tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit f6385e6644d5d4343d33b692810275c434122199
parent fcf1282d78cbc4069c719829e587166abf71d231
Author: Lando <lando@lando.test>
Date:   Mon,  3 Nov 2025 21:34:57 +0000

Merge autoland to mozilla-central

Diffstat:
Mbrowser/app/profile/firefox.js | 4++++
Mbrowser/base/content/browser-fullScreenAndPointerLock.js | 7+++----
Mbrowser/components/downloads/DownloadsViewUI.sys.mjs | 9++++++++-
Mbrowser/components/firefoxview/fxview-tab-list.mjs | 4+++-
Mbrowser/components/firefoxview/helpers.mjs | 4+++-
Mbrowser/components/ipprotection/IPProtectionServerlist.sys.mjs | 2++
Mbrowser/components/ipprotection/docs/Preferences.rst | 45+++++++++++++++++++++++++++++++++++++--------
Mdocshell/base/nsDocShell.cpp | 21+++++++++++----------
Mdocshell/base/nsDocShell.h | 1+
Mdom/base/nsFrameLoader.cpp | 20+++++++-------------
Mdom/html/HTMLCanvasElement.cpp | 23+++++++----------------
Mdom/permission/PermissionStatusSink.cpp | 42++++++++++++++++++++++++++++++++++--------
Mdom/permission/PermissionStatusSink.h | 4++--
Mdom/webtransport/api/WebTransport.cpp | 3+++
Meslint-rollouts.config.mjs | 19+++++++++++++++++++
Mjs/src/builtin/TestingFunctions.cpp | 27+++++----------------------
Mjs/src/vm/JSFunction.cpp | 13+++++++------
Mjs/src/vm/JSFunction.h | 6+++---
Mmobile/android/android-components/components/support/locale/src/main/java/mozilla/components/support/locale/LocaleManager.kt | 12++++++++++--
Mmobile/android/fenix/app/lint-baseline.xml | 44--------------------------------------------
Mmobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAdvancedTest.kt | 151+++++++++++++++----------------------------------------------------------------
Mmobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt | 9+++++----
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/Context.kt | 11+++++++++++
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/TabsCleanupFeature.kt | 36+++++++++++++++++++++---------------
Mmobile/android/fenix/app/src/main/res/raw/initial_experiments.json | 4++--
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/TabsCleanupFeatureTest.kt | 159+++++++++++++++++++++++++++++++++----------------------------------------------
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleManagerExtensionTest.kt | 22+++++++++++-----------
Mmobile/android/geckoview/src/main/java/org/mozilla/geckoview/ContentBlocking.java | 2++
Mmodules/libpref/init/StaticPrefList.yaml | 4++--
Mnetwerk/protocol/http/nsHttpConnectionMgr.cpp | 11++++++++---
Mpackage-lock.json | 1122++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------
Mpackage.json | 14+++++++-------
Apython/l10n/fluent_migrations/bug_1970743_browser_utils.py | 26++++++++++++++++++++++++++
Mpython/mach/mach/config.py | 25+++++++++++++++++++++++++
Mpython/mach/mach/settings.py | 27+--------------------------
Mremote/marionette/server.sys.mjs | 2+-
Mremote/shared/webdriver/Accessibility.sys.mjs | 6+++---
Msecurity/ct/CTKnownLogs.h | 2+-
Msecurity/manager/ssl/StaticHPKPins.h | 2+-
Msecurity/manager/ssl/nsSTSPreloadList.inc | 592++++++++++++++++++++++++++-----------------------------------------------------
Msecurity/manager/tools/log_list.json | 4++--
Dsecurity/sandbox/chromium-shim/patches/50_more_resilient_initialization_for_sandboxed_children.patch | 45---------------------------------------------
Asecurity/sandbox/chromium-shim/patches/50_use_rw_rx_mapping_for_child_init.patch | 420+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asecurity/sandbox/chromium-shim/patches/51_add_USER_LOCKDOWN_WITH_TRAVERSE.patch | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msecurity/sandbox/chromium/sandbox/win/src/eat_resolver.cc | 9++++++---
Msecurity/sandbox/chromium/sandbox/win/src/eat_resolver.h | 1+
Msecurity/sandbox/chromium/sandbox/win/src/interception.cc | 67+++++++++++++++++++++++++++++++++++--------------------------------
Msecurity/sandbox/chromium/sandbox/win/src/interception_agent.cc | 2+-
Msecurity/sandbox/chromium/sandbox/win/src/resolver.cc | 4+++-
Msecurity/sandbox/chromium/sandbox/win/src/resolver.h | 2++
Msecurity/sandbox/chromium/sandbox/win/src/restricted_token_utils.cc | 10++++++++++
Msecurity/sandbox/chromium/sandbox/win/src/security_level.h | 3+++
Msecurity/sandbox/chromium/sandbox/win/src/service_resolver.h | 10+---------
Msecurity/sandbox/chromium/sandbox/win/src/service_resolver_32.cc | 50++++++--------------------------------------------
Msecurity/sandbox/chromium/sandbox/win/src/service_resolver_64.cc | 49++++++++++---------------------------------------
Msecurity/sandbox/win/src/sandboxbroker/sandboxBroker.cpp | 55+++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mservices/settings/dumps/blocklists/addons-bloomfilters.json | 518++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Mservices/settings/dumps/main/top-sites.json | 160++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
Mservices/settings/dumps/security-state/intermediates.json | 128+------------------------------------------------------------------------------
Mtaskcluster/gecko_taskgraph/transforms/task.py | 12------------
Mtaskcluster/gecko_taskgraph/util/bugbug.py | 22+++++++++++++++-------
Mtaskcluster/gecko_taskgraph/util/verify.py | 22++++++++++++++++++++++
Mtesting/gtest/reports.py | 6+++++-
Mtoolkit/components/extensions/Schemas.sys.mjs | 2+-
Mtoolkit/components/extensions/test/xpcshell/test_ext_contentscript_triggeringPrincipal.js | 32++++++++++++++++----------------
Mtoolkit/components/prompts/src/PromptUtils.sys.mjs | 16+++++-----------
Mtoolkit/components/telemetry/app/TelemetryReportingPolicy.sys.mjs | 4++++
Mtoolkit/components/telemetry/tests/unit/test_canUpload_truth_table.js | 5+----
Mtoolkit/content/tests/browser/browser.toml | 3+++
Mtoolkit/locales/en-US/toolkit/downloads/downloadUtils.ftl | 7-------
Mtoolkit/locales/en-US/toolkit/global/browser-utils.ftl | 8++++++++
Mtoolkit/modules/BrowserUtils.sys.mjs | 56++++++++++++++++++++++++++++++++++++++++++++++++++++----
Mtoolkit/modules/tests/xpcshell/test_BrowserUtils_urlFormatting.js | 64+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
Mtoolkit/mozapps/downloads/DownloadUtils.sys.mjs | 86-------------------------------------------------------------------------------
Mtoolkit/mozapps/downloads/tests/browser/browser_unknownContentType_blob.js | 2+-
Mtoolkit/mozapps/downloads/tests/unit/test_DownloadUtils.js | 31-------------------------------
Mtools/@types/index.d.ts | 1+
Atools/@types/lib.gecko.esnext.d.ts | 39+++++++++++++++++++++++++++++++++++++++
Mtools/lint/eslint/eslint-plugin-mozilla/lib/configs/recommended.mjs | 5+++++
Mtools/lint/eslint/eslint-plugin-mozilla/lib/configs/require-jsdoc.mjs | 3+++
Mtools/lint/eslint/eslint-plugin-mozilla/lib/configs/valid-jsdoc.mjs | 1+
Mtools/lint/eslint/eslint-plugin-mozilla/package-lock.json | 307+++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------
Mtools/lint/eslint/eslint-plugin-mozilla/package.json | 8++++----
Mtools/lint/node-licenses.yml | 1+
Mtools/ts/package-lock.json | 919++++++++++++++++++++++++++++++++++++++++---------------------------------------
Mtools/ts/package.json | 6+++---
Mxpcom/threads/TaskController.cpp | 32++++++++++++++------------------
Mxpcom/threads/TaskController.h | 5+++--
88 files changed, 3654 insertions(+), 2201 deletions(-)

diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js @@ -1561,7 +1561,11 @@ pref("browser.bookmarks.editDialog.maxRecentFolders", 7); // On windows these levels are: // See - security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp // SetSecurityLevelForContentProcess() for what the different settings mean. +#if defined(NIGHTLY_BUILD) + pref("security.sandbox.content.level", 9); +#else pref("security.sandbox.content.level", 8); +#endif // Pref controlling if messages relevant to sandbox violations are logged. pref("security.sandbox.logging.enabled", false); diff --git a/browser/base/content/browser-fullScreenAndPointerLock.js b/browser/base/content/browser-fullScreenAndPointerLock.js @@ -100,10 +100,9 @@ var PointerlockFsWarning = { } else { textElem.removeAttribute("hidden"); // Document's principal's URI has a host. Display a warning including it. - let { DownloadUtils } = ChromeUtils.importESModule( - "resource://gre/modules/DownloadUtils.sys.mjs" - ); - let displayHost = DownloadUtils.getURIHost(uri.spec)[0]; + let displayHost = BrowserUtils.formatURIForDisplay(uri, { + onlyBaseDomain: true, + }); let l10nString = { "fullscreen-warning": "fullscreen-warning-domain", "pointerlock-warning": "pointerlock-warning-domain", diff --git a/browser/components/downloads/DownloadsViewUI.sys.mjs b/browser/components/downloads/DownloadsViewUI.sys.mjs @@ -12,6 +12,7 @@ import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs"; const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { + BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs", BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.sys.mjs", DownloadUtils: "resource://gre/modules/DownloadUtils.sys.mjs", Downloads: "resource://gre/modules/Downloads.sys.mjs", @@ -603,7 +604,13 @@ DownloadsViewUI.DownloadElementShell.prototype = { this.showStatus(stateLabel, hoverStatus); return; } - let [displayHost] = lazy.DownloadUtils.getURIHost(this.download.source.url); + let uri = URL.parse(this.download.source.url)?.URI; + let displayHost = uri + ? lazy.BrowserUtils.formatURIForDisplay(uri, { + onlyBaseDomain: true, + }) + : ""; + let [displayDate] = lazy.DownloadUtils.getReadableDates( new Date(this.download.endTime) ); diff --git a/browser/components/firefoxview/fxview-tab-list.mjs b/browser/components/firefoxview/fxview-tab-list.mjs @@ -517,7 +517,9 @@ export class FxviewTabRowBase extends MozLitElement { formatURIForDisplay(uriString) { return !window.IS_STORYBOOK - ? lazy.BrowserUtils.formatURIStringForDisplay(uriString) + ? lazy.BrowserUtils.formatURIStringForDisplay(uriString, { + showFilenameForLocalURIs: true, + }) : uriString; } diff --git a/browser/components/firefoxview/helpers.mjs b/browser/components/firefoxview/helpers.mjs @@ -24,7 +24,9 @@ export const LOGGING_PREF = "browser.tabs.firefox-view.logLevel"; export const MAX_TABS_FOR_RECENT_BROWSING = 5; export function formatURIForDisplay(uriString) { - return lazy.BrowserUtils.formatURIStringForDisplay(uriString); + return lazy.BrowserUtils.formatURIStringForDisplay(uriString, { + showFilenameForLocalURIs: true, + }); } export function convertTimestamp( diff --git a/browser/components/ipprotection/IPProtectionServerlist.sys.mjs b/browser/components/ipprotection/IPProtectionServerlist.sys.mjs @@ -162,6 +162,8 @@ class IPProtectionServerlistSingleton { this.#list = IPProtectionServerlistSingleton.#dataToList( await bucket.get() ); + + lazy.IPPStartupCache.storeLocationList(this.#list); }; this.#runningPromise = fetchList().finally( diff --git a/browser/components/ipprotection/docs/Preferences.rst b/browser/components/ipprotection/docs/Preferences.rst @@ -5,14 +5,28 @@ This document describes preferences affecting Firefox's IP Protection. These preferences are normally hidden and should not be used unless you really know what you are doing. +Feature enablement and experiments +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ``browser.ipProtection.enabled`` (boolean, default: ``false``) - Controls the entire feature. + Master feature toggle controlled by Nimbus and testing harnesses. -``browser.ipProtection.autoStartEnabled`` (boolean, default: ``false``) - Enables the auto‑start feature. +``browser.ipProtection.userEnabled`` (boolean, default: ``false``) + For testing; simulates user‑enabled state. -``browser.ipProtection.log`` (boolean, default: ``false``) - Enable/disable logging. +``browser.ipProtection.variant`` (string, default: ``""``) + Stores the current UI experiment variant. The value is passed to + ``IPProtectionPanel`` to render variant-specific strings and layouts. + +``browser.ipProtection.added`` (boolean, default: ``false``) + Tracks whether the toolbar button was auto-placed next to the FxA button. + Once true, the widget is not reinserted automatically after manual removal. + +Startup and caching +~~~~~~~~~~~~~~~~~~~ + +``browser.ipProtection.autoStartEnabled`` (boolean, default: ``false``) + Enables the auto-start helper so the proxy connects during browser startup. ``browser.ipProtection.stateCache`` (string, default: ``""``) Caches the latest ``IPProtectionStates`` value for use during startup. @@ -20,17 +34,32 @@ know what you are doing. ``browser.ipProtection.entitlementCache`` (string, default: ``""``) Cached entitlement JSON string used during startup to avoid network requests. +``browser.ipProtection.locationListCache`` (string, default: ``""``) + Cached Guardian location list shared between ``IPProtectionService`` and + ``GuardianClient``. + ``browser.ipProtection.cacheDisabled`` (boolean, default: ``false``) - For testing; disables caching of the entitlement and the state. + Turns off all startup caches. Used primarily by xpcshell tests. + +Networking and routing +~~~~~~~~~~~~~~~~~~~~~~ ``browser.ipProtection.guardian.endpoint`` (string, default: ``"https://vpn.mozilla.org/"``) Endpoint for the server‑side infrastructure. +``browser.ipProtection.mode`` (integer, default: ``0``) + Selects which requests are proxied by ``IPPChannelFilter``: + ``0`` routes all traffic (``MODE_FULL``), ``1`` only private browsing windows + (``MODE_PB``), ``2`` only requests classified as tracking (``MODE_TRACKER``). + ``browser.ipProtection.exceptionsMode`` (string, default: ``"all"``) Defines which network requests are processed. Default: all. ``browser.ipProtection.domainExclusions`` (string) Comma‑separated list of domains to exclude from the proxy. -``browser.ipProtection.userEnabled`` (boolean, default: ``false``) - For testing; simulates user‑enabled state. +Diagnostics +~~~~~~~~~~~ + +``browser.ipProtection.log`` (boolean, default: ``false``) + Enable/disable logging. diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp @@ -392,17 +392,22 @@ nsDocShell::nsDocShell(BrowsingContext* aBrowsingContext, #endif } +void nsDocShell::DestroyDocumentViewer() { + if (!mDocumentViewer) { + return; + } + mDocumentViewer->Close(nullptr); + mDocumentViewer->Destroy(); + mDocumentViewer = nullptr; +} + nsDocShell::~nsDocShell() { // Avoid notifying observers while we're in the dtor. mIsBeingDestroyed = true; Destroy(); - if (mDocumentViewer) { - mDocumentViewer->Close(nullptr); - mDocumentViewer->Destroy(); - mDocumentViewer = nullptr; - } + DestroyDocumentViewer(); MOZ_LOG(gDocShellLeakLog, LogLevel::Debug, ("DOCSHELL %p destroyed\n", this)); @@ -4564,11 +4569,7 @@ nsDocShell::Destroy() { docShellParentAsItem->RemoveChild(this); } - if (mDocumentViewer) { - mDocumentViewer->Close(nullptr); - mDocumentViewer->Destroy(); - mDocumentViewer = nullptr; - } + DestroyDocumentViewer(); nsDocLoader::Destroy(); diff --git a/docshell/base/nsDocShell.h b/docshell/base/nsDocShell.h @@ -577,6 +577,7 @@ class nsDocShell final : public nsDocLoader, // nsresult EnsureDocumentViewer(); + void DestroyDocumentViewer(); // aPrincipal can be passed in if the caller wants. If null is // passed in, the about:blank principal will end up being used. diff --git a/dom/base/nsFrameLoader.cpp b/dom/base/nsFrameLoader.cpp @@ -1913,22 +1913,16 @@ void nsFrameLoader::StartDestroy(bool aForProcessSwitch) { } // Let the tree owner know we're gone. - if (mIsTopLevelContent) { - if (GetDocShell()) { + if (nsCOMPtr<nsIDocShell> ds = GetDocShell()) { + if (mIsTopLevelContent) { nsCOMPtr<nsIDocShellTreeItem> parentItem; - GetDocShell()->GetInProcessParent(getter_AddRefs(parentItem)); - nsCOMPtr<nsIDocShellTreeOwner> owner = do_GetInterface(parentItem); - if (owner) { - owner->ContentShellRemoved(GetDocShell()); + ds->GetInProcessParent(getter_AddRefs(parentItem)); + if (nsCOMPtr<nsIDocShellTreeOwner> owner = do_GetInterface(parentItem)) { + owner->ContentShellRemoved(ds); } } - } - - // Let our window know that we are gone - if (GetDocShell()) { - nsCOMPtr<nsPIDOMWindowOuter> win_private(GetDocShell()->GetWindow()); - if (win_private) { - win_private->SetFrameElementInternal(nullptr); + if (nsCOMPtr<nsPIDOMWindowOuter> win = ds->GetWindow()) { + win->SetFrameElementInternal(nullptr); } } diff --git a/dom/html/HTMLCanvasElement.cpp b/dom/html/HTMLCanvasElement.cpp @@ -1117,10 +1117,8 @@ OffscreenCanvas* HTMLCanvasElement::TransferControlToOffscreen( } LayersBackend backend = LayersBackend::LAYERS_NONE; - nsIWidget* docWidget = nsContentUtils::WidgetForDocument(OwnerDoc()); - if (docWidget) { - WindowRenderer* renderer = docWidget->GetWindowRenderer(); - if (renderer) { + if (nsIWidget* docWidget = nsContentUtils::WidgetForDocument(OwnerDoc())) { + if (WindowRenderer* renderer = docWidget->GetWindowRenderer()) { backend = renderer->GetCompositorBackendType(); } } @@ -1425,30 +1423,23 @@ nsresult HTMLCanvasElement::RegisterFrameCaptureListener( } if (!mRequestedFrameRefreshObserver) { - Document* doc = OwnerDoc(); - if (!doc) { - return NS_ERROR_FAILURE; - } - - PresShell* shell = nsContentUtils::FindPresShellForDocument(doc); - if (!shell) { + PresShell* shell = nsContentUtils::FindPresShellForDocument(OwnerDoc()); + if (NS_WARN_IF(!shell)) { return NS_ERROR_FAILURE; } nsPresContext* context = shell->GetPresContext(); - if (!context) { + if (NS_WARN_IF(!context)) { return NS_ERROR_FAILURE; } context = context->GetRootPresContext(); - if (!context) { + if (NS_WARN_IF(!context)) { return NS_ERROR_FAILURE; } nsRefreshDriver* driver = context->RefreshDriver(); - if (!driver) { - return NS_ERROR_FAILURE; - } + MOZ_ASSERT(driver); mRequestedFrameRefreshObserver = new RequestedFrameRefreshObserver(this, driver, aReturnPlaceholderData); diff --git a/dom/permission/PermissionStatusSink.cpp b/dom/permission/PermissionStatusSink.cpp @@ -51,10 +51,26 @@ PermissionStatusSink::Init() { MutexAutoLock lock(mMutex); - mWorkerRef = WeakWorkerRef::Create( - workerPrivate, [self = RefPtr(this)] { self->Disentangle(); }); + RefPtr<StrongWorkerRef> workerRef = StrongWorkerRef::Create( + workerPrivate, "PermissionStatusSink", + [self = RefPtr(this)]() { self->Disentangle(); }); + if (NS_WARN_IF(!workerRef)) { + // If WorkerRef creation fails, the Worker has started shutting down. But + // we are on the Worker thread, promise handlers in + // PermissionStatus::Init()/Permissions::Query() can still be dispatched + // to the Worker thread for outer promise rejection. + return PermissionStatePromise::CreateAndReject(NS_ERROR_FAILURE, + __func__); + ; + } + + mWorkerRef = new ThreadSafeWorkerRef(workerRef); } + // On the Worker thread, so the below async function must be executed before + // WorkerRef callback which should also be on the Worker thread. So the above + // created WorkerRef should protect the outer promise handling can be + // dispatched on the Worker thread. return InvokeAsync(GetMainThreadSerialEventTarget(), __func__, [self = RefPtr(this)] { MOZ_ASSERT(!self->mObserver); @@ -102,6 +118,17 @@ bool PermissionStatusSink::MaybeUpdatedByNotifyOnlyOnMainThread( void PermissionStatusSink::PermissionChangedOnMainThread() { MOZ_ASSERT(NS_IsMainThread()); + // Nothing to do if Worker had shutted down. + if (!mSerialEventTarget->IsOnCurrentThread()) { + MutexAutoLock lock(mMutex); + if (!mWorkerRef) { + return; + } + } + + // mWorkerRef is not nullptr, it will protect the promise handling can be + // dispatched to the Worker thread, even though the Worker starts shutdown, + // because mWorkerRef is nullify on the main thread. ComputeStateOnMainThread()->Then( mSerialEventTarget, __func__, [self = RefPtr(this)]( @@ -117,17 +144,16 @@ void PermissionStatusSink::Disentangle() { mPermissionStatus = nullptr; - { - MutexAutoLock lock(mMutex); - mWorkerRef = nullptr; - } - NS_DispatchToMainThread( NS_NewRunnableFunction(__func__, [self = RefPtr(this)] { if (self->mObserver) { self->mObserver->RemoveSink(self); self->mObserver = nullptr; } + { + MutexAutoLock lock(self->mMutex); + self->mWorkerRef = nullptr; + } })); } @@ -167,7 +193,7 @@ PermissionStatusSink::ComputeStateOnMainThread() { // If we have mWorkerRef, we haven't received the WorkerRef notification // yet. - WorkerPrivate* workerPrivate = mWorkerRef->GetUnsafePrivate(); + WorkerPrivate* workerPrivate = mWorkerRef->Private(); MOZ_ASSERT(workerPrivate); ancestorWindow = workerPrivate->GetAncestorWindow(); diff --git a/dom/permission/PermissionStatusSink.h b/dom/permission/PermissionStatusSink.h @@ -19,7 +19,7 @@ namespace mozilla::dom { class PermissionObserver; class PermissionStatus; -class WeakWorkerRef; +class ThreadSafeWorkerRef; class PermissionStatusSink { public: @@ -70,7 +70,7 @@ class PermissionStatusSink { // Protected by mutex. // Created and released on worker-thread. Used also on main-thread. - RefPtr<WeakWorkerRef> mWorkerRef MOZ_GUARDED_BY(mMutex); + RefPtr<ThreadSafeWorkerRef> mWorkerRef MOZ_GUARDED_BY(mMutex); PermissionName mPermissionName; nsCString mPermissionType; diff --git a/dom/webtransport/api/WebTransport.cpp b/dom/webtransport/api/WebTransport.cpp @@ -277,6 +277,7 @@ void WebTransport::Init(const GlobalObject& aGlobal, const nsAString& aURL, PBackgroundChild* backgroundChild = BackgroundChild::GetOrCreateForCurrentThread(); if (NS_WARN_IF(!backgroundChild)) { + aError.Throw(NS_ERROR_FAILURE); return; } @@ -295,9 +296,11 @@ void WebTransport::Init(const GlobalObject& aGlobal, const nsAString& aURL, RefPtr<WebTransportChild> child = new WebTransportChild(this); if (NS_IsMainThread()) { if (!childEndpoint.Bind(child)) { + aError.Throw(NS_ERROR_FAILURE); return; } } else if (!childEndpoint.Bind(child, mGlobal->SerialEventTarget())) { + aError.Throw(NS_ERROR_FAILURE); return; } diff --git a/eslint-rollouts.config.mjs b/eslint-rollouts.config.mjs @@ -483,6 +483,25 @@ export default [ rules: mozilla.turnOff(mozilla.configs["flat/require-jsdoc"].rules), }, { + // TODO: Bug 1997306. Fix these instances after the jsdoc 60.8.0 upgrade. + name: "rollout-jsdoc-valid-types-updates", + files: [ + "browser/components/ipprotection/IPPNetworkErrorObserver.sys.mjs", + "browser/components/ipprotection/IPProtectionService.sys.mjs", + "browser/components/uitour/UITour-lib.js", + "remote/shared/AppInfo.sys.mjs", + "remote/shared/NavigationManager.sys.mjs", + "remote/shared/UserContextManager.sys.mjs", + "remote/shared/listeners/CachedResourceListener.sys.mjs", + "remote/shared/listeners/DataChannelListener.sys.mjs", + "remote/shared/listeners/DownloadListener.sys.mjs", + "remote/shared/listeners/NetworkListener.sys.mjs", + ], + rules: { + "jsdoc/valid-types": "off", + }, + }, + { name: "rollout-layout", files: ["layout/**"], ignores: ["layout/tools/reftest/**"], diff --git a/js/src/builtin/TestingFunctions.cpp b/js/src/builtin/TestingFunctions.cpp @@ -1026,13 +1026,7 @@ static bool WasmCompilersPresent(JSContext* cx, unsigned argc, Value* vp) { strcat(buf, "ion"); } - JSString* result = JS_NewStringCopyZ(cx, buf); - if (!result) { - return false; - } - - args.rval().setString(result); - return true; + return ReturnStringCopy(cx, args, buf); } static bool WasmCompileMode(JSContext* cx, unsigned argc, Value* vp) { @@ -1595,8 +1589,7 @@ static bool WasmGlobalToString(JSContext* cx, unsigned argc, Value* vp) { MOZ_ASSERT_UNREACHABLE(); } - args.rval().setString(JS_NewStringCopyZ(cx, result.get())); - return true; + return ReturnStringCopy(cx, args, result.get()); } static bool WasmLosslessInvoke(JSContext* cx, unsigned argc, Value* vp) { @@ -2173,13 +2166,7 @@ static bool WasmFunctionTier(JSContext* cx, unsigned argc, Value* vp) { return false; } wasm::Tier tier = instance.code().funcTier(funcIndex); - RootedString tierString(cx, JS_NewStringCopyZ(cx, wasm::ToString(tier))); - if (!tierString) { - ReportOutOfMemory(cx); - return false; - } - args.rval().set(StringValue(tierString)); - return true; + return ReturnStringCopy(cx, args, wasm::ToString(tier)); } JS_ReportErrorASCII(cx, "argument is not an exported wasm function"); return false; @@ -9072,18 +9059,14 @@ static bool GetEnvironmentObjectType(JSContext* cx, unsigned argc, Value* vp) { if (envObj->is<EnvironmentObject>()) { EnvironmentObject* env = &envObj->as<EnvironmentObject>(); - JSString* str = JS_NewStringCopyZ(cx, env->typeString()); - args.rval().setString(str); - return true; + return ReturnStringCopy(cx, args, env->typeString()); } if (envObj->is<DebugEnvironmentProxy>()) { DebugEnvironmentProxy* envProxy = &envObj->as<DebugEnvironmentProxy>(); EnvironmentObject* env = &envProxy->environment(); char buf[256] = {'\0'}; SprintfLiteral(buf, "[DebugProxy] %s", env->typeString()); - JSString* str = JS_NewStringCopyZ(cx, buf); - args.rval().setString(str); - return true; + return ReturnStringCopy(cx, args, buf); } args.rval().setUndefined(); diff --git a/js/src/vm/JSFunction.cpp b/js/src/vm/JSFunction.cpp @@ -102,7 +102,7 @@ static bool fun_enumerate(JSContext* cx, HandleObject obj) { return true; } -bool IsFunction(HandleValue v) { +static bool IsFunction(HandleValue v) { return v.isObject() && v.toObject().is<JSFunction>(); } @@ -168,7 +168,7 @@ static bool ArgumentsRestrictions(JSContext* cx, HandleFunction fun) { return true; } -bool ArgumentsGetterImpl(JSContext* cx, const CallArgs& args) { +static bool ArgumentsGetterImpl(JSContext* cx, const CallArgs& args) { MOZ_ASSERT(IsFunction(args.thisv())); RootedFunction fun(cx, &args.thisv().toObject().as<JSFunction>()); @@ -214,7 +214,7 @@ static bool ArgumentsGetter(JSContext* cx, unsigned argc, Value* vp) { return CallNonGenericMethod<IsFunction, ArgumentsGetterImpl>(cx, args); } -bool ArgumentsSetterImpl(JSContext* cx, const CallArgs& args) { +static bool ArgumentsSetterImpl(JSContext* cx, const CallArgs& args) { MOZ_ASSERT(IsFunction(args.thisv())); RootedFunction fun(cx, &args.thisv().toObject().as<JSFunction>()); @@ -250,7 +250,7 @@ static bool CallerRestrictions(JSContext* cx, HandleFunction fun) { return true; } -bool CallerGetterImpl(JSContext* cx, const CallArgs& args) { +static bool CallerGetterImpl(JSContext* cx, const CallArgs& args) { MOZ_ASSERT(IsFunction(args.thisv())); // Beware! This function can be invoked on *any* function! It can't @@ -320,7 +320,7 @@ static bool CallerGetter(JSContext* cx, unsigned argc, Value* vp) { return CallNonGenericMethod<IsFunction, CallerGetterImpl>(cx, args); } -bool CallerSetterImpl(JSContext* cx, const CallArgs& args) { +static bool CallerSetterImpl(JSContext* cx, const CallArgs& args) { MOZ_ASSERT(IsFunction(args.thisv())); // We just have to return |undefined|, but first we call CallerGetterImpl @@ -1014,7 +1014,8 @@ JSString* js::FunctionToString(JSContext* cx, HandleFunction fun, return out.finishString(); } -JSString* fun_toStringHelper(JSContext* cx, HandleObject obj, bool isToSource) { +JSString* js::fun_toStringHelper(JSContext* cx, HandleObject obj, + bool isToSource) { if (!obj->is<JSFunction>()) { if (JSFunToStringOp op = obj->getOpsFunToString()) { return op(cx, obj, isToSource); diff --git a/js/src/vm/JSFunction.h b/js/src/vm/JSFunction.h @@ -769,11 +769,11 @@ static_assert( static_assert(unsigned(JSFunction::AtomSlot) == unsigned(JS::shadow::Function::AtomSlot)); -extern JSString* fun_toStringHelper(JSContext* cx, js::HandleObject obj, - bool isToSource); - namespace js { +extern JSString* fun_toStringHelper(JSContext* cx, HandleObject obj, + bool isToSource); + extern bool Function(JSContext* cx, unsigned argc, Value* vp); extern bool Generator(JSContext* cx, unsigned argc, Value* vp); diff --git a/mobile/android/android-components/components/support/locale/src/main/java/mozilla/components/support/locale/LocaleManager.kt b/mobile/android/android-components/components/support/locale/src/main/java/mozilla/components/support/locale/LocaleManager.kt @@ -9,9 +9,11 @@ import android.content.Context import android.content.SharedPreferences import android.content.res.Configuration import android.content.res.Resources -import androidx.appcompat.app.AppCompatActivity +import androidx.annotation.VisibleForTesting import androidx.core.content.edit import androidx.core.os.ConfigurationCompat +import mozilla.components.support.locale.LocaleManager.getCurrentLocale +import mozilla.components.support.locale.LocaleManager.setNewLocale import java.util.Locale import mozilla.components.support.base.R as supportBaseR @@ -106,7 +108,13 @@ object LocaleManager { Locale.setDefault(locale) } - internal fun clear(context: Context) { + /** + * Clears the stored locale preference. + * + * @param context The [Context] used to access SharedPreferences. + */ + @VisibleForTesting + fun clear(context: Context) { Storage.clear(context) } diff --git a/mobile/android/fenix/app/lint-baseline.xml b/mobile/android/fenix/app/lint-baseline.xml @@ -334,50 +334,6 @@ <issue id="NoStaticMocking" message="Usage of MockK&apos;s &apos;mockkStatic&apos; for static mocking is discouraged. Refactor to use dependency injection." - errorLine1=" mockkStatic(&quot;org.mozilla.fenix.utils.UndoKt&quot;)" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="src/test/java/org/mozilla/fenix/home/TabsCleanupFeatureTest.kt" - line="76" - column="9"/> - </issue> - - <issue - id="NoStaticMocking" - message="Usage of MockK&apos;s &apos;mockkStatic&apos; for static mocking is discouraged. Refactor to use dependency injection." - errorLine1=" mockkStatic(&quot;mozilla.components.browser.state.selector.SelectorsKt&quot;)" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="src/test/java/org/mozilla/fenix/home/TabsCleanupFeatureTest.kt" - line="224" - column="9"/> - </issue> - - <issue - id="NoStaticMocking" - message="Usage of MockK&apos;s &apos;mockkStatic&apos; for static mocking is discouraged. Refactor to use dependency injection." - errorLine1=" mockkStatic(&quot;mozilla.components.browser.state.selector.SelectorsKt&quot;)" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="src/test/java/org/mozilla/fenix/home/TabsCleanupFeatureTest.kt" - line="255" - column="9"/> - </issue> - - <issue - id="NoStaticMocking" - message="Usage of MockK&apos;s &apos;mockkStatic&apos; for static mocking is discouraged. Refactor to use dependency injection." - errorLine1=" mockkStatic(&quot;mozilla.components.browser.state.selector.SelectorsKt&quot;)" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="src/test/java/org/mozilla/fenix/home/TabsCleanupFeatureTest.kt" - line="290" - column="9"/> - </issue> - - <issue - id="NoStaticMocking" - message="Usage of MockK&apos;s &apos;mockkStatic&apos; for static mocking is discouraged. Refactor to use dependency injection." errorLine1=" mockkStatic(&quot;mozilla.components.support.ktx.android.util.DisplayMetricsKt&quot;)" errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> <location diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAdvancedTest.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAdvancedTest.kt @@ -5,6 +5,7 @@ package org.mozilla.fenix.ui import androidx.core.net.toUri +import org.junit.Before import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest @@ -13,6 +14,7 @@ import org.mozilla.fenix.helpers.AppAndSystemHelper.assertYoutubeAppOpens import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText import org.mozilla.fenix.helpers.MatcherHelper.itemWithResIdAndText +import org.mozilla.fenix.helpers.OpenLinksInApp import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.TestHelper import org.mozilla.fenix.helpers.TestHelper.exitMenu @@ -40,6 +42,14 @@ class SettingsAdvancedTest : TestSetup() { @get:Rule val memoryLeaksRule = DetectMemoryLeaksRule() + lateinit var externalLinksPage: TestAssetHelper.TestAsset + + @Before + override fun setUp() { + super.setUp() + externalLinksPage = TestAssetHelper.getExternalLinksAsset(mockWebServer) + } + // TestRail link: https://mozilla.testrail.io/index.php?/cases/view/2092699 // Walks through settings menu and sub-menus to ensure all items are present @Test @@ -68,15 +78,8 @@ class SettingsAdvancedTest : TestSetup() { @SmokeTest @Test fun askBeforeOpeningOpenLinkInAppTest() { - val externalLinksPage = TestAssetHelper.getExternalLinksAsset(mockWebServer) - - homeScreen { - }.openThreeDotMenu { - }.openSettings { - verifyOpenLinksInAppsButton() - verifySettingsOptionSummary("Open links in apps", "Ask before opening") - }.openOpenLinksInAppsMenu { - verifyOpenLinksInAppsView("Ask before opening") + activityIntentTestRule.applySettingsExceptions { + it.openLinksInExternalApp = OpenLinksInApp.ASK } exitMenu() @@ -92,22 +95,10 @@ class SettingsAdvancedTest : TestSetup() { // Assumes Youtube is installed and enabled @Test fun privateBrowsingAskBeforeOpeningOpenLinkInAppTest() { - val externalLinksPage = TestAssetHelper.getExternalLinksAsset(mockWebServer) - - homeScreen { - }.togglePrivateBrowsingMode() - - homeScreen { - }.openThreeDotMenu { - }.openSettings { - verifyOpenLinksInAppsButton() - verifySettingsOptionSummary("Open links in apps", "Ask before opening") - }.openOpenLinksInAppsMenu { - verifyPrivateOpenLinksInAppsView("Ask before opening") + activityIntentTestRule.applySettingsExceptions { + it.openLinksInExternalApp = OpenLinksInApp.ASK } - exitMenu() - navigationToolbar { }.enterURLAndEnterToBrowser(externalLinksPage.url) { clickPageObject(playStoreLink) @@ -120,22 +111,10 @@ class SettingsAdvancedTest : TestSetup() { @SmokeTest @Test fun askBeforeOpeningLinkInAppCancelTest() { - val externalLinksPage = TestAssetHelper.getExternalLinksAsset(mockWebServer) - - homeScreen { - }.openThreeDotMenu { - }.openSettings { - verifyOpenLinksInAppsButton() - verifySettingsOptionSummary("Open links in apps", "Ask before opening") - }.openOpenLinksInAppsMenu { - verifyOpenLinksInAppsView("Ask before opening") - verifySelectedOpenLinksInAppOption("Ask before opening") - }.goBack { - verifySettingsOptionSummary("Open links in apps", "Ask before opening") + activityIntentTestRule.applySettingsExceptions { + it.openLinksInExternalApp = OpenLinksInApp.ASK } - exitMenu() - navigationToolbar { }.enterURLAndEnterToBrowser(externalLinksPage.url) { clickPageObject(youTubeSchemaLink) @@ -150,22 +129,10 @@ class SettingsAdvancedTest : TestSetup() { @SmokeTest @Test fun askBeforeOpeningLinkInAppOpenTest() { - val externalLinksPage = TestAssetHelper.getExternalLinksAsset(mockWebServer) - - homeScreen { - }.openThreeDotMenu { - }.openSettings { - verifyOpenLinksInAppsButton() - verifySettingsOptionSummary("Open links in apps", "Ask before opening") - }.openOpenLinksInAppsMenu { - verifyOpenLinksInAppsView("Ask before opening") - verifySelectedOpenLinksInAppOption("Ask before opening") - }.goBack { - verifySettingsOptionSummary("Open links in apps", "Ask before opening") + activityIntentTestRule.applySettingsExceptions { + it.openLinksInExternalApp = OpenLinksInApp.ASK } - exitMenu() - navigationToolbar { }.enterURLAndEnterToBrowser(externalLinksPage.url) { clickPageObject(youTubeSchemaLink) @@ -182,25 +149,13 @@ class SettingsAdvancedTest : TestSetup() { @Test fun privateBrowsingAskBeforeOpeningLinkInAppCancelTest() { TestHelper.appContext.settings().shouldShowCookieBannersCFR = false - val externalLinksPage = TestAssetHelper.getExternalLinksAsset(mockWebServer) + activityIntentTestRule.applySettingsExceptions { + it.openLinksInExternalApp = OpenLinksInApp.ASK + } homeScreen { }.togglePrivateBrowsingMode() - homeScreen { - }.openThreeDotMenu { - }.openSettings { - verifyOpenLinksInAppsButton() - verifySettingsOptionSummary("Open links in apps", "Ask before opening") - }.openOpenLinksInAppsMenu { - verifyPrivateOpenLinksInAppsView("Ask before opening") - verifySelectedOpenLinksInAppOption("Ask before opening") - }.goBack { - verifySettingsOptionSummary("Open links in apps", "Ask before opening") - } - - exitMenu() - navigationToolbar { }.enterURLAndEnterToBrowser(externalLinksPage.url) { clickPageObject(youTubeSchemaLink) @@ -218,23 +173,13 @@ class SettingsAdvancedTest : TestSetup() { // Assumes Youtube is installed and enabled @Test fun privateBrowsingAskBeforeOpeningLinkInAppOpenTest() { - val externalLinksPage = TestAssetHelper.getExternalLinksAsset(mockWebServer) + activityIntentTestRule.applySettingsExceptions { + it.openLinksInExternalApp = OpenLinksInApp.ASK + } homeScreen { }.togglePrivateBrowsingMode() - homeScreen { - }.openThreeDotMenu { - }.openSettings { - verifyOpenLinksInAppsButton() - verifySettingsOptionSummary("Open links in apps", "Ask before opening") - }.openOpenLinksInAppsMenu { - verifyPrivateOpenLinksInAppsView("Ask before opening") - verifySelectedOpenLinksInAppOption("Ask before opening") - }.goBack { - verifySettingsOptionSummary("Open links in apps", "Ask before opening") - } - exitMenu() navigationToolbar { @@ -256,23 +201,10 @@ class SettingsAdvancedTest : TestSetup() { // Assumes Youtube is installed and enabled @Test fun alwaysOpenLinkInAppTest() { - val externalLinksPage = TestAssetHelper.getExternalLinksAsset(mockWebServer) - - homeScreen { - }.openThreeDotMenu { - }.openSettings { - verifyOpenLinksInAppsButton() - verifySettingsOptionSummary("Open links in apps", "Ask before opening") - }.openOpenLinksInAppsMenu { - verifyOpenLinksInAppsView("Ask before opening") - clickOpenLinkInAppOption("Always") - verifySelectedOpenLinksInAppOption("Always") - }.goBack { - verifySettingsOptionSummary("Open links in apps", "Always") + activityIntentTestRule.applySettingsExceptions { + it.openLinksInExternalApp = OpenLinksInApp.ALWAYS } - exitMenu() - navigationToolbar { }.enterURLAndEnterToBrowser(externalLinksPage.url) { clickPageObject(youTubeSchemaLink) @@ -286,22 +218,9 @@ class SettingsAdvancedTest : TestSetup() { fun dismissOpenLinksInAppCFRTest() { activityIntentTestRule.applySettingsExceptions { it.isOpenInAppBannerEnabled = true + it.openLinksInExternalApp = OpenLinksInApp.NEVER } - homeScreen { - }.openThreeDotMenu { - }.openSettings { - verifyOpenLinksInAppsButton() - verifySettingsOptionSummary("Open links in apps", "Ask before opening") - }.openOpenLinksInAppsMenu { - verifyOpenLinksInAppsView("Ask before opening") - clickOpenLinkInAppOption("Never") - verifySelectedOpenLinksInAppOption("Never") - }.goBack { - verifySettingsOptionSummary("Open links in apps", "Never") - } - - exitMenu() navigationToolbar { }.enterURLAndEnterToBrowser("https://m.youtube.com/".toUri()) { verifyPageContent("youtube") @@ -316,23 +235,9 @@ class SettingsAdvancedTest : TestSetup() { fun goToSettingsFromOpenLinksInAppCFRTest() { activityIntentTestRule.applySettingsExceptions { it.isOpenInAppBannerEnabled = true + it.openLinksInExternalApp = OpenLinksInApp.NEVER } - homeScreen { - }.openThreeDotMenu { - }.openSettings { - verifyOpenLinksInAppsButton() - verifySettingsOptionSummary("Open links in apps", "Ask before opening") - }.openOpenLinksInAppsMenu { - verifyOpenLinksInAppsView("Ask before opening") - clickOpenLinkInAppOption("Never") - verifySelectedOpenLinksInAppOption("Never") - }.goBack { - verifySettingsOptionSummary("Open links in apps", "Never") - } - - exitMenu() - navigationToolbar { }.enterURLAndEnterToBrowser("https://m.youtube.com/".toUri()) { verifyPageContent("youtube") diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SearchRobot.kt @@ -9,6 +9,7 @@ package org.mozilla.fenix.ui.robots import android.util.Log import androidx.compose.ui.test.ComposeTimeoutException import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.assert import androidx.compose.ui.test.assertAny import androidx.compose.ui.test.assertCountEquals import androidx.compose.ui.test.assertIsDisplayed @@ -380,10 +381,10 @@ class SearchRobot { composeTestRule: ComposeTestRule, searchHint: String, ) { Log.i(TAG, "verifySearchBarPlaceholderWithComposableToolbar: Verify hint is $searchHint") - composeTestRule.onNode( - hasTestTag(ADDRESSBAR_SEARCH_BOX) and hasText(searchHint), - useUnmergedTree = true, - ) + composeTestRule + .onNodeWithTag(ADDRESSBAR_SEARCH_BOX) + .assert(hasText(searchHint)) + .assertIsDisplayed() Log.i(TAG, "verifySearchBarPlaceholderWithComposableToolbar: Verification successful") } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/Context.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/Context.kt @@ -148,6 +148,17 @@ fun Context.tabClosedUndoMessage(private: Boolean): String = } /** + * Returns the message to be shown when multiple tabs are closed based on whether the tabs were all private or not. + * @param private true if the tab was private, false otherwise. + */ +fun Context.tabsClosedUndoMessage(private: Boolean): String = + if (private) { + getString(R.string.snackbar_private_data_deleted) + } else { + getString(R.string.snackbar_tabs_closed) + } + +/** * Helper function used to determine whether the app's total *window* size is at least that of a tablet. * This relies on the window size check from [AcornWindowSize]. To determine whether the device's * *physical* size is at least the size of a tablet, use [Context.isLargeScreenSize] instead. diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/TabsCleanupFeature.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/TabsCleanupFeature.kt @@ -19,6 +19,7 @@ import org.mozilla.fenix.R import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager import org.mozilla.fenix.components.usecases.FenixBrowserUseCases import org.mozilla.fenix.ext.tabClosedUndoMessage +import org.mozilla.fenix.ext.tabsClosedUndoMessage import org.mozilla.fenix.home.HomeScreenViewModel.Companion.ALL_NORMAL_TABS import org.mozilla.fenix.home.HomeScreenViewModel.Companion.ALL_PRIVATE_TABS import org.mozilla.fenix.utils.Settings @@ -69,6 +70,23 @@ class TabsCleanupFeature( override fun stop() = Unit + /** + * Shows an undo snackbar after removing one or more tabs. + * + * @param message The message to display in the snackbar. + * @param onCancel The action to perform when the user clicks the "Undo" button. + */ + @VisibleForTesting + internal fun showUndoSnackbar(message: String, onCancel: () -> Unit) { + viewLifecycleScope.allowUndo( + view = snackBarParentView, + message = message, + undoActionTitle = context.getString(R.string.snackbar_deleted_undo), + onCancel = onCancel, + operation = {}, + ) + } + private fun removeAllTabsAndShowSnackbar(sessionCode: String) { if (sessionCode == ALL_PRIVATE_TABS) { tabsUseCases.removePrivateTabs() @@ -76,12 +94,6 @@ class TabsCleanupFeature( tabsUseCases.removeNormalTabs() } - val snackbarMessage = if (sessionCode == ALL_PRIVATE_TABS) { - context.getString(R.string.snackbar_private_data_deleted) - } else { - context.getString(R.string.snackbar_tabs_closed) - } - var tabId: String? = null if (settings.enableHomepageAsNewTab) { // Add a new tab after all the tabs are removed to ensure there's always 1 tab. @@ -92,14 +104,11 @@ class TabsCleanupFeature( ) } - viewLifecycleScope.allowUndo( - view = snackBarParentView, - message = snackbarMessage, - undoActionTitle = context.getString(R.string.snackbar_deleted_undo), + showUndoSnackbar( + message = context.tabsClosedUndoMessage(private = sessionCode == ALL_PRIVATE_TABS), onCancel = { onUndoAllTabsRemoved(tabId) }, - operation = {}, ) } @@ -141,14 +150,11 @@ class TabsCleanupFeature( ) } - viewLifecycleScope.allowUndo( - view = snackBarParentView, + showUndoSnackbar( message = context.tabClosedUndoMessage(tab.content.private), - undoActionTitle = context.getString(R.string.snackbar_deleted_undo), onCancel = { onUndoTabRemoved(tabId) }, - operation = {}, ) } diff --git a/mobile/android/fenix/app/src/main/res/raw/initial_experiments.json b/mobile/android/fenix/app/src/main/res/raw/initial_experiments.json @@ -171,7 +171,7 @@ "channel": "release", "userFacingName": "No sponsored tiles for 14 days V2", "userFacingDescription": "Do not show sponsored tiles to new users for 14 days.", - "isEnrollmentPaused": false, + "isEnrollmentPaused": true, "isRollout": false, "bucketConfig": { "randomizationUnit": "nimbus_id", @@ -234,7 +234,7 @@ ], "targeting": "((is_already_enrolled) || ((isFirstRun == 'true') && (app_version|versionCompare('143.3.0') >= 0)))", "startDate": "2025-10-07", - "enrollmentEndDate": null, + "enrollmentEndDate": "2025-10-30", "endDate": null, "proposedDuration": 14, "proposedEnrollment": 14, diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/TabsCleanupFeatureTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/TabsCleanupFeatureTest.kt @@ -12,19 +12,16 @@ import io.mockk.every import io.mockk.impl.annotations.RelaxedMockK import io.mockk.just import io.mockk.mockk -import io.mockk.mockkStatic +import io.mockk.spyk import io.mockk.verify import io.mockk.verifyOrder import kotlinx.coroutines.CoroutineScope -import mozilla.components.browser.state.selector.findTab -import mozilla.components.browser.state.selector.privateTabs +import kotlinx.coroutines.test.StandardTestDispatcher import mozilla.components.browser.state.state.TabSessionState import mozilla.components.browser.state.store.BrowserStore import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.support.test.robolectric.testContext -import mozilla.components.support.test.rule.MainCoroutineRule import org.junit.Before -import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.R @@ -33,15 +30,13 @@ import org.mozilla.fenix.components.usecases.FenixBrowserUseCases import org.mozilla.fenix.home.HomeScreenViewModel.Companion.ALL_NORMAL_TABS import org.mozilla.fenix.home.HomeScreenViewModel.Companion.ALL_PRIVATE_TABS import org.mozilla.fenix.utils.Settings -import org.mozilla.fenix.utils.allowUndo import org.robolectric.RobolectricTestRunner @RunWith(RobolectricTestRunner::class) class TabsCleanupFeatureTest { - @get:Rule - val coroutinesTestRule = MainCoroutineRule() - private val testCoroutineScope = coroutinesTestRule.scope + private val testDispatcher = StandardTestDispatcher() + private val testCoroutineScope = CoroutineScope(testDispatcher) @RelaxedMockK private lateinit var viewModel: HomeScreenViewModel @@ -73,31 +68,22 @@ class TabsCleanupFeatureTest { fun setup() { MockKAnnotations.init(this) - mockkStatic("org.mozilla.fenix.utils.UndoKt") - every { - any<CoroutineScope>().allowUndo( - view = any(), - message = any(), - undoActionTitle = any(), - onCancel = any(), - operation = any(), - anchorView = any(), - elevation = any(), - ) - } just Runs - - feature = TabsCleanupFeature( - context = testContext, - viewModel = viewModel, - browserStore = browserStore, - browsingModeManager = browsingModeManager, - navController = navController, - settings = settings, - tabsUseCases = tabsUseCases, - fenixBrowserUseCases = fenixBrowserUseCases, - snackBarParentView = snackBarParentView, - viewLifecycleScope = testCoroutineScope, + feature = spyk( + TabsCleanupFeature( + context = testContext, + viewModel = viewModel, + browserStore = browserStore, + browsingModeManager = browsingModeManager, + navController = navController, + settings = settings, + tabsUseCases = tabsUseCases, + fenixBrowserUseCases = fenixBrowserUseCases, + snackBarParentView = snackBarParentView, + viewLifecycleScope = testCoroutineScope, + ), ) + + every { feature.showUndoSnackbar(any(), any()) } just Runs } @Test @@ -109,12 +95,9 @@ class TabsCleanupFeatureTest { verify { tabsUseCases.removeNormalTabs() - testCoroutineScope.allowUndo( - view = snackBarParentView, - message = testContext.getString(R.string.snackbar_tabs_closed), - undoActionTitle = testContext.getString(R.string.snackbar_deleted_undo), - onCancel = any(), - operation = any(), + feature.showUndoSnackbar( + testContext.getString(R.string.snackbar_tabs_closed), + any(), ) viewModel.sessionToDelete = null @@ -130,12 +113,9 @@ class TabsCleanupFeatureTest { verify { tabsUseCases.removePrivateTabs() - testCoroutineScope.allowUndo( - view = snackBarParentView, - message = testContext.getString(R.string.snackbar_private_data_deleted), - undoActionTitle = testContext.getString(R.string.snackbar_deleted_undo), - onCancel = any(), - operation = any(), + feature.showUndoSnackbar( + testContext.getString(R.string.snackbar_private_data_deleted), + any(), ) viewModel.sessionToDelete = null @@ -156,12 +136,9 @@ class TabsCleanupFeatureTest { private = browsingModeManager.mode.isPrivate, ) - testCoroutineScope.allowUndo( - view = snackBarParentView, - message = testContext.getString(R.string.snackbar_tabs_closed), - undoActionTitle = testContext.getString(R.string.snackbar_deleted_undo), - onCancel = any(), - operation = any(), + feature.showUndoSnackbar( + testContext.getString(R.string.snackbar_tabs_closed), + any(), ) viewModel.sessionToDelete = null @@ -169,7 +146,7 @@ class TabsCleanupFeatureTest { } @Test - fun `GIVEN homepage as a new tab is enabled and all private tabs to delete WHEN rfeature is started THEN remove all normal tabs, show undo snackbar and ensure 1 new tab remains`() { + fun `GIVEN homepage as a new tab is enabled and all private tabs to delete WHEN feature is started THEN remove all normal tabs, show undo snackbar and ensure 1 new tab remains`() { every { settings.enableHomepageAsNewTab } returns true every { viewModel.sessionToDelete } returns ALL_PRIVATE_TABS @@ -182,12 +159,9 @@ class TabsCleanupFeatureTest { private = browsingModeManager.mode.isPrivate, ) - testCoroutineScope.allowUndo( - view = snackBarParentView, - message = testContext.getString(R.string.snackbar_private_data_deleted), - undoActionTitle = testContext.getString(R.string.snackbar_deleted_undo), - onCancel = any(), - operation = any(), + feature.showUndoSnackbar( + testContext.getString(R.string.snackbar_private_data_deleted), + any(), ) viewModel.sessionToDelete = null @@ -203,12 +177,9 @@ class TabsCleanupFeatureTest { verify { tabsUseCases.removePrivateTabs() - testCoroutineScope.allowUndo( - view = snackBarParentView, - message = testContext.getString(R.string.snackbar_private_data_deleted), - undoActionTitle = testContext.getString(R.string.snackbar_deleted_undo), - onCancel = any(), - operation = any(), + feature.showUndoSnackbar( + testContext.getString(R.string.snackbar_private_data_deleted), + any(), ) viewModel.sessionToDelete = null @@ -218,11 +189,14 @@ class TabsCleanupFeatureTest { @Test fun `GIVEN a session ID to delete WHEN feature is started THEN remove tab and show undo snackbar`() { val private = true - val tab: TabSessionState = mockk { every { content.private } returns private } val sessionId = "1" - mockkStatic("mozilla.components.browser.state.selector.SelectorsKt") - every { browserStore.state.findTab(sessionId) } returns tab + val tab: TabSessionState = mockk { + every { content.private } returns private + every { id } returns sessionId + } + + every { browserStore.state.tabs } returns listOf(tab) every { viewModel.sessionToDelete } returns sessionId feature.start() @@ -230,12 +204,9 @@ class TabsCleanupFeatureTest { verify { tabsUseCases.removeTab(sessionId) - testCoroutineScope.allowUndo( - view = snackBarParentView, - message = testContext.getString(R.string.snackbar_private_tab_closed), - undoActionTitle = testContext.getString(R.string.snackbar_deleted_undo), - onCancel = any(), - operation = any(), + feature.showUndoSnackbar( + testContext.getString(R.string.snackbar_private_tab_closed), + any(), ) viewModel.sessionToDelete = null @@ -245,16 +216,17 @@ class TabsCleanupFeatureTest { @Test fun `GIVEN homepage as a new tab is enabled and the last tab is to be removed WHEN feature is started THEN remove tab, show undo snackbar and ensure a new tab remains`() { val private = true - val tab: TabSessionState = mockk { every { content.private } returns private } val sessionId = "1" + val tab: TabSessionState = mockk { + every { content.private } returns private + every { id } returns sessionId + } every { settings.enableHomepageAsNewTab } returns true every { browsingModeManager.mode.isPrivate } returns private every { viewModel.sessionToDelete } returns sessionId - mockkStatic("mozilla.components.browser.state.selector.SelectorsKt") - every { browserStore.state.findTab(sessionId) } returns tab - every { browserStore.state.privateTabs.size } returns 1 + every { browserStore.state.tabs } returns listOf(tab) feature.start() @@ -265,12 +237,9 @@ class TabsCleanupFeatureTest { private = private, ) - testCoroutineScope.allowUndo( - view = snackBarParentView, - message = testContext.getString(R.string.snackbar_private_tab_closed), - undoActionTitle = testContext.getString(R.string.snackbar_deleted_undo), - onCancel = any(), - operation = any(), + feature.showUndoSnackbar( + testContext.getString(R.string.snackbar_private_tab_closed), + any(), ) viewModel.sessionToDelete = null @@ -280,28 +249,32 @@ class TabsCleanupFeatureTest { @Test fun `GIVEN homepage as a new tab is enabled and a session ID to delete WHEN feature is started THEN remove tab and show undo snackbar`() { val private = true - val tab: TabSessionState = mockk { every { content.private } returns private } val sessionId = "1" + val tab: TabSessionState = mockk { + every { content.private } returns private + every { id } returns sessionId + } + + val secondTab: TabSessionState = mockk { + every { content.private } returns private + every { id } returns "2" + } + every { settings.enableHomepageAsNewTab } returns true every { browsingModeManager.mode.isPrivate } returns private every { viewModel.sessionToDelete } returns sessionId - mockkStatic("mozilla.components.browser.state.selector.SelectorsKt") - every { browserStore.state.findTab(sessionId) } returns tab - every { browserStore.state.privateTabs.size } returns 2 + every { browserStore.state.tabs } returns listOf(tab, secondTab) feature.start() verify { tabsUseCases.removeTab(sessionId) - testCoroutineScope.allowUndo( - view = snackBarParentView, - message = testContext.getString(R.string.snackbar_private_tab_closed), - undoActionTitle = testContext.getString(R.string.snackbar_deleted_undo), - onCancel = any(), - operation = any(), + feature.showUndoSnackbar( + testContext.getString(R.string.snackbar_private_tab_closed), + any(), ) viewModel.sessionToDelete = null diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleManagerExtensionTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/advanced/LocaleManagerExtensionTest.kt @@ -5,10 +5,9 @@ package org.mozilla.fenix.settings.advanced import android.content.Context -import io.mockk.every -import io.mockk.mockk -import io.mockk.mockkObject import mozilla.components.support.locale.LocaleManager +import mozilla.components.support.test.robolectric.testContext +import org.junit.After import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue @@ -27,8 +26,13 @@ class LocaleManagerExtensionTest { @Before fun setup() { - context = mockk() - mockkObject(LocaleManager) + context = testContext + LocaleManager.clear(context) + } + + @After + fun tearDown() { + LocaleManager.clear(context) } @Test @@ -46,8 +50,6 @@ class LocaleManagerExtensionTest { @Test @Config(qualifiers = "en-rUS") fun `default locale selected`() { - every { LocaleManager.getCurrentLocale(context) } returns null - assertTrue(LocaleManager.isDefaultLocaleSelected(context)) } @@ -55,7 +57,7 @@ class LocaleManagerExtensionTest { @Config(qualifiers = "en-rUS") fun `custom locale selected`() { val selectedLocale = Locale.Builder().setLanguage("en").setRegion("UK").build() - every { LocaleManager.getCurrentLocale(context) } returns selectedLocale + LocaleManager.setNewLocale(context, locale = selectedLocale) assertFalse(LocaleManager.isDefaultLocaleSelected(context)) } @@ -67,7 +69,7 @@ class LocaleManagerExtensionTest { val selectedLocale = Locale.Builder().setLanguage("en").setRegion("UK").build() val localeList = listOf(otherLocale, selectedLocale) - every { LocaleManager.getCurrentLocale(context) } returns selectedLocale + LocaleManager.setNewLocale(context, locale = selectedLocale) assertEquals(selectedLocale, LocaleManager.getSelectedLocale(context, localeList)) } @@ -79,8 +81,6 @@ class LocaleManagerExtensionTest { val secondLocale = Locale.Builder().setLanguage("en").setRegion("UK").build() val localeList = listOf(firstLocale, secondLocale) - every { LocaleManager.getCurrentLocale(context) } returns null - assertEquals("en-US", LocaleManager.getSelectedLocale(context, localeList).toLanguageTag()) } } diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/ContentBlocking.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/ContentBlocking.java @@ -78,6 +78,8 @@ public class ContentBlocking { public static final SafeBrowsingProvider GOOGLE_SAFE_BROWSING_V5_PROVIDER = SafeBrowsingProvider.withName("google5") .lists( + "goog-badbinurl-proto", + "goog-downloadwhite-proto", "goog-phish-proto", "googpub-phish-proto", "goog-malware-proto", diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml @@ -10215,7 +10215,7 @@ # Whether @scope rule is enabled - name: layout.css.at-scope.enabled type: RelaxedAtomicBool - value: @IS_NIGHTLY_BUILD@ + value: true mirror: always rust: true @@ -19029,7 +19029,7 @@ #ifdef MOZ_WAYLAND - name: widget.wayland.fractional-scale.enabled type: bool - value: @IS_EARLY_BETA_OR_EARLIER@ + value: true mirror: always # Use opaque region for MozContainer wl_surface diff --git a/netwerk/protocol/http/nsHttpConnectionMgr.cpp b/netwerk/protocol/http/nsHttpConnectionMgr.cpp @@ -1984,9 +1984,14 @@ void nsHttpConnectionMgr::DispatchSpdyPendingQ( nsresult rv = DispatchTransaction(ent, pendingTransInfo->Transaction(), conn); if (NS_FAILED(rv)) { - // this cannot happen, but if due to some bug it does then - // close the transaction - MOZ_ASSERT(false, "Dispatch SPDY Transaction"); + // Dispatching a transaction to an existing HTTP/2 session should not + // fail. The only expected failure here is + // NS_ERROR_LOCAL_NETWORK_ACCESS_DENIED (e.g., when a + // speculative/preconnected HTTP/2 session was created before). Any other + // rv indicates a bug. + MOZ_ASSERT(rv == NS_ERROR_LOCAL_NETWORK_ACCESS_DENIED, + "Dispatch H2 transaction should only fail with Local Network " + "Access denied"); LOG(("ProcessSpdyPendingQ Dispatch Transaction failed trans=%p\n", pendingTransInfo->Transaction())); pendingTransInfo->Transaction()->Close(rv); diff --git a/package-lock.json b/package-lock.json @@ -9,30 +9,30 @@ "@microsoft/eslint-plugin-sdl": "1.1.0", "@stylistic/stylelint-plugin": "3.1.1", "@types/gecko": "file:tools/@types", - "eslint": "9.34.0", + "eslint": "9.38.0", "eslint-config-prettier": "10.1.8", - "eslint-plugin-eslint-plugin": "7.0.0", + "eslint-plugin-eslint-plugin": "7.2.0", "eslint-plugin-html": "8.1.3", "eslint-plugin-import": "2.32.0", "eslint-plugin-jest": "29.0.1", - "eslint-plugin-jsdoc": "54.1.1", + "eslint-plugin-jsdoc": "61.1.11", "eslint-plugin-json": "4.0.1", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-lit": "2.1.1", "eslint-plugin-mozilla": "file:tools/lint/eslint/eslint-plugin-mozilla", - "eslint-plugin-no-unsanitized": "4.1.2", + "eslint-plugin-no-unsanitized": "4.1.4", "eslint-plugin-promise": "7.2.1", "eslint-plugin-react": "7.37.5", - "eslint-plugin-react-hooks": "5.2.0", + "eslint-plugin-react-hooks": "7.0.1", "eslint-plugin-spidermonkey-js": "file:tools/lint/eslint/eslint-plugin-spidermonkey-js", - "jsdoc": "4.0.4", + "jsdoc": "4.0.5", "license-checker-rseidelsohn": "4.4.2", "prettier": "3.6.2", "stylelint": "16.14.1", "stylelint-config-recommended": "14.0.1", "stylelint-config-standard-scss": "14.0.0", "ts-patch": "3.3.0", - "typescript": "5.9.2", + "typescript": "5.9.3", "yarn": "1.22.22" } }, @@ -51,6 +51,123 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -62,23 +179,47 @@ } }, "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -87,20 +228,124 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@cacheable/memoize": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@cacheable/memoize/-/memoize-2.0.3.tgz", + "integrity": "sha512-hl9wfQgpiydhQEIv7fkjEzTGE+tcosCXLKFDO707wYJ/78FVOlowb36djex5GdbSyeHnG62pomYLMuV/OT8Pbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/utils": "^2.0.3" + } + }, + "node_modules/@cacheable/memory": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.3.tgz", + "integrity": "sha512-R3UKy/CKOyb1LZG/VRCTMcpiMDyLH7SH3JrraRdK6kf3GweWCOU3sgvE13W3TiDRbxnDKylzKJvhUAvWl9LQOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/memoize": "^2.0.3", + "@cacheable/utils": "^2.0.3", + "@keyv/bigmap": "^1.0.2", + "hookified": "^1.12.1", + "keyv": "^5.5.3" + } + }, + "node_modules/@cacheable/memory/node_modules/@keyv/bigmap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.1.0.tgz", + "integrity": "sha512-MX7XIUNwVRK+hjZcAbNJ0Z8DREo+Weu9vinBOjGU1thEi9F6vPhICzBbk4CCf3eEefKRz7n6TfZXwUFZTSgj8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.12.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.5.3" + } + }, + "node_modules/@cacheable/memory/node_modules/keyv": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.3.tgz", + "integrity": "sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, + "node_modules/@cacheable/utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.1.0.tgz", + "integrity": "sha512-ZdxfOiaarMqMj+H7qwlt5EBKWaeGihSYVHdQv5lUsbn8MJJOTW82OIwirQ39U5tMZkNvy3bQE+ryzC+xTAb9/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "keyv": "^5.5.3" + } + }, + "node_modules/@cacheable/utils/node_modules/keyv": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.3.tgz", + "integrity": "sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, "node_modules/@csstools/css-parser-algorithms": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", @@ -169,37 +414,47 @@ } }, "node_modules/@dual-bundle/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz", + "integrity": "sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==", "dev": true, "license": "MIT", "funding": { "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/JounQin" } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.53.0.tgz", - "integrity": "sha512-Wyed8Wfn3vMNVwrZrgLMxmqwmlcCE1/RfUAOHFzMJb3QLH03mi9Yv1iOCZjif0yx5EZUeJ+17VD1MHPka9IQjQ==", + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.76.0.tgz", + "integrity": "sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.8", - "@typescript-eslint/types": "^8.39.1", + "@typescript-eslint/types": "^8.46.0", "comment-parser": "1.4.1", "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~4.8.0" + "jsdoc-type-pratt-parser": "~6.10.0" }, "engines": { "node": ">=20.11.0" } }, + "node_modules/@es-joy/resolve.exports": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz", + "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "license": "MIT", "dependencies": { @@ -229,9 +484,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -239,13 +494,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -254,19 +509,35 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers/node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -301,9 +572,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", - "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz", + "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==", "dev": true, "license": "MIT", "engines": { @@ -314,9 +585,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -324,19 +595,32 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.2", + "@eslint/core": "^0.17.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -348,33 +632,19 @@ } }, "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "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", @@ -421,6 +691,56 @@ "node": ">=12" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@jsdoc/salty": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.9.tgz", @@ -435,9 +755,9 @@ } }, "node_modules/@keyv/serialize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.0.tgz", - "integrity": "sha512-RlDgexML7Z63Q8BSaqhXdCYNBy/JQnqYIwxofUrNLGCblOMHp+xux2Q8nLMLlPpgHQPoU0Do8Z6btCpRBEqZ8g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", "dev": true, "license": "MIT" }, @@ -562,9 +882,9 @@ } }, "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -592,6 +912,19 @@ "dev": true, "license": "MIT" }, + "node_modules/@sindresorhus/base62": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz", + "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@stylistic/stylelint-plugin": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.1.tgz", @@ -666,14 +999,14 @@ "license": "MIT" }, "node_modules/@typescript-eslint/project-service": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.41.0.tgz", - "integrity": "sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.2.tgz", + "integrity": "sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.41.0", - "@typescript-eslint/types": "^8.41.0", + "@typescript-eslint/tsconfig-utils": "^8.46.2", + "@typescript-eslint/types": "^8.46.2", "debug": "^4.3.4" }, "engines": { @@ -688,14 +1021,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz", - "integrity": "sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz", + "integrity": "sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0" + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -706,9 +1039,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz", - "integrity": "sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz", + "integrity": "sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==", "dev": true, "license": "MIT", "engines": { @@ -723,9 +1056,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz", - "integrity": "sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz", + "integrity": "sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==", "dev": true, "license": "MIT", "engines": { @@ -737,16 +1070,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz", - "integrity": "sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz", + "integrity": "sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.41.0", - "@typescript-eslint/tsconfig-utils": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0", + "@typescript-eslint/project-service": "8.46.2", + "@typescript-eslint/tsconfig-utils": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -792,9 +1125,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -805,16 +1138,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.41.0.tgz", - "integrity": "sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.2.tgz", + "integrity": "sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/typescript-estree": "8.41.0" + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -829,13 +1162,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz", - "integrity": "sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz", + "integrity": "sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/types": "8.46.2", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -897,9 +1230,9 @@ } }, "node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -1176,9 +1509,9 @@ } }, "node_modules/axe-core": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", - "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", + "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", "dev": true, "license": "MPL-2.0", "engines": { @@ -1202,6 +1535,16 @@ "dev": true, "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.21", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.21.tgz", + "integrity": "sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -1240,25 +1583,63 @@ "dev": true, "license": "ISC" }, + "node_modules/browserslist": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/cacheable": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.4.tgz", - "integrity": "sha512-Gd7ccIUkZ9TE2odLQVS+PDjIvQCdJKUlLdJRVvZu0aipj07Qfx+XIej7hhDrKGGoIxV5m5fT/kOJNJPQhQneRg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.1.1.tgz", + "integrity": "sha512-LmF4AXiSNdiRbI2UjH8pAp9NIXxeQsTotpEaegPiDcnN0YPygDJDV3l/Urc0mL72JWdATEorKqIHEx55nDlONg==", "dev": true, "license": "MIT", "dependencies": { - "hookified": "^1.11.0", - "keyv": "^5.5.0" + "@cacheable/memoize": "^2.0.3", + "@cacheable/memory": "^2.0.3", + "@cacheable/utils": "^2.1.0", + "hookified": "^1.12.2", + "keyv": "^5.5.3", + "qified": "^0.5.0" } }, "node_modules/cacheable/node_modules/keyv": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.0.tgz", - "integrity": "sha512-QG7qR2tijh1ftOvClut4YKKg1iW6cx3GZsKoGyJPxHkGWK9oJhG9P3j5deP0QQOGDowBMVQFaP+Vm4NpGYvmIQ==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.3.tgz", + "integrity": "sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A==", "dev": true, "license": "MIT", "dependencies": { - "@keyv/serialize": "^1.1.0" + "@keyv/serialize": "^1.1.1" } }, "node_modules/call-bind": { @@ -1334,6 +1715,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001751", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", + "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, "node_modules/catharsis": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", @@ -1502,6 +1904,13 @@ "dev": true, "license": "MIT" }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, "node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", @@ -1643,9 +2052,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -1846,6 +2255,13 @@ "dev": true, "license": "MIT" }, + "node_modules/electron-to-chromium": { + "version": "1.5.243", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.243.tgz", + "integrity": "sha512-ZCphxFW3Q1TVhcgS9blfut1PX8lusVi2SvXQgmEEnK4TCmE1JhH2JkjJN+DNt0pJJwfBri5AROBnz2b/C+YU9g==", + "dev": true, + "license": "ISC" + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -1891,9 +2307,9 @@ } }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2101,25 +2517,24 @@ } }, "node_modules/eslint": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", - "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz", + "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.1", + "@eslint/core": "^0.16.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.34.0", - "@eslint/plugin-kit": "^0.3.5", + "@eslint/js": "9.38.0", + "@eslint/plugin-kit": "^0.4.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", @@ -2178,9 +2593,9 @@ } }, "node_modules/eslint-compat-utils/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -2279,9 +2694,9 @@ } }, "node_modules/eslint-plugin-eslint-plugin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-plugin/-/eslint-plugin-eslint-plugin-7.0.0.tgz", - "integrity": "sha512-EgiW9zf4PbqA+yN9T6Z8bHx46+fWtAIXFrYkL4nSTnI84LnTKmzjh+cIJaVAyFVZveKUSG8LcVe1suGG78qZPw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-plugin/-/eslint-plugin-eslint-plugin-7.2.0.tgz", + "integrity": "sha512-3WOuoauBlxCItqpIdyajCOVQbCmAlqHNQq82QunpzuGkBNr6OqHRjdPZKpy2Z0rGb005mIO0HEP9aaDCzkApxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2379,22 +2794,26 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "54.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-54.1.1.tgz", - "integrity": "sha512-qoY2Gl0OkvATXIxRaG2irS2ue78+RTaOyYrADvg1ue+9FHE+2Mp7RcpO0epkuhhQgOkH/REv1oJFe58dYv8SGg==", + "version": "61.1.11", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.1.11.tgz", + "integrity": "sha512-c+NQQOFd+ZTjFt0pfFMB8OTumExg0vf8mlJsOtLj6qTDGewtLh7bhwoDgBg6rIiTziYc8N4u4dYmSdAIn0yTEQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.53.0", + "@es-joy/jsdoccomment": "~0.76.0", + "@es-joy/resolve.exports": "1.2.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", - "debug": "^4.4.1", + "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", "espree": "^10.4.0", "esquery": "^1.6.0", + "html-entities": "^2.6.0", + "object-deep-merge": "^2.0.0", "parse-imports-exports": "^0.2.4", - "semver": "^7.7.2", - "spdx-expression-parse": "^4.0.0" + "semver": "^7.7.3", + "spdx-expression-parse": "^4.0.0", + "to-valid-identifier": "^1.0.0" }, "engines": { "node": ">=20.11.0" @@ -2404,9 +2823,9 @@ } }, "node_modules/eslint-plugin-jsdoc/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -2547,9 +2966,9 @@ } }, "node_modules/eslint-plugin-n/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -2560,9 +2979,9 @@ } }, "node_modules/eslint-plugin-no-unsanitized": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.1.2.tgz", - "integrity": "sha512-ydF3PMFKEIkP71ZbLHFvu6/FW8SvRv6VV/gECfrQkqyD5+5oCAtPz8ZHy0GRuMDtNe2jsNdPCQXX4LSbkapAVQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.1.4.tgz", + "integrity": "sha512-cjAoZoq3J+5KJuycYYOWrc0/OpZ7pl2Z3ypfFq4GtaAgheg+L7YGxUo2YS3avIvo/dYU5/zR2hXu3v81M9NxhQ==", "dev": true, "license": "MPL-2.0", "peerDependencies": { @@ -2622,13 +3041,20 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", - "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, "engines": { - "node": ">=10" + "node": ">=18" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" @@ -2996,6 +3422,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -3064,9 +3510,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", - "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3359,10 +3805,27 @@ "he": "bin/he" } }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, "node_modules/hookified": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.12.0.tgz", - "integrity": "sha512-hMr1Y9TCLshScrBbV2QxJ9BROddxZ12MX9KsCtuGGy/3SmmN5H1PllKerrVlSotur9dlE8hmUKAOSa3WDzsZmQ==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.12.2.tgz", + "integrity": "sha512-aokUX1VdTpI0DUsndvW+OiwmBpKCu/NgRsSSkuSY0zq8PY6Q6a+lmOfAFDXAAOtBqJELvcWY9L1EVtzjbQcMdg==", "dev": true, "license": "MIT" }, @@ -3379,6 +3842,33 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, "node_modules/html-tags": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", @@ -3650,14 +4140,15 @@ } }, "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, @@ -3734,6 +4225,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -3991,9 +4492,9 @@ } }, "node_modules/jsdoc": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.4.tgz", - "integrity": "sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.5.tgz", + "integrity": "sha512-P4C6MWP9yIlMiK8nwoZvxN84vb6MsnXcHuy7XzVOvQoCizWX5JFCBsWIIWKXBltpoRZXddUOVQmCTOZt9yDj9g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4021,13 +4522,13 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.8.0.tgz", - "integrity": "sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.10.0.tgz", + "integrity": "sha512-+LexoTRyYui5iOhJGn13N9ZazL23nAHGkXsa1p/C8yeq79WRfLBag6ZZ0FQG2aRoc9yfo59JT9EYCQonOkHKkQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" } }, "node_modules/jsdoc/node_modules/escape-string-regexp": { @@ -4040,6 +4541,19 @@ "node": ">=8" } }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -4072,16 +4586,16 @@ "license": "MIT" }, "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, "bin": { "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, "node_modules/jsonc-parser": { @@ -4206,9 +4720,9 @@ } }, "node_modules/license-checker-rseidelsohn/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -4321,13 +4835,13 @@ } }, "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", - "engines": { - "node": ">=12" + "dependencies": { + "yallist": "^3.0.2" } }, "node_modules/markdown-it": { @@ -4504,9 +5018,9 @@ } }, "node_modules/mocha": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.1.tgz", - "integrity": "sha512-5EK+Cty6KheMS/YLPPMJC64g5V61gIR25KsRItHw6x4hEKT6Njp1n9LOlH4gpevuwMVS66SXaBBpg+RWZkza4A==", + "version": "11.7.4", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.4.tgz", + "integrity": "sha512-1jYAaY8x0kAZ0XszLWu14pzsf4KV740Gld4HXkhNTXwcHx4AUEDkPzgEHg9CM5dVcW+zv036tjpsEbLraPJj4w==", "dev": true, "license": "MIT", "dependencies": { @@ -4518,6 +5032,7 @@ "find-up": "^5.0.0", "glob": "^10.4.5", "he": "^1.2.0", + "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "log-symbols": "^4.1.0", "minimatch": "^9.0.5", @@ -4614,6 +5129,13 @@ "dev": true, "license": "MIT" }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, "node_modules/nopt": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", @@ -4647,9 +5169,9 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -4689,6 +5211,13 @@ "node": ">=0.10.0" } }, + "node_modules/object-deep-merge": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz", + "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==", + "dev": true, + "license": "MIT" + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -5217,6 +5746,19 @@ "node": ">=6" } }, + "node_modules/qified": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.5.1.tgz", + "integrity": "sha512-+BtFN3dCP+IaFA6IYNOu/f/uK1B8xD2QWyOeCse0rjtAebBmkzgd2d1OAXi3ikAzJMIBSdzZDNZ3wZKEUDQs5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.12.2" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -5380,14 +5922,27 @@ "lodash": "^4.17.21" } }, + "node_modules/reserved-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", + "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -6073,9 +6628,9 @@ } }, "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -6434,15 +6989,15 @@ } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.13.tgz", - "integrity": "sha512-gmtS2PaUjSPa4zjObEIn4WWliKyZzYljgxODBfxugpK6q6HU9ClXzgCJ+nlcPKY9Bt090ypTOLIFWkV0jbKFjw==", + "version": "6.1.18", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.18.tgz", + "integrity": "sha512-JUPnFgHMuAVmLmoH9/zoZ6RHOt5n9NlUw/sDXsTbROJ2SFoS2DS4s+swAV6UTeTbGH/CAsZIE6M8TaG/3jVxgQ==", "dev": true, "license": "MIT", "dependencies": { - "cacheable": "^1.10.4", + "cacheable": "^2.1.0", "flatted": "^3.3.3", - "hookified": "^1.11.0" + "hookified": "^1.12.0" } }, "node_modules/stylelint/node_modules/ignore": { @@ -6643,9 +7198,9 @@ } }, "node_modules/tapable": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", - "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "dev": true, "license": "MIT", "engines": { @@ -6669,6 +7224,23 @@ "node": ">=8.0" } }, + "node_modules/to-valid-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz", + "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/base62": "^1.0.0", + "reserved-identifiers": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/toml-eslint-parser": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/toml-eslint-parser/-/toml-eslint-parser-0.10.0.tgz", @@ -6786,9 +7358,9 @@ } }, "node_modules/ts-patch/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -6840,6 +7412,19 @@ "strip-bom": "^3.0.0" } }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -6932,9 +7517,9 @@ } }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -6978,6 +7563,37 @@ "dev": true, "license": "MIT" }, + "node_modules/update-browserslist-db": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -7175,9 +7791,9 @@ } }, "node_modules/workerpool": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.3.tgz", - "integrity": "sha512-slxCaKbYjEdFT/o2rH9xS1hf4uRDch1w7Uo+apxhZ+sf/1d9e0ZVkn42kPNGP2dgjIx6YFvSevj0zHvbWe2jdw==", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", + "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", "dev": true, "license": "Apache-2.0" }, @@ -7264,9 +7880,9 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -7307,6 +7923,13 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -7425,12 +8048,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zod": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", + "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, "tools/@types": { "dev": true, "license": "MPL-2.0" }, "tools/lint/eslint/eslint-plugin-mozilla": { - "version": "4.3.0", + "version": "4.3.2", "dev": true, "license": "MPL-2.0", "dependencies": { @@ -7442,8 +8088,8 @@ "toml-eslint-parser": "0.10.0" }, "devDependencies": { - "eslint": "9.34.0", - "mocha": "11.7.1" + "eslint": "9.38.0", + "mocha": "11.7.4" }, "engines": { "node": ">=22.0.0" @@ -7451,7 +8097,7 @@ "peerDependencies": { "@microsoft/eslint-plugin-sdl": "^1.0.0", "eslint": "^9.0.0", - "eslint-plugin-jsdoc": "^54.1.1", + "eslint-plugin-jsdoc": "^61.0.0", "eslint-plugin-no-unsanitized": "^4.1.0", "eslint-plugin-promise": "^7.2.1" }, diff --git a/package.json b/package.json @@ -8,30 +8,30 @@ "@microsoft/eslint-plugin-sdl": "1.1.0", "@stylistic/stylelint-plugin": "3.1.1", "@types/gecko": "file:tools/@types", - "eslint": "9.34.0", + "eslint": "9.38.0", "eslint-config-prettier": "10.1.8", - "eslint-plugin-eslint-plugin": "7.0.0", + "eslint-plugin-eslint-plugin": "7.2.0", "eslint-plugin-html": "8.1.3", "eslint-plugin-import": "2.32.0", "eslint-plugin-jest": "29.0.1", - "eslint-plugin-jsdoc": "54.1.1", + "eslint-plugin-jsdoc": "61.1.11", "eslint-plugin-json": "4.0.1", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-lit": "2.1.1", "eslint-plugin-mozilla": "file:tools/lint/eslint/eslint-plugin-mozilla", - "eslint-plugin-no-unsanitized": "4.1.2", + "eslint-plugin-no-unsanitized": "4.1.4", "eslint-plugin-promise": "7.2.1", "eslint-plugin-react": "7.37.5", - "eslint-plugin-react-hooks": "5.2.0", + "eslint-plugin-react-hooks": "7.0.1", "eslint-plugin-spidermonkey-js": "file:tools/lint/eslint/eslint-plugin-spidermonkey-js", - "jsdoc": "4.0.4", + "jsdoc": "4.0.5", "license-checker-rseidelsohn": "4.4.2", "prettier": "3.6.2", "stylelint": "16.14.1", "stylelint-config-recommended": "14.0.1", "stylelint-config-standard-scss": "14.0.0", "ts-patch": "3.3.0", - "typescript": "5.9.2", + "typescript": "5.9.3", "yarn": "1.22.22" }, "scripts": { diff --git a/python/l10n/fluent_migrations/bug_1970743_browser_utils.py b/python/l10n/fluent_migrations/bug_1970743_browser_utils.py @@ -0,0 +1,26 @@ +# Any copyright is dedicated to the Public Domain. +# http://creativecommons.org/publicdomain/zero/1.0/ + +import fluent.syntax.ast as FTL +from fluent.migrate import COPY_PATTERN +from fluent.migrate.helpers import transforms_from +from fluent.migrate.transforms import COPY + + +def migrate(ctx): + """Bug 1970743 - move some download strings to browser-utils.ftl, part {index}.""" + source = "toolkit/toolkit/downloads/downloadUtils.ftl" + target = "toolkit/toolkit/global/browser-utils.ftl" + + ctx.add_transforms( + target, + target, + transforms_from( + """ +browser-utils-file-scheme = {COPY_PATTERN(from_path, "download-utils-done-file-scheme")} + +browser-utils-url-scheme = {COPY_PATTERN(from_path, "download-utils-done-scheme")} +""", + from_path=source, + ), + ) diff --git a/python/mach/mach/config.py b/python/mach/mach/config.py @@ -83,6 +83,30 @@ class BooleanType(ConfigType): return "true" if value else "false" +class NullableBooleanType(ConfigType): + """ConfigType for nullable boolean: True, False, or None.""" + + @staticmethod + def validate(value): + if value is not None and not isinstance(value, bool): + raise TypeError() + + @staticmethod + def from_config(config, section, option): + value = config.get(section, option).lower() + if value == "true": + return True + elif value == "false": + return False + return None + + @staticmethod + def to_config(value): + if value is None: + return "unknown" + return "true" if value else "false" + + class IntegerType(ConfigType): @staticmethod def validate(value): @@ -118,6 +142,7 @@ class PathType(StringType): TYPE_CLASSES = { "string": StringType, "boolean": BooleanType, + "nullable_boolean": NullableBooleanType, "int": IntegerType, "pos_int": PositiveIntegerType, "path": PathType, diff --git a/python/mach/mach/settings.py b/python/mach/mach/settings.py @@ -2,34 +2,9 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this file, # You can obtain one at http://mozilla.org/MPL/2.0/. -from mach.config import ConfigType from mach.decorators import SettingsProvider -class NullableBooleanType(ConfigType): - """ConfigType for nullable boolean: True, False, or None.""" - - @staticmethod - def validate(value): - if value is not None and not isinstance(value, bool): - raise TypeError() - - @staticmethod - def from_config(config, section, option): - value = config.get(section, option).lower() - if value == "true": - return True - elif value == "false": - return False - return None - - @staticmethod - def to_config(value): - if value is None: - return "unknown" - return "true" if value else "false" - - @SettingsProvider class MachSettings: @classmethod @@ -57,7 +32,7 @@ class MachSettings: ), ( "mach_telemetry.is_employee", - NullableBooleanType, + "nullable_boolean", "Cached value for whether the user is a Mozilla employee " "(None=unknown, True=employee, False=not an employee)", None, diff --git a/remote/marionette/server.sys.mjs b/remote/marionette/server.sys.mjs @@ -398,7 +398,7 @@ export class TCPConnection { } /** - * Delegates message to client based on the provided {@code cmdID}. + * Delegates message to client based on the provided `cmdID`. * The message is sent over the debugger transport socket. * * The command ID is a unique identifier assigned to the client's request diff --git a/remote/shared/webdriver/Accessibility.sys.mjs b/remote/shared/webdriver/Accessibility.sys.mjs @@ -81,7 +81,7 @@ accessibility.ActionableRoles = new Set([ ]); /** - * Factory function that constructs a new {@code accessibility.Checks} + * Factory function that constructs a new `accessibility.Checks` * object with enforced strictness or not. */ accessibility.get = function (strict = false) { @@ -289,13 +289,13 @@ accessibility.Checks = class { } /** - * Test if an accessible has a {@code hidden} attribute. + * Test if an accessible has a `hidden` attribute. * * @param {nsIAccessible} accessible * Accessible object. * * @returns {boolean} - * True if the accessible object has a {@code hidden} attribute, + * True if the accessible object has a `hidden` attribute, * false otherwise. */ hasHiddenAttribute(accessible) { diff --git a/security/ct/CTKnownLogs.h b/security/ct/CTKnownLogs.h @@ -14,7 +14,7 @@ #include <stddef.h> -static const PRTime kCTExpirationTime = INT64_C(1767869862000000); +static const PRTime kCTExpirationTime = INT64_C(1768226955000000); namespace mozilla::ct { diff --git a/security/manager/ssl/StaticHPKPins.h b/security/manager/ssl/StaticHPKPins.h @@ -681,4 +681,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = { static const int32_t kUnknownId = -1; -static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1770289030405000); +static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1770646123325000); diff --git a/security/manager/ssl/nsSTSPreloadList.inc b/security/manager/ssl/nsSTSPreloadList.inc @@ -8,7 +8,7 @@ /*****************************************************************************/ #include <stdint.h> -const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); +const PRTime gPreloadListExpirationTime = INT64_C(1773065317034000); %% 0--1.de, 1 0-0.io, 1 @@ -352,7 +352,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 1001iq.com, 1 1001kartini.com, 1 1001mv.com, 1 -1001n.com, 1 1001reasonstolearnspanish.com, 1 1001telecommandes.com, 1 1007337.com, 0 @@ -361,9 +360,9 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 100baksov.tk, 1 100ballov.tk, 1 100bib.ru, 1 +100fast.com, 1 100kraz.ga, 1 100nome.com, 1 -100pay.com, 1 100plus.com.my, 1 100plus.com.sg, 1 100plus.sg, 1 @@ -371,7 +370,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 100pluspro.com, 1 100pour100print.com, 1 100pudov.tk, 1 -100reach.com, 1 100refer.tk, 1 100sapog.tk, 1 100skidok.ga, 1 @@ -533,7 +531,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 11333837.com, 1 113k8.com, 0 113z6.com, 1 -11400.com, 1 11443837.com, 0 114514ss.com, 1 114online.com, 1 @@ -643,6 +640,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 12.ag, 1 12.digital, 1 1200.cf, 1 +12006.com, 1 120percent-inc.com, 1 1212.tk, 1 1212873467.rsc.cdn77.org, 1 @@ -720,8 +718,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 1244.tk, 1 1244546066.rsc.cdn77.org, 1 125-rue.com, 1 -12517.com, 1 -12557.com, 1 125c.cn, 1 125colours.tk, 1 125m125.de, 1 @@ -729,7 +725,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 127661.com, 1 1288366.com, 1 129.co, 1 -12apostleshotel.com, 1 12fkcdtcetteefqv.myfritz.net, 1 12go.asia, 1 12go.co, 1 @@ -981,6 +976,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 171365y.com, 1 171365z.com, 1 17187q.com, 1 +17190.com, 1 1720301.com, 1 1720303.com, 1 1720304.com, 1 @@ -1035,6 +1031,8 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 174343.com, 1 175dt.com, 1 177milkstreet.com, 1 +17920.com, 1 +17921.com, 1 17dbz.org, 1 17experience.com.br, 1 17hats.com, 0 @@ -1057,6 +1055,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 1837365.com, 1 183cm.tk, 1 1844329061.rsc.cdn77.org, 1 +18521.com, 1 185k8.com, 0 186526.club, 1 186526.xyz, 1 @@ -1198,6 +1197,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 1dv.link, 1 1e9.nl, 1 1eanda.com, 1 +1earn.com, 1 1er-secours.ch, 0 1f123.net, 1 1f616emo.xyz, 1 @@ -1456,7 +1456,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 1xmyanmar.net, 1 1xpartners.com, 1 1xraja.com, 1 -1xrindu.com, 1 1xsinga.com, 1 1xslot-ua.com, 1 1xslot.casino, 1 @@ -1718,6 +1717,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 2495dentalimplants.com, 1 249722.com, 1 249cq.com, 1 +24alarm.com, 1 24ball.com, 1 24bel.ru, 0 24bit.dk, 1 @@ -1734,7 +1734,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 24images.com, 1 24k.co.jp, 1 24onlain.tk, 1 -24see.com, 1 24slides.com, 1 24webservice.nl, 1 24x7aircargoservices.co.in, 1 @@ -1902,6 +1901,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 2ugaming.com, 1 2url.link, 1 2ustyle.com, 1 +2value.com, 1 2vnews.com, 1 2vp-an.online, 1 2wth.com, 1 @@ -2050,7 +2050,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 360china.com, 1 360cycling.com.br, 1 360degreecloud.com, 1 -360dental.com, 1 360e-commerce.net, 1 360ecogroup.com, 0 360ecommerce.net, 1 @@ -2059,6 +2058,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 360islam.com, 1 360kuvia.fi, 1 360mediaworks.com, 1 +360now.com, 1 360organic.com, 1 360primeview.ie, 1 360prokuvat.fi, 1 @@ -2324,15 +2324,16 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 3dissue.com, 1 3djake.de, 1 3djake.uk, 1 -3djapan.com, 1 3djava.ml, 1 3dlab.team, 1 +3dlan.com, 1 3dm.audio, 1 3dmedium.de, 1 3dmetalprinting.tk, 1 3dmix.sk, 1 3dmusiclab.nl, 1 3do3dont.com, 1 +3down.com, 1 3dprintedhouse.nl, 1 3dprintedobjects.be, 1 3dprintsondemand.eu, 1 @@ -2362,6 +2363,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 3gokushi.com, 1 3haeuserprojekt.org, 1 3hh365.com, 1 +3huan.com, 1 3i-infotech.com, 1 3ieimpact.org, 1 3ii365.com, 1 @@ -2628,7 +2630,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 4digitiq.nl, 1 4dillusion.tk, 1 4dimension.net, 1 -4dplay.com, 1 4dsoft.com, 1 4dstyle.com, 1 4e8.net, 1 @@ -2721,7 +2722,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 5000164.com, 1 5000164.jp, 1 5000yz.com, 1 -5002888.com, 1 +5002888.com, 0 5007999.com, 1 500f500.com, 1 500fcw.com, 1 @@ -2762,7 +2763,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 50thingstodo.org, 1 511.org, 1 511in.org, 1 -51365a.com, 0 51365aa.com, 1 51365bb.com, 1 51365cc.com, 1 @@ -2827,7 +2827,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 51dazhe.com, 1 51evar.com, 1 51fishing.com, 1 -51free.com, 1 +51flower.com, 1 51fss.marketing, 1 51lavanderiaindustrial.com.br, 1 51life.com, 1 @@ -2953,7 +2953,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 578380.com, 1 5792.org, 1 5795887.com, 1 -585380.com, 1 588e.com, 1 589174.com, 1 589team.com, 1 @@ -3327,7 +3326,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 676812.com, 0 677314.com, 0 677340.com, 0 -677341.com, 1 677346.com, 1 677354.com, 1 677364.com, 0 @@ -3459,7 +3457,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 721172.com, 0 7214.cc, 1 722201.com, 0 -724online.com, 1 725741.com, 1 7261696e626f77.net, 1 727sss.com, 1 @@ -3755,7 +3752,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 838888.net, 1 83ir2k8b.duckdns.org, 1 83kb88.com, 1 -84000.com, 1 84036.ml, 1 842844.com, 1 8444.cf, 1 @@ -3921,7 +3917,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 889w889.net, 1 88acesmaritime.com, 1 88bet86.com, 0 -88bill.com, 1 88cakescorner.com, 1 88djl.cc, 1 88home9.com, 1 @@ -4088,7 +4083,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 9098.cf, 1 90daydiet.org, 1 90daysales.com, 1 -90minut.com, 1 90r.jp, 1 90splease.com, 1 91-av.com, 1 @@ -4492,8 +4486,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 9508.cf, 1 9509.cf, 1 9510.cf, 1 -95107.com, 1 -95108.com, 1 +95105.com, 1 9511.cf, 1 9512.cf, 1 9513.cf, 1 @@ -4535,7 +4528,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 9552.cf, 1 9553.cf, 1 9554.cf, 1 -95544.com, 1 95558.com, 1 95559.com, 1 9556.cf, 1 @@ -4602,9 +4594,9 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 9617.cf, 1 9617818.net, 1 9618.cf, 1 +96181.com, 1 9619.cf, 1 9620.cf, 1 -96200.com, 1 9621.cf, 1 9622.cf, 1 96229.com, 1 @@ -4616,15 +4608,12 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 9629.cf, 1 9630.cf, 1 9631.cf, 1 -96316.com, 1 9632.cf, 1 9633.cf, 1 -96448.com, 1 -96605.com, 1 +96607.com, 1 9666ks.com, 1 96685.com, 1 966ty.com, 1 -967606.com, 1 9700.cf, 1 9701.cf, 1 9702.cf, 1 @@ -4893,7 +4882,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 999family.com, 0 999salon.co, 1 999zlong.com, 1 -99bt.com, 1 99buffets.com, 1 99furnitureideasandtips.gq, 1 99furnitureideasexamples.ga, 1 @@ -4912,7 +4900,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 9ccn.top, 1 9elements.com, 0 9face.com, 1 -9fruit.com, 1 9fvip.net, 1 9gag.com, 1 9hosts.net, 1 @@ -4996,7 +4983,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1772708222473000); 9k899.com, 1 9l.com.au, 1 9lab.jp, 1 -9lo9.vip, 1 9mp.ro, 1 9ostech.com, 1 9pkfz.com, 1 @@ -5086,7 +5072,6 @@ a2n-expertise.com, 1 a2ssrl.duckdns.org, 1 a2zbabyname.com, 1 a2zplumbing.com.au, 1 -a340.com, 1 a356.top, 1 a36533.com, 1 a3m.gmbh, 1 @@ -5292,7 +5277,6 @@ abastor.tk, 1 abay-today.tk, 1 abbadabbabouncycastles.co.uk, 1 abbas.ch, 1 -abbauniformes.com.br, 1 abbaye-chaise-dieu.com, 1 abbayedumoncel.fr, 1 abbevillecountysc.gov, 1 @@ -5408,7 +5392,6 @@ aberdeencriticalmass.tk, 1 aberon.pl, 1 aberrantvascular.tk, 1 aberte.com, 1 -abetrans.com, 1 abettercreditunion.com, 1 abetterdeath.com, 1 abetterwichita.org, 1 @@ -5489,13 +5472,11 @@ ablx.de, 1 abmackenzie.com, 1 abmarketx.com, 1 abmc.gov, 1 -abmelden.com, 1 abminv.com, 1 abmledger.ca, 1 abn-consultants.ie, 1 abnamropensioenen.nl, 0 abnarnro.com, 0 -abnb.co, 1 abnbfcu.org, 1 abnehmen-sport-fitness.de, 1 abnobapetstore.co.uk, 1 @@ -5579,7 +5560,6 @@ abouttablewares.tk, 1 abouttime.gq, 1 abouttoblow.com, 1 abouttravel.gq, 1 -aboutvpn.com, 1 aboutwealthcreation.tk, 1 aboutyou.at, 1 aboutyou.be, 1 @@ -5741,7 +5721,6 @@ academiaofimage.com, 1 academiaveritas.com, 1 academicassembly.com, 1 academicexperts.com, 1 -academicexperts.org, 1 academichealthscience.net, 1 academichelp.gq, 1 academie-angoumois.org, 1 @@ -6418,7 +6397,6 @@ adaptivesite.gq, 1 adaptiveu.io, 1 adaptyourlifeacademy.com, 1 adarixconsultores.com, 1 -adarsh-pandey.com, 1 adarshcloud.in, 1 adarsvidler.me, 1 adasbench.com, 1 @@ -6524,7 +6502,6 @@ adelightfulglow.com, 1 adelina.com.br, 0 adelinemerrick.com, 1 adelonline.tk, 1 -adelphiawines.com, 1 ademaulana.tk, 1 adenergetics.tech, 1 adenhurra.cf, 1 @@ -6788,7 +6765,6 @@ adscss.eu, 1 adsense-arbitrage.com, 1 adseye.tk, 1 adsforcash.ga, 1 -adshooter.com, 1 adsib.gob.bo, 1 adsintl.net, 1 adsl2meg.fr, 1 @@ -6833,6 +6809,7 @@ adultbizz.eu, 1 adulteducation.org.uk, 1 adultforum.gr, 0 adultgames.pro, 1 +adultgeek.com, 1 adulttrust.com, 1 aduro.com.tr, 1 adurra.com, 1 @@ -7021,7 +6998,6 @@ adygheya-news.net, 1 adygio.com, 1 adytonpbc.com, 1 adzie.xyz, 1 -adztv.co.il, 1 adzuna.at, 1 adzuna.ca, 1 adzuna.co.nz, 1 @@ -7090,7 +7066,6 @@ aeis-api-stg.azurewebsites.net, 1 aeis-api.azurewebsites.net, 1 aejaca.com, 1 aeksantcugat.tk, 1 -aeksara.com, 1 aeksistem.com, 1 aelgame.com, 1 aelia.cc, 1 @@ -7431,7 +7406,6 @@ afterskool.eu, 1 afterstack.net, 1 aftodioikisi.gr, 1 aftonbladet.se, 1 -aftontickets.com, 1 afuturewithoutfear.org, 1 afuturewithoutfear.us, 1 afuzion.com, 1 @@ -7672,7 +7646,6 @@ aginion.com, 1 aginion.net, 1 agioanmark.tk, 1 agiosthomas.tk, 1 -agirc-arrco.fr, 1 agirlknows.com, 1 agitmedia.ru, 1 agks02.com, 0 @@ -7800,6 +7773,7 @@ agrokomi.tk, 1 agrokredit.ga, 1 agroland.tk, 1 agrolife.tk, 1 +agroma.com, 1 agromanagement.kz, 1 agromotorsburzaco.com, 1 agron.tk, 1 @@ -7972,7 +7946,6 @@ aiatsis.gov.au, 1 aib.gov.uk, 1 aibaoyou.com, 1 aibes.org, 1 -aibey.cloud, 1 aibili.pt, 1 aibios.cloud, 1 aibiying.com, 1 @@ -8281,6 +8254,7 @@ airfix.com, 1 airflightsdeals.com, 1 airforce-technology.com, 1 airforce.com, 1 +airfoto.com, 1 airfoto.tk, 1 airfox.cf, 1 airfox.gq, 1 @@ -8536,7 +8510,6 @@ airweb.top, 0 airwolf.tk, 1 airwolfthemes.com, 1 airzone.tk, 1 -airzox.com, 1 aisawa22.com, 1 aiscale.fr, 1 aischepervers-porn.com, 1 @@ -8592,6 +8565,7 @@ aixlab.de, 1 aixm.aero, 1 aixploringprovence.com, 1 aixue.net, 1 +aizhuan.com, 1 aizxxs.com, 1 aizxxs.net, 1 aj-laixada.tk, 1 @@ -8696,8 +8670,6 @@ akaphonelink.com, 1 akaratasker.com, 1 akari.net, 1 akariforge.com, 1 -akarisoftware.com, 1 -akarisoftware.eu, 1 akaritakai.net, 1 akaritaste.ch, 1 akasa.red, 1 @@ -8712,6 +8684,7 @@ akasmedikal.com, 1 akasmedikal.net, 1 akatsukainuneko.co.jp, 1 akaxaka.tk, 1 +akayu.com, 1 akaziya.cf, 1 akbam.co.uk, 1 akbarsempoi.tk, 1 @@ -9122,6 +9095,7 @@ alcarpentry.co, 1 alcatraz-webdesign.tk, 1 alcatrazeast.com, 1 alcatraztourtickets.com, 1 +alcatrazz.com, 1 alcazaar.com, 1 alchakov.tk, 1 alchemist-heaven.tk, 1 @@ -9140,7 +9114,6 @@ alcides.me, 1 alcites.com, 1 alcnutrition.com, 1 alcobendas.tk, 1 -alcoclinica.ru, 1 alcoholia.tk, 1 alcoholicbeverages.tk, 1 alcoholismtreatment.tk, 1 @@ -9151,7 +9124,6 @@ alcor.tk, 1 alcorncountyms.gov, 1 alcove.cf, 1 alcovidvaccine.gov, 1 -alctel.com.br, 0 alcubillas.tk, 1 aldanpa.gov, 1 aldarcake.com, 1 @@ -9314,6 +9286,7 @@ alexandraschmidt.coach, 1 alexandrastrauss.fr, 1 alexandrawett.org, 1 alexandre-acaries.fr, 1 +alexandre-barret.fr, 1 alexandrebassi.com, 1 alexandreguarita.com.br, 1 alexandremottier.tk, 1 @@ -9442,7 +9415,6 @@ alfatar-milk.com, 1 alfateks.com.ua, 1 alfavit.cf, 1 alfawedding.com, 1 -alfesystem.com, 1 alfithrah.ac.id, 1 alfm.fr, 1 alfonso-baya.tk, 1 @@ -9513,6 +9485,7 @@ alhsfb.com, 0 alhuqul-kh.com, 1 ali-shariati.tk, 1 alia-helianthi.tk, 1 +aliads.com, 1 aliakpoyraz.com, 1 alialkurdy.tk, 1 aliamakeup.com, 1 @@ -9677,7 +9650,6 @@ alko-stop.ml, 1 alkoferma.gq, 1 alkogol.ga, 1 alkoholiker-forum.de, 1 -alkomedfrank.com, 1 alkon.gg, 1 alkopedia.tk, 1 alkor.tk, 1 @@ -10601,7 +10573,6 @@ amabiligranilhas.com, 1 amac.tv, 1 amacuk.co.uk, 1 amad-bargh.com, 1 -amadera.com, 1 amaderforum.tk, 1 amadeusproject.cf, 1 amadin.tk, 1 @@ -10693,7 +10664,6 @@ amazing-castles.co.uk, 1 amazing-maids.com, 1 amazingbusinessresults.com, 1 amazingraymond.com, 1 -amazingraymond.com.au, 1 amazingribs.com, 1 amazingsmilesfl.com, 1 amazingstore.gq, 1 @@ -11702,7 +11672,6 @@ anextraordinaryday.net, 1 anfadern.com, 1 anfieldbc.co.uk, 1 anfilada.info, 1 -anfloors.ru, 1 anfr.fr, 1 anfra.fi, 1 angablade.com, 1 @@ -11809,7 +11778,6 @@ angryteeth.net, 1 angstakademie.com, 1 angstrommold.com, 1 angular-js.ga, 1 -anguloconsulting.com, 1 angusandperthpgl.tk, 1 angusbarn.com, 1 anh-dv.com, 1 @@ -12706,6 +12674,7 @@ apercloud.es, 1 aperioadvice.ga, 1 aperiomoney.ga, 1 aperiotaxation.ga, 1 +apert.be, 1 aperta.ro, 1 aperta.shop, 1 apertis.org, 0 @@ -12908,7 +12877,6 @@ apostasecasinos.pt, 1 apostasolida.com, 1 apostillelondon.com, 1 apostrophe.pl, 1 -apotex.com, 1 apothecarydouglasville.com, 1 apotheek-ict.nl, 1 apotheekvanwacht.be, 1 @@ -14429,6 +14397,7 @@ as202413.net, 1 as203145.com, 1 as204982.net, 1 as205794.net, 1 +as205941.net, 1 as207618.net, 1 as207960.net, 1 as209245.net, 1 @@ -14589,9 +14558,8 @@ ashesdiamonds.com, 1 ashesheriff.gov, 1 ashevillemenshealth.com, 1 ashfak.tk, 1 -ashfordcastle.com, 1 ashgroveclinic.com.au, 1 -ashgw.me, 1 +ashgw.me, 0 ashiba-kagu.com, 1 ashikagroup.com, 0 ashikajewellers.com.au, 1 @@ -15342,7 +15310,6 @@ atlas-multimedia.de, 1 atlas-sat.tk, 1 atlas-staging.ml, 1 atlas.computer, 0 -atlas.md, 1 atlas.promo, 1 atlasams.com, 1 atlasbridge.com, 1 @@ -16594,6 +16561,7 @@ avinguard.com, 1 avinilo.com, 1 avinode.com, 1 avinodegroup.com, 1 +avintivmedia.com, 1 avio.rest, 1 aviodrome.nl, 0 aviokarte.rs, 1 @@ -16605,7 +16573,7 @@ aviruptribedi.com, 1 avisbabes.com, 1 avishanx.com, 1 avishwebsoft.com, 1 -avisodeprivacidad.info, 1 +avisodeprivacidad.info, 0 avisofi-credit-immobilier.fr, 1 avisoshuaraz.tk, 1 avisoversigten.dk, 1 @@ -17371,6 +17339,7 @@ ba7jcm.top, 1 ba7rain.tk, 1 baaam.se, 1 baac-dewellmed.com, 1 +baademarine.no, 1 baams.tk, 1 baaradvies.nl, 0 baardagaam.com, 1 @@ -17469,7 +17438,6 @@ babynames.net, 1 babynamesdirect.com, 1 babynoise.tk, 1 babynow.org, 1 -babypalooza.com, 1 babypharm.ga, 1 babypoppen.tk, 1 babyportal.net, 1 @@ -17657,6 +17625,7 @@ badkamermarkt.com, 1 badkamermarkt.net, 1 badkamermarkt.nl, 1 badkeys.info, 1 +badmania.fr, 1 badmessage.tk, 1 badmice.tk, 1 badminton-forum.tk, 1 @@ -18097,7 +18066,6 @@ banderas-mundo.es, 1 banderasdelmundo.xyz, 1 banderatx.gov, 1 banderol.tk, 1 -bandhanbank.com, 1 bandidosmc.com, 1 bandiere-mondo.it, 1 bandiga.it, 1 @@ -18290,6 +18258,7 @@ baratzegrowshop.com, 1 baravalle.com, 1 baraxolka.ga, 1 baraxolka.ml, 1 +barbara-bertagnolli.co.uk, 1 barbara-fuchs-gruene-fuerth.de, 1 barbarabryce.com, 1 barbaraedanielsantos.ga, 1 @@ -18300,7 +18269,6 @@ barbarianbear.art, 1 barbarians.com, 0 barbaros.info, 1 barbate.fr, 1 -barbeirocetif.com.br, 1 barbericonic.com, 1 barberscorner.tk, 1 barbershop-harmony.org, 0 @@ -18613,7 +18581,6 @@ basllp.co.uk, 1 basmacioglu.com, 1 basmp.ml, 1 basnachtegaal.tk, 1 -basnoslovno.ru, 0 basonlinemarketing.nl, 0 basradio.tk, 1 bass-pro.ru, 1 @@ -19247,6 +19214,7 @@ beatmalaria.org, 1 beaton.tk, 1 beatquantum.com, 1 beatrice-nightscout.herokuapp.com, 1 +beatrice-raws.org, 1 beatricedailysun.com, 1 beatriz-urbano-vega.tk, 1 beatrizaebischer.ch, 0 @@ -19777,7 +19745,6 @@ belle-epoque-toys.com, 1 bellebakes.blog, 1 bellebaum.eu, 1 bellecarmen.tk, 1 -bellehorizon.co.za, 1 bellenews.com, 1 bellenundballern.de, 1 belleplaineiowa.gov, 1 @@ -19911,7 +19878,6 @@ benedictineravenstore.com, 1 benedictoaguilar.tech, 1 benedikto.tk, 1 benedyktynki-sakramentki.org, 1 -benedyktynki.info, 1 benee-awraham.nl, 1 benefactgroup.com, 1 benefeds.com, 1 @@ -20316,6 +20282,7 @@ besnik.tk, 1 besola.de, 1 besole.ch, 1 besolov.tk, 1 +besonline.es, 1 besox.be, 1 bespaarbazaar.nl, 1 bespaarenergie.click, 1 @@ -20651,6 +20618,7 @@ bestpornpictures.com, 1 bestpracticesleidraad.nl, 1 bestpressurewashingchicago.com, 1 bestpricelovers.com, 1 +bestprofessionalchainsaw.com, 1 bestpromoving.com, 1 bestratedremovals.co.uk, 1 bestratedtransport.com.au, 1 @@ -21178,7 +21146,6 @@ bghddevelopment.com, 1 bghope.com, 1 bghost.xyz, 1 bginsulation.com, 1 -bgiworldwide.com, 1 bgjargon.com, 1 bgkoleda.bg, 1 bglsingles.de, 1 @@ -21949,7 +21916,6 @@ biolibre.mx, 1 biolibre.pe, 1 biolibre.uy, 1 biolika.ua, 1 -biolink.vn, 1 biolinksperu.com, 1 biolinky.co, 0 biolivre.com.br, 1 @@ -22590,6 +22556,7 @@ bkin-42740.xyz, 1 bkin-43450.xyz, 1 bkin-46680.xyz, 1 bkk24.de, 1 +bkkf.at, 1 bkkposn.com, 1 bklaindia.com, 1 bkli.me, 1 @@ -23544,7 +23511,7 @@ boardspot.com, 1 boardusersers.ga, 1 boat-engines.eu, 1 boat-systems.pl, 0 -boathut.com.au, 1 +boatandsailboat.com, 1 boats.com, 0 boatsandoats.com, 1 boatseller.org, 1 @@ -23762,7 +23729,6 @@ bolele.org, 1 boleleboyz.org, 1 boleros.tk, 1 boletosdeavionbaratos.tk, 1 -boletus.icu, 1 bolevia.com, 1 boleyn.su, 1 bolgarnyelv.hu, 1 @@ -23820,7 +23786,6 @@ bolzanoinfo.it, 1 boma.ml, 1 bomanufacture.com, 1 bombard.ga, 1 -bombe-lacrymogene.fr, 1 bombeirostv.pt, 0 bomberosceuta.tk, 1 bomberus.de, 1 @@ -24051,7 +24016,6 @@ boombangcreditos.tk, 1 boomboomboat.com, 1 boombox.fi, 1 boombrd.com, 1 -boomerang.com, 0 boomerjacks.com, 1 boomfestival.org, 1 boomfinity.xyz, 1 @@ -24097,7 +24061,6 @@ boostertonbusiness.com, 1 boostgame.win, 1 boostport.com, 1 boostport.com.au, 1 -boostsafety.com, 1 boostylabs.com, 1 boot-berlin.de, 1 bootcampkatwijk.nl, 1 @@ -24481,11 +24444,9 @@ bovet.com, 1 bovileva.com.ua, 1 bovomed.nl, 1 bovworkplacepensions.com, 1 -bow-ter.com, 1 bowdens.me, 1 bowdoinmaine.gov, 1 bowenrealty.com, 1 -boweryandvine.com, 1 bowhill.me, 1 bowhunter-ahorn.de, 0 bowlcake.fr, 1 @@ -24851,7 +24812,6 @@ brau-ingenieur.de, 1 braudoktor.de, 1 brauer-augenoptik.de, 1 brauingenieur.de, 1 -braun-russia.ru, 1 braunbergerfreelance.com, 1 braunpodiatryplus.com, 1 braunsteinpc.com, 0 @@ -25082,7 +25042,6 @@ brianjohnson.co.za, 1 brianjosephdavis.tk, 1 briankanode.com, 1 briankavanaugh.com, 1 -briankerstenveterinarian.com, 0 brianlachapelle.tk, 1 brianlanders.us, 1 brianleejackson.com, 1 @@ -25113,7 +25072,6 @@ brickland.tk, 1 bricks-clicks.com, 1 bricks4kidzelearn.com, 1 bricksandmotor.co.uk, 1 -brickup.de, 1 brickweb.co.uk, 1 brickwerks.io, 1 bricmon.com, 1 @@ -25229,6 +25187,7 @@ brilliant-minds.tk, 1 brilliantbouncyfun.co.uk, 1 brilliantmed.cn, 1 brillie.tk, 1 +brillio.com, 1 brillionwi.gov, 1 brillionworks.com, 1 brimfinancial.com, 1 @@ -25247,7 +25206,7 @@ bringme.com, 1 bringonbusiness.com, 1 brinker.com, 1 brinkhaven.gov, 1 -brinkhu.is, 1 +brinkhu.is, 0 brinksurl.com, 1 brinksurls.com, 1 brinokidzonline.tk, 1 @@ -25266,7 +25225,6 @@ brisceremony.com, 1 brisignshop.com.au, 1 briskteaching.com, 1 brisp.nl, 0 -bristebein.com, 1 bristlecone.com, 1 bristol-taxi.com, 1 bristolandwestonsuperbounce.com, 1 @@ -25315,7 +25273,6 @@ brittainconsulting.ca, 1 brittany.com.ph, 1 brittanyferriesnewsroom.com, 1 brittas-world.tk, 1 -britva-optom.com, 1 brivawn.com, 1 brix-central.tk, 1 brixxonline.nl, 0 @@ -26081,7 +26038,6 @@ builtinaustin.com, 1 builtinboston.com, 1 builtinchicago.org, 1 builtincolorado.com, 1 -builtingym.com, 1 builtinla.com, 1 builtinnyc.com, 1 builtinseattle.com, 1 @@ -26458,6 +26414,7 @@ businesscaster.ga, 1 businesscellar.ga, 1 businesscharm.ga, 1 businesscharts.ga, 1 +businesscheckin.sg, 1 businesscircus.ga, 1 businesscisco.tk, 1 businesscloud.co.uk, 1 @@ -27385,7 +27342,6 @@ cadencescience.com, 1 cadervaulters.co.uk, 1 cadetsge.ch, 0 cadfl.com, 1 -cadflow.pt, 1 cadiar.tk, 1 cadici.ga, 1 cadifit.ga, 1 @@ -27843,6 +27799,7 @@ cameriere.it, 1 cameroncopa.gov, 1 cameroncountytx.gov, 1 cameronherold.com, 1 +cameronphotographyok.com, 1 cameronstar.tk, 1 cameronwince.com, 1 cameronwv.gov, 1 @@ -28142,6 +28099,7 @@ cankado.com, 1 canker.org, 1 cankhon.tk, 1 cankirihaber.tk, 1 +cankutahya.com.tr, 1 canliradyodinle.fm, 1 canlitelefonhatti.ga, 1 canlom.tk, 1 @@ -28152,6 +28110,7 @@ cannabisdiscounter.ca, 1 cannabisfactsnevada.org, 1 cannabisfactsnv.org, 1 cannabishouseyeg.com, 1 +cannabislegality.info, 1 cannabisreports.org, 1 cannabistraininguniversity.com, 1 cannabiz.tk, 1 @@ -28640,7 +28599,6 @@ cargosapiens.com.br, 1 cargotariff.ml, 1 carhunters.cz, 1 caribank.org, 1 -caribbean-tekton.com, 1 caribbeanbottlerstt.com, 1 caribbeancinemas.com, 1 caribuku.tk, 1 @@ -28739,6 +28697,7 @@ carlshamnsvaxtrike.se, 1 carlshamnvaxtrike.se, 1 carlsonfonder.se, 1 carlsonfunds.com, 1 +carlsonsolutionsmn.com, 1 carlsonsw.com, 1 carlstammerjohn.com, 1 carlstoker.com, 1 @@ -29519,7 +29478,6 @@ catfood.cf, 1 catfood.ga, 1 catfooddispensersreviews.com, 1 catfoto.cf, 1 -catfun-foto.de, 1 catgarden.tk, 1 catgirl.center, 0 catgirl.cloud, 1 @@ -29877,7 +29835,7 @@ cdc.cx, 1 cdc.gov, 1 cdcflix.xyz, 1 cdcpartners.gov, 1 -cdd.go.th, 0 +cdd.go.th, 1 cdda.ch, 0 cdeeply.com, 1 cdf.fyi, 1 @@ -31304,7 +31262,7 @@ cherrycountyne.gov, 1 cherrycredits.com, 1 cherrycreeknorth.com, 1 cherryjimbo.sucks, 1 -cherrynova.live, 1 +cherrynova.live, 0 cherryonit.com, 0 cherrypink.no, 1 cherubicsoft.com, 1 @@ -31327,7 +31285,6 @@ chesswiki.org, 1 chester-law.com, 1 chesterbennington.tk, 1 chestercountysc.gov, 1 -chesterfieldmayfair.com, 1 chesterultimatefrisbee.tk, 1 chestnut.cf, 1 chetin-orlov.ga, 1 @@ -31379,6 +31336,7 @@ chic-leather.com, 1 chic-weddings.com, 1 chicago-mold.com, 1 chicagobasementblog.com, 1 +chicagocitydeck.com, 1 chicagoconcretecleaning.com, 1 chicagoillinois.gq, 1 chicagomaroon.com, 1 @@ -32086,6 +32044,7 @@ chytris.cz, 1 chziq.com, 1 ci-fo.org, 0 ci-suite.com, 1 +ci.com.br, 1 cia-gaming.de, 1 cia.gov, 1 ciagutek.pl, 1 @@ -32174,7 +32133,7 @@ cigarterminal.com, 0 cigdelivery.com, 1 ciginsurance.com, 1 cign.nl, 1 -cigniti.com, 1 +cigniti.com, 0 cignium.com, 1 cigotracker.com, 1 cihanmedya.ga, 1 @@ -32183,6 +32142,7 @@ cihr-irsc.gc.ca, 1 cihr.ca, 1 cihucm.com, 1 cilacapnews.ml, 1 +cilaxreklam.com, 1 cile.cf, 1 cile.tk, 1 cilin.net, 1 @@ -32650,7 +32610,6 @@ citywalkr.com, 1 citywidealarms.com, 1 citywidechimneysweephouston.com, 1 citywindsor.ca, 1 -citywinecellar.com, 1 citywisdom.tk, 1 cityworksonline.com, 1 ciubotaru.tk, 1 @@ -32662,7 +32621,6 @@ ciulea.ro, 1 civ.social, 1 civey.com, 1 civia.com, 1 -civic-europe.eu, 1 civicconnectiongroup.com, 1 civicdigest.com.au, 1 civicforum.pl, 1 @@ -33015,6 +32973,7 @@ cleanenergy.gov, 1 cleanenergywire.org, 1 cleaner-en.com, 1 cleaner.tk, 1 +cleanerstool.com, 1 cleanertool.co.uk, 1 cleanfacesest.ga, 1 cleanhortihigienizados.com.br, 1 @@ -33386,7 +33345,6 @@ clmbr.ch, 0 clmde.de, 1 clmz.nl, 1 clna.ca, 1 -clnc.to, 1 clnlboard.co.uk, 1 clnnet.ch, 1 clnshrk.club, 0 @@ -33530,7 +33488,6 @@ cloudix.cf, 1 cloudlandmark.com, 1 cloudlessdreams.com, 0 cloudlight.biz, 1 -cloudlucida.com, 1 cloudmachine.fr, 1 cloudmanagedbuilding.com, 1 cloudmanagedbuildings.com, 1 @@ -34539,7 +34496,6 @@ collegenavigator.gov, 1 collegepaperworld.com, 1 collegephysicsanswers.com, 1 collegeprospectsofcentralindiana.com, 1 -collegereligionandphilosophy.com, 0 collegerover.com, 1 colleges.chat, 1 collegesecretary.cn, 1 @@ -34840,6 +34796,7 @@ comm-works.com, 1 comm.cx, 1 comma-store.eu, 1 commagere.com, 1 +command53.fr, 1 commanderone.net, 1 commanderx.cf, 1 commanderx.ml, 1 @@ -35003,7 +34960,6 @@ compassdirectportal.com, 1 compassfinance.com, 1 compassintladv.com, 1 compassionate-biology.com, 1 -compassionatehlt.com, 1 compasslos.com, 1 compassregroup.com, 1 compattatori.it, 1 @@ -35329,6 +35285,7 @@ confirmit.de, 1 confiscate.ga, 1 confiscation.tk, 1 confiwall.de, 1 +conflictcontrol.fi, 1 conflidentliving.cf, 1 confluent.cloud, 1 confluents.fr, 1 @@ -35429,7 +35386,6 @@ connorlim.net, 1 connornoddin.com, 1 connorreporting.com, 1 conntrack.com, 1 -connyandthecrazydogs.com, 1 connyduck.art, 0 connyduck.at, 1 conocchialidasole.it, 1 @@ -35486,7 +35442,6 @@ conservaschato.com, 1 conservation-careers.com, 1 conservationfreedivers.com, 1 conservationgeography.com, 1 -consigli.it, 1 consiglidisalute.com, 1 consiliarioltd.com, 1 consilio.com, 1 @@ -35623,6 +35578,7 @@ contango.xyz, 1 contato.vip, 1 contecgmbh.com, 1 contempfleury.com, 1 +contemplativeeducation.org, 1 contemptevoke.com, 1 contenedoresdereciclaje.online, 1 contentcaching.com, 1 @@ -36000,7 +35956,6 @@ coreup.de, 1 corevetconnect.co.uk, 1 corexpert.com, 1 coreyjmahler.com, 1 -corfman.com, 1 corfound.org, 1 corfuny.gov, 1 corgiaspets.com, 1 @@ -36856,6 +36811,7 @@ creabis.de, 1 creacioneslri.com, 1 creactive-mjardevi.se, 1 creadoc.fr, 1 +creadordenoticias.com, 1 creadstudy.com, 1 creafitchile.cl, 1 creagay.fr, 1 @@ -36922,6 +36878,7 @@ creativeexpertdesigner.com, 1 creativegraphix.com, 1 creativeground.com, 1 creativeground.com.au, 1 +creativeideasagency.com, 1 creativeink.de, 1 creativekitchens.co.nz, 1 creativekkids.com, 1 @@ -36986,6 +36943,7 @@ creditcheckup.com, 1 creditcorponline.com, 1 creditenonstop.ro, 1 crediteurope.ru, 1 +creditfair.in, 1 credithuman.com, 1 creditif.tk, 1 creditkarma.ca, 1 @@ -37213,6 +37171,7 @@ criticalculture.cf, 1 criticalculture.gq, 1 criticalculture.ml, 1 criticalgenesis.tk, 1 +criticalmention.com, 1 criticalminerals.gov, 1 criticalrace.org, 1 criticalsoftware.com, 1 @@ -38253,6 +38212,7 @@ cuxpool.club, 1 cuxpool.net, 1 cuyahogacommunitycollege.tk, 1 cuyahogacountyvotesoh.gov, 1 +cv-generator-fe-eu.herokuapp.com, 1 cv.fr, 1 cv.se, 1 cvalda.tk, 1 @@ -38338,7 +38298,6 @@ cwmcpe.tk, 1 cwo.fi, 1 cworkflow.com, 1 cwp.com.sg, 1 -cwpark.co, 0 cwr.gov, 1 cwrau.com, 1 cwrau.de, 1 @@ -38798,7 +38757,6 @@ d884vip.com, 1 d8859.com, 1 d885vip.com, 1 d886vip.com, 1 -d8878.com, 1 d887vip.com, 1 d88818.com, 1 d8886.net, 1 @@ -39001,7 +38959,6 @@ dailysomething.site, 1 dailysportfan.com, 1 dailytrip.de, 1 dailyusbusiness.tk, 1 -dailyvpn.com, 1 dailywealth.com, 1 dailywork.ga, 1 dailyxenang.com, 1 @@ -39640,6 +39597,7 @@ das-kobers.de, 1 das-mediale-haus.de, 1 das-sommercamp.de, 1 dasabomobil.de, 1 +dasble.com, 1 dascan.com.br, 1 dasdanny.de, 1 daseinsfreu.de, 1 @@ -39667,11 +39625,11 @@ dasignsource.com, 1 dasinternetluegt.at, 1 daskirschhaus.com, 1 dasler.eu, 1 -dasmailarchiv.ch, 1 dasolindustrialpark.tk, 1 dastchin.live, 1 dastelefonbuch.de, 1 dastihawkary.org, 1 +dastomize.com, 1 dasug.de, 1 data-access-point.com, 1 data-analysis.tokyo, 1 @@ -39895,6 +39853,7 @@ datingswagger.ga, 1 datingticino.ch, 0 datingwebsitesforteenagers.cf, 1 datingyourmate.ga, 1 +datista.de, 1 datj.net, 1 datmancrm.com, 1 datn-x.de, 1 @@ -39984,7 +39943,6 @@ david-pearce.com, 1 david-reess.de, 1 david-schiffmann.de, 1 david.kitchen, 1 -davidadrian.org, 1 davidalbert.me, 1 davidandersson.se, 1 davidaskew.uk, 1 @@ -40673,7 +40631,6 @@ decorator.uk, 1 decoratore.roma.it, 1 decorehomes.com, 0 decorestilo.com.br, 1 -decorlux.bg, 1 decormiernissanparts.com, 1 decorno.tk, 1 decorpol-renovation.fr, 1 @@ -40694,6 +40651,7 @@ decstasy.de, 1 decsys.work, 1 dedanskevasaloebere.dk, 1 deddehome.com.tr, 1 +deddie.gr, 0 dedede.ro, 1 dedektor.com, 1 dedelta.net, 1 @@ -41110,7 +41068,6 @@ deluxecar.fr, 1 deluxemassage.co.uk, 1 deluxeside.com, 1 deluxetransfers.co.uk, 1 -delv.ac, 1 delycate.com, 1 delycate.fr, 1 delzottolink.com, 1 @@ -41204,7 +41161,6 @@ dempe.tk, 1 dempseyenergy.com, 1 demsh.org, 1 demtech.com, 1 -demuzere.be, 1 demuzere.nl, 1 demuzere.org, 1 demxausa.com, 1 @@ -41305,6 +41261,7 @@ dennitisk.cz, 1 dennogumi.org, 1 dennstoree.com, 1 dennysdionigi.com, 1 +deno.com, 1 deno.net, 1 denous.nl, 1 denovocorp.com, 1 @@ -41342,7 +41299,6 @@ dentisalut.com, 1 dentislabor.lt, 1 dentist-profi.ga, 1 dentista.roma.it, 1 -dentistaaroma.com, 1 dentistabarbarajaqueline.com.br, 1 dentistalagoasanta.com.br, 1 dentisteliege.be, 1 @@ -41437,6 +41393,7 @@ depo12.com, 1 depoalabama.com, 1 depokcity.tk, 1 depolab.com, 1 +depolauncher.cf, 1 depone.net, 0 depoondemand.com, 1 depoone.com, 1 @@ -41527,7 +41484,6 @@ derinforge.com.au, 1 derinsular.tk, 1 derivative-calculator.net, 1 derivativeshub.pro, 1 -derive.cc, 0 derive.cf, 1 derkach.io, 1 derkarl.tk, 1 @@ -41645,6 +41601,7 @@ designarea.tk, 1 designartepublicidad.com, 1 designbro.com, 1 designburners.com, 1 +designbymaja.no, 1 designbymargot.com, 1 designbymargot.fr, 1 designbymargot.pro, 1 @@ -41707,6 +41664,7 @@ desireeburch.net, 1 desirememory.cf, 1 desirenet.ro, 1 desish.cf, 1 +desitorrents.tv, 1 desivideos.tk, 1 desk-mode.com, 1 deskaservices.com, 1 @@ -42779,6 +42737,7 @@ digitalimpactlab.org, 1 digitalistan.tk, 1 digitalizer.my.id, 1 digitalizzazioneverona.it, 0 +digitaljuliac.com.br, 1 digitalkashmir.ml, 1 digitalkey.pro, 1 digitalkoran.com, 1 @@ -42847,6 +42806,7 @@ digitalvag.tk, 1 digitalvalue.es, 1 digitalwasteland.net, 0 digitalworkplaceforum.com.br, 1 +digitalzenworks.com, 1 digitalzylinder-shop.com, 1 digite.com, 1 digitec.ch, 1 @@ -42869,10 +42829,9 @@ digitypa.fi, 1 digivan.ml, 1 digivibe.cz, 1 digiwedoo.com.au, 1 -digiyatrafoundation.com, 1 diglloyd.com, 1 digminecraft.com, 1 -dignited.com, 1 +dignilog.com, 1 dignity.tk, 1 digpubdev.org, 1 digpubprd.org, 1 @@ -43142,7 +43101,6 @@ dirt-street.tk, 1 dirtcraft.ca, 1 dirtinmyshoes.com, 1 dirty-tina.net, 1 -dirtybirdconcepts.com, 1 dirtyboyreviews.com, 1 dirtycat.ru, 1 dirtycode.tk, 1 @@ -43443,7 +43401,6 @@ districtcourtislamabad.tk, 1 distrigenosa.tk, 1 distrikia.com.co, 0 distrilogservices.com, 1 -distrim.pt, 1 distritoae.com, 1 distritotres.tk, 1 distritoxic.tk, 1 @@ -44272,7 +44229,6 @@ docusign.jp, 0 docusign.mx, 0 docusign.nl, 0 docutayho.com, 1 -docutek.com.tw, 1 docxtemplater.com, 1 doczlo.tk, 1 doda.space, 1 @@ -45084,6 +45040,7 @@ douzer.ninja, 1 dovamzallag.com, 0 dovanow.com, 1 dovebuttare.it, 1 +dovechina.com, 1 doveconviene.it, 1 dovecotedental.co.uk, 1 dovecraft.com.ua, 1 @@ -45147,7 +45104,6 @@ downtownindy.org, 1 downtownla.com, 1 downtownmesa.com, 1 downtownontario.org, 0 -downtownpdx.dog, 1 downtownraleigh.org, 1 downtownsuiteliving.com, 1 downtowntucson.org, 1 @@ -46402,7 +46358,6 @@ dutton.uk, 1 duttonmt.gov, 1 dutyfreeperfumes.tk, 1 duurzaamgww.nl, 1 -duurzaamheidskaart.nl, 1 duurzaamwonen.amsterdam, 1 duux.com, 1 duv.al, 1 @@ -46563,7 +46518,6 @@ dynalogix.eu, 0 dynamic-movie.com, 1 dynamic-networks.be, 1 dynamicalsystem.work, 1 -dynamicasoft.com, 1 dynamicathletes.ga, 1 dynamicbusinessconsultants.ga, 1 dynamiccounselingli.com, 1 @@ -46939,7 +46893,6 @@ e7d.io, 1 e899365.com, 0 e8bet.net, 1 e8space.co.nz, 1 -e8space.com, 1 e8space.nz, 1 e9297.co, 1 e9582.com, 1 @@ -47689,7 +47642,6 @@ ecoon.net, 1 ecopark.asia, 1 ecopath.org, 1 ecopiscines.fr, 1 -ecopond.co.nz, 1 ecopowerenginewash.com, 0 ecopoweroil.com, 1 ecorak.de, 1 @@ -48037,7 +47989,6 @@ educheck.tech, 1 educourse.nl, 1 edudip-next.com, 1 edudip.com, 1 -edudoc.ch, 1 edufever.com, 1 edufever.in, 0 eduflow.at, 1 @@ -48215,6 +48166,8 @@ effectivelist.com, 1 effectivepapers.com, 1 effectory.com, 1 effectpointphotography.cf, 1 +effectualness.co.za, 1 +effectualness.web.za, 1 effer.me, 1 effex.ru, 1 effexorgeneric.ml, 1 @@ -48656,7 +48609,6 @@ el-cell.com, 1 el-hossari.com, 1 el-masri.bg, 1 el-mundo.tk, 1 -el-taj.news, 1 el-tatwer.tk, 1 ela-lift.ru, 1 ela-n.de, 1 @@ -49086,7 +49038,6 @@ eleusis-zur-verschwiegenheit.de, 1 elev8fashion.ca, 1 elevacionesrama.com, 1 elevanhairdressing.co.uk, 1 -elevateservices.com, 1 elevatewebdesigns.com, 1 elevationplumbingandheating.com, 1 elevator.ee, 1 @@ -49760,7 +49711,6 @@ emoc.com, 1 emocionestlp.com, 1 emocionypensamiento.com, 1 emoforum.tk, 1 -emoha.com, 1 emoji-meaning.org, 1 emoji-symbols.org, 1 emoji.build, 1 @@ -50548,7 +50498,6 @@ entwistlepickups.com, 1 enu.vin, 1 enuchi.com, 1 enuchi.jp, 1 -enuhub.com, 1 enumasecurity.com, 1 enuygun.com, 1 enuygunaucakbileti.com, 1 @@ -50727,7 +50676,7 @@ epiphaniusmacar.com, 1 epiqcourtreportingblog.com, 1 episkevh-plaketas.gr, 1 episode.tk, 1 -episource.com, 1 +episource.com, 0 epistas.com, 1 epistas.de, 1 epistemes.org, 1 @@ -51065,6 +51014,7 @@ erotismo.co, 1 erozine.jp, 1 erp-systems.ovh, 1 erpcargo.com, 0 +erpcloud.systems, 1 erpelstolz.at, 1 erperium.com, 1 erperium.nl, 1 @@ -51218,7 +51168,6 @@ escontact.ch, 0 escordilla.tk, 1 escort-fashion.com, 1 escort.it, 1 -escortbee.com, 1 escortdisplay.com, 1 escortify.co.nz, 1 escortjessy.tk, 1 @@ -51974,7 +51923,6 @@ europeanspring.net, 1 europeanstudies-chemnitz.de, 1 europeantransmissions.com, 1 europeantransportmanagement.com, 1 -europeanwineresource.com, 1 europeluxuryweddings.com, 1 europeonline.tk, 1 europeontrack.org, 1 @@ -52371,7 +52319,6 @@ evolution-host.ga, 1 evolution-x.org, 0 evolution.codes, 1 evolutionbp.es, 1 -evolutionhomecorp.com, 1 evolutioninflatables.co.uk, 1 evolutionlife.za.com, 1 evolutionmuaythai.com, 1 @@ -52596,7 +52543,6 @@ exegol.co.uk, 1 exelonline.nl, 1 exelreporters.com, 1 exelreporting.com, 1 -exem.cc, 1 exemples-de-stands.com, 1 exentrify.com, 1 exer.fr, 1 @@ -52763,6 +52709,7 @@ explicamente.pt, 1 explode.tk, 1 explodie.org, 1 explohub.com, 1 +exploit-db.com, 1 exploit.cz, 0 exploit.party, 1 exploited.cz, 1 @@ -52777,7 +52724,6 @@ explore-malaysia.ga, 1 explore-visions.com, 1 explore.beer, 1 explorea1a.com, 1 -explorebigideas.com, 0 exploreeverydays.com, 1 exploregulf.ga, 1 exploreintel.com, 1 @@ -52977,7 +52923,6 @@ exvega.com, 1 exvisits.tk, 1 exwaiti.com, 1 exxoncannabis.com, 1 -exxpozed-image.de, 1 exxpozed.co.uk, 1 exzibit.net, 1 eyaqueen.com, 1 @@ -53037,7 +52982,6 @@ ezdog.press, 1 ezec.com.tw, 1 ezee-fix.co.uk, 1 ezekia.com, 1 -ezemous.com, 1 ezercommerce.com, 1 ezgif.com, 1 ezhub.de, 1 @@ -53696,7 +53640,6 @@ familytreehq.com, 1 familytrees.net, 1 familytreewebinars.com, 1 familyzone.ga, 1 -famion.eu, 1 famiport.com, 1 famlefeber.nl, 1 famonitor.com, 1 @@ -53804,6 +53747,7 @@ fantasysports.tk, 1 fantasysportsnews.org, 1 fantgames.com, 1 fantinisfantasy.cf, 1 +fantinishop.com, 1 fantraxhq.com, 1 fanty-online.com, 0 fanuc-stanok.ru, 1 @@ -53883,6 +53827,7 @@ farmaciaclinica.it, 1 farmaciacomunalelacchiarella.it, 1 farmacialaboratorio.it, 0 farmaciasanchodemesa.com, 1 +farmacologiaonline.com, 1 farmacovigilancia-exeltis.com.mx, 0 farmako.net, 1 farmakon.tk, 1 @@ -54640,7 +54585,6 @@ feministreview.ga, 1 feministreview.gq, 1 feministreview.ml, 1 feministspectrum.org, 0 -feminteligencia.com, 1 femiwiki.com, 1 femme.fitness, 1 femmes-women.gc.ca, 1 @@ -55640,7 +55584,6 @@ firestuff.org, 1 firetotheprisons.org, 1 fireurboss.tk, 1 firevap.org, 1 -firewall.net.za, 1 firewallremoval.cf, 1 firewallremovalers.ga, 1 fireware.tk, 1 @@ -56393,6 +56336,7 @@ floobits.com, 1 floodboss.ml, 1 flooddoctorva.com, 1 floodguypro.com, 1 +floodheroessaltlakecity.com, 1 floodsmart.gov, 1 floogulinc.com, 1 flooood.tk, 1 @@ -56591,7 +56535,6 @@ fluentu.com, 1 fluessiggas.de, 1 fluf.io, 1 fluff.im, 1 -fluffandfoldmodesto.com, 1 fluffybottles.com, 1 fluffycat.ga, 1 fluffycloud.de, 1 @@ -56943,7 +56886,6 @@ foodadaptive.ga, 1 foodafter.ga, 1 foodagenda.ga, 1 foodanchor.ga, 1 -foodandseeds.com, 1 foodarrow.ga, 1 foodatlantic.ga, 1 foodattitude.ch, 0 @@ -57240,7 +57182,6 @@ foreverbreak.com, 1 forevercollage.com, 1 foreverpontiac.com, 1 foreverreem.com, 0 -foreverssl.com, 1 forevertoday.nl, 1 foreverydream.com, 1 forewordreviews.com, 1 @@ -57644,7 +57585,6 @@ foucheplumbers.com, 1 foudufafa.de, 0 fougereettralala.fr, 1 foundationalucc.com, 1 -foundationassure.com, 1 foundationforfamilies.org, 1 foundationmaintenance.com, 1 foundationprogramme.nhs.uk, 1 @@ -57673,7 +57613,7 @@ fountainvalley.gov, 1 fouproduction.cz, 1 fourashesgolfcentre.uk, 1 fourbrothers.tk, 1 -fourchetteverte.ch, 1 +fourchetteverte.ch, 0 fourcornerscb.com, 1 fourfivecbd.co.za, 1 fourfri.es, 1 @@ -57882,7 +57822,6 @@ framboise314.fr, 1 framedog.tk, 1 framegame.ch, 1 framemo.org, 1 -framenails.fr, 1 framer.ai, 1 framer.com, 1 framer.live, 1 @@ -58158,7 +58097,6 @@ freddyjs.com, 1 freddythechick.net, 1 freddyvasquez.com, 1 freddyxvasquez.com, 1 -fredericdenis.fr, 1 fredericdesforges.com, 1 fredericfrancois.com, 1 fredericheim.fr, 1 @@ -58533,7 +58471,6 @@ freshbooks.com, 0 freshcar.bg, 1 freshcode.nl, 1 freshdesk-apps-by-invantive.com, 1 -fresheetmusic.com, 1 freshempire.gov, 1 freshersworld.ml, 1 fresherwalkins.tk, 1 @@ -58879,7 +58816,6 @@ fs-w.org, 1 fs-world.org, 1 fs1.hopto.org, 1 fs22a.de, 1 -fs4is7zrzcubrrfkhrx4miywpx3l5xk4vse2axsxbgetdlabe6gvvqyd.com, 1 fsaddons.net, 1 fsalmeron.tk, 1 fsapubs.gov, 0 @@ -59199,7 +59135,6 @@ functori.com, 1 fund-melden.de, 1 fundacaoedp.pt, 1 fundacaoeveris.com.br, 1 -fundacion.in, 1 fundacionasilo.es, 1 fundacionfade.org, 1 fundacionfranciscofiasco.org, 1 @@ -59212,6 +59147,7 @@ fundaekhaya.co.za, 1 fundamentalrightsforum.eu, 1 fundamentals.lu, 1 fundamentt.com, 1 +fundatiacomunitaragalati.ro, 1 fundayltd.com, 1 fundedschools.ml, 1 fundelva.com, 1 @@ -59622,6 +59558,7 @@ fvr-concept.be, 1 fw-einsatz.de, 1 fwaux.de, 1 fwba.hopto.org, 1 +fwd.pp.ua, 1 fwd.vg, 1 fwdmovers.com, 1 fwdx.net, 1 @@ -60307,7 +60244,6 @@ gamize.com, 1 gamma-travel.fr, 1 gamma.fi, 1 gammabeyond.com, 1 -gammabrossfrance.fr, 1 gammagroup.co, 1 gammaknife.com, 1 gammaphibeta.tk, 1 @@ -60421,7 +60357,6 @@ garduri-electrice-animale.ro, 1 gardurialuminiuiasi.ro, 1 garethbowker.com, 1 garethbowker.uk, 1 -garethdesign.co.uk, 1 garethkirk.com, 1 garethkirkreviews.com, 1 garfieldairlines.net, 1 @@ -60593,7 +60528,6 @@ gatlinheatandair.com, 1 gatlink.tk, 1 gatomix.net, 1 gator34.com, 1 -gatot.id, 0 gattomatto.tk, 1 gaudeamus-folklor.cz, 1 gaudeamuschoir.tk, 1 @@ -60706,6 +60640,7 @@ gbk-host.de, 1 gbk-teamplan.de, 0 gbkom.de, 1 gbl.selfip.net, 0 +gbm.net, 1 gbnorthsaltlake.com, 1 gboys.net, 0 gbp.com.ph, 1 @@ -60926,6 +60861,7 @@ geertdegraaf.nl, 1 geertjanvanhest.nl, 1 geertswei.nl, 1 gees.ch, 1 +geesthof.de, 1 gefaessmedizin-rapperswil.ch, 1 gefmo.pl, 1 gefolge.org, 1 @@ -61507,7 +61443,6 @@ germanytravelguide.ml, 1 germfr.ee, 1 germinalekeren.tk, 1 germistonsolarsystems.co.za, 1 -gernert-server.de, 1 gero.io, 1 geroiplavska.tk, 1 geropa.it, 1 @@ -61930,6 +61865,7 @@ ghllc.com, 1 ghn.vn, 1 ghobcars.com, 1 ghobot.ai, 1 +ghobusers.com, 1 ghostarmy.tk, 1 ghostbusters.tk, 1 ghostbustersuk.tk, 1 @@ -61969,7 +61905,6 @@ ghpastor.com, 1 ghprinting.net, 1 ghsix.com.br, 1 ghtmi.gov, 1 -ghui.de, 1 ghwconline.org, 1 ghyvelde.fr, 1 gi-plant.shop, 1 @@ -62807,6 +62742,11 @@ glpreparation.com, 1 glreit.com, 1 glsauto.com, 1 gltjp.com, 1 +gluconote.net, 1 +gluconote.org, 1 +gluconotes.com, 1 +gluconotes.net, 1 +gluconotes.org, 1 glue.tk, 1 gluechapter.ga, 1 glueck-im-norden.de, 1 @@ -63178,12 +63118,10 @@ gold99999.com, 1 goldankauf1875.at, 1 goldband.tk, 1 goldbar.com.hk, 1 -goldbio.com, 1 goldbug.ga, 1 goldchip.com, 1 goldclubcasino.com, 1 goldcoast-plumbing.com.au, 1 -goldcoast.org, 0 goldcoastasian.com, 1 goldcoastit.com.au, 1 goldcoastphotographycourses.com, 1 @@ -63605,6 +63543,7 @@ goshippingcargo.com, 1 goshop.pl, 1 goshopnow.co.za, 1 goshrink.ca, 1 +gosifa.com, 1 gosifan.com, 1 gosimpler.com, 1 goskey.ru, 1 @@ -63868,6 +63807,7 @@ gracedonors.co.za, 1 gracedonors.com, 1 gracefuljourneys.ca, 1 graceharborapps.net, 1 +gracehousecall.ae, 0 gracelawoffice.com, 1 graceradio.tk, 1 gracereminder.com, 1 @@ -64081,7 +64021,6 @@ granulate.io, 1 grape33.com, 1 grapee.jp, 1 grapeintentions.com, 1 -grapesthewineco.com, 1 grapevine.is, 1 graph.org, 1 graphe.gq, 1 @@ -64538,6 +64477,7 @@ greymouthkiwi.co.nz, 1 greymuzzlemanor.org, 1 greypanel.com, 1 greyrectangle.com, 1 +greyscale.zone, 1 greyskymedia.com, 1 greysolonballroom.com, 1 greystonesmovement.com, 1 @@ -64717,8 +64657,7 @@ group4layers.net, 1 groupama.hu, 1 groupama.sk, 1 groupamadirekt.hu, 1 -groupbuytrading.com, 1 -groupdcc.com, 1 +groupdcc.com, 0 groupe-accedia.org, 1 groupe-cassous.com, 1 groupe-goddi.com, 1 @@ -64777,7 +64716,6 @@ groveld.com, 1 growatiopex.com, 1 growbydata.com, 1 growbyrabbit.com, 1 -growcredit.com, 1 growebmarketing.com, 0 growery.org, 1 growglam.com, 1 @@ -64865,7 +64803,6 @@ gruphepsi.tk, 1 grupo-famia.tk, 1 grupo-rbd.com, 1 grupo-zoom.com, 1 -grupoalbedo.com.br, 1 grupoandrey.com.mx, 1 grupoauxteclic.com, 1 grupobit.net, 1 @@ -65639,7 +65576,6 @@ h5197.co, 1 h5q.net, 1 h6729.co, 1 h6957.co, 1 -h6k.io, 1 h6p.de, 1 h82365.com, 0 h8p.de, 1 @@ -66164,7 +66100,6 @@ hammerstorm.ga, 1 hammertonbarbados.com, 1 hammondwi.gov, 1 hamoominim.tk, 1 -hamoup.com, 1 hampl.tv, 1 hampshiretechservices.co.uk, 1 hampshiretrustbank.co.uk, 1 @@ -66233,6 +66168,7 @@ handicappingsportsers.ga, 1 handicappingsportsest.ga, 1 handicapzero.org, 1 handicraftsman.tk, 1 +handigehannie.nl, 1 handinhandhrd.eu, 1 handler.lt, 1 handler.lv, 1 @@ -66259,6 +66195,7 @@ handsender-express.com, 1 handsome-samurai.jp, 1 handsomeabel.tk, 1 handsonscience.com.au, 1 +handsontheheart.eu, 1 handstandstudio.ga, 1 handsup.dance, 1 handtales.com, 1 @@ -66682,7 +66619,6 @@ harrypottereditor.net, 1 harrypotterpuzzlesandspells.com, 1 harrypottervenezuela.tk, 1 harrysmallbones.co.uk, 1 -harryswine.com, 1 harryvapoteur.com, 1 harryvrancken.nl, 1 harryxxjohnson.ga, 1 @@ -66905,7 +66841,6 @@ haveforeningen-enghaven.dk, 1 haveg.ru, 1 haveibeenpwned.be, 1 haveibeenpwned.com, 1 -haveko-vv.nl, 1 havellab.de, 1 havells.com, 0 haven-staging.cloud, 1 @@ -67679,7 +67614,6 @@ heckmann.photos, 1 hectorama.tk, 1 hectorfiorini.com.ar, 0 hectorlima.tk, 1 -hedd.audio, 0 hedefhalk.com, 1 hedenskrig.tk, 1 hederatech.us, 1 @@ -68453,7 +68387,6 @@ hexasoft.com.my, 1 hexatech.gq, 1 hexatech.tk, 1 hexaunits.com, 1 -hexaware.com, 1 hexaweb.tk, 1 hexcel.com, 1 hexcode.in, 1 @@ -69854,7 +69787,6 @@ homewidget.ga, 1 homewinner.ga, 1 homewish.ga, 1 homewoodpathfinder.com, 1 -homewoodworkplans.com, 1 homeworld.ga, 1 homeyou.com, 1 homeyx.cf, 1 @@ -70028,6 +69960,7 @@ hopkintonri.gov, 1 hopnepal.com, 1 hopo.design, 1 hoponmedia.de, 1 +hoppenr.xyz, 1 hoppinjohn.org, 0 hoppy.com, 1 hoppygo.com, 1 @@ -70994,6 +70927,7 @@ huanvm.com, 1 huanxu.com, 1 huapont.com, 1 huapood.com, 1 +huaqian.art, 1 huashan.co.uk, 1 huashang.tk, 1 huawenyy.com, 1 @@ -71020,7 +70954,6 @@ hubchain.org, 1 huber-informatik.de, 1 huberheightschamber.com, 1 hubermanlab.com, 1 -huberts.com, 1 hubilo.com, 1 hublaagram.ml, 1 hubmark.co, 1 @@ -71772,7 +71705,6 @@ iaabc.org, 1 iaata.info, 1 iabot.tk, 1 iac-indooraircare.com, 1 -iacc.cl, 1 iacee.org, 1 iacono.com.br, 0 iactor.co.jp, 1 @@ -71796,6 +71728,7 @@ iainsimms.me, 1 ialternatywne.pl, 1 iam.lc, 0 iam.soy, 1 +iamafricacampaign.com, 1 iamafricacampaign.org, 1 iambhatti.tk, 1 iamcloud.de, 1 @@ -72122,7 +72055,6 @@ icowhitepapers.co, 1 icpamerica.com, 1 icpc2016.in.th, 1 icpcnj.org, 1 -icpcorp.com, 1 icq-project.net, 1 icq-world.tk, 1 icq.com, 1 @@ -72310,7 +72242,6 @@ ideologiaycultura-ap.tk, 1 ideorealm.tk, 1 idered.net, 1 idesign.tk, 1 -idesoft.cloud, 1 idesoft.com, 1 idesoft.eu, 1 idesoft.info, 1 @@ -72752,7 +72683,7 @@ ikeyless.com, 1 ikgron.com, 1 ikhwanfillah.com, 1 ikimo9.com, 1 -ikinogo.com, 1 +ikinogo.com, 0 ikinogo.zone, 1 ikinokori-marketing.com, 1 ikisser.de, 1 @@ -72952,7 +72883,6 @@ iltze.fr, 1 ilug-ktm.tk, 1 iluman.tk, 1 ilumantio.tk, 1 -ilumina2photo.es, 1 iluminatia.com, 1 ilunion.tk, 1 ilusionistas.tk, 1 @@ -73775,7 +73705,6 @@ indramas.tk, 1 indramdhani.net, 1 indranesia.tk, 1 indraq.tk, 1 -indreams.me, 1 indretningmedplanter.dk, 1 indst.eu, 1 indstocks.com, 1 @@ -74467,7 +74396,6 @@ inoa8.com, 1 inoapps.com, 1 inoio.de, 1 inokolab.net, 1 -inoldnews.com, 1 inolution.com, 1 inomics.com, 1 inondation.ch, 0 @@ -74654,7 +74582,7 @@ instagraph.cn, 1 instahub.net, 0 instalamosyreformamos.es, 1 instalatii-pardoseala.ro, 1 -install-solar.co.uk, 0 +install-solar.co.uk, 1 installation-hotte-cuisine.com, 1 installation-of-xenon.tk, 1 installationdehotte.com, 1 @@ -75075,6 +75003,7 @@ internetzaim.tk, 1 internetzentrale.net, 1 internetzonei.com, 1 internews24.com, 1 +internewscast.com, 1 interparcel.com, 1 interpass.id, 1 interplex.com, 1 @@ -75119,7 +75048,7 @@ interwebz.cloud, 1 interwebz.nz, 1 interwerk.de, 1 intestclub.tk, 1 -intgr8ai.com, 1 +intgr8ai.com, 0 inthechair.com, 1 inthechileanwoods.tk, 1 inthecompanyofguides.com, 1 @@ -75291,7 +75220,6 @@ investingoutlook.co, 1 investingrenada.gd, 1 investingtrader.net, 1 investinlodzkie.com, 1 -investinsenegal.sn, 1 investintech.com, 1 investion.cf, 1 investir.ch, 0 @@ -75551,7 +75479,6 @@ iphonechina.net, 0 iphoned.nl, 1 iphonekaitori.tokyo, 0 iphonemobile.ro, 1 -iphonesoft.fr, 1 iphoneunlock.nu, 1 ipicolorissa.com, 1 ipid.me, 1 @@ -75630,7 +75557,6 @@ iptvcanada.biz, 1 iptvfriend.ga, 1 iptvmasters.fr, 1 iptvmiro.com, 1 -iptvsubscriptiontv.com, 1 iptvzoom.xyz, 1 ipty.de, 1 ipuservicedesign.com, 1 @@ -75988,7 +75914,6 @@ ishigurodo.com, 1 ishiharaken.com, 1 ishii.de, 1 ishikawadc.jp, 1 -ishimen.co.jp, 1 ishiro.me, 1 ishland.com, 1 ishtamar.fr, 1 @@ -76023,7 +75948,6 @@ iskaron.de, 1 iskaz.rs, 1 iskkk.com, 1 iskkk.net, 1 -iskndr.com, 1 iskorka.tk, 1 iskurturkiye.cf, 1 iskurturkiye.ga, 1 @@ -76858,6 +76782,7 @@ izipik.gq, 1 izitex.shop, 1 izkustvo.com, 1 izletiyo.com, 1 +izm.ovh, 1 izmail-invertor.com.ua, 1 izmailovo.tk, 1 izmir-media.cf, 1 @@ -77633,7 +77558,6 @@ jayjardine.cf, 1 jayjardine.ga, 1 jayjardine.gq, 1 jayjardine.ml, 1 -jaylewis.us, 1 jaylineko.com, 1 jaymecd.rocks, 1 jaypandit.me, 1 @@ -77990,6 +77914,7 @@ jenadamsphoto.com, 1 jenakultur.de, 1 jenascarpetcleaning.com.au, 1 jencshiny-org.tk, 1 +jendeindustries.com, 1 jendela360.com, 1 jendies.com, 1 jenelle.ml, 1 @@ -78075,6 +78000,7 @@ jeroendeneef.com, 1 jeroened.be, 1 jeroenensanne.wedding, 1 jeroengui.be, 1 +jeroenstekelenburg.nl, 1 jerome-r.tk, 1 jeromecountyid.gov, 1 jeromequezel.fr, 1 @@ -78102,6 +78028,7 @@ jerusalempersonalsest.ga, 1 jerusalemplus.tv, 1 jesec.cn, 1 jesec.io, 1 +jesen.org, 1 jesiensredniowiecza.pl, 1 jesmatboutique.com, 1 jesmh.de, 1 @@ -78877,7 +78804,6 @@ johnblackbourn.com, 0 johnblotsky.tk, 1 johnbratus.com, 1 johncam.tk, 1 -johncleary.me, 1 johncook.co.uk, 1 johncook.ltd.uk, 1 johndball.co, 1 @@ -79050,7 +78976,7 @@ jonathandaleswindle.com, 1 jonathandowning.uk, 0 jonathanisaac.com, 1 jonathanlara.com, 1 -jonathanmares.com, 1 +jonathanmares.com, 0 jonathanmassacand.ch, 1 jonathanrobichaud.ca, 1 jonathanrys.com, 1 @@ -79293,6 +79219,7 @@ jourdespa.fr, 1 journal-officiel.ga, 1 journaldufumeur.ch, 1 journales.com, 1 +journalexpress.ca, 1 journalgameers.ga, 1 journalgameest.ga, 1 journalism-schools.com, 1 @@ -79440,6 +79367,7 @@ jrlopezoficial.com, 1 jrmora.com, 0 jrock.tk, 1 jrock.us, 1 +jrockrevolution.com, 1 jrom.net, 1 jross.me, 1 jrrmail.com, 1 @@ -79788,7 +79716,6 @@ jumpstartii.com, 1 jun-e-jay.com, 1 jun.ax, 1 junctioncitywisconsin.gov, 1 -june.ceo, 1 june.dating, 1 juneau.gov, 1 juneaucountywi.gov, 1 @@ -80005,6 +79932,7 @@ justpdf.cf, 1 justquoteme.ga, 1 justsa.co.za, 1 justsandro.tk, 1 +justsellmycar.com, 1 justsfa.com, 1 justsfa.net, 1 justsfa.org, 1 @@ -80106,7 +80034,6 @@ k-homes.net, 1 k-labs.be, 1 k-larevue.com, 1 k-linkcarecenter.com, 1 -k-lol.com, 1 k-matsudaclinic.com, 1 k-moto.sk, 1 k-net.dk, 1 @@ -80264,7 +80191,6 @@ kachka.cf, 1 kachlikova2.cz, 1 kacinzverinec.cz, 1 kack.website, 1 -kackyreloaded.com, 1 kacperstapor.com, 1 kacy-kisha.com, 1 kada.lk, 1 @@ -80534,7 +80460,6 @@ kamchatkatravel.tk, 1 kamchatkawinter.tk, 1 kamcolorectal.com, 1 kamel.social, 1 -kameldesign.com, 1 kameliya.tk, 1 kamennyj-pisatel.tk, 1 kameno-news.tk, 1 @@ -80632,7 +80557,6 @@ kandrahechiceravudu.com, 1 kandrive.gov, 1 kanduit.live, 1 kanduit.tech, 1 -kandwliquor.com, 1 kaneadvocates.com, 1 kaneandtrap.com, 1 kanecastles.com, 1 @@ -81173,6 +81097,7 @@ kaysville.gov, 1 kaysvillechurch.com, 0 kayteedidquiltsandmore.com, 1 kayziarra.com, 1 +kaz-energo.com, 1 kazakov.lt, 1 kazan-news.net, 1 kazan-tury.ml, 1 @@ -81510,6 +81435,7 @@ kemifilani.ng, 1 kemikon.com, 1 kemnacarwash.com, 1 kemono.cr, 1 +kemono.in.th, 1 kempercountyms.gov, 1 kempercountysheriff.com, 1 kempkens.io, 1 @@ -81618,7 +81544,6 @@ kenzelmann.li, 1 kenzelmann.name, 1 kenzie.com.br, 0 keops-spine.fr, 1 -keops-spine.us, 1 keos.ga, 1 keos.tk, 1 kep-sbt.hu, 1 @@ -81727,7 +81652,6 @@ kettcar.net, 1 kettererholmes.tk, 1 kettinggeleider.be, 1 kettlebellspower.com, 1 -kettlemetalbbq.com, 1 kettleworx.com, 1 kettmail.com, 1 ketto.org, 1 @@ -81815,7 +81739,6 @@ keycenter.com.br, 1 keycodingjohannesburg.co.za, 1 keydelay.tk, 1 keydifferencemedia.com, 1 -keyerror.com, 1 keyesrobot.cn, 1 keyfortech.com, 1 keyfoundation.xyz, 1 @@ -82008,7 +81931,6 @@ kickasscanadians.ca, 1 kickasspoker.com, 1 kickback-studios.com, 1 kickbackservices.com, 0 -kickex.com, 1 kickico.com, 1 kickitfootball.com.au, 1 kicksecure.com, 1 @@ -82226,7 +82148,6 @@ kimochi.info, 1 kimonocloud.com, 1 kimonoplatform.com, 1 kimoo.co, 1 -kimoota.net, 1 kimootoko.net, 0 kimotodental.com, 1 kimotrip.com, 1 @@ -82275,8 +82196,6 @@ kinautas.com, 1 kindan.net, 1 kindapoth.com, 1 kinde.com, 1 -kinden-giankyou.jp, 1 -kinden-kizuna.com, 1 kinder-garten.tk, 1 kinderarzt-berlin-zia.de, 1 kinderarzt-traunstein.de, 1 @@ -82312,7 +82231,7 @@ kindredcode.com, 1 kindredcode.net, 1 kindredcode.org, 1 kindredspirits.tk, 1 -kindspace.ca, 1 +kindspace.ca, 0 kine-duthil.fr, 1 kinebamps.be, 1 kinebioquimica.com, 1 @@ -82370,7 +82289,6 @@ kingofthecastlesrhyl.co.uk, 1 kingpie.co.za, 1 kingpin.pro, 1 kingpincages.com, 1 -kingroot.com, 1 kings-potong.com, 1 kings-world.net, 1 kingsaft.net, 1 @@ -82764,6 +82682,7 @@ kks.ch, 1 kksg-sulzbach.de, 1 kksg.com, 0 kkws.co, 1 +kkychristianblog.com, 1 kkyy.me, 1 kl008888.com, 1 klaasvantornout.tk, 1 @@ -82942,7 +82861,6 @@ klokkenluidersvg.nl, 1 kloop.kg, 1 klop.info, 1 klos-kremperler.at, 1 -klose-besser.com, 1 klose.family, 1 klosetestumgebungnextcloud.de, 1 klosko.net, 1 @@ -83245,7 +83163,6 @@ koef.nl, 1 koehlhoff.de, 1 koehn-consulting.com, 1 koehn.com, 1 -koehn.lol, 1 koelbli.ch, 1 koeldezomerdoor.nl, 1 koelnmafia.de, 1 @@ -83665,7 +83582,6 @@ koresageart.com, 1 korespondent.tk, 1 korfbal.nl, 1 korfballeague.nl, 1 -korfezemlak.com, 1 korhonen.cc, 1 korikart.com, 1 korikart.net, 1 @@ -84565,7 +84481,6 @@ kupkabn.de, 1 kupleno.com, 1 kuplukover.by, 1 kupoholik.rs, 1 -kupone.com.br, 1 kuponla.com, 1 kuponmail.tk, 1 kuppingercole.com, 1 @@ -85307,7 +85222,6 @@ lahoratunante.tk, 1 lahstalon.org, 1 lai.is, 1 lailabanx.org, 1 -lain.at, 1 lain.la, 1 lain.wiki, 1 laindonleisure.co.uk, 1 @@ -85813,6 +85727,7 @@ laramuredesmots.fr, 1 laranjada.org, 1 larasm.tk, 1 laravel.software, 1 +laravel42.com, 1 laravelcommunity.asia, 1 larawoodarts.com, 1 larax.tk, 1 @@ -86314,7 +86229,6 @@ laymans911.info, 1 layoutsatzunddruck.de, 1 layt.org, 1 laythetable.com, 1 -layx.xyz, 1 layxw.com, 1 lazarev.agency, 1 lazarusalliance.com, 1 @@ -87493,7 +87407,6 @@ letdownloads.tk, 1 letec.be, 1 leteckedarky.cz, 1 letempsdujasmin.fr, 1 -leter.io, 0 leterroirdesvignobles.fr, 1 leteszemazecsetet.hu, 1 letgodbetrue.com, 1 @@ -87713,7 +87626,6 @@ lexopen.dk, 1 lexpartsofac.com, 1 lexpert.ca, 1 lexplicite.fr, 1 -lexpredict.com, 1 lexreception.com, 1 lexreporter.com, 1 lexreporter.info, 1 @@ -87751,6 +87663,7 @@ lffweb.ga, 1 lfg.com.ph, 1 lfgss.com, 1 lfi-mv.de, 0 +lfmosqueira.com.br, 1 lfn.moe, 1 lfnaturopathie.com, 1 lforla.org, 1 @@ -87805,6 +87718,7 @@ lhm.de, 1 lhost.su, 1 lhp-creation.fr, 1 lhpk.no, 1 +lhr.wiki, 1 lhsbudget.com, 1 lhsdoi.com, 1 lhsj28.com, 1 @@ -88652,6 +88566,7 @@ linkst.co, 0 linkstaffing.com, 1 linkstellar.com, 1 linktgo.com, 1 +linkthis.me, 1 linkthis.ml, 1 linkthisstatus.ml, 1 linkto.cf, 1 @@ -89222,7 +89137,6 @@ living-space.co.nz, 1 living-with-outlook-2010.com, 1 living.video, 1 livingafrugallife.com, 1 -livingbitsandthings.com, 1 livingdex.ca, 1 livingdocs.io, 1 livinghebrew.tk, 1 @@ -89313,7 +89227,6 @@ lklyrics.com, 1 lkmt.us, 1 lknw.de, 1 lkp111138.me, 1 -lkqpickyourpart.com, 1 lksoft.cz, 1 lkwmodellbau.at, 1 ll-vt.de, 1 @@ -89454,7 +89367,6 @@ localcdn.org, 1 localcryptos.com, 1 locald.at, 1 localdating.ml, 1 -localenv.uk, 1 localethereum.com, 1 localexpert.realestate, 1 localexpress.io, 0 @@ -89834,7 +89746,6 @@ lokjagruktafoundation.com, 1 lokmatnews.in, 1 lokmattimes.com, 1 lokomotivaplzen.cz, 1 -lokys.de, 1 lola.by, 1 lolacandy.com, 1 lolalacita.net, 1 @@ -90426,7 +90337,6 @@ lovedicas.com.br, 1 lovedutch.tk, 1 lovefoodhatewaste.com, 1 lovefrankie.co, 1 -lovegood.fr, 1 lovegpl.com, 1 lovehairstyles.com, 1 loveherass.com, 1 @@ -90785,7 +90695,6 @@ luctam.com, 1 lucy.sex, 1 lucychan.tk, 1 lucym.co.nz, 1 -lucymontebello-arte.com, 1 lucysan.net, 1 ludasmith.co.uk, 1 lude.tk, 1 @@ -90807,7 +90716,6 @@ ludotech.tk, 1 ludovic-frank.fr, 0 ludovic-muller.fr, 1 ludovicfernez.com, 1 -ludovicozitelli.it, 1 ludum-polus.xyz, 1 ludum.pl, 1 ludunwayoo.com, 1 @@ -91061,7 +90969,6 @@ luongtuananh.com, 1 luongvu.com, 0 luoshifeng.com, 1 luotianyi.online, 1 -luowu.cc, 1 luoxianjun.com, 1 luoxingyu.ml, 1 lupa.cz, 1 @@ -92001,7 +91908,7 @@ maguy-energies.com, 1 magwin.co.uk, 1 magyarepitok.hu, 1 mah-nig.ga, 1 -mah24.com, 1 +mah24.com, 0 mahabharat.tk, 1 mahadhanconnect.com, 1 mahadihasan.cf, 1 @@ -92882,7 +92789,6 @@ manwork.tk, 1 manwv.gov, 1 manychat.com, 1 manycheap.com, 1 -manyebook.com, 1 manyetikboya.com, 1 manyhotfiesta.ml, 1 manylots.ru, 1 @@ -93356,7 +93262,6 @@ marketingdominante.com.br, 1 marketingmd.com, 1 marketingo.digital, 1 marketingpalace.tk, 1 -marketingpowerups.com, 1 marketingstrategy.gq, 1 marketingtrendnews.com, 1 marketingwelt-lipp.de, 1 @@ -93905,7 +93810,6 @@ mastere.tn, 1 masterflitzer.xyz, 1 masterglasses.ru, 1 masterhelenaroma.com, 1 -masterimperia.com, 1 masterin.it, 1 masterinchess.com, 1 masterjuantex-projects.tk, 1 @@ -94473,7 +94377,6 @@ maximoguk.com, 1 maximosilupu.tk, 1 maximovie.eu, 1 maxims-travel.com, 1 -maximschinese.com.hk, 1 maximumcontrol.nl, 1 maximumphysiotherapy.com, 1 maximusrose.com, 0 @@ -94688,7 +94591,6 @@ mcb-bank.com, 1 mcba.com.br, 1 mcbooks.vn, 0 mcc.edu.ph, 1 -mcc.foundation, 1 mccabes.com.au, 1 mccallkulak.org, 1 mccannhealth.com, 1 @@ -95028,7 +94930,6 @@ mec0556.com, 1 mec0562.com, 1 mec0563.com, 1 mec0565.com, 1 -mec0572.com, 0 mec0576.com, 1 mec0579.com, 1 mec0592.com, 1 @@ -95150,6 +95051,7 @@ mechmk1.me, 1 mechsoftgroup.com, 1 mechta.gq, 1 mechtylda.info, 1 +meciel.net, 1 mecloudprinter.com, 1 mectilde.info, 1 mecu.com, 1 @@ -95406,7 +95308,6 @@ medium.cz, 1 mediumforgood.com, 1 mediums.cf, 1 mediumseznam.cz, 1 -medivisionsc.com, 1 medivox.tk, 1 mediweed.tk, 1 mediwish.com, 1 @@ -95503,7 +95404,7 @@ meetbot.fedoraproject.org, 1 meetcleo.com, 1 meetfranz.com, 1 meetfriends.tk, 1 -meetgeek.ai, 1 +meetgeek.ai, 0 meeting-server.ml, 1 meetingvotes.com, 1 meetjeslandsetriathlon.tk, 1 @@ -95884,7 +95785,6 @@ melodycenter.de, 1 melonhub.com, 1 melonpanda.com, 1 melonstudios.net, 1 -melonwin.gg, 1 melown.com, 1 melp.co.uk, 1 melp.com, 1 @@ -96314,6 +96214,7 @@ mesjumelles.fr, 1 meskiukas.tk, 1 meslekkursu.com, 1 mesmer.tk, 1 +mesmerus.net, 1 mesologie-soesterberg.nl, 1 mesomeds.com, 1 mesonandino.tk, 1 @@ -96716,7 +96617,6 @@ mgfgroup.ca, 1 mgfgroup.com, 1 mgfgroup.mx, 1 mgfgroup.us, 1 -mgfnow.com, 1 mgfpatrimoine.com, 1 mghiorzi.com.ar, 0 mghr.co.nz, 1 @@ -97197,7 +97097,7 @@ mightyfive.tk, 1 mightygadget.com, 1 mightyoakmarketing.ca, 1 mightytext-ios.tk, 1 -mightytips.biz, 1 +mightytips.biz, 0 mightytips.com.br, 1 mightytips.hu, 0 migliorailtuoambiente.it, 1 @@ -97476,7 +97376,6 @@ milanvit.net, 1 milanvreeken.nl, 1 milapopovich.com, 1 milasescmagazin.tk, 1 -milatlumaczenia.pl, 1 milavica.tk, 1 milavicca.tk, 1 milay.pk, 1 @@ -97502,7 +97401,6 @@ milesconsulting.io, 1 milesdewitt.com, 1 milesforwomenshealth.org, 1 milesquaretechnologygroup.com, 1 -milestonehotel.com, 1 milestoneinternet.com, 1 milestonemachine.com, 1 miletic.net, 1 @@ -97563,6 +97461,7 @@ millburyma.gov, 1 millcreekut.gov, 1 millcreekwa.gov, 1 millefleurs.eu, 1 +millenn.photos, 1 millennialbella.net, 1 millennium-thisiswhoweare.net, 1 millenniumfalcon.org, 1 @@ -97711,7 +97610,6 @@ mindfully.com, 0 mindfulnessjourney.ca, 1 mindfulslumber.com, 1 mindgard.co.uk, 1 -mindgtc.com, 1 mindingourway.com, 1 mindjee.tk, 1 mindleaking.org, 1 @@ -97837,7 +97735,6 @@ minibardelivery.com, 1 minibikini.cf, 1 minibomba.pro, 1 minibrewery.cf, 1 -minibus-service.ru, 1 minibusrent.ro, 1 minicampingshalom.nl, 1 minican.net, 1 @@ -97998,7 +97895,7 @@ mio-ip.ch, 1 miobeach.nl, 1 miobt.eu.org, 0 miodysudnik.pl, 1 -miomiojoyeria.com, 1 +miomiojoyeria.com, 0 miomiorun.com, 0 miorganics.ro, 1 miottawavotes.gov, 1 @@ -98233,12 +98130,8 @@ misterl.net, 1 mistermojo.nl, 1 misterspex.at, 1 misterspex.ch, 1 -misterspex.co.uk, 1 misterspex.de, 1 -misterspex.es, 1 -misterspex.fi, 1 misterspex.nl, 1 -misterspex.no, 1 misterspex.se, 1 mistertesi.it, 1 misteryrip.tk, 1 @@ -98773,7 +98666,6 @@ mobileciti.com.au, 1 mobilecraftingco.com, 1 mobilefactory.io, 1 mobilefidelity-magazin.de, 1 -mobilegameslist.com, 1 mobilegoldcoastelectrical.ga, 1 mobilehydraulics.com.au, 1 mobileit.cz, 1 @@ -98784,7 +98676,6 @@ mobileone.com.my, 1 mobilepartner.tk, 1 mobilepricepk.com, 1 mobiler-handel.de, 1 -mobiler-musikservice.de, 0 mobileread.com, 1 mobileritelushi.com, 1 mobilesector.de, 1 @@ -100065,6 +99956,7 @@ motorzone.od.ua, 1 motoselfservices.fr, 1 motospaya.com, 0 motostorie.blog, 1 +motostyle.ua, 1 mototax.ch, 1 mototeam.tk, 1 mototsi.com, 1 @@ -100242,7 +100134,6 @@ moviro.net, 1 movlib.org, 1 movnest.com, 1 mowercountymn.gov, 1 -mowing-the-lawn.com, 1 mowsey.org, 1 mowster.com, 1 mowster.net, 1 @@ -101178,6 +101069,7 @@ musickorea.tk, 1 musiclenta.tk, 1 musiclite.tk, 1 musicmasala.tk, 1 +musicnotesroom.com, 1 musicompare.com, 1 musicradar.co.il, 1 musicradio.ga, 1 @@ -101663,6 +101555,7 @@ mycrypnet.io, 1 mycts.org, 1 mycues.gov, 1 mycumortgage.com, 1 +mydabb.com, 1 mydarkness.cf, 1 mydarksite.tk, 1 mydarkstar.net, 1 @@ -102910,7 +102803,6 @@ napcabs.com, 1 napcae.de, 1 naphex.rocks, 1 napi.edu.ee, 1 -napifilm.com, 1 napikuponok.hu, 1 napilol.ml, 1 napisdata.us, 1 @@ -103303,6 +103195,7 @@ naturopath.tk, 1 naturparadies-rheinauen.de, 0 naturschutz-holderbank.ch, 1 natuurinhuisheerenveen.tk, 1 +natuurkundegeflipt.nl, 1 natuurlijk.tk, 1 natuurlijkbesteld.nl, 1 natuurlijkehaarkleuring.nl, 1 @@ -103455,7 +103348,6 @@ nbaimg.com, 1 nbalive.cn, 1 nbalivecn.com, 1 nbalivex.com, 1 -nbao.ca, 1 nbaot.org, 1 nbapc.org, 1 nbapwned.com, 1 @@ -103778,7 +103670,6 @@ negociemos.com.co, 1 negocios-imatore.com, 1 negociosparaoptimistas.com, 1 negociosurbanos.net, 1 -negoya-shokai.info, 1 negozimoda.it, 1 negoziointimo.com, 1 negr.gay, 1 @@ -104925,6 +104816,7 @@ nex.io, 1 nex.li, 1 nexacu.com.au, 1 nexadevs.com, 1 +nexafuze.com, 1 nexarda.com, 1 nexcoda.io, 1 nexd.com, 1 @@ -104953,7 +104845,7 @@ nexon.com.au, 1 nexril.net, 0 nexs.gg, 1 nexscience.tk, 1 -nexsol-tech.ch, 1 +nexsol-tech.ch, 0 next-fact.com, 1 next-geek.fr, 1 next-idea.co, 1 @@ -105085,7 +104977,6 @@ nfobar.com, 1 nforto.com, 1 nfpors.gov, 1 nfpsa.lv, 1 -nfrdoz.com, 1 nfs.pub, 1 nfsec.pl, 1 nfshopnsave.com, 1 @@ -105151,6 +105042,7 @@ nguyenanhung.com, 1 nguyencucthanh.com, 1 nguyenductrong.net, 1 nguyenduythiem.com, 1 +nguyenfamily.cc, 1 nguyenfamily.tk, 1 nguyenslist.com, 1 nguyensuu.tk, 1 @@ -105649,7 +105541,6 @@ niledevelopmentseg.com, 1 nileempire.com, 1 nilefi.cf, 1 nileis.de, 1 -niles-simmons.de, 1 niles.xyz, 1 nilesil.gov, 1 nilianwo.com, 1 @@ -105948,6 +105839,7 @@ nm.cx, 1 nm.sl, 1 nm2000.kz, 1 nma.is, 1 +nmaedu.org, 1 nmb.gov, 1 nmbhgc.org, 1 nmbtc.com, 1 @@ -106046,7 +105938,6 @@ noahjacobson.com, 1 noahmodas.com.br, 1 noahs.com, 1 noahsaso.com, 1 -noajoder.ch, 1 noamweb.com, 1 noangel.tk, 1 noart.tk, 1 @@ -106539,7 +106430,6 @@ northshoremums.com.au, 1 northshorevisitor.com, 1 northsidecaravansrepairsandspares.com, 1 northsideeventsindy.com, 1 -northstarasset.com, 1 northstarcommunitytrust.org, 1 northstarcommunitytrust.org.uk, 1 northstaredit.org.uk, 1 @@ -107733,7 +107623,6 @@ oal.law, 1 oanamancu.com, 1 oandgpr.com, 1 oanow.com, 1 -oase-der-ruhe.de, 1 oasegroen.nl, 1 oasis-info.co.uk, 1 oasisautospa.org, 1 @@ -108700,7 +108589,6 @@ olevoitalia.com, 1 olffi.com, 1 olfnewcastle.com, 1 olfsecane.org, 1 -olfuscluster.is, 1 olgallery.tk, 1 olgamalytcheva.com, 1 olgamilosevic.edu.rs, 1 @@ -109087,6 +108975,7 @@ onedrive.com, 0 onee3.org, 1 oneearthliving.org, 1 oneearthsacredarts.com, 1 +oneelevenseniors.ca, 1 oneem.tk, 1 oneequity.com, 1 oneest.com, 1 @@ -109124,7 +109013,6 @@ oneless.tk, 1 onelifenutrition.co.uk, 1 onemail.co.uk, 1 onemap.sg, 0 -onemeter.com, 1 oneminute.io, 0 onemobility-group.com, 1 onemodel.com.au, 1 @@ -109186,7 +109074,6 @@ onetouchtour.com, 1 onetown.gq, 1 onetranslations.com.br, 0 onetrust.com, 1 -onets.es, 1 onetwentyseven001.com, 1 onetwo-vermietung.de, 1 onetwosweetatelier.com, 1 @@ -109219,7 +109106,7 @@ ongiaenegogoa.com, 1 onglobetrotter.com, 1 ongoal.gr, 1 ongoved.com, 1 -onguard.co, 1 +onguard.co, 0 onguardonline.gov, 1 onhistory.co.uk, 1 onhub1.com, 1 @@ -109470,7 +109357,7 @@ onpopup.ga, 1 onporn.fun, 1 onrampwallet.com, 1 onrangetout.com, 1 -onrealt.ru, 1 +onrealt.ru, 0 onrr.gov, 1 onsatv.com, 1 onscript.study, 1 @@ -109850,6 +109737,7 @@ oplata-mvd.ga, 1 oplata-vklike.tk, 1 oplata.uz, 1 oplium.com, 1 +oplop.appspot.com, 1 opm.gov, 1 opmaakonderscheidingen.nl, 1 opnx.dk, 1 @@ -110016,7 +109904,6 @@ optumsecurity.com, 1 opture.ch, 1 optykgill.pl, 1 optymyze.com, 1 -opulentdivision.com, 1 opulentranch.com, 1 opus-codium.fr, 1 opus-labs.fr, 1 @@ -110124,7 +110011,6 @@ orcamarine.tk, 1 orcas.tk, 1 orcasecurity.io, 1 orchardnh.org, 1 -orchestra-ppm.io, 1 orchestra.tk, 1 orchestremetropolitain.com, 1 orchidee-mariage.com, 1 @@ -110800,7 +110686,6 @@ ourworldindata.org, 0 ourworldspeaks.com, 1 ousho.me, 1 oust.ch, 0 -oustaou-connect.com, 0 out-of-england.cf, 1 out-of-england.ga, 1 out-of-england.gq, 1 @@ -111012,7 +110897,6 @@ owlbee.uk, 1 owldevelopers.tk, 1 owlhollowbakery.com, 1 owllee.com, 1 -owlmaster.org, 1 owlnull.me, 1 owlofminerva.net, 1 owlscrap.ru, 1 @@ -111041,7 +110925,6 @@ owo.vn, 1 owop-filmscoring.com, 1 owoss.com, 1 owott.com, 1 -owozi.com, 1 owozz.com, 1 owrt-risk.dedyn.io, 1 owyheecounty.gov, 1 @@ -111127,7 +111010,6 @@ oyo.moe, 1 oyoshi.com.my, 1 oyosoft.net, 1 oyr79.tk, 1 -oysterboxhotel.com, 1 oysterlink.com, 1 oysterworldwide.com, 1 oytic.com, 1 @@ -111161,7 +111043,6 @@ ozelgitardersi.tk, 1 ozellaruck.tk, 1 ozelmarmaratip.com, 1 ozemsec.com.br, 1 -ozerify.com, 1 ozero-kardyvach.ru, 1 ozgesezen.com, 1 ozgoz.com, 1 @@ -111724,7 +111605,6 @@ pamc.tk, 1 pamdrew.com, 1 pamelafong.com, 1 pamelastimpson.com, 1 -pamiers-citoyenne.fr, 1 pamirabezmenphotography.com, 1 pamlightdesign.com, 1 pamlims.net, 1 @@ -112003,7 +111883,6 @@ papuaone.com, 0 papuzkija.pl, 1 paqtam.com, 1 par-allel.ru, 1 -para-sports.tokyo, 1 parabellum-barakaldo.tk, 1 parablu.com, 1 parabolaeditorial.com.br, 1 @@ -112107,7 +111986,6 @@ parcelauditpartners.com, 1 parcelow.com, 1 parceltrackr.com, 1 parcelup.com, 1 -parcheggio-aeroportofiumicino.it, 1 parckwart.de, 1 parcoursup.fr, 1 pardal.tk, 1 @@ -112276,6 +112154,7 @@ parleu2017.ee, 1 parleur.net, 1 parliament.gov.to, 1 parliamentcamp.com, 1 +parmacityfutsal.it, 1 parmartecultura.it, 1 parmatoday.it, 1 parmatwp.gov, 1 @@ -112290,6 +112169,7 @@ parokia.hu, 1 parolededieu.org, 1 paroli.pl, 0 parolu.io, 1 +paronubi.com, 1 parool.nl, 1 parorrey.com, 1 parosvoyages.gr, 1 @@ -112752,7 +112632,6 @@ pauljzak.com, 1 paulknulst.de, 1 paullinmakeup.com, 1 paullockaby.com, 1 -paullovestugba.nl, 1 paulmarc.org, 1 paulmarvin.tk, 1 paulmolloy.guitars, 1 @@ -113443,6 +113322,7 @@ pelican.ie, 1 pelicanbaytx.gov, 1 pelicanconveyancing.co.uk, 1 pelicanottertailmn.gov, 1 +pelicanparty.games, 1 pelicans.tk, 1 peliculaonline.tk, 1 peliculaslatino.tk, 1 @@ -113959,7 +113839,6 @@ persoonlijkeblog.nl, 1 perspective-daily.de, 1 perspectives-de-voyage.com, 1 perspektivwechsel-coaching.de, 0 -perspio.io, 1 persson.me, 1 perssonsgarn.se, 1 persuader-reports.gov, 1 @@ -114076,7 +113955,6 @@ petegrahamcarving.co.uk, 1 petelew.is, 1 petemerges.com, 1 petemerges.xyz, 1 -peter-r.co.uk, 1 peter-rader.pro, 1 peter-taban.de, 1 peter-zhu.ca, 1 @@ -114428,7 +114306,6 @@ pharmasana.ru, 1 pharmasyncers.ga, 1 pharmasyncest.ga, 1 pharmgkb.org, 1 -pharmica.uk, 1 pharosconsulting.com, 1 pharosiq.com, 1 pharside.dyndns.org, 1 @@ -114571,6 +114448,7 @@ philwilson-green.ml, 1 phimbop.top, 1 phimmoingay.org, 0 phimtor.com, 1 +phinikarides.net, 1 phiomegachi.tk, 1 phishguard.sa, 1 phishing-studie.org, 1 @@ -114684,6 +114562,7 @@ photogelique.be, 1 photoglobe.gr, 1 photogptai.com, 1 photograf.io, 1 +photograni.ru, 1 photographeremploymenters.ga, 1 photographeremploymentest.ga, 1 photographerforwedding.tk, 1 @@ -114816,7 +114695,6 @@ phyllis.nl, 1 phyllischerry.com, 1 phyrone.de, 1 phyrone.eu, 1 -phys.ir, 0 physia.gr, 1 physicalism.com, 1 physicalist.com, 1 @@ -115098,6 +114976,7 @@ pikeky.gov, 1 pikepa.gov, 1 piketonohio.gov, 1 pikimusic.moe, 1 +pikjay.com, 1 pikker.ee, 1 pikkuegypti.tk, 1 pikminwiki.com, 1 @@ -115151,8 +115030,6 @@ pimhaarsma.nl, 1 pimhaarsmamedia.nl, 1 pimichi.com, 1 pimmel.stream, 1 -pimo.id, 1 -pimoid.fr, 1 pimplelotionest.ga, 1 pimpmymac.ru, 1 pimpmypaper.com, 1 @@ -115861,7 +115738,6 @@ plastikkirurgiskane.se, 1 plastischechirurgie-linz.at, 1 plastokna.tk, 1 plastovelehatko.cz, 1 -plastrequest.com, 1 plataformascebrian.com, 1 plataformaslms.com, 1 platanakia.tk, 1 @@ -115940,7 +115816,6 @@ playanka.com, 1 playapex.cn, 1 playapex.com.cn, 1 playapexcn.com, 1 -playarcadiax.com, 1 playasdegalicia.tk, 1 playavalon.net, 1 playball.tk, 1 @@ -116520,7 +116395,6 @@ pogljad-brest.tk, 1 pogodavolgograd.tk, 1 pogodok.tk, 1 pogomate.com, 1 -pogoswine.com, 1 pogotowie-komputerowe.tk, 1 pogotowiekomputeroweolsztyn.pl, 1 pogrebeniq-sofia.com, 1 @@ -116615,7 +116489,6 @@ pokerventure.ga, 1 pokerventureers.ga, 1 pokerventureest.ga, 1 pokerzone.com, 1 -pokeymanatee4.xyz, 1 poki.at, 1 poki.be, 1 poki.bg, 1 @@ -116785,7 +116658,6 @@ pollet-ghijs.be, 1 pollet-ghys.be, 1 pollet.tech, 1 pollev-embeds.com, 1 -pollev.com, 1 polleverywhere.com, 1 polliga.tk, 1 pollinators.ie, 1 @@ -116921,7 +116793,6 @@ poojanews.com, 1 pookhaarden.nl, 1 pookl.com, 1 pool-selber-bauen.de, 1 -poolbarn.com.au, 1 poolcalculator.net, 1 pooletranslation.com.au, 1 pools.shop, 1 @@ -116931,7 +116802,8 @@ poolsonline.tk, 1 poolspa.es, 1 pooltools.net, 1 poolvilla-margarita.net, 1 -poonawallafincorp.com, 1 +poon.io, 1 +poonawallafincorp.com, 0 poopa.loan, 1 poopjournal.rocks, 1 poopr.ru, 1 @@ -117393,7 +117265,6 @@ potatiz.com, 1 potato.im, 1 potatochip.tk, 1 potatodiet.ca, 1 -potatolighting.com, 1 potatopro.com, 1 potatosoft.kr, 1 potatosouprecipe.ml, 1 @@ -118135,7 +118006,6 @@ prettycities.ga, 1 prettydecor.store, 1 prettydirtyteens.com, 1 prettygirlcheats.com, 1 -prettygoodai.co, 1 prettykeira.tk, 1 prettynightjob.net, 1 prettyporn.com, 1 @@ -118658,7 +118528,6 @@ prochainephase.com, 1 procharter.com, 1 proclaiminteractive.com, 1 proclock.com, 1 -procode.ch, 1 procode.gq, 1 procom-automation.com, 1 procomservices.com, 1 @@ -119461,6 +119330,7 @@ pscsoftware.com, 1 psd-vfx.com, 1 psd401.net, 1 psdfindia.in, 1 +psdiving.com, 1 psdpt-tpfd.gc.ca, 1 psdreams.com, 1 psdsuc.com, 1 @@ -120331,6 +120201,7 @@ qalm.net, 1 qalpuch.cc, 1 qanatnews.tk, 1 qani.me, 1 +qanw.com.br, 1 qao.qld.gov.au, 1 qaq.cloud, 1 qaq.icu, 0 @@ -120344,7 +120215,6 @@ qatartimes.tk, 1 qatesol.org.au, 1 qauk.org, 1 qaware.de, 1 -qawasmigroup.com, 1 qaz.cloud, 1 qbasic.tk, 1 qbasicsite.tk, 1 @@ -120914,7 +120784,6 @@ quic.fr, 1 quic.ovh, 1 quichante.com, 1 quiche-quic.cf, 1 -quichost.com, 1 quick-and-easy.tk, 1 quick-seo.tk, 1 quickbooksguru.com.au, 1 @@ -121860,7 +121729,6 @@ ram-tenancy.ml, 1 ram.nl, 1 rama.ovh, 1 ramanujantest.in, 1 -ramapada.com, 1 ramatola.uk, 0 ramblingrf.tech, 1 rambo.codes, 1 @@ -121910,7 +121778,7 @@ ramydent.no, 1 ramynetwork.tk, 1 ramzinex.com, 1 ran-drunken.tk, 1 -ran-ran.top, 1 +ran-ran.top, 0 ran-sama.ddns.net, 1 ranasinha.com, 1 rancheriastereo.tk, 1 @@ -122314,6 +122182,7 @@ razvlekuha.cf, 1 razvlekuhablog.tk, 1 rb-china.net, 1 rb.cz, 1 +rballday-entertainment.nl, 1 rbbaader.de, 1 rbbuae.com, 1 rbcafe.com, 1 @@ -122351,6 +122220,7 @@ rburz.com, 1 rbx.com, 1 rbx.gg, 1 rc-offi.net, 1 +rc-refer.nhs.uk, 1 rc-shop.ch, 1 rc.cruises, 1 rc21x.com, 1 @@ -122400,6 +122270,7 @@ rcsda.net, 1 rcslt.org, 1 rcsolutions.nl, 0 rct-chair.com, 1 +rct-uae.com, 1 rct.uk, 1 rctalk.com, 1 rctiads.com, 1 @@ -122803,9 +122674,6 @@ recode-lang.com, 1 recoilbox.com, 1 recolic.cc, 1 recolic.net, 1 -recollect.co.nz, 1 -recollect.net.au, 1 -recollectcms.com, 1 recollection.fr, 1 recollective.com, 1 recolor.ml, 1 @@ -122856,7 +122724,6 @@ recuperation-essaim-abeille.fr, 1 recuperation-points.fr, 1 recuperatucuentaya.com, 1 recupero.it, 1 -recurly.com, 1 recursos.vip, 1 recursoscristianosleinad.com, 1 recursosilimitados.tk, 1 @@ -122903,7 +122770,6 @@ redcanary.co, 1 redcandycane.tk, 1 redcapital.cl, 1 redcardinal.tk, 1 -redcarnationhotels.com, 1 redcarpetmonday.com, 1 redcatrampageforum.com, 1 redcedar.gov, 1 @@ -123038,7 +122904,6 @@ redot.com, 1 redpandacoding.net, 1 redpandamap.com, 1 redparrotstudios.tk, 1 -redpath.co.uk, 1 redpen.gr, 1 redper.serveminecraft.net, 1 redperegrine.com, 0 @@ -123206,7 +123071,6 @@ reformayobra.com, 1 reformedermatology.com, 1 refpa.top, 1 refpa170071.top, 1 -refpa4216323.top, 1 refpa4496162.top, 1 refpa5446390.top, 1 refpa59720.top, 1 @@ -123342,7 +123206,6 @@ regiovertrieb.de, 0 regis.tech, 1 regisearch.co.uk, 1 regismoscardini.fr, 1 -registech.com, 1 register.com.np, 1 register.to, 0 registered-counsellor.co.za, 1 @@ -123483,6 +123346,7 @@ rejido.tk, 1 rejushiiplotter.ru, 1 rejuveaesthetic.com, 1 rejuvetclinicpromotion.com, 1 +rekayasainformatika.com, 1 rekenkameroost.nl, 1 rekka-j.com, 1 rekklab.com, 1 @@ -124022,6 +123886,7 @@ resch-verlag.com, 1 rescms-secure.com, 1 rescuenode.com, 1 rescuer.gq, 1 +rescuer.org.ua, 1 rescuer.tk, 1 rescueyourrestaurant.com, 1 research-panel.jp, 1 @@ -124043,7 +123908,6 @@ resellerprogram.ga, 1 resellrefreshrepeat.com, 1 reserva-agora.pt, 1 reservadecitasonline.com, 1 -reservaelcortijosuitehouse.com, 1 reservationsair.com, 1 reservetonshift.com, 1 reservevaparks.com, 1 @@ -124080,7 +123944,6 @@ resilience.sh, 1 resiliencebox.com, 1 resilientlouisianacommission.gov, 1 resilienzatropical.it, 1 -resimdo.de, 1 resimevi.tk, 1 resinbondedaggregates.com, 1 resindrivewayexperts.co.uk, 1 @@ -124693,6 +124556,7 @@ ricedust.com, 1 riceforafrica.net, 1 ricelasvegas.com, 1 ricettedellanonna.net, 1 +ricettesemplicieveloci.altervista.org, 1 rich-good.com, 0 richadams.me, 1 richandsteph.co.uk, 1 @@ -125077,7 +124941,6 @@ riskconsole.com, 1 riskiq.com, 0 riskledger.com, 1 riskmitigation.ch, 1 -riskstudio.com, 1 riskxchange.co, 1 risky.services, 1 riskymeals.com, 1 @@ -126505,6 +126368,7 @@ rssr.ddns.net, 1 rssr.se, 1 rssreaderone.com, 1 rssready.eu, 1 +rstadler.com, 1 rstsecuritygroup.co.uk, 1 rsttraining.co.uk, 1 rsudlimpung.com, 1 @@ -126622,7 +126486,6 @@ rubenplazagarcia.es, 1 rubens.cloud, 0 rubensalgado.com, 1 rubenschulz.nl, 1 -rubenshotel.com, 1 rubenshuis.be, 1 rubenslikkarchive.com, 1 rubensteinphotography.com, 1 @@ -127070,7 +126933,6 @@ rxbusiness.com, 1 rxcarbon.com, 1 rxcom.net, 1 rxhill.com, 1 -rxkids.org, 1 rxperiusdata.com, 1 rxphoto.com, 1 rxss.com, 1 @@ -127539,7 +127401,6 @@ safewayinsurance.com, 1 safex.org, 1 saffle.se, 1 saffron-crocuses.com, 1 -saffron.com, 1 safgrandchallenge.gov, 1 safiafashion.kz, 1 safinamide.co.uk, 1 @@ -127811,7 +127672,6 @@ saleaks.org, 1 salebaba.com, 1 saleduck.at, 1 saleduck.ch, 1 -saleduck.co.id, 1 saleduck.dk, 1 saleduck.fi, 1 saleduck.se, 1 @@ -127897,7 +127757,7 @@ salmadenora.net, 1 salmaghanim.com, 1 salman.agency, 1 salmanravoof.com, 1 -salmanshafi.net, 0 +salmanshafi.net, 1 salmelainenwalter.tk, 1 salminencrane.tk, 1 salmo-rybak.ru, 1 @@ -128337,7 +128197,6 @@ sanityrant.ml, 1 sanjanaherath.cf, 1 sanjaymenon.xyz, 1 sanjose.cl, 1 -sanjosecostarica.org, 1 sanjosegijon.com, 1 sanjosestorm.com, 1 sanjoweb.tk, 1 @@ -128447,7 +128306,6 @@ santehnik-home.ru, 1 santehnikaplus.by, 1 santenatureetcie.com, 0 santeriabeliefs.com, 1 -santeriasanjorge.com.ar, 1 santewonderland.nl, 1 santhatela.com.br, 1 santhoshveer.com, 1 @@ -128467,7 +128325,6 @@ santo.fi, 1 santocollection.gr, 1 santodelgiorno.it, 1 santong.tk, 1 -santons-fouque.fr, 1 santorinidress.com, 1 santoscarmelitas.tk, 1 santosdecordoba.tk, 1 @@ -128735,7 +128592,6 @@ satisperfectacollections.com, 1 sativatunja.com, 1 satl-lelystad.nl, 1 satlantis.tk, 1 -satmd.de, 1 satoplet.cz, 1 satopletova.cz, 1 satoshinumbers.com, 1 @@ -129956,7 +129812,6 @@ seagrace.com, 1 seagrass-salcombe.com, 1 seagull-seafarer.org, 1 seahaweb.org, 1 -seaholmwines.com, 1 seaif.org, 1 seal-tite.eu, 1 sealability.co.uk, 1 @@ -130258,7 +130113,6 @@ securedrop.org, 1 secureeclaims.com, 1 secureenduserconnection.se, 1 securefiletransfer.nl, 1 -securegovernment.us, 1 securehugs.com, 1 secureideas.com, 0 secureim.de, 1 @@ -130460,7 +130314,6 @@ segnidisegni.eu, 1 segnoadv.com, 0 segretario.it, 1 segriz.com, 1 -segub.bj, 1 segulink.com, 1 segurancaresidencialbh.com.br, 1 segurancati.com, 1 @@ -130505,7 +130358,6 @@ seiler-ds.com, 1 seilergeodrones.com, 1 seilerinst.com, 1 seilgold.de, 1 -seimei.is, 1 seimo.cn, 1 seineoparebrise.fr, 1 seinfeldquote.com, 1 @@ -130592,7 +130444,6 @@ selena-armavir.ml, 1 selenapelletier.tk, 1 selenegames.com, 1 seleondar.ru, 1 -selexgalileo.com, 1 selezionebarbrboguaccero.cf, 1 selezionebarbrboguaccero.ga, 1 selezionebarbrboguaccero.tk, 1 @@ -130881,7 +130732,6 @@ sensualsexyhot.com.br, 1 sensuuri.tk, 1 sentechnology.co, 1 sentenza.tk, 1 -senteon.co, 1 senterada.tk, 1 sentez-cro.com, 1 sentia.com, 1 @@ -131115,7 +130965,6 @@ serenityeditor.com, 1 serenityhk.org, 1 serenitytvl.com, 1 serenmodz.rocks, 1 -seres.eu.org, 1 seresco.es, 1 serfas.gr, 1 serfinansa.com.co, 1 @@ -131503,7 +131352,6 @@ sexgarage.de, 1 sexgirlfriend.com, 1 sexgood.com.ua, 1 sexi.si, 1 -sexin.nl, 0 sexkras.club, 1 sexkrd.love, 1 sexkursk.club, 1 @@ -131669,7 +131517,6 @@ sfls.edu, 1 sfmason.net, 1 sfmcompile.club, 1 sfnetwork.pl, 1 -sfo-fog.ch, 0 sfondo.info, 1 sformule.cz, 1 sfotbal.cz, 1 @@ -132160,7 +132007,6 @@ shemalexxxfreetube.com, 1 shemogo.com, 1 shemsconseils.ma, 1 shemy.eu, 1 -shena.co.uk, 1 shenandoahrealestate.org, 1 shenandoahwoodwork.com, 1 shenannigans.tk, 1 @@ -132289,6 +132135,7 @@ shimmy1996.com, 1 shimo.im, 1 shinbukan-katorishintoryu.org, 1 shindocuba.tk, 1 +shineads.in, 1 shineiberia.tv, 1 shineindiarktutorial.ml, 1 shineleds.ga, 1 @@ -132558,7 +132405,6 @@ shoporangetheory.com, 1 shoposal.com, 1 shopperexpertss.com, 1 shoppersdepuertorico.com, 1 -shoppersvineyard.com, 1 shoppies.tk, 1 shopping-cart-migration.com, 1 shopping-il.org.il, 1 @@ -133099,7 +132945,6 @@ sierotowicz.pl, 1 sierpinska.eu, 1 sierramadreca.gov, 1 sierramusic.tk, 1 -sietareu.org, 1 sietejefes.com.ar, 1 sieuthithangmay.com, 1 sifangmao.net, 1 @@ -134127,7 +133972,7 @@ sjouke.dedyn.io, 1 sjparanormal.tk, 1 sjrcommercialfinance.co.uk, 1 sjs.org.hk, 1 -sjtpo.org, 1 +sjtpo.org, 0 sjtravel.guru, 1 sjuhawknews.com, 1 sjukom.net, 1 @@ -134342,7 +134187,6 @@ skladchinamk.ru, 0 skladnicaksiegarska.pl, 1 sklarlaw.com, 1 sklave-daniel.org, 1 -sklepbhp.online, 1 sklepsnowboardowy.pl, 1 sklepwielobranzowymd.com, 1 sklexpert.ru, 1 @@ -134923,6 +134767,7 @@ smallcubed.com, 1 smalldeveloper.ml, 1 smallfarmersjournal.com, 1 smallfoot.tk, 1 +smallguard.fr, 1 smallingerland.nl, 1 smallpark.com, 1 smallplanet.com, 0 @@ -135211,7 +135056,7 @@ smile-shika-fujii.com, 1 smileback.co.uk, 1 smilebert.at, 1 smilecenterturkey.com, 1 -smilecliniq.com, 1 +smilecliniq.com, 0 smilecon.cf, 1 smiledirectsales.com, 1 smiledoctors.com, 1 @@ -135262,6 +135107,7 @@ smithwealth.com.au, 1 smits.frl, 1 smitsdesigncenter.nl, 1 smitsmail.net, 1 +smkn1luragung.sch.id, 0 sml.lc, 1 smlk.org, 1 smlstriperfishing.com, 1 @@ -135743,7 +135589,6 @@ sociologyk.nl, 1 sociopampers.com.ar, 1 sociosalafuerza.tk, 1 socioscasino.com, 1 -sociosjournal.com, 1 socious.io, 1 sociusian.gq, 1 sockscap64.com, 1 @@ -135820,7 +135665,6 @@ sofortcutie24.de, 1 sofortindenurlaub.de, 1 sofpedia.ro, 0 sofritocafe.com, 1 -sofrout.com, 1 soft-key.tk, 1 soft-office.tk, 1 soft-resets.com, 1 @@ -136344,7 +136188,6 @@ soohealthy.nl, 1 soom.ga, 1 soom.tk, 1 soomee.be, 1 -soontm.net, 1 soopure.nl, 1 soopy.moe, 1 soortenbank.nl, 1 @@ -136393,7 +136236,6 @@ sorakumo.jp, 1 sorarkitekter.no, 1 sorbillo.it, 1 sorbire.com, 1 -sorcix.com, 1 sorellecollection.com.au, 1 sorellinteriors.com, 1 soren.xyz, 1 @@ -137430,7 +137272,6 @@ sportcompactwarehouse.com, 1 sportcucc.hu, 1 sportda.tk, 1 sportedy.com, 1 -sportellocafpatronato.com, 1 sportencultuurintrobreda.nl, 0 sportfair.it, 1 sportfits.at, 1 @@ -138567,7 +138408,6 @@ statusspb.ru, 1 statxperts.com, 1 stavangerliving.no, 1 stavbymilota.cz, 1 -stavgp2.ru, 1 stavinchains.tk, 1 stavnager.net, 1 stavovskystat.cz, 1 @@ -138695,6 +138535,7 @@ steelnavi.jp, 1 steelpoint.com.pl, 1 steelsheds.biz, 1 steelshop.net, 1 +steelsoldiers.com, 1 steelstructuresltd.com, 1 steelvortex.tk, 1 steelzone.tk, 1 @@ -138893,6 +138734,7 @@ stepplanning.com, 1 steppowerplant.com, 1 stepstobuyni.co.uk, 1 stepstone.dk, 1 +stepupforeurope.eu, 1 stepxpress.com, 1 stepyz.com, 1 stepzen.com, 1 @@ -138939,7 +138781,6 @@ stersoftware.nl, 1 sterva.mobi, 0 sterydki.pl, 1 sterz.io, 1 -stesmarteyes.com, 1 stestena.eu, 1 stesti.cz, 1 stethostalk.com, 1 @@ -139138,6 +138979,7 @@ stipic-webit.de, 1 stirblaut.de, 1 stirchleybaths.org, 1 stiridecluj.ro, 1 +stirling.co, 1 stirlingpoon.com, 1 stirringphoto.com, 1 stisidores.org, 1 @@ -139860,7 +139702,6 @@ strongercommunity.org.uk, 1 strongerfoundationrealestate.com, 1 strongergateway.com, 1 strongestcashoffer.com, 1 -strongguardsecurity.co.uk, 1 strongmind.be, 1 strongohio.gov, 1 strongpassword.club, 1 @@ -141422,6 +141263,7 @@ sweep-staging.com, 0 sweep.net, 0 sweeppeasweeps.com, 1 sweering.com, 1 +sweers.ch, 1 sweet-quiz.com, 1 sweet-spatula.com, 0 sweet64.fr, 1 @@ -141811,7 +141653,6 @@ synxfps.de, 1 syobon.org, 1 syogainenkin119.com, 1 syoier.com, 1 -syok.my, 1 syonix.ru, 1 syotatakahashi.com, 1 syphax.ml, 1 @@ -141919,7 +141760,6 @@ systems-thinking.eu, 1 systemsense.com.au, 1 systemsikkerhet.no, 1 systemsinblue.tk, 1 -systemsoftwareleader.com, 1 systemtoto.ml, 1 systemysportowe.pl, 1 systemzeit.info, 1 @@ -142120,6 +141960,7 @@ taanishsaifu.gq, 1 taapk.com, 1 taartbesteld.nl, 1 taartenvankoenie.tk, 1 +taartenvanmireille.nl, 1 taartenvanthea.nl, 1 taat.edu.ee, 1 taav.com, 1 @@ -142384,12 +142225,10 @@ takebackyourstate.org, 1 takechargetexas.gov, 1 takecommunity.com, 1 takedownthissite.com, 1 -takeflightglobal.com, 1 takehomepay.uk, 1 takeitback.tk, 1 takememoriesleavefootprints.com, 1 takemetomontpellier.fr, 1 -takemyexam.us, 1 taken.cf, 1 taken.pl, 1 takenote.co, 1 @@ -142424,7 +142263,6 @@ takosuke.net, 1 taks.nl, 1 taksaft.tk, 1 takshni.com, 1 -taksihesaplama.com, 1 taktak.co.uk, 0 taktika.tk, 1 takuhai12.com, 1 @@ -142510,7 +142348,6 @@ talksileby.tk, 1 talksport.com, 1 talktime.ae, 1 talktobabes.com, 1 -talktobot.com, 1 talktwincities.com, 1 talkx.de, 1 tallac.tk, 1 @@ -143294,7 +143131,6 @@ teachforall.org, 1 teaching-certification.com, 1 teachingamericanhistorymd.net, 1 teachingcleveland.org, 1 -teachingfeeling.pro, 1 teachinginhighered.com, 1 teachingmama.org, 1 teachingtoday.education, 1 @@ -144003,7 +143839,6 @@ teesypeesy.com, 1 teethtalkgirl.com, 0 teetje-doko.de, 1 teetoptens.com, 1 -teevahasa.com, 1 teewinotfunds.com, 1 tefek.cz, 1 teffcoshop.com, 1 @@ -144474,7 +144309,6 @@ teramundi.com, 1 teran.me, 1 teran.pw, 1 teran.ru, 1 -terapeutbooking.dk, 1 terapeuticaenalza.es, 1 terapiaradial.tk, 1 terapower.com.tw, 1 @@ -144919,7 +144753,6 @@ tfok.ml, 1 tfrei.de, 1 tfrei.net, 1 tfscreener.com, 1 -tfsrcymru.org.uk, 1 tfus.co, 1 tfw-a.com, 1 tfx.com.br, 1 @@ -145236,7 +145069,6 @@ thebeginningviolinist.com, 1 thebeltedgalloways.com, 1 thebengalinews.tk, 1 theberries.tk, 1 -thebertshow.com, 1 thebestfun.co.uk, 1 thebestgift.com.au, 1 thebestlaos.ga, 1 @@ -145602,7 +145434,7 @@ theflashback.co.uk, 1 theflatrestaurant.com, 1 theflesh.tk, 1 theflexerzone.ga, 1 -theflowerapothecary.com, 1 +theflowerapothecary.com, 0 theflowershopdeddington.com, 1 theflowstudios.com, 1 theflyingbear.net, 0 @@ -145782,7 +145614,6 @@ theideaskitchen.com.au, 1 theidiotboard.com, 1 theimagefile.com, 1 theimaginationagency.com, 0 -theimagroup.com, 1 theimpactnews.com, 1 theimperfective.com, 1 theinboxpros.com, 1 @@ -145803,7 +145634,6 @@ theinteracial.com, 1 theintercept.com, 0 theinternationalgeekconspiracy.eu, 1 theinvisibleman.tk, 1 -theislandtime.com, 1 theislandwellness.com, 1 theisopurecompany.com, 1 theissen.io, 1 @@ -145845,6 +145675,7 @@ theknockoutchampionship.com, 1 theknowitguy.com, 1 thekochampionship.com, 1 thekodaichronicle.com, 1 +thekolye.com, 1 thekonsulthub.tk, 1 thekuwayama.net, 1 thelakedistrict.tk, 1 @@ -146355,7 +146186,6 @@ theseahawk.org, 1 theseal.tk, 1 thesearch.com.tw, 1 thesecondsposts.com, 0 -thesecularparent.com, 1 theseed.io, 1 theseedbox.xyz, 1 thesehighsandlows.com, 1 @@ -146363,7 +146193,6 @@ thesemisouthernhomemaker.com, 1 theseofarm.com, 1 theseoframework.com, 1 theseosystem.com, 1 -theseotool.site, 1 theserpent.tk, 1 theserver.ml, 1 theserver201.tk, 1 @@ -146787,7 +146616,6 @@ thisistina.nl, 1 thisistwice.tk, 1 thisiswhywemom.com, 1 thismatter.com, 1 -thismatters.agency, 1 thismumdoesntknowbest.com, 1 thispageisup.com, 1 thispageisup.net, 1 @@ -147041,7 +146869,6 @@ thuiswinkel.org, 1 thumbnail-download.com, 1 thumbnails.jp, 1 thumbsupcandy.com, 1 -thumbtack.com, 1 thumbzilla.com, 1 thummer.net, 1 thunderbase.tk, 1 @@ -147610,7 +147437,6 @@ tinneke.tk, 1 tinnhanhvietnam.tk, 1 tinnitus.tirol, 1 tino-dtb.de, 1 -tinonawall.co.uk, 1 tinselandtwigllc.com, 1 tint.edu.in, 1 tintamas.tk, 1 @@ -148667,7 +148493,6 @@ topflightwildlife.com, 1 topfood.club, 1 topfrags.pl, 1 topfreeporn.com, 1 -topfreesoftwares.com, 1 topfx.com, 1 topfx.com.sc, 1 topgallant.gq, 1 @@ -149446,7 +149271,6 @@ toyotaconnected.co.th, 1 toyotaconnected.eu, 0 toyotapartsdeal.com, 1 toyotapartsprime.com, 1 -toyotasp.ru, 1 toyouiv.org, 1 toys-robots.cf, 1 toysandstuff.uk, 1 @@ -149510,7 +149334,6 @@ tptq-arabic.com, 1 tpu-ltd.co.uk, 1 tpue.de, 1 tpx.com, 1 -tqdev.com, 0 tqdn.cn, 1 tql.plus, 1 tqno.net, 1 @@ -149612,7 +149435,6 @@ tradebuilders.com.au, 1 tradedesk.co.za, 0 tradeeasy.com, 1 tradefxp.com, 1 -tradeinvent.co.uk, 1 tradeiq.ch, 1 tradeledger.io, 1 tradelink.cf, 1 @@ -150429,7 +150251,6 @@ tribalzone.tk, 1 tribe.rs, 1 tribeaura.com, 1 tribeca-it.com, 1 -tribecalawsuitloans.com, 1 tribedynamics.com, 1 tribefanaticsunited.tk, 1 tribesbeekeepersassociation.com, 1 @@ -151005,7 +150826,7 @@ trutrip.co, 1 truugo.com, 1 truvayangin.tk, 1 truvisory.com, 1 -truvo.ca, 1 +truvo.ca, 0 trux.tk, 1 truxa.net, 1 truxton.tk, 1 @@ -151283,6 +151104,7 @@ tucsonfcu.com, 1 tucsonpcrepair.com, 1 tucsonsewerscopes.com, 1 tucuatro.com, 1 +tucuxi.org, 1 tudatosantejmentesen.hu, 1 tudatosdori.hu, 1 tudinerito.tk, 1 @@ -151580,6 +151402,7 @@ turple.com, 1 turquoise.health, 1 turquoisetassel.com, 1 turretlabs.io, 1 +tursiae.org, 1 turtle.ai, 0 turtleduckstudios.com, 1 turtlehead.tk, 1 @@ -151589,7 +151412,6 @@ turtleteam.fr, 1 turtlezone.de, 1 turtunis.ml, 1 turul.tk, 1 -turunculevye.com, 1 tus-kikishinkyo.jp, 1 tus.si, 1 tusaalanga.ca, 0 @@ -152180,7 +152002,6 @@ uacred.co.ua, 1 uacrisis.org, 1 uae-company-service.com, 1 uaefiu.gov.ae, 1 -uaestorages.com, 1 uafinance.net, 1 uahistory.com, 1 uaireceitas.com.br, 1 @@ -152583,7 +152404,6 @@ ultima-ratio.at, 1 ultimasearch.com, 1 ultimasword.tk, 1 ultimate-fireworks.tk, 1 -ultimate.money, 1 ultimateappreviews.co, 1 ultimatebabyshowergifts.ga, 1 ultimatebattle.tk, 1 @@ -152605,6 +152425,7 @@ ultimatepower.ga, 1 ultimatespearfishing.com, 1 ultimateyankees.com, 1 ultimedalweb.it, 1 +ultortech.com, 1 ultra-fast.net, 1 ultra-pro.ga, 1 ultra.law, 1 @@ -152753,7 +152574,6 @@ unclaimedtreasure.com, 1 unclebens-specials.gr, 1 uncontrollablegas.com, 1 uncorporate.cf, 1 -uncuento.net, 1 uncut.wtf, 1 uncuteyes.tk, 1 uncuttype.wtf, 1 @@ -153230,7 +153050,6 @@ unreal-estate.pl, 1 unreal.dk, 1 unrealircd-api.org, 1 unrealircd.org, 1 -unrealphotographs.com, 1 unrelated.net.au, 1 unrepentant.cf, 1 unrepentant.ga, 1 @@ -153558,7 +153377,6 @@ urbansketchers.org, 1 urbansoundwave.tk, 1 urbanspitz.tk, 1 urbansportsclub.com, 1 -urbanstrategiesinc.org, 1 urbantecno.com, 1 urbantrafficschool.com, 1 urbantrail.tk, 1 @@ -153644,7 +153462,7 @@ urmx.eu, 1 urmx.net, 1 urmx.org, 1 urnabios.com, 1 -urni-eco.ru, 1 +urni-eco.ru, 0 uro.soy, 1 urocentre.ga, 1 urogen.com, 0 @@ -154622,7 +154440,6 @@ vaporquest.tk, 1 vapotank.com, 1 vapoteuse.fr, 1 vapteke.ru, 1 -vaptkidsight.azurewebsites.net, 1 var.cc, 1 vara.se, 1 varaani.tk, 1 @@ -155691,6 +155508,7 @@ vickyhundt.com, 1 vickylarraz.tk, 1 vickyoliver.tk, 1 vicmatus.com, 1 +vico.vn, 1 vicrecyclers.com.au, 1 vicsancab.com, 1 victimizer.tk, 1 @@ -155774,7 +155592,6 @@ vidcruiter.com, 0 vide-dressing.org, 0 vide-greniers.org, 0 vide-maisons.org, 0 -videcnik.si, 1 videferre.tk, 1 video-converter.com, 1 video-lab.it, 1 @@ -155841,7 +155658,6 @@ videt-son.tk, 1 vidhaatha.com, 1 vidi-design.uk, 1 vidimte.eu, 1 -vidiproject.com, 1 vidispine.com, 1 vidister.de, 0 viditour-golf.nl, 1 @@ -155856,7 +155672,6 @@ vidos.id, 1 vidracariaembh.com, 1 vidracariaespelhosbh.com.br, 1 vidrasec.com, 1 -vids.cz, 1 vidulo.com, 1 vidyalayalms.com, 1 vidyamonk.com, 1 @@ -156007,7 +155822,6 @@ vikaviktoria.com, 1 vikc.ca, 1 viki.com, 1 viking-style.ru, 1 -viking-t.com, 1 vikingenterprise.com, 1 vikingenterprisesolutions.com, 1 vikingsportsmag.com, 1 @@ -156222,6 +156036,7 @@ vimka.gq, 1 vimoksa.com, 1 vimworld.com, 1 vin-news.ru, 1 +vinaconce.cl, 1 vinarnaunas.cz, 1 vinarstvimodryhrozen.cz, 1 vinaygakhar.tk, 1 @@ -156546,7 +156361,6 @@ visaya.com.co, 1 visaynou.com, 1 visceralsound.ca, 1 viscondedemaua.com.br, 1 -viscountwines.com, 1 visdetech.com, 1 vise.com, 0 visecoach.com, 1 @@ -157963,6 +157777,7 @@ vulpine.club, 1 vulpix.uk, 1 vultrhxl.com, 1 vulva.observer, 1 +vulva.photos, 1 vumea.top, 1 vumerity.com, 0 vunn.com, 1 @@ -158222,9 +158037,7 @@ wagesweldandfab.com, 1 wageworks.com, 1 wagidopaczek.pl, 1 wagihakowe.pl, 1 -waginajazdowe.pl, 1 wagipaletowe.pl, 1 -wagiplatformowe.pl, 1 wagistolowe.pl, 1 wagn3r.de, 1 wagrowieckierekodzielo.pl, 1 @@ -158280,6 +158093,7 @@ wakenyatulindane.co.ke, 1 wakeofthepredator.tk, 1 wakeskincarellc.com, 1 waketurbulencereport.eu, 1 +wakeupeire.com, 1 wakeupworld.ml, 1 waki-ci.com, 1 wakinglighting.com, 0 @@ -158472,7 +158286,6 @@ wanjuhui.com, 1 wannabfit.nl, 1 wannaknow.tk, 1 wannapopularnews.cf, 1 -wannathis.one, 1 wanorthshoreny.gov, 1 wantaghschools.org, 1 wantocode.com, 1 @@ -158556,7 +158369,6 @@ warenmedia.com, 1 warennetworks.com, 1 warensecurity.com, 1 wareshoalssc.gov, 1 -warezbook.org, 1 warfarina.com, 1 warfield.org.uk, 1 warfighters.de, 1 @@ -158627,6 +158439,7 @@ wartorngalaxy.com, 1 wartraining.com.br, 1 wartung.tk, 1 warubbermate.co.th, 1 +warungmini-vanwou.nl, 1 warwick.institute, 1 warwickbucks.gov, 1 warworld.ml, 1 @@ -158822,7 +158635,6 @@ watisleukemie.tk, 1 watismijnbandenspanning.nl, 1 watmar.com.au, 1 watnongpangtru.com, 1 -watobi.jp, 1 watongaok.gov, 1 watoo.tech, 1 watrd.com, 1 @@ -158860,6 +158672,7 @@ waverity.ai, 1 waverlypa.gov, 1 waverlytn.gov, 1 wavesite.tk, 1 +wavycat.ru, 1 waw-werbeagentur.de, 1 wawak.pl, 1 wawapuquy.com, 1 @@ -158916,7 +158729,6 @@ wazzap.tk, 1 wb-cw.tech, 1 wb-partner.pl, 1 wb0hsi.org, 1 -wb256.com, 0 wba.or.at, 1 wball.com, 1 wbaltv.com, 1 @@ -159431,7 +159243,6 @@ webmama.tk, 1 webmanagement.berlin, 0 webmandat.fr, 1 webmandesign.eu, 1 -webmaniabr.com, 1 webmarcosmarquez.tk, 1 webmaster16.ml, 1 webmasterblog.tk, 1 @@ -159520,7 +159331,6 @@ websecured.io, 1 websecurity.is, 1 webseitendesigner.com, 0 webseitenserver.com, 0 -webserve.be, 1 webserverindia.com, 0 webshipper.com, 1 webshop.nl, 1 @@ -159534,7 +159344,6 @@ websitebakers.eu, 1 websiteboost.nl, 1 websitecalifornia.cf, 1 websitecenter.tk, 1 -websitecontrol.com, 1 websitecyber.com, 1 websitedesignersmalappuram.ga, 1 websitedesignprice.ga, 1 @@ -159728,7 +159537,6 @@ weekendtradingco.com, 1 weekly-app.com, 0 weekly-news.pl, 1 weekly-residence.com, 1 -weeklyads2.com, 0 weeklydcoupgen.com, 1 weelzbahamas.com, 1 weemakers.fr, 0 @@ -159858,7 +159666,7 @@ well.bayern, 1 wella-download-center.de, 1 wellbalancedhealth.ie, 1 wellbe.co, 1 -wellbe.com, 1 +wellbe.com, 0 wellbeing360.com.au, 1 wellbutrinxlgeneric.cf, 1 wellcarehealthsurvey.com, 1 @@ -160096,7 +159904,6 @@ westcentralaor.org, 1 westcentralmls.com, 1 westchester-il.gov, 1 westchesteranxietytreatment.com, 1 -westchesterwine.com, 1 westcoastaggregate.com, 1 westcoastcastles.com, 1 westcoastdrones.net, 1 @@ -160605,7 +160412,7 @@ whomanity.party, 1 whoneedstobeprimaried.today, 1 whong.media, 1 whonix.org, 1 -whoopee.my, 0 +whoopee.my, 1 whooshkaa.com, 1 whoownswhom.co.za, 1 whop.com, 1 @@ -160638,6 +160445,7 @@ whyleavetown.com, 1 whynohttps.com, 1 whynoipv6.com, 1 whynotbi.com, 1 +whypetcare.com, 1 whypowerbrush.com, 1 whysoslow.co.uk, 1 whyteryan.com, 1 @@ -161078,6 +160886,7 @@ willstamper.name, 1 willsthebest.co.uk, 0 willtaylorbooks.com, 0 willtc.co.uk, 1 +willtc.uk, 1 willturner.tk, 1 willvision.com, 0 willwilkins.com, 1 @@ -161202,7 +161011,6 @@ windycitypressurewashing.com, 1 wine-route.net, 1 wine.com.my, 1 wine.my, 1 -wineandcheeseplace.com, 1 winebrasil.com.br, 1 winechapter.be, 1 winedineunwind.org, 1 @@ -161210,14 +161018,11 @@ wineexperience.com.au, 1 wineforhelp.cz, 1 winefortune.com, 1 winegadgets.ru, 0 -winehouse.com, 1 winek.tk, 1 winenews.it, 1 wineparis.com, 1 winerytoursanfrancisco.com, 1 winetable.se, 1 -winewisegreenwich.com, 1 -wineworksonline.com, 1 winfieldchen.me, 1 winfieldpa.gov, 1 winfieldtownshipmi.gov, 1 @@ -161675,7 +161480,7 @@ woh.org, 0 woheni.de, 1 wohlgefuehl-massagen.de, 1 wohlpa.de, 0 -wohnbau-mobilitaet.ch, 1 +wohnbau-mobilitaet.ch, 0 wohnberatung-wien.at, 1 wohnsitz-ausland.com, 1 wohnungsaufloesung-berlin.net, 1 @@ -161690,7 +161495,6 @@ wohnungsbaukredit.org, 1 wohnungsmarktbeobachtung.de, 1 wohnzimmer-koch.de, 1 woi.vision, 1 -woistderbus.net, 1 wojart.pl, 1 wojciechowka.pl, 1 wojciechteichert.pl, 1 @@ -161892,7 +161696,6 @@ woodworkingforabeginner.com, 1 woodwormtreatment.com, 1 woody-art.eu, 1 woodyallen.tk, 1 -woodyandpearl.com, 1 woodysinstalaciones.com, 1 wooeffi.at, 1 woof.blue, 1 @@ -162302,7 +162105,6 @@ wozkinozycowe.pl, 1 wozkipaletowe.com.pl, 1 wozkipaletowe.net, 1 wozkipodnosnikowe.eu, 1 -wozsun.com, 0 wozwaardeloket.nl, 1 wozwebdesign.com.br, 1 wp-assistance.fr, 1 @@ -162326,7 +162128,6 @@ wp-tao.com, 1 wp-webagentur.de, 1 wpac.de, 1 wpadelaide.org, 1 -wpandup.org, 1 wpauctions.com, 1 wpautolistings.com, 1 wpbase.io, 1 @@ -162553,6 +162354,7 @@ wszystkocokocham.com, 1 wt-server3.de, 1 wtccc.org.uk, 1 wtdiw.com, 1 +wteam.pl, 1 wtfast.com, 1 wtfbryan.com, 0 wtfindonesia.tk, 1 @@ -163072,7 +162874,6 @@ xbjt33.com, 1 xbjt66.com, 1 xbjt666.com, 1 xbjt77.com, 1 -xblau.com, 1 xbox, 1 xbox-mag.net, 1 xboxachievements.com, 1 @@ -163297,7 +163098,7 @@ xice.cf, 1 xice.wang, 1 xicreative.net, 1 xiecongan.org, 1 -xiedeacc.com, 1 +xiedeacc.com, 0 xiexiexi.com, 1 xif.at, 1 xifrem.com, 1 @@ -163869,7 +163670,6 @@ xn--gmq92k.nagoya, 1 xn--grnderlehrstuhl-0vb.de, 1 xn--grnstrm-r1ae.nu, 1 xn--gs8h.eu.org, 1 -xn--h-1ga.net, 1 xn--h1aaahdlb4aki4h.xn--p1ai, 1 xn--h1aaakmzd.xn--p1ai, 1 xn--h1aagcjb0ajh5g.xn--p1ai, 1 @@ -163886,7 +163686,6 @@ xn--hnse-gra.net, 1 xn--hogarniitojesus-4qb.com, 1 xn--hsers-kva.de, 1 xn--hy1bj8u2yeo4i8lh.com, 1 -xn--iet627k.com, 1 xn--ikketenkpdet-1cb.no, 1 xn--imker-in-nrnberg-szb.de, 1 xn--incentft-81a.com, 1 @@ -164377,7 +164176,6 @@ xtremebouncepartyhire.com.au, 1 xtremecarwash.com, 1 xtremegaming.it, 1 xtremeitu.dk, 1 -xtremejetski.ae, 1 xtremers.tk, 1 xtremyblog.com, 0 xtronics.com, 1 @@ -165123,7 +164921,6 @@ yiai.ga, 1 yiai.gq, 1 yiai.ml, 1 yiai.tk, 1 -yianniswine.com, 1 yiannopoulos.edu.gr, 1 yibaoweilong.top, 1 yibin0831.com, 0 @@ -165325,7 +165122,6 @@ yoogirls.com, 1 yoonas.com, 1 yooneunhye.com, 0 yooooex.com, 1 -yoopies.fr, 1 yopers.com, 0 yopmail.com, 1 yopmail.net, 1 @@ -165848,7 +165644,6 @@ yunicorn19.com, 1 yunite.one, 1 yunjishou.pro, 1 yunloc.com, 1 -yunnanbaiyao.com, 1 yunqueradehenares.tk, 1 yunzhu.li, 1 yuplay.com, 1 @@ -165941,7 +165736,7 @@ yyc.city, 1 yycbike.info, 1 yydjtc.top, 0 yyr.im, 1 -yyrss.com, 0 +yyrss.com, 1 yyy116.com, 1 yyy608.com, 1 yyyy.xyz, 1 @@ -166491,7 +166286,6 @@ zecuur.nl, 1 zedaflow.com, 1 zedeko.pl, 1 zednet.tk, 1 -zedtm.ir, 1 zeebarresort.bt, 1 zeedroom.be, 1 zeeg.me, 1 @@ -167146,6 +166940,7 @@ znjc.top, 1 znnahiyan.com, 1 znowuwrocisz.pl, 1 znwvw.net, 1 +zobraz.cz, 1 zochowskiplasticsurgery.com, 1 zockenbiszumumfallen.de, 1 zocode.tk, 1 @@ -167153,6 +166948,7 @@ zocoxx.com, 1 zode.co, 1 zodee.com.au, 1 zodgame.fun, 0 +zodgame.xyz, 1 zodiacohouses.com, 1 zodiaconline.com, 1 zodiak.tk, 1 @@ -167186,6 +166982,7 @@ zoho.in, 1 zoho.sa, 1 zoho.uk, 1 zohoaccounts.com, 1 +zohoaccounts.eu, 1 zohoanalytics.com, 1 zohoanalytics.eu, 1 zohobookings.com, 1 @@ -167469,6 +167266,7 @@ zsoltbereczki.tk, 1 zsplesivec.cz, 1 zsq.im, 1 zsrbcs.com, 1 +zstaticcdn.com, 1 zstgmnachod.cz, 1 zstrategy.es, 1 zsue.de, 1 diff --git a/security/manager/tools/log_list.json b/security/manager/tools/log_list.json @@ -1,6 +1,6 @@ { - "version": "74.9", - "log_list_timestamp": "2025-10-29T12:52:58Z", + "version": "74.13", + "log_list_timestamp": "2025-11-02T12:54:00Z", "operators": [ { "name": "Google", diff --git a/security/sandbox/chromium-shim/patches/50_more_resilient_initialization_for_sandboxed_children.patch b/security/sandbox/chromium-shim/patches/50_more_resilient_initialization_for_sandboxed_children.patch @@ -1,45 +0,0 @@ -Use a more resilient initialization for sandboxed children. - -If commiting RWX memory fails, we fall back to RW instead, which is -enough to initialize the thunks. In that case, we make sure that the -later transition to RX permission succeeds. ---- - sandbox/win/src/interception.cc | 16 +++++++++++++--- - 1 file changed, 13 insertions(+), 3 deletions(-) - -diff --git a/security/sandbox/chromium/sandbox/win/src/interception.cc b/security/sandbox/chromium/sandbox/win/src/interception.cc -index 04f32b099646..c78d56e17abc 100644 ---- a/security/sandbox/chromium/sandbox/win/src/interception.cc -+++ b/security/sandbox/chromium/sandbox/win/src/interception.cc -@@ -386,9 +386,16 @@ ResultCode InterceptionManager::PatchNtdll(bool hot_patch_needed) { - - // Make an aligned, padded allocation, and move the pointer to our chunk. - size_t thunk_bytes_padded = base::bits::AlignUp(thunk_bytes, kPageSize); -- thunk_base = reinterpret_cast<BYTE*>( -+ BYTE* thunk_base_rwx = reinterpret_cast<BYTE*>( - ::VirtualAllocEx(child, thunk_base, thunk_bytes_padded, MEM_COMMIT, - PAGE_EXECUTE_READWRITE)); -+ bool rwx_commit_succeeded = static_cast<bool>(thunk_base_rwx); -+ if (rwx_commit_succeeded) { -+ thunk_base = thunk_base_rwx; -+ } else { -+ thunk_base = reinterpret_cast<BYTE*>(::VirtualAllocEx( -+ child, thunk_base, thunk_bytes_padded, MEM_COMMIT, PAGE_READWRITE)); -+ } - CHECK(thunk_base); // If this fails we'd crash anyway on an invalid access. - DllInterceptionData* thunks = - reinterpret_cast<DllInterceptionData*>(thunk_base + thunk_offset); -@@ -418,8 +425,11 @@ ResultCode InterceptionManager::PatchNtdll(bool hot_patch_needed) { - - // Attempt to protect all the thunks, but ignore failure - DWORD old_protection; -- ::VirtualProtectEx(child, thunks, thunk_bytes, PAGE_EXECUTE_READ, -- &old_protection); -+ bool rx_update_succeeded = static_cast<bool>(::VirtualProtectEx( -+ child, thunks, thunk_bytes, PAGE_EXECUTE_READ, &old_protection)); -+ -+ // We need the EXECUTE permission on the thunks, one way or the other -+ CHECK(rwx_commit_succeeded || rx_update_succeeded); - - ResultCode ret = - child_->TransferVariable("g_originals", g_originals, sizeof(g_originals)); diff --git a/security/sandbox/chromium-shim/patches/50_use_rw_rx_mapping_for_child_init.patch b/security/sandbox/chromium-shim/patches/50_use_rw_rx_mapping_for_child_init.patch @@ -0,0 +1,420 @@ +Use a RW/RX mapping for the remote initialization of sandboxed children. + +This removes the need for a remote RWX allocation in the child, or for a +remote change of protection from RW to RX. Instead, sandboxed child +processes only ever get a RX view on the mapping, which the parent +initializes with a RW view. + +The calls to WriteProcessMemory do not need to occur anymore, since the +parent updates through the RW view automatically propagate to the +child's RX view. + +We also delete ServiceResolverThunk::CopyThunk which is dead code. +--- + sandbox/win/src/eat_resolver.cc | 9 ++- + sandbox/win/src/eat_resolver.h | 1 + + sandbox/win/src/interception.cc | 57 ++++++++++++------- + sandbox/win/src/interception_agent.cc | 2 +- + sandbox/win/src/resolver.cc | 4 +- + sandbox/win/src/resolver.h | 2 + + sandbox/win/src/service_resolver.h | 10 +--- + sandbox/win/src/service_resolver_32.cc | 50 ++-------------- + sandbox/win/src/service_resolver_64.cc | 49 ++++------------ + 9 files changed, 65 insertions(+), 119 deletions(-) + +diff --git a/sandbox/win/src/eat_resolver.cc b/sandbox/win/src/eat_resolver.cc +index 97f77c1849d2..e1dc18a241bb 100644 +--- a/sandbox/win/src/eat_resolver.cc ++++ b/sandbox/win/src/eat_resolver.cc +@@ -18,12 +18,15 @@ NTSTATUS EatResolverThunk::Setup(const void* target_module, + const char* target_name, + const char* interceptor_name, + const void* interceptor_entry_point, ++ void* local_thunk_storage, + void* thunk_storage, + size_t storage_bytes, + size_t* storage_used) { +- NTSTATUS ret = +- Init(target_module, interceptor_module, target_name, interceptor_name, +- interceptor_entry_point, thunk_storage, storage_bytes); ++ // In-process interception only: we don't have a notion of local and remote. ++ CHECK(local_thunk_storage == thunk_storage); ++ NTSTATUS ret = Init(target_module, interceptor_module, target_name, ++ interceptor_name, interceptor_entry_point, ++ local_thunk_storage, thunk_storage, storage_bytes); + if (!NT_SUCCESS(ret)) + return ret; + +diff --git a/sandbox/win/src/eat_resolver.h b/sandbox/win/src/eat_resolver.h +index 924354e447a3..9d45c2863942 100644 +--- a/sandbox/win/src/eat_resolver.h ++++ b/sandbox/win/src/eat_resolver.h +@@ -29,6 +29,7 @@ class EatResolverThunk : public ResolverThunk { + const char* target_name, + const char* interceptor_name, + const void* interceptor_entry_point, ++ void* local_thunk_storage, + void* thunk_storage, + size_t storage_bytes, + size_t* storage_used) override; +diff --git a/sandbox/win/src/interception.cc b/sandbox/win/src/interception.cc +index 04f32b099646..9fef6728eb3e 100644 +--- a/sandbox/win/src/interception.cc ++++ b/sandbox/win/src/interception.cc +@@ -28,6 +28,8 @@ + #include "sandbox/win/src/target_process.h" + #include "sandbox/win/src/win_utils.h" + ++#include "mozilla/WindowsMapRemoteView.h" ++ + namespace sandbox { + + namespace { +@@ -372,8 +374,27 @@ ResultCode InterceptionManager::PatchNtdll(bool hot_patch_needed) { + + // Reserve a full 64k memory range in the child process. + HANDLE child = child_->Process(); +- BYTE* thunk_base = reinterpret_cast<BYTE*>(::VirtualAllocEx( +- child, nullptr, kAllocGranularity, MEM_RESERVE, PAGE_NOACCESS)); ++ HANDLE mapping = ::CreateFileMappingW(INVALID_HANDLE_VALUE, nullptr, ++ PAGE_EXECUTE_READWRITE | SEC_RESERVE, 0, ++ kAllocGranularity, nullptr); ++ // MOZ: We must crash on failure paths for parity with upstream code. This ++ // will allow us to compare the crash volume before and after patch. ++ CHECK(mapping); ++ ++ using LocalViewPtr = std::unique_ptr<void, decltype(&::UnmapViewOfFile)>; ++ LocalViewPtr local_view_ptr( ++ ::MapViewOfFile(mapping, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, 0), ++ &::UnmapViewOfFile); ++ auto* local_view = static_cast<BYTE*>(local_view_ptr.get()); ++ CHECK(local_view); ++ ++ // We never unmap child_view. If we succeed we want it to stay mapped, if we ++ // fail the child process will be terminated anyway. ++ auto* child_view = static_cast<BYTE*>(mozilla::MapRemoteViewOfFile( ++ mapping, child, 0ULL, nullptr, 0, 0, PAGE_EXECUTE_READ)); ++ CHECK(child_view); ++ ++ ::CloseHandle(mapping); + + // Find an aligned, random location within the reserved range. + size_t thunk_bytes = +@@ -381,19 +402,24 @@ ResultCode InterceptionManager::PatchNtdll(bool hot_patch_needed) { + size_t thunk_offset = internal::GetGranularAlignedRandomOffset(thunk_bytes); + + // Split the base and offset along page boundaries. +- thunk_base += thunk_offset & ~(kPageSize - 1); ++ auto* local_thunk_base = local_view + (thunk_offset & ~(kPageSize - 1)); ++ auto* thunk_base = child_view + (thunk_offset & ~(kPageSize - 1)); + thunk_offset &= kPageSize - 1; + + // Make an aligned, padded allocation, and move the pointer to our chunk. + size_t thunk_bytes_padded = base::bits::AlignUp(thunk_bytes, kPageSize); +- thunk_base = reinterpret_cast<BYTE*>( +- ::VirtualAllocEx(child, thunk_base, thunk_bytes_padded, MEM_COMMIT, +- PAGE_EXECUTE_READWRITE)); +- CHECK(thunk_base); // If this fails we'd crash anyway on an invalid access. ++ local_thunk_base = reinterpret_cast<BYTE*>(::VirtualAlloc( ++ local_thunk_base, thunk_bytes_padded, MEM_COMMIT, PAGE_READWRITE)); ++ CHECK(local_thunk_base); ++ thunk_base = reinterpret_cast<BYTE*>(::VirtualAllocEx( ++ child, thunk_base, thunk_bytes_padded, MEM_COMMIT, PAGE_EXECUTE_READ)); ++ CHECK(thunk_base); ++ + DllInterceptionData* thunks = + reinterpret_cast<DllInterceptionData*>(thunk_base + thunk_offset); + +- DllInterceptionData dll_data; ++ DllInterceptionData& dll_data = ++ *reinterpret_cast<DllInterceptionData*>(local_thunk_base + thunk_offset); + dll_data.data_bytes = thunk_bytes; + dll_data.num_thunks = 0; + dll_data.used_bytes = offsetof(DllInterceptionData, thunks); +@@ -407,20 +433,6 @@ ResultCode InterceptionManager::PatchNtdll(bool hot_patch_needed) { + if (rc != SBOX_ALL_OK) + return rc; + +- // and now write the first part of the table to the child's memory +- SIZE_T written; +- bool ok = +- !!::WriteProcessMemory(child, thunks, &dll_data, +- offsetof(DllInterceptionData, thunks), &written); +- +- if (!ok || (offsetof(DllInterceptionData, thunks) != written)) +- return SBOX_ERROR_CANNOT_WRITE_INTERCEPTION_THUNK; +- +- // Attempt to protect all the thunks, but ignore failure +- DWORD old_protection; +- ::VirtualProtectEx(child, thunks, thunk_bytes, PAGE_EXECUTE_READ, +- &old_protection); +- + ResultCode ret = + child_->TransferVariable("g_originals", g_originals, sizeof(g_originals)); + return ret; +@@ -475,6 +487,7 @@ ResultCode InterceptionManager::PatchClientFunctions( + NTSTATUS ret = thunk.Setup( + ntdll_base, interceptor_base, interception.function.c_str(), + interception.interceptor.c_str(), interception.interceptor_address, ++ &dll_data->thunks[dll_data->num_thunks], + &thunks->thunks[dll_data->num_thunks], + thunk_bytes - dll_data->used_bytes, nullptr); + if (!NT_SUCCESS(ret)) { +diff --git a/sandbox/win/src/interception_agent.cc b/sandbox/win/src/interception_agent.cc +index d4bc2a231203..3c8c4f112373 100644 +--- a/sandbox/win/src/interception_agent.cc ++++ b/sandbox/win/src/interception_agent.cc +@@ -172,7 +172,7 @@ bool InterceptionAgent::PatchDll(const DllPatchInfo* dll_info, + NTSTATUS ret = resolver->Setup( + thunks->base, interceptions_->interceptor_base, function->function, + interceptor, function->interceptor_address, &thunks->thunks[i], +- sizeof(ThunkData), nullptr); ++ &thunks->thunks[i], sizeof(ThunkData), nullptr); + if (!NT_SUCCESS(ret)) { + NOTREACHED_NT(); + return false; +diff --git a/sandbox/win/src/resolver.cc b/sandbox/win/src/resolver.cc +index b48a2f29a7b6..86f68a2c8313 100644 +--- a/sandbox/win/src/resolver.cc ++++ b/sandbox/win/src/resolver.cc +@@ -19,9 +19,11 @@ NTSTATUS ResolverThunk::Init(const void* target_module, + const char* target_name, + const char* interceptor_name, + const void* interceptor_entry_point, ++ void* local_thunk_storage, + void* thunk_storage, + size_t storage_bytes) { +- if (!thunk_storage || 0 == storage_bytes || !target_module || !target_name) ++ if (!local_thunk_storage || !thunk_storage || 0 == storage_bytes || ++ !target_module || !target_name) + return STATUS_INVALID_PARAMETER; + + if (storage_bytes < GetThunkSize()) +diff --git a/sandbox/win/src/resolver.h b/sandbox/win/src/resolver.h +index 5dd5bbc4fd8e..62ef0dcfd0bb 100644 +--- a/sandbox/win/src/resolver.h ++++ b/sandbox/win/src/resolver.h +@@ -54,6 +54,7 @@ class [[clang::lto_visibility_public]] ResolverThunk { + const char* target_name, + const char* interceptor_name, + const void* interceptor_entry_point, ++ void* local_thunk_storage, + void* thunk_storage, + size_t storage_bytes, + size_t* storage_used) = 0; +@@ -87,6 +88,7 @@ class [[clang::lto_visibility_public]] ResolverThunk { + const char* target_name, + const char* interceptor_name, + const void* interceptor_entry_point, ++ void* local_thunk_storage, + void* thunk_storage, + size_t storage_bytes); + +diff --git a/sandbox/win/src/service_resolver.h b/sandbox/win/src/service_resolver.h +index dc74bd6e5253..6d2a372083a3 100644 +--- a/sandbox/win/src/service_resolver.h ++++ b/sandbox/win/src/service_resolver.h +@@ -35,6 +35,7 @@ class [[clang::lto_visibility_public]] ServiceResolverThunk + const char* target_name, + const char* interceptor_name, + const void* interceptor_entry_point, ++ void* local_thunk_storage, + void* thunk_storage, + size_t storage_bytes, + size_t* storage_used) override; +@@ -55,15 +56,6 @@ class [[clang::lto_visibility_public]] ServiceResolverThunk + // Call this to set up ntdll_base_ which will allow for local patches. + void AllowLocalPatches(); + +- // Verifies that the function specified by |target_name| in |target_module| is +- // a service and copies the data from that function into |thunk_storage|. If +- // |storage_bytes| is too small, then the method fails. +- NTSTATUS CopyThunk(const void* target_module, +- const char* target_name, +- BYTE* thunk_storage, +- size_t storage_bytes, +- size_t* storage_used); +- + // Checks if a target was patched correctly for a jump. This is only for use + // in testing in 32-bit builds. Will always return true on 64-bit builds. Set + // |thunk_storage| to the same pointer passed to Setup(). +diff --git a/sandbox/win/src/service_resolver_32.cc b/sandbox/win/src/service_resolver_32.cc +index cb43a3d053a7..fdf8d5eea102 100644 +--- a/sandbox/win/src/service_resolver_32.cc ++++ b/sandbox/win/src/service_resolver_32.cc +@@ -153,20 +153,20 @@ NTSTATUS ServiceResolverThunk::Setup(const void* target_module, + const char* target_name, + const char* interceptor_name, + const void* interceptor_entry_point, ++ void* local_thunk_storage, + void* thunk_storage, + size_t storage_bytes, + size_t* storage_used) { +- NTSTATUS ret = +- Init(target_module, interceptor_module, target_name, interceptor_name, +- interceptor_entry_point, thunk_storage, storage_bytes); ++ NTSTATUS ret = Init(target_module, interceptor_module, target_name, ++ interceptor_name, interceptor_entry_point, ++ local_thunk_storage, thunk_storage, storage_bytes); + if (!NT_SUCCESS(ret)) + return ret; + + relative_jump_ = 0; + size_t thunk_bytes = GetThunkSize(); +- std::unique_ptr<char[]> thunk_buffer(new char[thunk_bytes]); + ServiceFullThunk* thunk = +- reinterpret_cast<ServiceFullThunk*>(thunk_buffer.get()); ++ reinterpret_cast<ServiceFullThunk*>(local_thunk_storage); + + if (!IsFunctionAService(&thunk->original) && + (!relaxed_ || !SaveOriginalFunction(&thunk->original, thunk_storage))) { +@@ -185,32 +185,6 @@ size_t ServiceResolverThunk::GetThunkSize() const { + return offsetof(ServiceFullThunk, internal_thunk) + GetInternalThunkSize(); + } + +-NTSTATUS ServiceResolverThunk::CopyThunk(const void* target_module, +- const char* target_name, +- BYTE* thunk_storage, +- size_t storage_bytes, +- size_t* storage_used) { +- NTSTATUS ret = ResolveTarget(target_module, target_name, &target_); +- if (!NT_SUCCESS(ret)) +- return ret; +- +- size_t thunk_bytes = GetThunkSize(); +- if (storage_bytes < thunk_bytes) +- return STATUS_UNSUCCESSFUL; +- +- ServiceFullThunk* thunk = reinterpret_cast<ServiceFullThunk*>(thunk_storage); +- +- if (!IsFunctionAService(&thunk->original) && +- (!relaxed_ || !SaveOriginalFunction(&thunk->original, thunk_storage))) { +- return STATUS_OBJECT_NAME_COLLISION; +- } +- +- if (storage_used) +- *storage_used = thunk_bytes; +- +- return ret; +-} +- + bool ServiceResolverThunk::IsFunctionAService(void* local_thunk) const { + static bool is_wow64 = IsWow64Process(); + return is_wow64 ? IsFunctionAServiceWow64(process_, target_, local_thunk) +@@ -247,23 +221,11 @@ NTSTATUS ServiceResolverThunk::PerformPatch(void* local_thunk, + SetInternalThunk(&full_local_thunk->internal_thunk, GetInternalThunkSize(), + remote_thunk, interceptor_); + +- size_t thunk_size = GetThunkSize(); +- +- // copy the local thunk buffer to the child +- SIZE_T written; +- if (!::WriteProcessMemory(process_, remote_thunk, local_thunk, thunk_size, +- &written)) { +- return STATUS_UNSUCCESSFUL; +- } +- +- if (thunk_size != written) +- return STATUS_UNSUCCESSFUL; +- + // and now change the function to intercept, on the child + if (ntdll_base_) { + // running a unit test + if (!::WriteProcessMemory(process_, target_, &intercepted_code, +- bytes_to_write, &written)) ++ bytes_to_write, nullptr)) + return STATUS_UNSUCCESSFUL; + } else { + if (!WriteProtectedChildMemory(process_, target_, &intercepted_code, +diff --git a/sandbox/win/src/service_resolver_64.cc b/sandbox/win/src/service_resolver_64.cc +index 33b91d04ad11..9d6839961c93 100644 +--- a/sandbox/win/src/service_resolver_64.cc ++++ b/sandbox/win/src/service_resolver_64.cc +@@ -178,19 +178,19 @@ NTSTATUS ServiceResolverThunk::Setup(const void* target_module, + const char* target_name, + const char* interceptor_name, + const void* interceptor_entry_point, ++ void* local_thunk_storage, + void* thunk_storage, + size_t storage_bytes, + size_t* storage_used) { +- NTSTATUS ret = +- Init(target_module, interceptor_module, target_name, interceptor_name, +- interceptor_entry_point, thunk_storage, storage_bytes); ++ NTSTATUS ret = Init(target_module, interceptor_module, target_name, ++ interceptor_name, interceptor_entry_point, ++ local_thunk_storage, thunk_storage, storage_bytes); + if (!NT_SUCCESS(ret)) + return ret; + + size_t thunk_bytes = GetThunkSize(); +- std::unique_ptr<char[]> thunk_buffer(new char[thunk_bytes]); + ServiceFullThunk* thunk = +- reinterpret_cast<ServiceFullThunk*>(thunk_buffer.get()); ++ reinterpret_cast<ServiceFullThunk*>(local_thunk_storage); + + if (!IsFunctionAService(&thunk->original)) + return STATUS_OBJECT_NAME_COLLISION; +@@ -207,30 +207,6 @@ size_t ServiceResolverThunk::GetThunkSize() const { + return sizeof(ServiceFullThunk); + } + +-NTSTATUS ServiceResolverThunk::CopyThunk(const void* target_module, +- const char* target_name, +- BYTE* thunk_storage, +- size_t storage_bytes, +- size_t* storage_used) { +- NTSTATUS ret = ResolveTarget(target_module, target_name, &target_); +- if (!NT_SUCCESS(ret)) +- return ret; +- +- size_t thunk_bytes = GetThunkSize(); +- if (storage_bytes < thunk_bytes) +- return STATUS_UNSUCCESSFUL; +- +- ServiceFullThunk* thunk = reinterpret_cast<ServiceFullThunk*>(thunk_storage); +- +- if (!IsFunctionAService(&thunk->original)) +- return STATUS_OBJECT_NAME_COLLISION; +- +- if (storage_used) +- *storage_used = thunk_bytes; +- +- return ret; +-} +- + bool ServiceResolverThunk::IsFunctionAService(void* local_thunk) const { + ServiceFullThunk function_code; + SIZE_T read; +@@ -252,26 +228,21 @@ bool ServiceResolverThunk::IsFunctionAService(void* local_thunk) const { + + NTSTATUS ServiceResolverThunk::PerformPatch(void* local_thunk, + void* remote_thunk) { ++ // MOZ: These variables are used in the 32-bit variant of this function. ++ (void) local_thunk; ++ (void) remote_thunk; ++ + // Patch the original code. + ServiceEntry local_service; + if (!SetInternalThunk(&local_service, sizeof(local_service), nullptr, + interceptor_)) + return STATUS_UNSUCCESSFUL; + +- // Copy the local thunk buffer to the child. +- SIZE_T actual; +- if (!::WriteProcessMemory(process_, remote_thunk, local_thunk, +- sizeof(ServiceFullThunk), &actual)) +- return STATUS_UNSUCCESSFUL; +- +- if (sizeof(ServiceFullThunk) != actual) +- return STATUS_UNSUCCESSFUL; +- + // And now change the function to intercept, on the child. + if (ntdll_base_) { + // Running a unit test. + if (!::WriteProcessMemory(process_, target_, &local_service, +- sizeof(local_service), &actual)) ++ sizeof(local_service), nullptr)) + return STATUS_UNSUCCESSFUL; + } else { + if (!WriteProtectedChildMemory(process_, target_, &local_service, diff --git a/security/sandbox/chromium-shim/patches/51_add_USER_LOCKDOWN_WITH_TRAVERSE.patch b/security/sandbox/chromium-shim/patches/51_add_USER_LOCKDOWN_WITH_TRAVERSE.patch @@ -0,0 +1,76 @@ +Author: Bob Owen <bobowencode@gmail.com> + +Add USER_LOCKDOWN_WITH_TRAVERSE access token level. + +diff --git a/sandbox/win/src/restricted_token_utils.cc b/sandbox/win/src/restricted_token_utils.cc +index cb8d18a1a832..1dc7fd219f88 100644 +--- a/sandbox/win/src/restricted_token_utils.cc ++++ b/sandbox/win/src/restricted_token_utils.cc +@@ -137,16 +137,26 @@ absl::optional<base::win::AccessToken> CreateRestrictedToken( + restricted_token.AddRestrictingSid(base::win::WellKnownSid::kRestricted); + if (unique_restricted_sid) { + restricted_token.AddRestrictingSid(*unique_restricted_sid); + } + } else { + restricted_token.AddUserSidForDenyOnly(); + } + break; ++ case USER_LOCKDOWN_WITH_TRAVERSE: ++ if (use_restricting_sids) { ++ restricted_token.AddRestrictingSid(base::win::WellKnownSid::kNull); ++ if (unique_restricted_sid) { ++ restricted_token.AddRestrictingSid(*unique_restricted_sid); ++ } ++ } else { ++ restricted_token.AddUserSidForDenyOnly(); ++ } ++ break; + case USER_LOCKDOWN: + remove_traverse_privilege = true; + if (use_restricting_sids) { + restricted_token.AddRestrictingSid(base::win::WellKnownSid::kNull); + if (unique_restricted_sid) { + restricted_token.AddRestrictingSid(*unique_restricted_sid); + } + } else { +diff --git a/sandbox/win/src/security_level.h b/sandbox/win/src/security_level.h +index f9110600a11a..a86c4576f6e8 100644 +--- a/sandbox/win/src/security_level.h ++++ b/sandbox/win/src/security_level.h +@@ -38,16 +38,18 @@ enum IntegrityLevel { + // The Token level specifies a set of security profiles designed to + // provide the bulk of the security of sandbox. + // + // TokenLevel |Restricting |Deny Only |Privileges| + // |Sids |Sids | | + // ----------------------------|--------------|----------------|----------| + // USER_LOCKDOWN | Null Sid | All | None | + // ----------------------------|--------------|----------------|----------| ++// USER_LOCKDOWN_WITH_TRAVERSE | Null Sid | All | Traverse | ++// ----------------------------|--------------|----------------|----------| + // USER_RESTRICTED | RESTRICTED | All | Traverse | + // ----------------------------|--------------|----------------|----------| + // USER_LIMITED | Users | All except: | Traverse | + // | Everyone | Users | | + // | RESTRICTED | Everyone | | + // | | Interactive | | + // ----------------------------|--------------|----------------|----------| + // USER_INTERACTIVE | Users | All except: | Traverse | +@@ -77,16 +79,17 @@ enum IntegrityLevel { + // and on the broker token itself. + // + // The LOCKDOWN level is designed to allow access to almost nothing that has + // security associated with and they are the recommended levels to run sandboxed + // code specially if there is a chance that the broker is process might be + // started by a user that belongs to the Admins or power users groups. + enum TokenLevel { + USER_LOCKDOWN = 0, ++ USER_LOCKDOWN_WITH_TRAVERSE, + USER_RESTRICTED, + USER_LIMITED, + USER_INTERACTIVE, + USER_RESTRICTED_NON_ADMIN, + USER_RESTRICTED_SAME_ACCESS, + USER_UNPROTECTED, + USER_LAST + }; diff --git a/security/sandbox/chromium/sandbox/win/src/eat_resolver.cc b/security/sandbox/chromium/sandbox/win/src/eat_resolver.cc @@ -18,12 +18,15 @@ NTSTATUS EatResolverThunk::Setup(const void* target_module, const char* target_name, const char* interceptor_name, const void* interceptor_entry_point, + void* local_thunk_storage, void* thunk_storage, size_t storage_bytes, size_t* storage_used) { - NTSTATUS ret = - Init(target_module, interceptor_module, target_name, interceptor_name, - interceptor_entry_point, thunk_storage, storage_bytes); + // In-process interception only: we don't have a notion of local and remote. + CHECK(local_thunk_storage == thunk_storage); + NTSTATUS ret = Init(target_module, interceptor_module, target_name, + interceptor_name, interceptor_entry_point, + local_thunk_storage, thunk_storage, storage_bytes); if (!NT_SUCCESS(ret)) return ret; diff --git a/security/sandbox/chromium/sandbox/win/src/eat_resolver.h b/security/sandbox/chromium/sandbox/win/src/eat_resolver.h @@ -29,6 +29,7 @@ class EatResolverThunk : public ResolverThunk { const char* target_name, const char* interceptor_name, const void* interceptor_entry_point, + void* local_thunk_storage, void* thunk_storage, size_t storage_bytes, size_t* storage_used) override; diff --git a/security/sandbox/chromium/sandbox/win/src/interception.cc b/security/sandbox/chromium/sandbox/win/src/interception.cc @@ -28,6 +28,8 @@ #include "sandbox/win/src/target_process.h" #include "sandbox/win/src/win_utils.h" +#include "mozilla/WindowsMapRemoteView.h" + namespace sandbox { namespace { @@ -372,8 +374,27 @@ ResultCode InterceptionManager::PatchNtdll(bool hot_patch_needed) { // Reserve a full 64k memory range in the child process. HANDLE child = child_->Process(); - BYTE* thunk_base = reinterpret_cast<BYTE*>(::VirtualAllocEx( - child, nullptr, kAllocGranularity, MEM_RESERVE, PAGE_NOACCESS)); + HANDLE mapping = ::CreateFileMappingW(INVALID_HANDLE_VALUE, nullptr, + PAGE_EXECUTE_READWRITE | SEC_RESERVE, 0, + kAllocGranularity, nullptr); + // MOZ: We must crash on failure paths for parity with upstream code. This + // will allow us to compare the crash volume before and after patch. + CHECK(mapping); + + using LocalViewPtr = std::unique_ptr<void, decltype(&::UnmapViewOfFile)>; + LocalViewPtr local_view_ptr( + ::MapViewOfFile(mapping, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, 0), + &::UnmapViewOfFile); + auto* local_view = static_cast<BYTE*>(local_view_ptr.get()); + CHECK(local_view); + + // We never unmap child_view. If we succeed we want it to stay mapped, if we + // fail the child process will be terminated anyway. + auto* child_view = static_cast<BYTE*>(mozilla::MapRemoteViewOfFile( + mapping, child, 0ULL, nullptr, 0, 0, PAGE_EXECUTE_READ)); + CHECK(child_view); + + ::CloseHandle(mapping); // Find an aligned, random location within the reserved range. size_t thunk_bytes = @@ -381,26 +402,24 @@ ResultCode InterceptionManager::PatchNtdll(bool hot_patch_needed) { size_t thunk_offset = internal::GetGranularAlignedRandomOffset(thunk_bytes); // Split the base and offset along page boundaries. - thunk_base += thunk_offset & ~(kPageSize - 1); + auto* local_thunk_base = local_view + (thunk_offset & ~(kPageSize - 1)); + auto* thunk_base = child_view + (thunk_offset & ~(kPageSize - 1)); thunk_offset &= kPageSize - 1; // Make an aligned, padded allocation, and move the pointer to our chunk. size_t thunk_bytes_padded = base::bits::AlignUp(thunk_bytes, kPageSize); - BYTE* thunk_base_rwx = reinterpret_cast<BYTE*>( - ::VirtualAllocEx(child, thunk_base, thunk_bytes_padded, MEM_COMMIT, - PAGE_EXECUTE_READWRITE)); - bool rwx_commit_succeeded = static_cast<bool>(thunk_base_rwx); - if (rwx_commit_succeeded) { - thunk_base = thunk_base_rwx; - } else { - thunk_base = reinterpret_cast<BYTE*>(::VirtualAllocEx( - child, thunk_base, thunk_bytes_padded, MEM_COMMIT, PAGE_READWRITE)); - } - CHECK(thunk_base); // If this fails we'd crash anyway on an invalid access. + local_thunk_base = reinterpret_cast<BYTE*>(::VirtualAlloc( + local_thunk_base, thunk_bytes_padded, MEM_COMMIT, PAGE_READWRITE)); + CHECK(local_thunk_base); + thunk_base = reinterpret_cast<BYTE*>(::VirtualAllocEx( + child, thunk_base, thunk_bytes_padded, MEM_COMMIT, PAGE_EXECUTE_READ)); + CHECK(thunk_base); + DllInterceptionData* thunks = reinterpret_cast<DllInterceptionData*>(thunk_base + thunk_offset); - DllInterceptionData dll_data; + DllInterceptionData& dll_data = + *reinterpret_cast<DllInterceptionData*>(local_thunk_base + thunk_offset); dll_data.data_bytes = thunk_bytes; dll_data.num_thunks = 0; dll_data.used_bytes = offsetof(DllInterceptionData, thunks); @@ -414,23 +433,6 @@ ResultCode InterceptionManager::PatchNtdll(bool hot_patch_needed) { if (rc != SBOX_ALL_OK) return rc; - // and now write the first part of the table to the child's memory - SIZE_T written; - bool ok = - !!::WriteProcessMemory(child, thunks, &dll_data, - offsetof(DllInterceptionData, thunks), &written); - - if (!ok || (offsetof(DllInterceptionData, thunks) != written)) - return SBOX_ERROR_CANNOT_WRITE_INTERCEPTION_THUNK; - - // Attempt to protect all the thunks, but ignore failure - DWORD old_protection; - bool rx_update_succeeded = static_cast<bool>(::VirtualProtectEx( - child, thunks, thunk_bytes, PAGE_EXECUTE_READ, &old_protection)); - - // We need the EXECUTE permission on the thunks, one way or the other - CHECK(rwx_commit_succeeded || rx_update_succeeded); - ResultCode ret = child_->TransferVariable("g_originals", g_originals, sizeof(g_originals)); return ret; @@ -485,6 +487,7 @@ ResultCode InterceptionManager::PatchClientFunctions( NTSTATUS ret = thunk.Setup( ntdll_base, interceptor_base, interception.function.c_str(), interception.interceptor.c_str(), interception.interceptor_address, + &dll_data->thunks[dll_data->num_thunks], &thunks->thunks[dll_data->num_thunks], thunk_bytes - dll_data->used_bytes, nullptr); if (!NT_SUCCESS(ret)) { diff --git a/security/sandbox/chromium/sandbox/win/src/interception_agent.cc b/security/sandbox/chromium/sandbox/win/src/interception_agent.cc @@ -172,7 +172,7 @@ bool InterceptionAgent::PatchDll(const DllPatchInfo* dll_info, NTSTATUS ret = resolver->Setup( thunks->base, interceptions_->interceptor_base, function->function, interceptor, function->interceptor_address, &thunks->thunks[i], - sizeof(ThunkData), nullptr); + &thunks->thunks[i], sizeof(ThunkData), nullptr); if (!NT_SUCCESS(ret)) { NOTREACHED_NT(); return false; diff --git a/security/sandbox/chromium/sandbox/win/src/resolver.cc b/security/sandbox/chromium/sandbox/win/src/resolver.cc @@ -19,9 +19,11 @@ NTSTATUS ResolverThunk::Init(const void* target_module, const char* target_name, const char* interceptor_name, const void* interceptor_entry_point, + void* local_thunk_storage, void* thunk_storage, size_t storage_bytes) { - if (!thunk_storage || 0 == storage_bytes || !target_module || !target_name) + if (!local_thunk_storage || !thunk_storage || 0 == storage_bytes || + !target_module || !target_name) return STATUS_INVALID_PARAMETER; if (storage_bytes < GetThunkSize()) diff --git a/security/sandbox/chromium/sandbox/win/src/resolver.h b/security/sandbox/chromium/sandbox/win/src/resolver.h @@ -54,6 +54,7 @@ class [[clang::lto_visibility_public]] ResolverThunk { const char* target_name, const char* interceptor_name, const void* interceptor_entry_point, + void* local_thunk_storage, void* thunk_storage, size_t storage_bytes, size_t* storage_used) = 0; @@ -87,6 +88,7 @@ class [[clang::lto_visibility_public]] ResolverThunk { const char* target_name, const char* interceptor_name, const void* interceptor_entry_point, + void* local_thunk_storage, void* thunk_storage, size_t storage_bytes); diff --git a/security/sandbox/chromium/sandbox/win/src/restricted_token_utils.cc b/security/sandbox/chromium/sandbox/win/src/restricted_token_utils.cc @@ -142,6 +142,16 @@ absl::optional<base::win::AccessToken> CreateRestrictedToken( restricted_token.AddUserSidForDenyOnly(); } break; + case USER_LOCKDOWN_WITH_TRAVERSE: + if (use_restricting_sids) { + restricted_token.AddRestrictingSid(base::win::WellKnownSid::kNull); + if (unique_restricted_sid) { + restricted_token.AddRestrictingSid(*unique_restricted_sid); + } + } else { + restricted_token.AddUserSidForDenyOnly(); + } + break; case USER_LOCKDOWN: remove_traverse_privilege = true; if (use_restricting_sids) { diff --git a/security/sandbox/chromium/sandbox/win/src/security_level.h b/security/sandbox/chromium/sandbox/win/src/security_level.h @@ -43,6 +43,8 @@ enum IntegrityLevel { // ----------------------------|--------------|----------------|----------| // USER_LOCKDOWN | Null Sid | All | None | // ----------------------------|--------------|----------------|----------| +// USER_LOCKDOWN_WITH_TRAVERSE | Null Sid | All | Traverse | +// ----------------------------|--------------|----------------|----------| // USER_RESTRICTED | RESTRICTED | All | Traverse | // ----------------------------|--------------|----------------|----------| // USER_LIMITED | Users | All except: | Traverse | @@ -82,6 +84,7 @@ enum IntegrityLevel { // started by a user that belongs to the Admins or power users groups. enum TokenLevel { USER_LOCKDOWN = 0, + USER_LOCKDOWN_WITH_TRAVERSE, USER_RESTRICTED, USER_LIMITED, USER_INTERACTIVE, diff --git a/security/sandbox/chromium/sandbox/win/src/service_resolver.h b/security/sandbox/chromium/sandbox/win/src/service_resolver.h @@ -35,6 +35,7 @@ class [[clang::lto_visibility_public]] ServiceResolverThunk const char* target_name, const char* interceptor_name, const void* interceptor_entry_point, + void* local_thunk_storage, void* thunk_storage, size_t storage_bytes, size_t* storage_used) override; @@ -55,15 +56,6 @@ class [[clang::lto_visibility_public]] ServiceResolverThunk // Call this to set up ntdll_base_ which will allow for local patches. void AllowLocalPatches(); - // Verifies that the function specified by |target_name| in |target_module| is - // a service and copies the data from that function into |thunk_storage|. If - // |storage_bytes| is too small, then the method fails. - NTSTATUS CopyThunk(const void* target_module, - const char* target_name, - BYTE* thunk_storage, - size_t storage_bytes, - size_t* storage_used); - // Checks if a target was patched correctly for a jump. This is only for use // in testing in 32-bit builds. Will always return true on 64-bit builds. Set // |thunk_storage| to the same pointer passed to Setup(). diff --git a/security/sandbox/chromium/sandbox/win/src/service_resolver_32.cc b/security/sandbox/chromium/sandbox/win/src/service_resolver_32.cc @@ -153,20 +153,20 @@ NTSTATUS ServiceResolverThunk::Setup(const void* target_module, const char* target_name, const char* interceptor_name, const void* interceptor_entry_point, + void* local_thunk_storage, void* thunk_storage, size_t storage_bytes, size_t* storage_used) { - NTSTATUS ret = - Init(target_module, interceptor_module, target_name, interceptor_name, - interceptor_entry_point, thunk_storage, storage_bytes); + NTSTATUS ret = Init(target_module, interceptor_module, target_name, + interceptor_name, interceptor_entry_point, + local_thunk_storage, thunk_storage, storage_bytes); if (!NT_SUCCESS(ret)) return ret; relative_jump_ = 0; size_t thunk_bytes = GetThunkSize(); - std::unique_ptr<char[]> thunk_buffer(new char[thunk_bytes]); ServiceFullThunk* thunk = - reinterpret_cast<ServiceFullThunk*>(thunk_buffer.get()); + reinterpret_cast<ServiceFullThunk*>(local_thunk_storage); if (!IsFunctionAService(&thunk->original) && (!relaxed_ || !SaveOriginalFunction(&thunk->original, thunk_storage))) { @@ -185,32 +185,6 @@ size_t ServiceResolverThunk::GetThunkSize() const { return offsetof(ServiceFullThunk, internal_thunk) + GetInternalThunkSize(); } -NTSTATUS ServiceResolverThunk::CopyThunk(const void* target_module, - const char* target_name, - BYTE* thunk_storage, - size_t storage_bytes, - size_t* storage_used) { - NTSTATUS ret = ResolveTarget(target_module, target_name, &target_); - if (!NT_SUCCESS(ret)) - return ret; - - size_t thunk_bytes = GetThunkSize(); - if (storage_bytes < thunk_bytes) - return STATUS_UNSUCCESSFUL; - - ServiceFullThunk* thunk = reinterpret_cast<ServiceFullThunk*>(thunk_storage); - - if (!IsFunctionAService(&thunk->original) && - (!relaxed_ || !SaveOriginalFunction(&thunk->original, thunk_storage))) { - return STATUS_OBJECT_NAME_COLLISION; - } - - if (storage_used) - *storage_used = thunk_bytes; - - return ret; -} - bool ServiceResolverThunk::IsFunctionAService(void* local_thunk) const { static bool is_wow64 = IsWow64Process(); return is_wow64 ? IsFunctionAServiceWow64(process_, target_, local_thunk) @@ -247,23 +221,11 @@ NTSTATUS ServiceResolverThunk::PerformPatch(void* local_thunk, SetInternalThunk(&full_local_thunk->internal_thunk, GetInternalThunkSize(), remote_thunk, interceptor_); - size_t thunk_size = GetThunkSize(); - - // copy the local thunk buffer to the child - SIZE_T written; - if (!::WriteProcessMemory(process_, remote_thunk, local_thunk, thunk_size, - &written)) { - return STATUS_UNSUCCESSFUL; - } - - if (thunk_size != written) - return STATUS_UNSUCCESSFUL; - // and now change the function to intercept, on the child if (ntdll_base_) { // running a unit test if (!::WriteProcessMemory(process_, target_, &intercepted_code, - bytes_to_write, &written)) + bytes_to_write, nullptr)) return STATUS_UNSUCCESSFUL; } else { if (!WriteProtectedChildMemory(process_, target_, &intercepted_code, diff --git a/security/sandbox/chromium/sandbox/win/src/service_resolver_64.cc b/security/sandbox/chromium/sandbox/win/src/service_resolver_64.cc @@ -178,19 +178,19 @@ NTSTATUS ServiceResolverThunk::Setup(const void* target_module, const char* target_name, const char* interceptor_name, const void* interceptor_entry_point, + void* local_thunk_storage, void* thunk_storage, size_t storage_bytes, size_t* storage_used) { - NTSTATUS ret = - Init(target_module, interceptor_module, target_name, interceptor_name, - interceptor_entry_point, thunk_storage, storage_bytes); + NTSTATUS ret = Init(target_module, interceptor_module, target_name, + interceptor_name, interceptor_entry_point, + local_thunk_storage, thunk_storage, storage_bytes); if (!NT_SUCCESS(ret)) return ret; size_t thunk_bytes = GetThunkSize(); - std::unique_ptr<char[]> thunk_buffer(new char[thunk_bytes]); ServiceFullThunk* thunk = - reinterpret_cast<ServiceFullThunk*>(thunk_buffer.get()); + reinterpret_cast<ServiceFullThunk*>(local_thunk_storage); if (!IsFunctionAService(&thunk->original)) return STATUS_OBJECT_NAME_COLLISION; @@ -207,30 +207,6 @@ size_t ServiceResolverThunk::GetThunkSize() const { return sizeof(ServiceFullThunk); } -NTSTATUS ServiceResolverThunk::CopyThunk(const void* target_module, - const char* target_name, - BYTE* thunk_storage, - size_t storage_bytes, - size_t* storage_used) { - NTSTATUS ret = ResolveTarget(target_module, target_name, &target_); - if (!NT_SUCCESS(ret)) - return ret; - - size_t thunk_bytes = GetThunkSize(); - if (storage_bytes < thunk_bytes) - return STATUS_UNSUCCESSFUL; - - ServiceFullThunk* thunk = reinterpret_cast<ServiceFullThunk*>(thunk_storage); - - if (!IsFunctionAService(&thunk->original)) - return STATUS_OBJECT_NAME_COLLISION; - - if (storage_used) - *storage_used = thunk_bytes; - - return ret; -} - bool ServiceResolverThunk::IsFunctionAService(void* local_thunk) const { ServiceFullThunk function_code; SIZE_T read; @@ -252,26 +228,21 @@ bool ServiceResolverThunk::IsFunctionAService(void* local_thunk) const { NTSTATUS ServiceResolverThunk::PerformPatch(void* local_thunk, void* remote_thunk) { + // MOZ: These variables are used in the 32-bit variant of this function. + (void) local_thunk; + (void) remote_thunk; + // Patch the original code. ServiceEntry local_service; if (!SetInternalThunk(&local_service, sizeof(local_service), nullptr, interceptor_)) return STATUS_UNSUCCESSFUL; - // Copy the local thunk buffer to the child. - SIZE_T actual; - if (!::WriteProcessMemory(process_, remote_thunk, local_thunk, - sizeof(ServiceFullThunk), &actual)) - return STATUS_UNSUCCESSFUL; - - if (sizeof(ServiceFullThunk) != actual) - return STATUS_UNSUCCESSFUL; - // And now change the function to intercept, on the child. if (ntdll_base_) { // Running a unit test. if (!::WriteProcessMemory(process_, target_, &local_service, - sizeof(local_service), &actual)) + sizeof(local_service), nullptr)) return STATUS_UNSUCCESSFUL; } else { if (!WriteProtectedChildMemory(process_, target_, &local_service, diff --git a/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp b/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp @@ -9,6 +9,7 @@ #include "sandboxBroker.h" #include <aclapi.h> +#include <sddl.h> #include <shlobj.h> #include <string> @@ -717,6 +718,30 @@ static sandbox::MitigationFlags DynamicCodeFlagForSystemMediaLibraries() { return dynamicCodeFlag; } +static auto GetProcessUserSidString() { + std::unique_ptr<wchar_t, LocalFreeDeleter> userSidString; + std::unique_ptr<HANDLE, CloseHandleDeleter> tokenHandle; + if (!::OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, + getter_Transfers(tokenHandle))) { + return userSidString; + } + + BYTE tokenUserBuffer[sizeof(TOKEN_USER) + SECURITY_MAX_SID_SIZE]; + DWORD len = sizeof(tokenUserBuffer); + if (!::GetTokenInformation(tokenHandle.get(), TokenUser, &tokenUserBuffer, + len, &len)) { + return userSidString; + } + + auto* tokenUser = reinterpret_cast<TOKEN_USER*>(tokenUserBuffer); + if (!::ConvertSidToStringSidW(tokenUser->User.Sid, + getter_Transfers(userSidString))) { + userSidString.reset(); + } + + return userSidString; +} + // Process fails to start in LPAC with ASan build #if !defined(MOZ_ASAN) static void HexEncode(const Span<const uint8_t>& aBytes, nsACString& aEncoded) { @@ -976,6 +1001,11 @@ void SandboxBroker::SetSecurityLevelForContentProcess(int32_t aSandboxLevel, accessTokenLevel = sandbox::USER_LOCKDOWN; initialIntegrityLevel = sandbox::INTEGRITY_LEVEL_LOW; delayedIntegrityLevel = sandbox::INTEGRITY_LEVEL_UNTRUSTED; + } else if (aSandboxLevel >= 9) { + jobLevel = sandbox::JobLevel::kLockdown; + accessTokenLevel = sandbox::USER_LOCKDOWN_WITH_TRAVERSE; + initialIntegrityLevel = sandbox::INTEGRITY_LEVEL_LOW; + delayedIntegrityLevel = sandbox::INTEGRITY_LEVEL_UNTRUSTED; } else if (aSandboxLevel >= 8) { jobLevel = sandbox::JobLevel::kLockdown; accessTokenLevel = sandbox::USER_RESTRICTED; @@ -1168,6 +1198,9 @@ void SandboxBroker::SetSecurityLevelForContentProcess(int32_t aSandboxLevel, // that path to fall-back to the normal loading path. config->SetForceKnownDllLoadingFallback(); + // We should be able to remove access to these media registry keys below + // once encoding has moved out of the content process (bug 1972552). + // Read access for MF Media Source Activate and subkeys/values. result = config->AllowRegistryRead( L"HKEY_LOCAL_MACHINE\\Software\\Classes\\CLSID" @@ -1221,6 +1254,28 @@ void SandboxBroker::SetSecurityLevelForContentProcess(int32_t aSandboxLevel, } #endif } + + if (aSandboxLevel >= 9) { + // Before reading the media registry keys (specified for aSandboxLevel >= 8) + // the user's Classes key is read. We lose access to this at + // USER_LOCKDOWN_WITH_TRAVERSE because we no longer have the Restricted SID. + // We should be able to remove this once encoding has moved out of the + // content process (bug 1972552). + auto userSidString = GetProcessUserSidString(); + if (userSidString) { + std::wstring userClassKeyName(L"HKEY_USERS\\"); + userClassKeyName += userSidString.get(); + userClassKeyName += L"_Classes"; + result = config->AllowRegistryRead(userClassKeyName.c_str()); + if (sandbox::SBOX_ALL_OK != result) { + NS_ERROR("Failed to add rule for user's Classes."); + LOG_E("Failed (ResultCode %d) to add rule for user's Classes.", result); + } + } else { + NS_ERROR("Failed to get user's SID."); + LOG_E("Failed to get user's SID. %lx", ::GetLastError()); + } + } } void SandboxBroker::SetSecurityLevelForGPUProcess(int32_t aSandboxLevel) { diff --git a/services/settings/dumps/blocklists/addons-bloomfilters.json b/services/settings/dumps/blocklists/addons-bloomfilters.json @@ -2,6 +2,522 @@ "data": [ { "stash": { + "blocked": [ + "{be19033b-2de2-4149-9a7c-630ea2af141e}:12.8.1", + "{cfd6d628-2cae-411b-9db2-41b3ca5dd925}:12.23.1", + "{5e1d0cc5-b63b-400b-b2fb-f29ac8c22193}:12.8.1", + "{698acd32-4d42-4127-8c06-d43e57272915}:12.8.1", + "{c9ddbf57-a48e-44da-8dd5-cd7501f87df1}:12.8.1", + "{63c680c4-4308-40d1-bfea-c8c91d6cff65}:12.8.1", + "{dfefe0ae-2871-4301-bbd3-ee3dc02c8b67}:12.8.1" + ], + "unblocked": [], + "softblocked": [ + "marcin.dec1@gmail.com:1.3.0", + "marcin.dec1@gmail.com:1.3.1", + "@2chdatviewer.myhilmyhill:1.0.0", + "{f174dda0-ceec-43bf-97e4-a504dcbfb09f}:1.4.8.8", + "{ea017008-fb89-4c15-a042-b9c3032e9588}:1.0", + "{89c6f8c0-c7b4-46b6-a1ca-d964c8247c5b}:1.0", + "workhourstracker@local:1.0" + ] + }, + "schema": 1762151789859, + "key_format": "{guid}:{version}", + "stash_time": 1762173305242, + "id": "bd17ed6c-0d53-467c-9965-041e7b15f35c", + "last_modified": 1762173379374 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{15a9235a-de6e-4cef-8b90-e8efbf13f881}:0.0.25", + "{15a9235a-de6e-4cef-8b90-e8efbf13f881}:0.0.27", + "{15a9235a-de6e-4cef-8b90-e8efbf13f881}:0.0.26", + "{15a9235a-de6e-4cef-8b90-e8efbf13f881}:0.0.28", + "{15a9235a-de6e-4cef-8b90-e8efbf13f881}:0.0.29", + "{15a9235a-de6e-4cef-8b90-e8efbf13f881}:0.0.30", + "{1d018584-d7ef-4b54-af03-2341fe9db2fa}:2.0.0", + "{ad9fa15e-841e-46e8-b935-756d35c586ec}:1.0", + "{777cd3ca-1580-450a-8577-5ff3cdd9675b}:1.0", + "subfeed@example.com:0.1.0", + "{dcf9e4dc-59d1-4f88-a170-36c78c7735f0}:3.1", + "{f03b58e3-44ad-4435-9ef2-895717b2f43f}:1.0", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2021.1006.1", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2021.1007.2", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2021.1007.3", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2021.1007.4", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2021.1008.0", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2021.1008.1", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2021.1008.4", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2021.1008.5", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2021.1009.0", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2021.1009.1", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2021.1009.2", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2021.1011.0", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2021.1011.1", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2021.1029.1", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2021.1107.0", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2022.605.0", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2022.906.2", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2022.907.0", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2022.1005.0", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2022.1120.2", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2022.1120.4", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2023.122.0", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2023.131.0", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2023.201.0", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2023.201.1", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2023.218.0", + "{8873e5a1-115c-48d6-98c1-dd9313cde7e3}:1.2023.329.0" + ] + }, + "schema": 1762136158670, + "key_format": "{guid}:{version}", + "stash_time": 1762151705983, + "id": "c6c3ae15-4a8c-499d-b80e-e47d859809f9", + "last_modified": 1762151789693 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{52306c48-d404-4ae6-901f-81dac1fa068a}:1.1.0", + "minimal-snippet-runner@example:1.2.3", + "{d6558581-1810-4b6d-bc06-a89c8f9f675e}:10.1", + "simple-job-apply@mailbase.info:0.1.1", + "luxonaio@extension.dev:0.0.2", + "kinozalhelper@elektrikis.id.lv:2.30.0", + "kinozalhelper@elektrikis.id.lv:2.31.0", + "kinozalhelper@elektrikis.id.lv:2.31.1", + "customtabs@deivix.dev:3.0.0", + "customtabs@deivix.dev:3.0.2", + "customtabs@deivix.dev:3.0.3", + "azul-assistant@boardgamearena.com:1.2.0", + "{852f759f-c956-48bd-88c6-dd494fb4feb3}:1.0", + "{2c6e47ca-3286-4820-8c2b-35252b0c4e09}:1.4", + "{48c0cb5f-5b05-4611-921f-dd5e14e77d98}:1.4", + "{280d2b1f-2cd9-4063-ad9f-3285b73ac674}:1.0", + "{093af4b9-7014-4cca-b420-2876e9d529fb}:1.4.0", + "{9bb1aa6e-07c9-4611-ac50-2cb03b03823c}:1.1.6", + "{8131e988-19e5-4e17-bf1f-ec83cceea09b}:2.0.0.0", + "{624d68cd-4860-42e7-9ce5-b2dce95f1b48}:4.3.70", + "{46c35e5e-ffa9-44be-aa5e-90f341e4ade6}:3.1.2", + "{dbcfb87d-20aa-41f2-9905-717e0df702b6}:1.3.4", + "{1e428d73-e958-4701-be59-a8ac9dc6c968}:0.1", + "video-segment-looper@ava0808.example:1.3.1", + "video-segment-looper@ava0808.example:0.1.1", + "video-segment-looper@ava0808.example:0.1.2" + ] + }, + "schema": 1762108590007, + "key_format": "{guid}:{version}", + "stash_time": 1762130107709, + "id": "ea308a0e-2298-4a76-9569-ff6ee2c46caf", + "last_modified": 1762130196450 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{d6558581-1810-4b6d-bc06-a89c8f9f675e}:10.0", + "hi@sp4ceMan.xyz:2.4.1", + "hi@sp4ceMan.xyz:2.4.2", + "hi@sp4ceMan.xyz:2.4.3", + "hi@sp4ceMan.xyz:2.4.4", + "hi@sp4ceMan.xyz:0.0.2", + "hi@sp4ceMan.xyz:2.4.6", + "{52306c48-d404-4ae6-901f-81dac1fa067a}:2.0", + "{52306c48-d404-4ae6-901f-81dac1fa067a}:1.1.0", + "{52306c48-d404-4ae6-901f-81dac1fa067a}:1.0", + "title-replacer@example.com:0.1.0", + "title-replacer@example.com:0.1.1", + "{815f42b7-bcce-4a6f-b1c9-8e6d7fb70bec}:1.0", + "{1cebc232-e6ad-4ab4-85da-946addfe8df6}:1.0", + "{75115781-3d15-4403-a2a9-8213aa353f84}:1.0", + "{dd9341f8-deb7-4813-b2a1-8c4b7cb57634}:1.0", + "{dd9341f8-deb7-4813-b2a1-8c4b7cb57634}:2.0", + "{dd9341f8-deb7-4813-b2a1-8c4b7cb57634}:3.0", + "{dd9341f8-deb7-4813-b2a1-8c4b7cb57634}:4.0", + "{dd9341f8-deb7-4813-b2a1-8c4b7cb57634}:5.0", + "msp2-userscript-manager@dolo.local:1.0.0" + ] + }, + "schema": 1762086998762, + "key_format": "{guid}:{version}", + "stash_time": 1762108505670, + "id": "601ca6f3-b2b2-4081-9eb9-319d16c3e727", + "last_modified": 1762108589798 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "youtube-downloader@yourdomain.com:1.0.0" + ] + }, + "schema": 1762065382855, + "key_format": "{guid}:{version}", + "stash_time": 1762086906563, + "id": "58e76a1b-69fc-40ab-8951-abe498b61c2e", + "last_modified": 1762086998567 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.6.1", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.6", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.5", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.2.1", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.10", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.1", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.0.8", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.0.7", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.0.3", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.0.2", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.0", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.0.1", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.2", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.8", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.8.1", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.20", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.21", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.23", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.28", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.30", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.32", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.33", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.38", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.39", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.50", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.52", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.51", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.53", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.56", + "{269539ab-07f3-4964-ae47-7d4deb557320}:1.58", + "multisell-helper-v15@addon-id.com:1.5", + "{f49a929d-502e-4650-9225-abab55b865c7}:1.0", + "{f49a929d-502e-4650-9225-abab55b865c7}:2.0", + "{f49a929d-502e-4650-9225-abab55b865c7}:3.0", + "{9433d72b-819b-4c7e-a32d-30d2ba627a03}:4.0", + "{9433d72b-819b-4c7e-a32d-30d2ba627a03}:3.0", + "rapid-collector@example.com:1.0.1", + "corelyst-antam@example.com:1.0", + "{cbf51341-dede-4050-820a-45ea49627f16}:1.0", + "{dff3549c-c4bb-4e7a-978f-39413fafd21b}:1.0", + "{d3ca9d41-d2c9-4852-b072-d67700467641}:1.0", + "{511ca74e-8805-431a-9cb6-68a368a27a06}:1.0", + "{cbf51341-dede-4050-820a-45ea49627f16}:1.1", + "{4dcd514a-4e50-446b-8e0d-83f517998cfc}:0.2" + ] + }, + "schema": 1762049749954, + "key_format": "{guid}:{version}", + "stash_time": 1762065305885, + "id": "738f3e4e-9cd6-4e19-af68-b1dfaea22852", + "last_modified": 1762065382758 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{159b6f72-6536-444e-b2e0-3d7540da1446}:8.1.1.3", + "{159b6f72-6536-444e-b2e0-3d7540da1446}:8.2.0.0", + "{159b6f72-6536-444e-b2e0-3d7540da1446}:8.3.0.0", + "{159b6f72-6536-444e-b2e0-3d7540da1446}:8.3.0.2", + "distraction-curtain-pro@jonesotens.com:2.2.0", + "{8c6dd33c-11dc-4c38-a770-8ea303c397c4}:1.0", + "{d851ea6b-db2e-4cdd-8b44-4b06e2ce8532}:1.0", + "{bbb0df11-b3d0-4423-8100-393ed4458ce3}:1.2.3", + "{5e9273c0-0d36-4327-a6b6-939ddefdb4f4}:1.0", + "{d851ea6b-db2e-4cdd-8b44-4b06e2ce8532}:0.0.0" + ] + }, + "schema": 1762022196675, + "key_format": "{guid}:{version}", + "stash_time": 1762043705946, + "id": "9e0f0604-f673-40ed-8bcb-f39f3b3ecc8a", + "last_modified": 1762043789927 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "com.youtube-queue-manager@samba.com:1.0", + "com.youtube-queue-manager@samba.com:1.2", + "com.youtube-queue-manager@samba.com:1.2.1", + "com.youtube-queue-manager@samba.com:1.2.2", + "{0cd59cb2-e37f-4b27-8e9c-09c69d907faf}:1.0", + "{0cd59cb2-e37f-4b27-8e9c-09c69d907faf}:2.0", + "toriumi0410@example.com:0.7", + "{1b500712-aef7-4e2b-b0ac-e93470a22f87}:1", + "roblox-friends-manager-unique-2025@example.com:1.0.9", + "roblox-friends-manager-unique-2025@example.com:1.0.8", + "ytdownloader@dodekatos:0.3", + "ytdownloader@dodekatos:0.3.1", + "ytdownloader@dodekatos:0.3.2", + "ytdownloader@dodekatos:0.3.3", + "ytdownloader@dodekatos:0.3.4" + ] + }, + "schema": 1762000593224, + "key_format": "{guid}:{version}", + "stash_time": 1762022105758, + "id": "f61e23a5-bfe5-448d-a5e5-e1e80dccaac6", + "last_modified": 1762022196577 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "chartink-bridge@example.com:1", + "chartink-bridge@example.com:2.0", + "typosquattingprotection@example.com:1.1.1" + ] + }, + "schema": 1761963354526, + "key_format": "{guid}:{version}", + "stash_time": 1762000506677, + "id": "f0a6724f-248c-470f-ad1b-cbc92143af68", + "last_modified": 1762000593032 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "ceolhdknifpojmmlbjjoeklbnjjicdae@chrome-store-foxified-121909573:1.6", + "mmimngoggfoobjdlefbcabngfnmieonb@chrome-store-foxified-121904828:1.1.14", + "{1d018584-d7ef-4b54-af03-2341fe9db2fa}:1.0.0", + "gip@ryjzea.shop:1.0", + "{ad8a6772-2bf8-4ab4-a577-7f7e7d406208}:0.3", + "{ad8a6772-2bf8-4ab4-a577-7f7e7d406208}:0.4", + "{ad8a6772-2bf8-4ab4-a577-7f7e7d406208}:0.6", + "{ad8a6772-2bf8-4ab4-a577-7f7e7d406208}:0.6.5", + "{ad8a6772-2bf8-4ab4-a577-7f7e7d406208}:0.7", + "{ad8a6772-2bf8-4ab4-a577-7f7e7d406208}:0.9", + "{ad8a6772-2bf8-4ab4-a577-7f7e7d406208}:0.9.1", + "{ad8a6772-2bf8-4ab4-a577-7f7e7d406208}:0.10", + "{ad8a6772-2bf8-4ab4-a577-7f7e7d406208}:0.20", + "{ad8a6772-2bf8-4ab4-a577-7f7e7d406208}:0.21" + ] + }, + "schema": 1761935780059, + "key_format": "{guid}:{version}", + "stash_time": 1761957306953, + "id": "66117643-c415-4459-8426-28205d179fd0", + "last_modified": 1761957396338 + }, + { + "stash": { + "blocked": [ + "baseprice@dash.app:2.19.2", + "{9b2a6315-7c03-471e-8c94-c1016489441c}:1.8.0", + "{d03d5e51-df05-465e-b497-a9d543d30e2a}:1.0", + "{d03d5e51-df05-465e-b497-a9d543d30e2a}:3.6.16", + "{fa6855bb-61a3-4d9b-9c24-634e9cff321b}:1.0", + "{fa6855bb-61a3-4d9b-9c24-634e9cff321b}:3.6.16" + ], + "unblocked": [], + "softblocked": [ + "{fc7b6418-e701-4e85-a5fc-3a6644ff31d1}:1.4.8.8", + "{740f8640-a054-4067-bf22-87b6e03cea82}:1.4.8.8", + "{4e01d9bb-a6d4-46aa-9f4a-2c7205026bfb}:1.4.8.8", + "{0ba2aae2-956e-4e5f-ac85-995c10a5316f}:1.0.0", + "{37f2dc26-06e7-4938-ba7e-c5ca011300ee}:1.4.8.8", + "{c551bbf9-3b78-4dcd-b265-9a22d8c19b4d}:1.4.8.8", + "{6fd7e1e2-1840-46b5-a71d-eeb1ce2c5a8b}:1.4.8.8", + "{b8c52e77-c986-4ac2-bd97-ba19e2997e61}:1.4.8.8", + "Android@bravenhancer.com:17.6.1", + "enhancer@goldenfox.com:17.6.1", + "classdl@parrwot:1.0", + "{4aed6ff0-aa13-46fd-8b0a-05ce7bcdaf54}:1.4.8.8", + "{f284c3c0-65b3-47f6-8df0-5264be383d22}:1.4.8.8", + "{ffef83b8-0f90-428b-a481-98eb6daf4504}:1.2.5", + "pjhnilfooknlkdonmjnleaomamfehkli@chrome-store-foxified-unsigned:1.7.1", + "ankfnfbhggdblgnengpbbpgbndebpfdi@chrome-store-foxified-unsigned:0.0.3", + "{3bf66d04-0bfb-40b9-a1d4-4afa2bc5af19}:1.4.13", + "opejkaopndcenabifdfpfjckepadabnf@chrome-store-foxified-1579036229:0.2.5", + "ekpipjofdicppbepocohdlgenahaneen@chrome-store-foxified-1579036229:1.7.1", + "targeted-cleaner@example.com:1.0.0", + "{b6f6592d-bb44-4331-a459-edc5b83b6ceb}:1.4.8.8", + "{05b3d56a-a72d-4642-966e-f89c4f4b3764}:1.4.8.8", + "{8245b70d-c74d-48ed-95d4-c42af09378a6}:0.1.2", + "{8245b70d-c74d-48ed-95d4-c42af09378a6}:0.1.3", + "{8245b70d-c74d-48ed-95d4-c42af09378a6}:0.1.4", + "{bafb7b29-a436-4e9a-95fb-d8af02a7314c}:1.4.8.8", + "{9d0c75cc-471a-446a-8d0b-9849f65f36f8}:1.4.8.8", + "@newsync-zen:2.3.7", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2595", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2601", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2613", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2614", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2637", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2644", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2659", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2669", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2677", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2687", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2702", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2710", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2720", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2723", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2731", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2746", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2752", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2750", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2610", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2763", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2776", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2782", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2790", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2799", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2803", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2812", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2854", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2875", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2880", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2878", + "{ee6ddb1e-c316-4062-874f-ff780824f459}:1.6.1.2728", + "{7052457c-b67f-4f0f-b465-0c71a7bef91f}:1.0", + "{93f7d52d-2c37-48ed-93cd-472200439b52}:1.0", + "{35311cd2-a357-4fdf-8297-9a8557f6f2da}:2.5.0", + "{35311cd2-a357-4fdf-8297-9a8557f6f2da}:2.6.0", + "@utilitator:0.0.1" + ] + }, + "schema": 1761914180565, + "key_format": "{guid}:{version}", + "stash_time": 1761935704915, + "id": "84741994-4ac4-4556-afb0-120794cbe34e", + "last_modified": 1761935779888 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "refinement-checklist@wiktor.local:1.0.0", + "{b252bbb2-8cd4-4348-b95c-6c8d96127205}:1.0", + "{eb056ecc-65fd-43fb-ab8a-f8c21f41b649}:1.0", + "{405e358b-5e1f-4b01-a702-7f7395de9f62}:0.0.4", + "bouton-oceane-pfh@orange.com:1.0", + "auto-theme-switcher2@example.com:2.2.3", + "new-tab-redirect-33@example.com:2.6.0", + "{ff0544da-f65e-4388-8012-be0b39db7294}:2.4", + "{a23e5a40-9bae-444d-a31b-7be62fdbc90d}:2.2", + "{8f2e9c45-6b3a-4d1e-a9f8-7c4b5e2d8a1f}:1.13.2", + "tabtabtab-sheets@tabtabtab.com:1.12.53", + "{4a2754eb-85ad-4b43-b4db-3551068068cb}:1.0", + "{4a2754eb-85ad-4b43-b4db-3551068068cb}:1.1" + ] + }, + "schema": 1761892583050, + "key_format": "{guid}:{version}", + "stash_time": 1761914104877, + "id": "d9215b5d-c524-42fe-a086-58182f04abc1", + "last_modified": 1761914180466 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "{74921077-9b99-4bf2-944a-c814b2b25156}:1.0", + "download-manager@example.com:1.2", + "valra@media.recorder:1.0.3", + "valra@media.recorder:1.0.5", + "valra@media.recorder:1.0.7", + "valra@media.recorder:1.0.8", + "rsi-auto-buy@tdmi.us:3.0.0", + "rsi-auto-buy@tdmi.us:3.0.3", + "{4d1b48c3-6830-49e9-b0c9-6f4901bb7c4f}:1.0", + "linpro@example.com:1.0", + "hoverzoomport@burakkurkcu.com:1.0.123", + "speedvideo@example.com:1.1.0", + "speedvideo@example.com:1.1.2" + ] + }, + "schema": 1761876945123, + "key_format": "{guid}:{version}", + "stash_time": 1761892504801, + "id": "b86ce40f-9eed-4633-bc03-c9597c98b50f", + "last_modified": 1761892582827 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "Android@bravenhancer.com:17.6.0", + "enhancer@goldenfox.com:17.6.0", + "youtube-cleaner-popup@example.com:1.2.2", + "youtube-cleaner-popup@example.com:1.2.3", + "youtube-cleaner-popup@example.com:1.2.4", + "tempus@example.com:1.0.11", + "tempus@example.com:1.0.12", + "library-vendor-search@your-library.org:7.2.0", + "ssoproxy@hacker:1.2", + "ssoproxy@hacker:1.1", + "{5bc4b3bc-9a6c-461c-ae90-6a0340490ec5}:1.0", + "somethig@-7844-4272-8140-4875a:1.0" + ] + }, + "schema": 1761849392413, + "key_format": "{guid}:{version}", + "stash_time": 1761870905843, + "id": "6f8f1ecf-e511-4eb2-b621-360389ed5029", + "last_modified": 1761870992085 + }, + { + "stash": { + "blocked": [ + "{2b71ab6f-cc0d-4ff8-b482-470f988d5c19}:6.2.0" + ], + "unblocked": [], + "softblocked": [ + "bankfinder@borrowbe.com:1.2.0", + "{3e4b4578-e3d0-486e-ab0b-743fba91a5f7}:0.1", + "forum@bigbrainafk.zone:1.0", + "amazon-address-helper@privacybrowserpy:1.0.0" + ] + }, + "schema": 1761827782734, + "key_format": "{guid}:{version}", + "stash_time": 1761849305234, + "id": "cbaa6ab7-8adc-4b53-9373-e77c67d24a62", + "last_modified": 1761849392128 + }, + { + "stash": { + "blocked": [], + "unblocked": [], + "softblocked": [ + "@rf-extension-001:1.2.1", + "{85c0fc9a-e41a-48b4-a6a3-412a8a10ba13}:1.0", + "{2277a348-4e36-4778-b3c8-8914eed2abe3}:1.0", + "{71c79efa-f73c-4d82-8fb1-5117bfb3c41c}:1.0", + "{6e4d5b97-0359-431d-8cc2-109701ae89af}:3.0.1" + ] + }, + "schema": 1761806190721, + "key_format": "{guid}:{version}", + "stash_time": 1761827705140, + "id": "fb4060ee-fc92-47ce-ae5f-67d8d4e7a8e9", + "last_modified": 1761827782572 + }, + { + "stash": { "blocked": [], "unblocked": [], "softblocked": [ @@ -1037,5 +1553,5 @@ "last_modified": 1761136764909 } ], - "timestamp": 1761806190631 + "timestamp": 1762173379374 } diff --git a/services/settings/dumps/main/top-sites.json b/services/settings/dumps/main/top-sites.json @@ -1,6 +1,103 @@ { "data": [ { + "url": "https://www.baidu.com/", + "order": 10, + "title": "百度", + "schema": 1761704146046, + "exclude_locales": [], + "exclude_regions": [], + "include_locales": [], + "include_regions": [ + "CN" + ], + "search_shortcut": true, + "exclude_experiments": [], + "include_experiments": [], + "id": "1bfdbe7c-570f-494a-b61c-20c5c64dd69d", + "last_modified": 1761841580345 + }, + { + "url": "https://www.zhihu.com/", + "order": 20, + "title": "知乎", + "schema": 1761756432798, + "exclude_locales": [], + "exclude_regions": [], + "include_locales": [], + "include_regions": [ + "CN" + ], + "exclude_experiments": [], + "include_experiments": [], + "id": "568fca49-6921-4895-997b-60276d6ea000", + "last_modified": 1761841580341 + }, + { + "url": "https://www.ifeng.com/", + "order": 30, + "title": "凤凰网", + "schema": 1761756462340, + "exclude_locales": [], + "exclude_regions": [], + "include_locales": [], + "include_regions": [ + "CN" + ], + "exclude_experiments": [], + "include_experiments": [], + "id": "8d392627-d892-4b51-96a7-3b2ec47c6cdd", + "last_modified": 1761841580338 + }, + { + "url": "https://weibo.com/", + "order": 40, + "title": "微博", + "schema": 1761756484424, + "exclude_locales": [], + "exclude_regions": [], + "include_locales": [], + "include_regions": [ + "CN" + ], + "exclude_experiments": [], + "include_experiments": [], + "id": "e707b8ac-e844-4b14-a1bc-ce6968c777d1", + "last_modified": 1761841580335 + }, + { + "url": "https://www.ctrip.com/", + "order": 50, + "title": "携程", + "schema": 1761756500593, + "exclude_locales": [], + "exclude_regions": [], + "include_locales": [], + "include_regions": [ + "CN" + ], + "exclude_experiments": [], + "include_experiments": [], + "id": "38ac6a09-6d0b-43fc-894b-d214e6d5b684", + "last_modified": 1761841580332 + }, + { + "url": "https://www.iqiyi.com/", + "order": 60, + "title": "爱奇艺", + "schema": 1761756514644, + "exclude_locales": [], + "exclude_regions": [], + "include_locales": [], + "include_regions": [ + "CN" + ], + "exclude_experiments": [], + "include_experiments": [], + "id": "cbb986d2-665d-4967-b74b-41ecdd7c6188", + "last_modified": 1761841580329 + }, + { "url": "http://tagesschau.de/", "order": 30, "title": "Tagesschau", @@ -134,67 +231,6 @@ "last_modified": 1741633408447 }, { - "url": "https://www.baidu.com/", - "order": 10, - "schema": 1611835746769, - "include_regions": [ - "CN" - ], - "search_shortcut": true, - "id": "1bfdbe7c-570f-494a-b61c-20c5c64dd69d", - "last_modified": 1611838808375 - }, - { - "url": "https://www.zhihu.com/", - "order": 20, - "schema": 1599055903630, - "include_regions": [ - "CN" - ], - "id": "568fca49-6921-4895-997b-60276d6ea000", - "last_modified": 1599146777461 - }, - { - "url": "https://www.ifeng.com/", - "order": 30, - "schema": 1599055904425, - "include_regions": [ - "CN" - ], - "id": "8d392627-d892-4b51-96a7-3b2ec47c6cdd", - "last_modified": 1599146777456 - }, - { - "url": "https://weibo.com/", - "order": 40, - "schema": 1599055905429, - "include_regions": [ - "CN" - ], - "id": "e707b8ac-e844-4b14-a1bc-ce6968c777d1", - "last_modified": 1599146777450 - }, - { - "url": "https://www.ctrip.com/", - "order": 50, - "schema": 1599055906460, - "include_regions": [ - "CN" - ], - "id": "38ac6a09-6d0b-43fc-894b-d214e6d5b684", - "last_modified": 1599146777446 - }, - { - "url": "https://www.iqiyi.com/", - "order": 60, - "schema": 1599055907301, - "include_regions": [ - "CN" - ], - "id": "cbb986d2-665d-4967-b74b-41ecdd7c6188", - "last_modified": 1599146777441 - }, - { "url": "https://www.youtube.com/", "order": 10, "title": "YouTube", @@ -206,5 +242,5 @@ "last_modified": 1599146777370 } ], - "timestamp": 1744205351122 + "timestamp": 1761841580345 } diff --git a/services/settings/dumps/security-state/intermediates.json b/services/settings/dumps/security-state/intermediates.json @@ -10110,42 +10110,6 @@ "last_modified": 1702353423368 }, { - "schema": 1700646486489, - "derHash": "hA6N0d/JwMUNKcqFEpkc8u19zd8SQQN1/QpdR/j79XY=", - "subject": "CN=CommScope Public Trust RSA Sub-CA-02-01,O=CommScope,C=US", - "subjectDN": "MFMxCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxMDAuBgNVBAMMJ0NvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFN1Yi1DQS0wMi0wMQ==", - "whitelist": false, - "attachment": { - "hash": "762f4a00fafbf72cafcfbf2df28508633b74eab8d56655a38f34f22cda936dd0", - "size": 2560, - "filename": "KqL7He22QNw5xBoQbw-L4F7QQHXu2QEKXyV8S9IIM7Q=.pem", - "location": "security-state-staging/intermediates/4358f58e-e583-4cef-909e-09165bcf77e4.pem", - "mimetype": "application/x-pem-file" - }, - "pubKeyHash": "KqL7He22QNw5xBoQbw+L4F7QQHXu2QEKXyV8S9IIM7Q=", - "crlite_enrolled": false, - "id": "839cfa6e-a330-4c7a-9c3f-33e9a898e391", - "last_modified": 1700647023222 - }, - { - "schema": 1700646486205, - "derHash": "64nTCH12kS12FqyZxzuuusH7jkg1+LoVtUP3NEpMV/E=", - "subject": "CN=CommScope Public Trust ECC Sub-CA-01-01,O=CommScope,C=US", - "subjectDN": "MFMxCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxMDAuBgNVBAMMJ0NvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFN1Yi1DQS0wMS0wMQ==", - "whitelist": false, - "attachment": { - "hash": "2be311121ba10df25faf0d5302d6bfd11db4831fdab8d31c6d8306841c759de9", - "size": 1414, - "filename": "2eDPH26eDI6d3-Tsjd41zsuO9Klm9C0IFnwK1xslzpw=.pem", - "location": "security-state-staging/intermediates/0d83f23e-7f91-4581-8469-5546f6804616.pem", - "mimetype": "application/x-pem-file" - }, - "pubKeyHash": "2eDPH26eDI6d3+Tsjd41zsuO9Klm9C0IFnwK1xslzpw=", - "crlite_enrolled": false, - "id": "4f712de1-16d2-4746-83e8-6e6dd3d87a4e", - "last_modified": 1700647023220 - }, - { "schema": 1700646485601, "derHash": "7ua69QsUvKBCArSWc35nb3E+dDH/1PyhMJ9mFIHsUg8=", "subject": "CN=TrustAsia OV TLS ECC CA G4,O=TrustAsia Technologies\\, Inc.,C=CN", @@ -10164,42 +10128,6 @@ "last_modified": 1700647023217 }, { - "schema": 1700646485912, - "derHash": "AhUxG8GC1ZcYgitF3fECE84mYak8PC0gPexlZ95Erjw=", - "subject": "CN=CommScope Public Trust RSA Sub-CA-01-02,O=CommScope,C=US", - "subjectDN": "MFMxCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxMDAuBgNVBAMMJ0NvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFN1Yi1DQS0wMS0wMg==", - "whitelist": false, - "attachment": { - "hash": "76fa134521bf3180c607f441ea511de8222ac07021bcb04f2b51434a869b6020", - "size": 2560, - "filename": "uUmm1vqY4WOAXX3tIc9qA2Ai5Yr0EmaZlBwLTelbnzw=.pem", - "location": "security-state-staging/intermediates/75bd4b66-445f-4c60-b998-2891565d084d.pem", - "mimetype": "application/x-pem-file" - }, - "pubKeyHash": "uUmm1vqY4WOAXX3tIc9qA2Ai5Yr0EmaZlBwLTelbnzw=", - "crlite_enrolled": false, - "id": "d2ed46e8-b5af-4401-a731-badd42ed9265", - "last_modified": 1700647023215 - }, - { - "schema": 1700646485300, - "derHash": "WY0hJQ3EAC/X8fwO9TBjPUsWh9hZfAp6hv2w6NcKQEs=", - "subject": "CN=CommScope Public Trust ECC Sub-CA-02-01,O=CommScope,C=US", - "subjectDN": "MFMxCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxMDAuBgNVBAMMJ0NvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFN1Yi1DQS0wMi0wMQ==", - "whitelist": false, - "attachment": { - "hash": "0861064b3940fe7c22d8860cbd8234786257b9ac114ebd823875c18db9e03559", - "size": 1414, - "filename": "FreBKmEXdNpyFMcG1o3nDNjwoZ5Vc924tuSbvWdZE64=.pem", - "location": "security-state-staging/intermediates/47074e7c-85a6-4995-b101-879fd3de19d0.pem", - "mimetype": "application/x-pem-file" - }, - "pubKeyHash": "FreBKmEXdNpyFMcG1o3nDNjwoZ5Vc924tuSbvWdZE64=", - "crlite_enrolled": false, - "id": "8f4225a5-796d-4d7a-8510-628d12fb66f6", - "last_modified": 1700647023212 - }, - { "schema": 1700646484689, "derHash": "woNIdA2jbPFN3EkoDPAwq5zjsKzgk7DhuhiUVvSRi5w=", "subject": "CN=TrustAsia DV TLS ECC CA G4,O=TrustAsia Technologies\\, Inc.,C=CN", @@ -10236,42 +10164,6 @@ "last_modified": 1700647023207 }, { - "schema": 1700646485003, - "derHash": "gUc+GximiHdogYQbOuFgsq2TXOno1YMriiYlZEjbc3k=", - "subject": "CN=CommScope Public Trust ECC Sub-CA-01-02,O=CommScope,C=US", - "subjectDN": "MFMxCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxMDAuBgNVBAMMJ0NvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFN1Yi1DQS0wMS0wMg==", - "whitelist": false, - "attachment": { - "hash": "46cae718f26fd00c333165e2fbd250a12a9d38a8bc2a9a6dc942fa9edf99c12b", - "size": 1414, - "filename": "tBre6NvedLp1Nvk3FtFIxgjhtkXFJ7lgj8u07sRBDk0=.pem", - "location": "security-state-staging/intermediates/3948e9d2-7cc4-4136-9b3f-72bc70afb1aa.pem", - "mimetype": "application/x-pem-file" - }, - "pubKeyHash": "tBre6NvedLp1Nvk3FtFIxgjhtkXFJ7lgj8u07sRBDk0=", - "crlite_enrolled": false, - "id": "8fb9c242-9ed1-4e18-997b-dd05d7fae35a", - "last_modified": 1700647023204 - }, - { - "schema": 1700646486816, - "derHash": "E4Du1mssMWYS1fbn72jC00YFgv6pTgDGwnWV+Rk049k=", - "subject": "CN=CommScope Public Trust RSA Sub-CA-01-01,O=CommScope,C=US", - "subjectDN": "MFMxCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxMDAuBgNVBAMMJ0NvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFN1Yi1DQS0wMS0wMQ==", - "whitelist": false, - "attachment": { - "hash": "7c11c1b878f79f9e702f18c2a9340e77d2a3a26d92b6fbaefc47260195b201f2", - "size": 2560, - "filename": "PuzSWf62hnlXmDTvun4KqmESMLeim7gU8LRuyOQPieY=.pem", - "location": "security-state-staging/intermediates/8db659e4-ad44-4c01-a7d3-986d7aa7cd0c.pem", - "mimetype": "application/x-pem-file" - }, - "pubKeyHash": "PuzSWf62hnlXmDTvun4KqmESMLeim7gU8LRuyOQPieY=", - "crlite_enrolled": false, - "id": "24f99808-5e61-4042-87d3-feaa84f7b8ab", - "last_modified": 1700647023201 - }, - { "schema": 1700621585126, "derHash": "4N1nQ9bQjiqxiITtHn5Gs9lyb/+psYZmQq6/Jm/aJlQ=", "subject": "CN=TrustAsia DV TLS RSA CA G3,O=TrustAsia Technologies\\, Inc.,C=CN", @@ -14484,24 +14376,6 @@ "last_modified": 1666727874843 }, { - "schema": 1666727436119, - "derHash": "1yERA4jKbyC7qf0ajbpO+4wWOSo9662XxVPurwrKyqw=", - "subject": "CN=TeliaSonera Server CA v2,O=TeliaSonera,C=FI", - "subjectDN": "MEYxCzAJBgNVBAYTAkZJMRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEhMB8GA1UEAwwYVGVsaWFTb25lcmEgU2VydmVyIENBIHYy", - "whitelist": false, - "attachment": { - "hash": "2f9dcba71811d0e494412cb5ac40c7215fd1e0e68794cf9d419462eb22bfdd4d", - "size": 2528, - "filename": "Fq3YMR2ibLgpoD509egJDn5cPXPfnXC5MUd2IWwV_qA=.pem", - "location": "security-state-staging/intermediates/e40e2f56-df5c-40a6-85f6-694d1d00f167.pem", - "mimetype": "application/x-pem-file" - }, - "pubKeyHash": "Fq3YMR2ibLgpoD509egJDn5cPXPfnXC5MUd2IWwV/qA=", - "crlite_enrolled": false, - "id": "3082ff87-55fc-4380-b33c-8f226a13dcec", - "last_modified": 1666727874827 - }, - { "schema": 1666727427156, "derHash": "tnb/oxeeiBIJOhter+6HauemqvIxB42tG/shzSiTdko=", "subject": "CN=GlobalSign RSA OV SSL CA 2018,O=GlobalSign nv-sa,C=BE", @@ -30738,5 +30612,5 @@ "last_modified": 1559865884636 } ], - "timestamp": 1761620226672 + "timestamp": 1761922623184 } diff --git a/taskcluster/gecko_taskgraph/transforms/task.py b/taskcluster/gecko_taskgraph/transforms/task.py @@ -2141,18 +2141,6 @@ def set_task_and_artifact_expiry(config, jobs): else None ) cap_from_now = fromNow(cap, now) if cap else None - if cap: - expiration_policy = evaluate_keyed_by( - config.graph_config["expiration-policy"], - "task expiration", - {"project": config.params["project"], "level": config.params["level"]}, - ) - for policy, expires in expiration_policy.items(): - if fromNow(expires, now) > cap_from_now: - raise Exception( - f'expiration-policy "{policy}" is larger than {cap} ' - f'for {config.params["project"]}' - ) for job in jobs: expires = get_expiration(config, job.get("expiration-policy", "default")) job_expiry = job.setdefault("expires-after", expires) diff --git a/taskcluster/gecko_taskgraph/util/bugbug.py b/taskcluster/gecko_taskgraph/util/bugbug.py @@ -122,31 +122,39 @@ def push_schedules(branch, rev): attempts = timeout / RETRY_INTERVAL i = 0 - did_fallback = 0 + success = False while i < attempts: r = session.get(url) r.raise_for_status() if r.status_code != 202: + success = True break + # Trigger the fallback deployment, but ignore it for now. r = session.get(fallback_url) r.raise_for_status() - if r.status_code != 202: - did_fallback = 1 - print("bugbug fallback answered quicker") - break - time.sleep(RETRY_INTERVAL) i += 1 end = monotonic() + if not success: + i = 0 + while i < attempts: + r = session.get(fallback_url) + r.raise_for_status() + + if r.status_code != 202: + break + + time.sleep(RETRY_INTERVAL) + i += 1 + _write_perfherder_data( lower_is_better={ "bugbug_push_schedules_time": end - start, "bugbug_push_schedules_retries": i, - "bugbug_push_schedules_fallback": did_fallback, } ) diff --git a/taskcluster/gecko_taskgraph/util/verify.py b/taskcluster/gecko_taskgraph/util/verify.py @@ -3,6 +3,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. +import datetime import logging import os import re @@ -10,6 +11,8 @@ import sys import warnings import attr +from taskcluster.utils import fromNow +from taskgraph.util.keyed_by import evaluate_keyed_by from taskgraph.util.treeherder import join_symbol from taskgraph.util.verify import VerificationSequence @@ -445,3 +448,22 @@ def verify_run_known_projects(task, taskgraph, scratch_pad, graph_config, parame f"Task '{task.label}' has an invalid run-on-projects value: " f"{invalid_projects}" ) + + +@verifications.add("graph_config") +def verify_try_expiration_policies(graph_config): + """We don't want any configuration leading to anything with an expiry longer + than 28 days on try.""" + now = datetime.datetime.utcnow() + cap = "28 days" + cap_from_now = fromNow(cap, now) + expiration_policy = evaluate_keyed_by( + graph_config["expiration-policy"], + "task expiration", + {"project": "try", "level": "1"}, + ) + for policy, expires in expiration_policy.items(): + if fromNow(expires, now) > cap_from_now: + raise Exception( + f'expiration-policy "{policy}" ({expires}) is larger than {cap} for try' + ) diff --git a/testing/gtest/reports.py b/testing/gtest/reports.py @@ -6,6 +6,7 @@ import functools import itertools import json import os +import sys import tempfile from os import path @@ -79,7 +80,10 @@ class AggregatedGTestReport(dict): __slots__ = ["result_dir"] def __init__(self): - self.result_dir = tempfile.TemporaryDirectory(ignore_cleanup_errors=True) + tmpdir_kwargs = {} + if sys.version_info >= (3, 10): + tmpdir_kwargs["ignore_cleanup_errors"] = True + self.result_dir = tempfile.TemporaryDirectory(**tmpdir_kwargs) super().__init__() self.reset() diff --git a/toolkit/components/extensions/Schemas.sys.mjs b/toolkit/components/extensions/Schemas.sys.mjs @@ -708,7 +708,7 @@ class Context { /** * Executes the given callback, and returns an array of choice strings - * passed to {@see #error} during its execution. + * passed to {@link #error} during its execution. * * @param {Function} callback * @returns {object} diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_contentscript_triggeringPrincipal.js b/toolkit/components/extensions/test/xpcshell/test_ext_contentscript_triggeringPrincipal.js @@ -183,7 +183,7 @@ function getElementData(test, opts) { } /** - * The result type of the {@see createElement} function. + * The result type of the {@link createElement} function. * * @typedef {object} CreateElementResult * @property {Element} elem @@ -197,7 +197,7 @@ function getElementData(test, opts) { /** * Creates a DOM tree for a given test, in a given configuration, as - * understood by {@see getElementData}, but without the `test.srcAttr` + * understood by {@link getElementData}, but without the `test.srcAttr` * attribute having been set. The caller must set the value of that * attribute to the returned `src` value. * @@ -207,9 +207,9 @@ function getElementData(test, opts) { * many variants of these as possible. * * @param {ElementTestCase} test - * A test object, as passed to {@see getElementData}. + * A test object, as passed to {@link getElementData}. * @param {ElementTestOptions} opts - * An options object, as passed to {@see getElementData}. + * An options object, as passed to {@link getElementData}. * @returns {CreateElementResult} */ function createElement(test, opts) { @@ -281,13 +281,13 @@ function escaped(strings, ...values) { } /** - * Converts the given test data, as accepted by {@see getElementData}, + * Converts the given test data, as accepted by {@link getElementData}, * to an HTML representation. * * @param {ElementTestCase} test - * A test object, as passed to {@see getElementData}. + * A test object, as passed to {@link getElementData}. * @param {ElementTestOptions} opts - * An options object, as passed to {@see getElementData}. + * An options object, as passed to {@link getElementData}. * @returns {string} */ function toHTML(test, opts) { @@ -586,9 +586,9 @@ function testInlineCSS() { * various configurations. * * @param {Array<ElementTestCase>} tests - * A list of test objects, as understood by {@see getElementData}. + * A list of test objects, as understood by {@link getElementData}. * @param {ElementTestOptions} baseOpts - * A base options object, as understood by {@see getElementData}, + * A base options object, as understood by {@link getElementData}, * which represents the default values for injections under this * context. */ @@ -758,13 +758,13 @@ function injectElements(tests, baseOpts) { } /** - * Stringifies the {@see injectElements} function for use as a page or + * Stringifies the {@link injectElements} function for use as a page or * content script. * * @param {Array<ElementTestCase>} tests - * A list of test objects, as understood by {@see getElementData}. + * A list of test objects, as understood by {@link getElementData}. * @param {ElementTestOptions} opts - * A base options object, as understood by {@see getElementData}, + * A base options object, as understood by {@link getElementData}, * which represents the default values for injections under this * context. * @returns {string} @@ -822,7 +822,7 @@ function getOriginBase(origURL) { * with the `origin` query parameter removed. * * @param {Array<ElementTestCase>} tests - * A list of tests, as understood by {@see getElementData}. + * A list of tests, as understood by {@link getElementData}. * @param {Record<string, object>} expectedSources * A set of sources for which each of the above tests is expected * to generate one request, if each of the properties in the @@ -946,7 +946,7 @@ function computeExpectedForbiddenURLs( * * @param {Promise<object>} urlsPromise * A promise which resolves to an object containing expected and - * forbidden URL sets, as returned by {@see computeBaseURLs}. + * forbidden URL sets, as returned by {@link computeBaseURLs}. * @param {Record<string, string>} origins * A mapping of origin parameters as they appear in URL query * strings to the origin strings returned by corresponding @@ -1015,7 +1015,7 @@ function awaitLoads(urlsPromise, origins) { * * @param {Promise<object>} urlsPromise * A promise which resolves to an object containing expected and - * forbidden URL sets, as returned by {@see computeBaseURLs}. + * forbidden URL sets, as returned by {@link computeBaseURLs}. * @param {ExtensionWrapper} extension * @returns {Promise} * A promise which resolves when all requests have been @@ -1087,7 +1087,7 @@ function awaitCSP(urlsPromise, extension) { /** * A list of tests to run in each context, as understood by - * {@see getElementData}. + * {@link getElementData}. */ const TESTS = [ { diff --git a/toolkit/components/prompts/src/PromptUtils.sys.mjs b/toolkit/components/prompts/src/PromptUtils.sys.mjs @@ -74,7 +74,7 @@ export var EnableDelayHelper = function ({ // While the user key-repeats, we want to renew the timer until keyup: this.focusTarget.addEventListener("keyup", this, true); this.focusTarget.addEventListener("keydown", this, true); - this.focusTarget.document.addEventListener("unload", this); + this.focusTarget.addEventListener("unload", this); // If we're not part of the active window, don't even start the timer yet. let topWin = focusTarget.browsingContext.top.window; @@ -91,14 +91,6 @@ EnableDelayHelper.prototype = { }, handleEvent(event) { - if ( - !event.type.startsWith("key") && - event.target != this.focusTarget && - event.target != this.focusTarget.document - ) { - return; - } - switch (event.type) { case "keyup": // As soon as any key goes up, we can stop treating keypresses @@ -150,7 +142,7 @@ EnableDelayHelper.prototype = { this.focusTarget.removeEventListener("focus", this); this.focusTarget.removeEventListener("keyup", this, true); this.focusTarget.removeEventListener("keydown", this, true); - this.focusTarget.document.removeEventListener("unload", this); + this.focusTarget.removeEventListener("unload", this); if (this._focusTimer) { this._focusTimer.cancel(); @@ -187,6 +179,8 @@ function makeSafe(fn) { // which makes it likely that the given fn might throw. try { fn(); - } catch (e) {} + } catch (e) { + console.error(e); + } }; } diff --git a/toolkit/components/telemetry/app/TelemetryReportingPolicy.sys.mjs b/toolkit/components/telemetry/app/TelemetryReportingPolicy.sys.mjs @@ -235,6 +235,10 @@ export var TelemetryReportingPolicy = { return TelemetryReportingPolicyImpl.fullOnTrainReleaseDates; }, + get minimumPolicyVersion() { + return TelemetryReportingPolicyImpl.minimumPolicyVersion; + }, + async ensureUserIsNotified() { return TelemetryReportingPolicyImpl.ensureUserIsNotified(); }, diff --git a/toolkit/components/telemetry/tests/unit/test_canUpload_truth_table.js b/toolkit/components/telemetry/tests/unit/test_canUpload_truth_table.js @@ -189,10 +189,7 @@ const Mutators = { ); }, B_legacyNotified() { - const min = Services.prefs.getIntPref( - TelemetryUtils.Preferences.MinimumPolicyVersion, - 1 - ); + const min = TelemetryReportingPolicy.minimumPolicyVersion; Services.prefs.setIntPref( TelemetryUtils.Preferences.AcceptedPolicyVersion, min diff --git a/toolkit/content/tests/browser/browser.toml b/toolkit/content/tests/browser/browser.toml @@ -83,6 +83,9 @@ fail-if = ["a11y_checks"] # Bug 1854538 clicked tabbrowser-tabpanels may not be ["browser_click_event_during_autoscrolling.js"] fail-if = ["a11y_checks"] # Bug 1854538 clicked browser may not be accessible +skip-if = [ + "os == 'linux' && os_version == '24.04' && processor == 'x86_64'", # Bug 1775544 +] ["browser_contentTitle.js"] diff --git a/toolkit/locales/en-US/toolkit/downloads/downloadUtils.ftl b/toolkit/locales/en-US/toolkit/downloads/downloadUtils.ftl @@ -95,12 +95,5 @@ download-utils-time-left-double = { $time1 } { $time2 } left download-utils-time-few-seconds = A few seconds left download-utils-time-unknown = Unknown time left -# Variables: -# $scheme (string) - URI scheme like data: jar: about: -download-utils-done-scheme = { $scheme } resource -# Special case of done-scheme for file: -# This is used as an eTLD replacement for local files, so make it lower case -download-utils-done-file-scheme = local file - # Displayed time for files finished yesterday download-utils-yesterday = Yesterday diff --git a/toolkit/locales/en-US/toolkit/global/browser-utils.ftl b/toolkit/locales/en-US/toolkit/global/browser-utils.ftl @@ -5,6 +5,14 @@ # Used for data: URLs where we don't have any useful origin information browser-utils-url-data = (data) +# Variables: +# $scheme (string) - URI scheme like jar: about: +browser-utils-url-scheme = { $scheme } resource +# Special case of done-scheme for file: +# This is used as an eTLD replacement for local files, so make it lower case +browser-utils-file-scheme = local file + + # Used for extension URLs # Variables: # $extension (string) - Name of the extension that generated the URL diff --git a/toolkit/modules/BrowserUtils.sys.mjs b/toolkit/modules/BrowserUtils.sys.mjs @@ -246,8 +246,36 @@ export var BrowserUtils = { } }, + /** + * Show a URI in the UI in a user-friendly (but security-sensitive) way. + * + * @param {nsIURI} uri + * @param {object} [options={}] + * @param {boolean} [options.showInsecureHTTP=false] + * Whether to show "http://" for insecure HTTP URLs. + * @param {boolean} [options.showWWW=false] + * Whether to show "www." for URLs that have it. + * @param {boolean} [options.onlyBaseDomain=false] + * Whether to show only the base domain (eTLD+1) for HTTP(S) URLs. + * @param {boolean} [options.showFilenameForLocalURIs=false] + * If false (default), will show a protocol-specific label for local + * URIs (file:, chrome:, resource:, moz-src:, jar:). + * Otherwise, will show the filename for such URIs. Only use 'true' if + * the context in which the URI is being represented is not security- + * critical. + */ formatURIForDisplay(uri, options = {}) { - let { showInsecureHTTP = false } = options; + let { + showInsecureHTTP = false, + showWWW = false, + onlyBaseDomain = false, + showFilenameForLocalURIs = false, + } = options; + // For moz-icon and jar etc. which wrap nsIURLs, if we want to show the + // actual filename, unwrap: + if (uri && uri instanceof Ci.nsINestedURI && showFilenameForLocalURIs) { + return this.formatURIForDisplay(uri.innermostURI, options); + } switch (uri.scheme) { case "view-source": { let innerURI = uri.spec.substring("view-source:".length); @@ -257,8 +285,14 @@ export var BrowserUtils = { // Fall through. case "https": { let host = uri.displayHostPort; - if (!showInsecureHTTP && host.startsWith("www.")) { + let removeSubdomains = + !showInsecureHTTP && + (onlyBaseDomain || (!showWWW && host.startsWith("www."))); + if (removeSubdomains) { host = Services.eTLD.getSchemelessSite(uri); + if (uri.port != -1) { + host += ":" + uri.port; + } } if (showInsecureHTTP && uri.scheme == "http") { return "http://" + host; @@ -269,7 +303,7 @@ export var BrowserUtils = { return "about:" + uri.filePath; case "blob": try { - let url = new URL(uri.specIgnoringRef); + let url = URL.fromURI(uri); // _If_ we find a non-null origin, report that. if (url.origin && url.origin != "null") { return this.formatURIStringForDisplay(url.origin, options); @@ -291,8 +325,22 @@ export var BrowserUtils = { } case "chrome": case "resource": + case "moz-icon": + case "moz-src": case "jar": case "file": + if (!showFilenameForLocalURIs) { + if (uri.scheme == "file") { + return lazy.gLocalization.formatValueSync( + "browser-utils-file-scheme" + ); + } + return lazy.gLocalization.formatValueSync( + "browser-utils-url-scheme", + { scheme: uri.scheme } + ); + } + // Otherwise, fall through to show filename... default: try { let url = uri.QueryInterface(Ci.nsIURL); @@ -318,7 +366,7 @@ export var BrowserUtils = { console.error(ex); } } - return uri.asciiHost || uri.spec; + return uri.spec; }, // Given a URL returns a (possibly transformed) URL suitable for sharing, or null if diff --git a/toolkit/modules/tests/xpcshell/test_BrowserUtils_urlFormatting.js b/toolkit/modules/tests/xpcshell/test_BrowserUtils_urlFormatting.js @@ -19,6 +19,10 @@ const EXTENSION_URL_EXPECTED_STRING = gL10n.formatValueSync( { extension: EXTENSION_NAME } ); +const FILE_URL_EXPECTED_STRING = gL10n.formatValueSync( + "browser-utils-file-scheme" +); + const { AddonTestUtils } = ChromeUtils.importESModule( "resource://testing-common/AddonTestUtils.sys.mjs" ); @@ -88,7 +92,7 @@ const HTTP_TESTS = [ output: "www.co.uk", }, - // Other sudomains should be kept: + // Other subdomains should be kept: { input: "https://webmail.example.co.uk", output: "webmail.example.co.uk", @@ -158,6 +162,15 @@ const TESTS = [ input: "data:text/html,42", output: DATA_URL_EXPECTED_STRING, }, + + { + input: `moz-icon:${Services.io.newFileURI(tempFile).spec}`, + output: tempFile.leafName, + }, + { + input: "moz-icon://.extension?size=16", + output: "moz-icon://.extension?size=16", + }, ]; add_setup(async () => { @@ -220,7 +233,9 @@ const { BrowserUtils } = ChromeUtils.importESModule( add_task(async function test_checkStringFormatting() { for (let { input, output } of TESTS) { Assert.equal( - BrowserUtils.formatURIStringForDisplay(input), + BrowserUtils.formatURIStringForDisplay(input, { + showFilenameForLocalURIs: true, + }), output, `String ${input} formatted for output should match` ); @@ -231,13 +246,56 @@ add_task(async function test_checkURIFormatting() { for (let { input, output } of TESTS) { let uri = Services.io.newURI(input); Assert.equal( - BrowserUtils.formatURIForDisplay(uri), + BrowserUtils.formatURIForDisplay(uri, { + showFilenameForLocalURIs: true, + }), + output, + `URI ${input} formatted for output should match` + ); + } +}); + +add_task(async function test_checkOnlyBaseDomain() { + for (let { input, output } of [ + { input: "https://subdomain.example.com/", output: "example.com" }, + { + input: "http://www.city.mikasa.hokkaido.jp/", + output: "city.mikasa.hokkaido.jp", + }, + { input: "https://www.example.co.uk/", output: "example.co.uk" }, + { + input: "mailto:example@subdomain.example.com", + output: "mailto:example@subdomain.example.com", + }, + ]) { + let uri = Services.io.newURI(input); + Assert.equal( + BrowserUtils.formatURIForDisplay(uri, { onlyBaseDomain: true }), output, `URI ${input} formatted for output should match` ); } }); +add_task(async function test_checkLocalFileFormatting() { + for (let { input } of TESTS) { + let uri = Services.io.newURI(input); + if ( + ["file", "chrome", "moz-icon", "resource", "jar"].includes(uri.scheme) + ) { + Assert.equal( + BrowserUtils.formatURIForDisplay(uri, { + showFilenameForLocalURIs: false, + }), + uri.scheme == "file" + ? FILE_URL_EXPECTED_STRING + : `${uri.scheme} resource`, + `URI ${input} formatted for output should match` + ); + } + } +}); + add_task(async function test_checkViewSourceFormatting() { for (let { input, output } of HTTP_TESTS) { Assert.equal( diff --git a/toolkit/mozapps/downloads/DownloadUtils.sys.mjs b/toolkit/mozapps/downloads/DownloadUtils.sys.mjs @@ -3,8 +3,6 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs"; - /** * This module provides the DownloadUtils object which contains useful methods * for downloads such as displaying file sizes, transfer times, and download @@ -55,14 +53,6 @@ const TIME_UNITS = [ // with TIME_UNITS without the last item const TIME_SIZES = [60, 60, 24]; -const lazy = {}; -XPCOMUtils.defineLazyServiceGetter( - lazy, - "IDNService", - "@mozilla.org/network/idn-service;1", - Ci.nsIIDNService -); - var localeNumberFormatCache = new Map(); function getLocaleNumberFormat(fractionDigits) { if (!localeNumberFormatCache.has(fractionDigits)) { @@ -387,82 +377,6 @@ export var DownloadUtils = { }, /** - * Get the appropriate display host string for a URI string depending on if - * the URI has an eTLD + 1, is an IP address, a local file, or other protocol - * - * @param aURIString - * The URI string to try getting an eTLD + 1, etc. - * @return A pair: [display host for the URI string, full host name] - */ - getURIHost: function DU_getURIHost(aURIString) { - // Get a URI that knows about its components - let uri = URL.parse(aURIString)?.URI; - if (!uri) { - return ["", ""]; - } - - // Get the inner-most uri for schemes like jar: - if (uri instanceof Ci.nsINestedURI) { - uri = uri.innermostURI; - } - - if (uri.schemeIs("blob")) { - let origin = URL.fromURI(uri).origin; - // Origin can be "null" for blob URIs from a sandbox. - if (origin != "null") { - // `newURI` can throw (like for null) and throwing here breaks... - // a lot of stuff. So let's avoid doing that in case there are other - // edgecases we're missing here. - try { - uri = Services.io.newURI(origin); - } catch (ex) { - console.error(ex); - } - } - } - - let fullHost; - try { - // Get the full host name; some special URIs fail (data: jar:) - fullHost = uri.host; - } catch (e) { - fullHost = ""; - } - - let displayHost; - try { - // This might fail if it's an IP address or doesn't have more than 1 part - let baseDomain = Services.eTLD.getBaseDomain(uri); - - // Convert base domain for display - displayHost = lazy.IDNService.convertToDisplayIDN(baseDomain); - } catch (e) { - // Default to the host name - displayHost = fullHost; - } - - // Check if we need to show something else for the host - if (uri.schemeIs("file")) { - // Display special text for file protocol - displayHost = l10n.formatValueSync("download-utils-done-file-scheme"); - fullHost = displayHost; - } else if (!displayHost.length) { - // Got nothing; show the scheme (data: about: moz-icon:) - displayHost = l10n.formatValueSync("download-utils-done-scheme", { - scheme: uri.scheme, - }); - fullHost = displayHost; - } else if (uri.port != -1) { - // Tack on the port if it's not the default port - let port = ":" + uri.port; - displayHost += port; - fullHost += port; - } - - return [displayHost, fullHost]; - }, - - /** * Converts a number of bytes to the appropriate unit that results in an * internationalized number that needs fewer than 4 digits. * diff --git a/toolkit/mozapps/downloads/tests/browser/browser_unknownContentType_blob.js b/toolkit/mozapps/downloads/tests/browser/browser_unknownContentType_blob.js @@ -36,7 +36,7 @@ add_task(async function test_check_blob_origin_representation() { await check_blob_origin( "data:text/html,<body>Some Text<br>", "(data)", - "blob" + "(data)" ); }); diff --git a/toolkit/mozapps/downloads/tests/unit/test_DownloadUtils.js b/toolkit/mozapps/downloads/tests/unit/test_DownloadUtils.js @@ -83,16 +83,6 @@ function testFormattedTimeStatus(aSec, aExpected) { Assert.equal(status.l10n.id, aExpected); } -function testURI(aURI, aDisp, aHost) { - dump("URI Test: " + [aURI, aDisp, aHost] + "\n"); - - let [disp, host] = DownloadUtils.getURIHost(aURI); - - // Make sure we have the right display host and full host - Assert.equal(disp, aDisp); - Assert.equal(host, aHost); -} - function testGetReadableDates(aDate, aCompactValue) { const now = new Date(2000, 11, 31, 11, 59, 59); @@ -373,26 +363,5 @@ function run_test() { testFormattedTimeStatus(0, "downloading-file-opens-in-seconds-2"); testFormattedTimeStatus(30, "downloading-file-opens-in-seconds-2"); - testURI("http://www.mozilla.org/", "mozilla.org", "www.mozilla.org"); - testURI( - "http://www.city.mikasa.hokkaido.jp/", - "city.mikasa.hokkaido.jp", - "www.city.mikasa.hokkaido.jp" - ); - testURI("data:text/html,Hello World", "data resource", "data resource"); - testURI( - "jar:http://www.mozilla.com/file!/magic", - "mozilla.com", - "www.mozilla.com" - ); - testURI("file:///C:/Cool/Stuff/", "local file", "local file"); - // Don't test for moz-icon if we don't have a protocol handler for it (e.g. b2g): - if ("@mozilla.org/network/protocol;1?name=moz-icon" in Cc) { - testURI("moz-icon:file:///test.extension", "local file", "local file"); - testURI("moz-icon://.extension", "moz-icon resource", "moz-icon resource"); - } - testURI("about:config", "about resource", "about resource"); - testURI("invalid.uri", "", ""); - testAllGetReadableDates(); } diff --git a/tools/@types/index.d.ts b/tools/@types/index.d.ts @@ -19,6 +19,7 @@ /// <reference types="./generated/lib.gecko.win32.d.ts" /> /// Order of references matters here, for overriding type signatures. +/// <reference types="./lib.gecko.esnext.d.ts" /> /// <reference types="./lib.gecko.tweaks.d.ts" /> import type {} from "./lib.gecko.augmentations.d.ts"; diff --git a/tools/@types/lib.gecko.esnext.d.ts b/tools/@types/lib.gecko.esnext.d.ts @@ -0,0 +1,39 @@ +/** + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +/** + * This file is for manual type definitions for things that aren't yet available + * in TypeScript, but should be in the next target version (esnext). This + * typically occurs when a feature has been implemented in Gecko, but not yet + * reached ECMAScript stage 4, or multi-browser support. + */ + +// Additions for Temporal. +// xref https://github.com/microsoft/TypeScript/pull/62628 + +/** + * Basic simulation of the Temporal interface. + * https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Temporal + */ +declare namespace Temporal { + type Instant = any; +} + +declare var Temporal: { + Duration: any; + Instant: any; + Now: any; + PlainDate: any; + PlainDateTime: any; + PlainMonthDay: any; + PlainTime: any; + PlainYearMonth: any; + ZonedDateTime: any; +}; + +interface Date { + toTemporalInstant(): Temporal.Instant; +} diff --git a/tools/lint/eslint/eslint-plugin-mozilla/lib/configs/recommended.mjs b/tools/lint/eslint/eslint-plugin-mozilla/lib/configs/recommended.mjs @@ -359,6 +359,11 @@ export default [ // If this changes, ensure the version in `legacyConfig` is updated, as well // as the return value of `helpers.getECMAVersion()`. ecmaVersion: "latest", + globals: { + // Temporal is currently a stage 3 ECMA proposal, and won't be in the + // "latest" ecmaVersion in ESLint until it reaches stage 4. + Temporal: "readonly", + }, }, name: "mozilla/recommended/main-rules", rules: { diff --git a/tools/lint/eslint/eslint-plugin-mozilla/lib/configs/require-jsdoc.mjs b/tools/lint/eslint/eslint-plugin-mozilla/lib/configs/require-jsdoc.mjs @@ -16,6 +16,7 @@ export default { }, }, ], + "jsdoc/require-next-type": "error", "jsdoc/require-param": "error", "jsdoc/require-param-name": "error", "jsdoc/require-param-type": "error", @@ -24,7 +25,9 @@ export default { "jsdoc/require-property-name": "error", "jsdoc/require-property-type": "error", "jsdoc/require-returns-check": "error", + // "jsdoc/require-throws-type": "error", "jsdoc/require-yields": "error", "jsdoc/require-yields-check": "error", + "jsdoc/require-yields-type": "error", }, }; diff --git a/tools/lint/eslint/eslint-plugin-mozilla/lib/configs/valid-jsdoc.mjs b/tools/lint/eslint/eslint-plugin-mozilla/lib/configs/valid-jsdoc.mjs @@ -18,6 +18,7 @@ export default { "jsdoc/multiline-blocks": "error", "jsdoc/no-bad-blocks": "error", "jsdoc/no-multi-asterisks": ["error", { allowWhitespace: true }], + // "jsdoc/reject-function-type": "error", "jsdoc/require-param-type": "error", "jsdoc/require-returns-type": "error", "jsdoc/tag-lines": ["error", "any", { startLines: 1 }], diff --git a/tools/lint/eslint/eslint-plugin-mozilla/package-lock.json b/tools/lint/eslint/eslint-plugin-mozilla/package-lock.json @@ -1,12 +1,12 @@ { "name": "eslint-plugin-mozilla", - "version": "4.3.1", + "version": "4.3.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "eslint-plugin-mozilla", - "version": "4.3.0", + "version": "4.3.1", "license": "MPL-2.0", "dependencies": { "eslint-scope": "^8.4.0", @@ -17,8 +17,8 @@ "toml-eslint-parser": "0.10.0" }, "devDependencies": { - "eslint": "9.34.0", - "mocha": "11.7.1" + "eslint": "9.38.0", + "mocha": "11.7.4" }, "engines": { "node": ">=22.0.0" @@ -26,7 +26,7 @@ "peerDependencies": { "@microsoft/eslint-plugin-sdl": "^1.0.0", "eslint": "^9.0.0", - "eslint-plugin-jsdoc": "^54.1.1", + "eslint-plugin-jsdoc": "^61.0.0", "eslint-plugin-no-unsanitized": "^4.1.0", "eslint-plugin-promise": "^7.2.1" }, @@ -40,26 +40,36 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.53.0.tgz", - "integrity": "sha512-Wyed8Wfn3vMNVwrZrgLMxmqwmlcCE1/RfUAOHFzMJb3QLH03mi9Yv1iOCZjif0yx5EZUeJ+17VD1MHPka9IQjQ==", + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.76.0.tgz", + "integrity": "sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w==", "license": "MIT", "peer": true, "dependencies": { "@types/estree": "^1.0.8", - "@typescript-eslint/types": "^8.39.1", + "@typescript-eslint/types": "^8.46.0", "comment-parser": "1.4.1", "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~4.8.0" + "jsdoc-type-pratt-parser": "~6.10.0" }, "engines": { "node": ">=20.11.0" } }, + "node_modules/@es-joy/resolve.exports": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz", + "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + } + }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" @@ -87,21 +97,21 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -110,18 +120,33 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers/node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" @@ -154,9 +179,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", - "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz", + "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -166,27 +191,39 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.2", + "@eslint/core": "^0.17.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -197,31 +234,18 @@ } }, "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "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", @@ -277,6 +301,19 @@ "node": ">=14" } }, + "node_modules/@sindresorhus/base62": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz", + "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -290,9 +327,9 @@ "license": "MIT" }, "node_modules/@typescript-eslint/types": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz", - "integrity": "sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz", + "integrity": "sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==", "license": "MIT", "peer": true, "engines": { @@ -341,9 +378,9 @@ } }, "node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -588,9 +625,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -749,24 +786,23 @@ } }, "node_modules/eslint": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", - "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz", + "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.1", + "@eslint/core": "^0.16.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.34.0", - "@eslint/plugin-kit": "^0.3.5", + "@eslint/js": "9.38.0", + "@eslint/plugin-kit": "^0.4.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", @@ -809,22 +845,26 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "54.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-54.1.1.tgz", - "integrity": "sha512-qoY2Gl0OkvATXIxRaG2irS2ue78+RTaOyYrADvg1ue+9FHE+2Mp7RcpO0epkuhhQgOkH/REv1oJFe58dYv8SGg==", + "version": "61.1.11", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.1.11.tgz", + "integrity": "sha512-c+NQQOFd+ZTjFt0pfFMB8OTumExg0vf8mlJsOtLj6qTDGewtLh7bhwoDgBg6rIiTziYc8N4u4dYmSdAIn0yTEQ==", "license": "BSD-3-Clause", "peer": true, "dependencies": { - "@es-joy/jsdoccomment": "~0.53.0", + "@es-joy/jsdoccomment": "~0.76.0", + "@es-joy/resolve.exports": "1.2.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", - "debug": "^4.4.1", + "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", "espree": "^10.4.0", "esquery": "^1.6.0", + "html-entities": "^2.6.0", + "object-deep-merge": "^2.0.0", "parse-imports-exports": "^0.2.4", - "semver": "^7.7.2", - "spdx-expression-parse": "^4.0.0" + "semver": "^7.7.3", + "spdx-expression-parse": "^4.0.0", + "to-valid-identifier": "^1.0.0" }, "engines": { "node": ">=20.11.0" @@ -834,9 +874,9 @@ } }, "node_modules/eslint-plugin-no-unsanitized": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.1.2.tgz", - "integrity": "sha512-ydF3PMFKEIkP71ZbLHFvu6/FW8SvRv6VV/gECfrQkqyD5+5oCAtPz8ZHy0GRuMDtNe2jsNdPCQXX4LSbkapAVQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.1.4.tgz", + "integrity": "sha512-cjAoZoq3J+5KJuycYYOWrc0/OpZ7pl2Z3ypfFq4GtaAgheg+L7YGxUo2YS3avIvo/dYU5/zR2hXu3v81M9NxhQ==", "license": "MPL-2.0", "peer": true, "peerDependencies": { @@ -1141,6 +1181,23 @@ "he": "bin/he" } }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT", + "peer": true + }, "node_modules/htmlparser2": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", @@ -1225,6 +1282,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -1283,13 +1350,13 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.8.0.tgz", - "integrity": "sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.10.0.tgz", + "integrity": "sha512-+LexoTRyYui5iOhJGn13N9ZazL23nAHGkXsa1p/C8yeq79WRfLBag6ZZ0FQG2aRoc9yfo59JT9EYCQonOkHKkQ==", "license": "MIT", "peer": true, "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" } }, "node_modules/json-buffer": { @@ -1400,9 +1467,9 @@ } }, "node_modules/mocha": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.1.tgz", - "integrity": "sha512-5EK+Cty6KheMS/YLPPMJC64g5V61gIR25KsRItHw6x4hEKT6Njp1n9LOlH4gpevuwMVS66SXaBBpg+RWZkza4A==", + "version": "11.7.4", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.4.tgz", + "integrity": "sha512-1jYAaY8x0kAZ0XszLWu14pzsf4KV740Gld4HXkhNTXwcHx4AUEDkPzgEHg9CM5dVcW+zv036tjpsEbLraPJj4w==", "dev": true, "license": "MIT", "dependencies": { @@ -1414,6 +1481,7 @@ "find-up": "^5.0.0", "glob": "^10.4.5", "he": "^1.2.0", + "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "log-symbols": "^4.1.0", "minimatch": "^9.0.5", @@ -1489,6 +1557,13 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "license": "MIT" }, + "node_modules/object-deep-merge": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz", + "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==", + "license": "MIT", + "peer": true + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -1666,6 +1741,19 @@ "node": ">=0.10.0" } }, + "node_modules/reserved-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", + "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -1697,9 +1785,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "peer": true, "bin": { @@ -1843,9 +1931,9 @@ } }, "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -1906,6 +1994,23 @@ "node": ">=8" } }, + "node_modules/to-valid-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz", + "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@sindresorhus/base62": "^1.0.0", + "reserved-identifiers": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/toml-eslint-parser": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/toml-eslint-parser/-/toml-eslint-parser-0.10.0.tgz", @@ -1979,9 +2084,9 @@ } }, "node_modules/workerpool": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.3.tgz", - "integrity": "sha512-slxCaKbYjEdFT/o2rH9xS1hf4uRDch1w7Uo+apxhZ+sf/1d9e0ZVkn42kPNGP2dgjIx6YFvSevj0zHvbWe2jdw==", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", + "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", "dev": true, "license": "Apache-2.0" }, @@ -2068,9 +2173,9 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { diff --git a/tools/lint/eslint/eslint-plugin-mozilla/package.json b/tools/lint/eslint/eslint-plugin-mozilla/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-mozilla", - "version": "4.3.1", + "version": "4.3.2", "description": "A collection of rules that help enforce JavaScript coding standard in the Mozilla project.", "keywords": [ "eslint", @@ -29,13 +29,13 @@ "toml-eslint-parser": "0.10.0" }, "devDependencies": { - "eslint": "9.34.0", - "mocha": "11.7.1" + "eslint": "9.38.0", + "mocha": "11.7.4" }, "peerDependencies": { "@microsoft/eslint-plugin-sdl": "^1.0.0", "eslint": "^9.0.0", - "eslint-plugin-jsdoc": "^54.1.1", + "eslint-plugin-jsdoc": "^61.0.0", "eslint-plugin-no-unsanitized": "^4.1.0", "eslint-plugin-promise": "^7.2.1" }, diff --git a/tools/lint/node-licenses.yml b/tools/lint/node-licenses.yml @@ -30,6 +30,7 @@ node-licenses: - (MIT OR CC0-1.0) - CC-BY-3.0 - (MIT AND CC-BY-3.0) + - CC-BY-4.0 - 0BSD - Zlib - Public Domain diff --git a/tools/ts/package-lock.json b/tools/ts/package-lock.json @@ -6,30 +6,16 @@ "": { "hasInstallScript": true, "devDependencies": { - "@mdn/browser-compat-data": "^6.0.4", + "@mdn/browser-compat-data": "7.1.17", "@types/webidl2": "24.4.3", "@typescript/dom-lib-generator": "github:microsoft/TypeScript-DOM-lib-generator#@types/web@0.0.257", - "bcd-idl-mapper": "3.0.0", - "jest": "30.0.5", + "bcd-idl-mapper": "3.0.1", + "jest": "30.2.0", "kdljs": "0.3.0", "peggy": "5.0.6", "print-diff": "2.0.0" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -46,9 +32,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true, "license": "MIT", "engines": { @@ -56,22 +42,22 @@ } }, "node_modules/@babel/core": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", - "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.3", - "@babel/parser": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -87,14 +73,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -183,9 +169,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -203,27 +189,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", - "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -487,18 +473,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", - "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", + "@babel/types": "^7.28.5", "debug": "^4.3.1" }, "engines": { @@ -506,14 +492,14 @@ } }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -571,21 +557,21 @@ "license": "Apache-2.0" }, "node_modules/@emnapi/core": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz", - "integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.6.0.tgz", + "integrity": "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.0.4", + "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", - "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.6.0.tgz", + "integrity": "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==", "dev": true, "license": "MIT", "optional": true, @@ -594,9 +580,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz", - "integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", "dev": true, "license": "MIT", "optional": true, @@ -650,17 +636,17 @@ } }, "node_modules/@jest/console": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.0.5.tgz", - "integrity": "sha512-xY6b0XiL0Nav3ReresUarwl2oIz1gTnxGbGpho9/rbUWsLH0f1OD/VT84xs8c7VmH7MChnLb0pag6PhZhAdDiA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", + "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", - "jest-message-util": "30.0.5", - "jest-util": "30.0.5", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", "slash": "^3.0.0" }, "engines": { @@ -668,39 +654,39 @@ } }, "node_modules/@jest/core": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.0.5.tgz", - "integrity": "sha512-fKD0OulvRsXF1hmaFgHhVJzczWzA1RXMMo9LTPuFXo9q/alDbME3JIyWYqovWsUBWSoBcsHaGPSLF9rz4l9Qeg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", + "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.0.5", + "@jest/console": "30.2.0", "@jest/pattern": "30.0.1", - "@jest/reporters": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", + "@jest/reporters": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "ci-info": "^4.2.0", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", - "jest-changed-files": "30.0.5", - "jest-config": "30.0.5", - "jest-haste-map": "30.0.5", - "jest-message-util": "30.0.5", + "jest-changed-files": "30.2.0", + "jest-config": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.0.5", - "jest-resolve-dependencies": "30.0.5", - "jest-runner": "30.0.5", - "jest-runtime": "30.0.5", - "jest-snapshot": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", - "jest-watcher": "30.0.5", + "jest-resolve": "30.2.0", + "jest-resolve-dependencies": "30.2.0", + "jest-runner": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "jest-watcher": "30.2.0", "micromatch": "^4.0.8", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "slash": "^3.0.0" }, "engines": { @@ -726,70 +712,70 @@ } }, "node_modules/@jest/environment": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.0.5.tgz", - "integrity": "sha512-aRX7WoaWx1oaOkDQvCWImVQ8XNtdv5sEWgk4gxR6NXb7WBUnL5sRak4WRzIQRZ1VTWPvV4VI4mgGjNL9TeKMYA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", + "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "30.0.5", - "@jest/types": "30.0.5", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-mock": "30.0.5" + "jest-mock": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.0.5.tgz", - "integrity": "sha512-6udac8KKrtTtC+AXZ2iUN/R7dp7Ydry+Fo6FPFnDG54wjVMnb6vW/XNlf7Xj8UDjAE3aAVAsR4KFyKk3TCXmTA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", "dev": true, "license": "MIT", "dependencies": { - "expect": "30.0.5", - "jest-snapshot": "30.0.5" + "expect": "30.2.0", + "jest-snapshot": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.0.5.tgz", - "integrity": "sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1" + "@jest/get-type": "30.1.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.0.5.tgz", - "integrity": "sha512-ZO5DHfNV+kgEAeP3gK3XlpJLL4U3Sz6ebl/n68Uwt64qFFs5bv4bfEEjyRGK5uM0C90ewooNgFuKMdkbEoMEXw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", + "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", "@types/node": "*", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", - "jest-util": "30.0.5" + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/get-type": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.0.1.tgz", - "integrity": "sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==", + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", "dev": true, "license": "MIT", "engines": { @@ -797,16 +783,16 @@ } }, "node_modules/@jest/globals": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.0.5.tgz", - "integrity": "sha512-7oEJT19WW4oe6HR7oLRvHxwlJk2gev0U9px3ufs8sX9PoD1Eza68KF0/tlN7X0dq/WVsBScXQGgCldA1V9Y/jA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", + "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.0.5", - "@jest/expect": "30.0.5", - "@jest/types": "30.0.5", - "jest-mock": "30.0.5" + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -827,17 +813,17 @@ } }, "node_modules/@jest/reporters": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.0.5.tgz", - "integrity": "sha512-mafft7VBX4jzED1FwGC1o/9QUM2xebzavImZMeqnsklgcyxBto8mV4HzNSzUrryJ+8R9MFOM3HgYuDradWR+4g==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", + "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@jridgewell/trace-mapping": "^0.3.25", "@types/node": "*", "chalk": "^4.1.2", @@ -850,9 +836,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^5.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "30.0.5", - "jest-util": "30.0.5", - "jest-worker": "30.0.5", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", "slash": "^3.0.0", "string-length": "^4.0.2", "v8-to-istanbul": "^9.0.1" @@ -883,13 +869,13 @@ } }, "node_modules/@jest/snapshot-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.0.5.tgz", - "integrity": "sha512-XcCQ5qWHLvi29UUrowgDFvV4t7ETxX91CbDczMnoqXPOIcZOxyNdSjm6kV5XMc8+HkxfRegU/MUmnTbJRzGrUQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", + "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "natural-compare": "^1.4.0" @@ -914,14 +900,14 @@ } }, "node_modules/@jest/test-result": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.0.5.tgz", - "integrity": "sha512-wPyztnK0gbDMQAJZ43tdMro+qblDHH1Ru/ylzUo21TBKqt88ZqnKKK2m30LKmLLoKtR2lxdpCC/P3g1vfKcawQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", + "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.0.5", - "@jest/types": "30.0.5", + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", "@types/istanbul-lib-coverage": "^2.0.6", "collect-v8-coverage": "^1.0.2" }, @@ -930,15 +916,15 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.0.5.tgz", - "integrity": "sha512-Aea/G1egWoIIozmDD7PBXUOxkekXl7ueGzrsGGi1SbeKgQqCYCIf+wfbflEbf2LiPxL8j2JZGLyrzZagjvW4YQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", + "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.0.5", + "@jest/test-result": "30.2.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", + "jest-haste-map": "30.2.0", "slash": "^3.0.0" }, "engines": { @@ -946,23 +932,23 @@ } }, "node_modules/@jest/transform": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.0.5.tgz", - "integrity": "sha512-Vk8amLQCmuZyy6GbBht1Jfo9RSdBtg7Lks+B0PecnjI8J+PCLQPGh7uI8Q/2wwpW2gLdiAfiHNsmekKlywULqg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", + "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.0", + "babel-plugin-istanbul": "^7.0.1", "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", + "jest-haste-map": "30.2.0", "jest-regex-util": "30.0.1", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "micromatch": "^4.0.8", "pirates": "^4.0.7", "slash": "^3.0.0", @@ -973,9 +959,9 @@ } }, "node_modules/@jest/types": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.5.tgz", - "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", "dependencies": { @@ -1002,6 +988,17 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -1020,9 +1017,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -1031,9 +1028,9 @@ } }, "node_modules/@mdn/browser-compat-data": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-6.1.4.tgz", - "integrity": "sha512-g4WOGwx+cR4dQ5QsRzuJCUuMu/Vn+/vtRiOQ4TLtKQkQV37J3/HiVrU4PQYm/aJy1DbE83ONwcz5SjrwvRP9Ag==", + "version": "7.1.17", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-7.1.17.tgz", + "integrity": "sha512-uu84r+qFnWO3a+3+kK2cb+ZwEZRxxSgamFb2S+uA56g8ffYSOljqx/luf+oKIsnUMc4s1wTFbro5qq1IV8YzQw==", "dev": true, "license": "CC0-1.0" }, @@ -1101,9 +1098,9 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.34.40", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.40.tgz", - "integrity": "sha512-gwBNIP8ZAYev/ORDWW0QvxdwPXwxBtLsdsJgSc7eDIRt8ubP+rxUBzPsrwnu16fgEF8Bx4lh/+mvQvJzcTM6Kw==", + "version": "0.34.41", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", + "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "dev": true, "license": "MIT" }, @@ -1128,9 +1125,9 @@ } }, "node_modules/@tybys/wasm-util": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", - "integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", "dev": true, "license": "MIT", "optional": true, @@ -1211,13 +1208,13 @@ } }, "node_modules/@types/node": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", - "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "version": "24.9.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.2.tgz", + "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.10.0" + "undici-types": "~7.16.0" } }, "node_modules/@types/stack-utils": { @@ -1235,9 +1232,9 @@ "license": "MIT" }, "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "version": "17.0.34", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.34.tgz", + "integrity": "sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==", "dev": true, "license": "MIT", "dependencies": { @@ -1534,9 +1531,9 @@ ] }, "node_modules/@webref/idl": { - "version": "3.66.1", - "resolved": "https://registry.npmjs.org/@webref/idl/-/idl-3.66.1.tgz", - "integrity": "sha512-1nkRbMl1GU0IG1E96OPTHRNQP2ir0WZX6KFu9RN8QO/3RjlognX6OP4F4NiZu3py5zQqGmjnQd/qLKmn5yCbhQ==", + "version": "3.68.3", + "resolved": "https://registry.npmjs.org/@webref/idl/-/idl-3.68.3.tgz", + "integrity": "sha512-Y3ytN2KguJMNBgigmgvehuIlmCIM17WtYPpDbsJA7DFG0is+jUJfQioA7AnB/Og7JufdGV6912GFS0HBrpx+dQ==", "dev": true, "license": "MIT", "peer": true, @@ -1561,9 +1558,9 @@ } }, "node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -1614,16 +1611,16 @@ } }, "node_modules/babel-jest": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.0.5.tgz", - "integrity": "sha512-mRijnKimhGDMsizTvBTWotwNpzrkHr+VvZUQBof2AufXKB8NXrL1W69TG20EvOz7aevx6FTJIaBuBkYxS8zolg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", + "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/transform": "30.0.5", + "@jest/transform": "30.2.0", "@types/babel__core": "^7.20.5", - "babel-plugin-istanbul": "^7.0.0", - "babel-preset-jest": "30.0.1", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.2.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "slash": "^3.0.0" @@ -1632,15 +1629,18 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.11.0" + "@babel/core": "^7.11.0 || ^8.0.0-0" } }, "node_modules/babel-plugin-istanbul": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.0.tgz", - "integrity": "sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", "dev": true, "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -1653,14 +1653,12 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.0.1.tgz", - "integrity": "sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", + "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", "@types/babel__core": "^7.20.5" }, "engines": { @@ -1695,20 +1693,20 @@ } }, "node_modules/babel-preset-jest": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.0.1.tgz", - "integrity": "sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", + "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", "dev": true, "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "30.0.1", - "babel-preset-current-node-syntax": "^1.1.0" + "babel-plugin-jest-hoist": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.11.0" + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" } }, "node_modules/balanced-match": { @@ -1718,17 +1716,27 @@ "dev": true, "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.21", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.21.tgz", + "integrity": "sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/bcd-idl-mapper": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bcd-idl-mapper/-/bcd-idl-mapper-3.0.0.tgz", - "integrity": "sha512-foC8P49Zav26/ZnQQrwxvWvg3Q8s8hGmfZ2Mx1XBaqDbwnyPOsON4H6+FiHJOydGB9ZB1KbXgUz21gn+Y60DnQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/bcd-idl-mapper/-/bcd-idl-mapper-3.0.1.tgz", + "integrity": "sha512-gUdGOJYhxnmyePEnNCTEIJ+kZ3ZAaUC3wkdQDs/RtuuanALmWXRuMjJqeCEh2+c369yo1CwjH2J6To9j+fg2Bg==", "dev": true, "license": "ISC", "dependencies": { "webidl2": "^24.4.1" }, "peerDependencies": { - "@mdn/browser-compat-data": "^6.0.24", + "@mdn/browser-compat-data": "^6.0.24 || ^7.0.0", "@webref/idl": "^3.65.0" } }, @@ -1756,9 +1764,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.3.tgz", - "integrity": "sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", "dev": true, "funding": [ { @@ -1776,10 +1784,11 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001735", - "electron-to-chromium": "^1.5.204", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" }, "bin": { "browserslist": "cli.js" @@ -1826,9 +1835,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001735", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001735.tgz", - "integrity": "sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==", + "version": "1.0.30001751", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", + "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", "dev": true, "funding": [ { @@ -1889,9 +1898,9 @@ } }, "node_modules/ci-info": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", - "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", "dev": true, "funding": [ { @@ -2001,9 +2010,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", "dev": true, "license": "MIT" }, @@ -2028,9 +2037,9 @@ "license": "MIT" }, "node_modules/commander": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", - "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", "dev": true, "license": "MIT", "engines": { @@ -2067,9 +2076,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -2085,9 +2094,9 @@ } }, "node_modules/dedent": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", - "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", + "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2137,9 +2146,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.207", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.207.tgz", - "integrity": "sha512-mryFrrL/GXDTmAtIVMVf+eIXM09BBPlO5IQ7lUyKmK8d+A4VpRGG+M3ofoVef6qyF8s60rJei8ymlJxjUA8Faw==", + "version": "1.5.243", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.243.tgz", + "integrity": "sha512-ZCphxFW3Q1TVhcgS9blfut1PX8lusVi2SvXQgmEEnK4TCmE1JhH2JkjJN+DNt0pJJwfBri5AROBnz2b/C+YU9g==", "dev": true, "license": "ISC" }, @@ -2164,9 +2173,9 @@ "license": "MIT" }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2249,18 +2258,18 @@ } }, "node_modules/expect": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.0.5.tgz", - "integrity": "sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "30.0.5", - "@jest/get-type": "30.0.1", - "jest-matcher-utils": "30.0.5", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", - "jest-util": "30.0.5" + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -2581,9 +2590,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -2654,16 +2663,16 @@ } }, "node_modules/jest": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest/-/jest-30.0.5.tgz", - "integrity": "sha512-y2mfcJywuTUkvLm2Lp1/pFX8kTgMO5yyQGq/Sk/n2mN7XWYp4JsCZ/QXW34M8YScgk8bPZlREH04f6blPnoHnQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz", + "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.0.5", - "@jest/types": "30.0.5", + "@jest/core": "30.2.0", + "@jest/types": "30.2.0", "import-local": "^3.2.0", - "jest-cli": "30.0.5" + "jest-cli": "30.2.0" }, "bin": { "jest": "bin/jest.js" @@ -2681,14 +2690,14 @@ } }, "node_modules/jest-changed-files": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.0.5.tgz", - "integrity": "sha512-bGl2Ntdx0eAwXuGpdLdVYVr5YQHnSZlQ0y9HVDu565lCUAe9sj6JOtBbMmBBikGIegne9piDDIOeiLVoqTkz4A==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz", + "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", "dev": true, "license": "MIT", "dependencies": { "execa": "^5.1.1", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "p-limit": "^3.1.0" }, "engines": { @@ -2696,29 +2705,29 @@ } }, "node_modules/jest-circus": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.0.5.tgz", - "integrity": "sha512-h/sjXEs4GS+NFFfqBDYT7y5Msfxh04EwWLhQi0F8kuWpe+J/7tICSlswU8qvBqumR3kFgHbfu7vU6qruWWBPug==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz", + "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.0.5", - "@jest/expect": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/types": "30.0.5", + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "co": "^4.6.0", "dedent": "^1.6.0", "is-generator-fn": "^2.1.0", - "jest-each": "30.0.5", - "jest-matcher-utils": "30.0.5", - "jest-message-util": "30.0.5", - "jest-runtime": "30.0.5", - "jest-snapshot": "30.0.5", - "jest-util": "30.0.5", + "jest-each": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", "p-limit": "^3.1.0", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "pure-rand": "^7.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" @@ -2728,21 +2737,21 @@ } }, "node_modules/jest-cli": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.0.5.tgz", - "integrity": "sha512-Sa45PGMkBZzF94HMrlX4kUyPOwUpdZasaliKN3mifvDmkhLYqLLg8HQTzn6gq7vJGahFYMQjXgyJWfYImKZzOw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz", + "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/types": "30.0.5", + "@jest/core": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", "chalk": "^4.1.2", "exit-x": "^0.2.2", "import-local": "^3.2.0", - "jest-config": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", + "jest-config": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", "yargs": "^17.7.2" }, "bin": { @@ -2761,34 +2770,34 @@ } }, "node_modules/jest-config": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.0.5.tgz", - "integrity": "sha512-aIVh+JNOOpzUgzUnPn5FLtyVnqc3TQHVMupYtyeURSb//iLColiMIR8TxCIDKyx9ZgjKnXGucuW68hCxgbrwmA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz", + "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", - "@jest/get-type": "30.0.1", + "@jest/get-type": "30.1.0", "@jest/pattern": "30.0.1", - "@jest/test-sequencer": "30.0.5", - "@jest/types": "30.0.5", - "babel-jest": "30.0.5", + "@jest/test-sequencer": "30.2.0", + "@jest/types": "30.2.0", + "babel-jest": "30.2.0", "chalk": "^4.1.2", "ci-info": "^4.2.0", "deepmerge": "^4.3.1", "glob": "^10.3.10", "graceful-fs": "^4.2.11", - "jest-circus": "30.0.5", - "jest-docblock": "30.0.1", - "jest-environment-node": "30.0.5", + "jest-circus": "30.2.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.0.5", - "jest-runner": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", + "jest-resolve": "30.2.0", + "jest-runner": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", "micromatch": "^4.0.8", "parse-json": "^5.2.0", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -2813,25 +2822,25 @@ } }, "node_modules/jest-diff": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.0.5.tgz", - "integrity": "sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, "license": "MIT", "dependencies": { "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.0.1", + "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "pretty-format": "30.0.5" + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-docblock": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.0.1.tgz", - "integrity": "sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", + "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", "dev": true, "license": "MIT", "dependencies": { @@ -2842,56 +2851,56 @@ } }, "node_modules/jest-each": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.0.5.tgz", - "integrity": "sha512-dKjRsx1uZ96TVyejD3/aAWcNKy6ajMaN531CwWIsrazIqIoXI9TnnpPlkrEYku/8rkS3dh2rbH+kMOyiEIv0xQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz", + "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1", - "@jest/types": "30.0.5", + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", "chalk": "^4.1.2", - "jest-util": "30.0.5", - "pretty-format": "30.0.5" + "jest-util": "30.2.0", + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-environment-node": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.0.5.tgz", - "integrity": "sha512-ppYizXdLMSvciGsRsMEnv/5EFpvOdXBaXRBzFUDPWrsfmog4kYrOGWXarLllz6AXan6ZAA/kYokgDWuos1IKDA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz", + "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.0.5", - "@jest/fake-timers": "30.0.5", - "@jest/types": "30.0.5", + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-mock": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5" + "jest-mock": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-haste-map": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.0.5.tgz", - "integrity": "sha512-dkmlWNlsTSR0nH3nRfW5BKbqHefLZv0/6LCccG0xFCTWcJu8TuEwG+5Cm75iBfjVoockmO6J35o5gxtFSn5xeg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", + "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", "jest-regex-util": "30.0.1", - "jest-util": "30.0.5", - "jest-worker": "30.0.5", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", "micromatch": "^4.0.8", "walker": "^1.0.8" }, @@ -2903,49 +2912,49 @@ } }, "node_modules/jest-leak-detector": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.0.5.tgz", - "integrity": "sha512-3Uxr5uP8jmHMcsOtYMRB/zf1gXN3yUIc+iPorhNETG54gErFIiUhLvyY/OggYpSMOEYqsmRxmuU4ZOoX5jpRFg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", + "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1", - "pretty-format": "30.0.5" + "@jest/get-type": "30.1.0", + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.0.5.tgz", - "integrity": "sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1", + "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "jest-diff": "30.0.5", - "pretty-format": "30.0.5" + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-message-util": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.0.5.tgz", - "integrity": "sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", + "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "micromatch": "^4.0.8", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -2954,15 +2963,15 @@ } }, "node_modules/jest-mock": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz", - "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", + "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-util": "30.0.5" + "jest-util": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -2997,18 +3006,18 @@ } }, "node_modules/jest-resolve": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.0.5.tgz", - "integrity": "sha512-d+DjBQ1tIhdz91B79mywH5yYu76bZuE96sSbxj8MkjWVx5WNdt1deEFRONVL4UkKLSrAbMkdhb24XN691yDRHg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz", + "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.2", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", + "jest-haste-map": "30.2.0", "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", "slash": "^3.0.0", "unrs-resolver": "^1.7.11" }, @@ -3017,46 +3026,46 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.0.5.tgz", - "integrity": "sha512-/xMvBR4MpwkrHW4ikZIWRttBBRZgWK4d6xt3xW1iRDSKt4tXzYkMkyPfBnSCgv96cpkrctfXs6gexeqMYqdEpw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz", + "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", "dev": true, "license": "MIT", "dependencies": { "jest-regex-util": "30.0.1", - "jest-snapshot": "30.0.5" + "jest-snapshot": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-runner": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.0.5.tgz", - "integrity": "sha512-JcCOucZmgp+YuGgLAXHNy7ualBx4wYSgJVWrYMRBnb79j9PD0Jxh0EHvR5Cx/r0Ce+ZBC4hCdz2AzFFLl9hCiw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz", + "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.0.5", - "@jest/environment": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", + "@jest/console": "30.2.0", + "@jest/environment": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "emittery": "^0.13.1", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", - "jest-docblock": "30.0.1", - "jest-environment-node": "30.0.5", - "jest-haste-map": "30.0.5", - "jest-leak-detector": "30.0.5", - "jest-message-util": "30.0.5", - "jest-resolve": "30.0.5", - "jest-runtime": "30.0.5", - "jest-util": "30.0.5", - "jest-watcher": "30.0.5", - "jest-worker": "30.0.5", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-leak-detector": "30.2.0", + "jest-message-util": "30.2.0", + "jest-resolve": "30.2.0", + "jest-runtime": "30.2.0", + "jest-util": "30.2.0", + "jest-watcher": "30.2.0", + "jest-worker": "30.2.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -3065,32 +3074,32 @@ } }, "node_modules/jest-runtime": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.0.5.tgz", - "integrity": "sha512-7oySNDkqpe4xpX5PPiJTe5vEa+Ak/NnNz2bGYZrA1ftG3RL3EFlHaUkA1Cjx+R8IhK0Vg43RML5mJedGTPNz3A==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz", + "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.0.5", - "@jest/fake-timers": "30.0.5", - "@jest/globals": "30.0.5", + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/globals": "30.2.0", "@jest/source-map": "30.0.1", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "cjs-module-lexer": "^2.1.0", "collect-v8-coverage": "^1.0.2", "glob": "^10.3.10", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.0.5", - "jest-snapshot": "30.0.5", - "jest-util": "30.0.5", + "jest-resolve": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -3099,9 +3108,9 @@ } }, "node_modules/jest-snapshot": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.0.5.tgz", - "integrity": "sha512-T00dWU/Ek3LqTp4+DcW6PraVxjk28WY5Ua/s+3zUKSERZSNyxTqhDXCWKG5p2HAJ+crVQ3WJ2P9YVHpj1tkW+g==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", + "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", "dev": true, "license": "MIT", "dependencies": { @@ -3110,20 +3119,20 @@ "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.0.5", - "@jest/get-type": "30.0.1", - "@jest/snapshot-utils": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", - "babel-preset-current-node-syntax": "^1.1.0", + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", "chalk": "^4.1.2", - "expect": "30.0.5", + "expect": "30.2.0", "graceful-fs": "^4.2.11", - "jest-diff": "30.0.5", - "jest-matcher-utils": "30.0.5", - "jest-message-util": "30.0.5", - "jest-util": "30.0.5", - "pretty-format": "30.0.5", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", "semver": "^7.7.2", "synckit": "^0.11.8" }, @@ -3132,9 +3141,9 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -3145,13 +3154,13 @@ } }, "node_modules/jest-util": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", - "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -3176,18 +3185,18 @@ } }, "node_modules/jest-validate": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.0.5.tgz", - "integrity": "sha512-ouTm6VFHaS2boyl+k4u+Qip4TSH7Uld5tyD8psQ8abGgt2uYYB8VwVfAHWHjHc0NWmGGbwO5h0sCPOGHHevefw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz", + "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1", - "@jest/types": "30.0.5", + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", "camelcase": "^6.3.0", "chalk": "^4.1.2", "leven": "^3.1.0", - "pretty-format": "30.0.5" + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -3207,19 +3216,19 @@ } }, "node_modules/jest-watcher": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.0.5.tgz", - "integrity": "sha512-z9slj/0vOwBDBjN3L4z4ZYaA+pG56d6p3kTUhFRYGvXbXMWhXmb/FIxREZCD06DYUwDKKnj2T80+Pb71CQ0KEg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz", + "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.0.5", - "@jest/types": "30.0.5", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "emittery": "^0.13.1", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "string-length": "^4.0.2" }, "engines": { @@ -3227,15 +3236,15 @@ } }, "node_modules/jest-worker": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.0.5.tgz", - "integrity": "sha512-ojRXsWzEP16NdUuBw/4H/zkZdHOa7MMYCk4E430l+8fELeLg/mqmMlRhjL7UNZvQrDmnovWZV4DxX03fZF48fQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", + "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" }, @@ -3387,9 +3396,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -3474,9 +3483,9 @@ "license": "MIT" }, "node_modules/napi-postinstall": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.3.tgz", - "integrity": "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", "dev": true, "license": "MIT", "bin": { @@ -3504,9 +3513,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, "license": "MIT" }, @@ -3756,9 +3765,9 @@ } }, "node_modules/pretty-format": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", - "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", "dependencies": { @@ -4062,9 +4071,9 @@ } }, "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -4276,9 +4285,9 @@ } }, "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, @@ -4318,9 +4327,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", "dev": true, "funding": [ { @@ -4482,9 +4491,9 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { diff --git a/tools/ts/package.json b/tools/ts/package.json @@ -1,11 +1,11 @@ { "devDependencies": { - "@mdn/browser-compat-data": "^6.0.4", + "@mdn/browser-compat-data": "7.1.17", "@types/webidl2": "24.4.3", "@typescript/dom-lib-generator": "github:microsoft/TypeScript-DOM-lib-generator#@types/web@0.0.257", - "bcd-idl-mapper": "3.0.0", + "bcd-idl-mapper": "3.0.1", "kdljs": "0.3.0", - "jest": "30.0.5", + "jest": "30.2.0", "peggy": "5.0.6", "print-diff": "2.0.0" }, diff --git a/xpcom/threads/TaskController.cpp b/xpcom/threads/TaskController.cpp @@ -1494,26 +1494,22 @@ void TaskController::ProcessUpdatedPriorityModifier(TaskManager* aManager) { int32_t modifier = aManager->mCurrentPriorityModifier; - std::vector<RefPtr<Task>> storedTasks; - // Find all relevant tasks. - for (auto iter = mMainThreadTasks.begin(); iter != mMainThreadTasks.end();) { - if ((*iter)->mTaskManager == aManager) { - storedTasks.push_back(*iter); - iter = mMainThreadTasks.erase(iter); - } else { - iter++; + // Find all relevant task nodes and move them to a temporary set with the + // new priority modifier. + PrioritySortedTasks managerTasks; + auto cur = mMainThreadTasks.begin(); + while (cur != mMainThreadTasks.end()) { + // Keep a valid iterator before potentially extracting the current task. + auto next = std::next(cur); + if (cur->get()->mTaskManager == aManager) { + auto task = mMainThreadTasks.extract(cur); + task.value()->mPriorityModifier = modifier; + managerTasks.insert(std::move(task)); } + cur = std::move(next); } - - // Reinsert found tasks with their new priorities. - for (RefPtr<Task>& ref : storedTasks) { - // Kept alive at first by the vector and then by mMainThreadTasks. - Task* task = ref; - task->mPriorityModifier = modifier; - auto insertion = mMainThreadTasks.insert(std::move(ref)); - MOZ_ASSERT(insertion.second); - task->mIterator = insertion.first; - } + // Merge the temporary set back to the main set. + mMainThreadTasks.merge(std::move(managerTasks)); } } // namespace mozilla diff --git a/xpcom/threads/TaskController.h b/xpcom/threads/TaskController.h @@ -431,8 +431,9 @@ class TaskController { std::stack<RefPtr<Task>> mCurrentTasksMT; // A list of all tasks ordered by priority. - std::set<RefPtr<Task>, Task::PriorityCompare> mThreadableTasks; - std::set<RefPtr<Task>, Task::PriorityCompare> mMainThreadTasks; + using PrioritySortedTasks = std::set<RefPtr<Task>, Task::PriorityCompare>; + PrioritySortedTasks mThreadableTasks; + PrioritySortedTasks mMainThreadTasks; // TaskManagers currently active. // We can use a raw pointer since tasks always hold on to their TaskManager.