Version in base suite: 1.62.0+dfsg-2
Base version: ublock-origin_1.62.0+dfsg-2
Target version: ublock-origin_1.67.0+dfsg-1~deb13u1
Base file: /srv/ftp-master.debian.org/ftp/pool/main/u/ublock-origin/ublock-origin_1.62.0+dfsg-2.dsc
Target file: /srv/ftp-master.debian.org/policy/pool/main/u/ublock-origin/ublock-origin_1.67.0+dfsg-1~deb13u1.dsc
/srv/release.debian.org/tmp/loyMF0iGQH/ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/line-hor-dashed.png |binary
/srv/release.debian.org/tmp/loyMF0iGQH/ublock-origin-1.67.0+dfsg/platform/mv3/extension/img/icon_128_off.png |binary
/srv/release.debian.org/tmp/loyMF0iGQH/ublock-origin-1.67.0+dfsg/platform/mv3/extension/img/icon_16_off.png |binary
/srv/release.debian.org/tmp/loyMF0iGQH/ublock-origin-1.67.0+dfsg/platform/mv3/extension/img/icon_32_off.png |binary
/srv/release.debian.org/tmp/loyMF0iGQH/ublock-origin-1.67.0+dfsg/platform/mv3/extension/img/icon_512.png |binary
/srv/release.debian.org/tmp/loyMF0iGQH/ublock-origin-1.67.0+dfsg/platform/mv3/extension/img/icon_64_off.png |binary
/srv/release.debian.org/tmp/loyMF0iGQH/ublock-origin-1.67.0+dfsg/src/css/fonts/Inter/Inter-Regular.woff2 |binary
/srv/release.debian.org/tmp/loyMF0iGQH/ublock-origin-1.67.0+dfsg/src/css/fonts/Inter/Inter-SemiBold.woff2 |binary
/srv/release.debian.org/tmp/loyMF0iGQH/ublock-origin-1.67.0+dfsg/src/js/wasm/biditrie.wasm |binary
ublock-origin-1.67.0+dfsg/.eslintrc.yml | 30
ublock-origin-1.67.0+dfsg/.github/workflows/RELEASE.HEAD.md | 7
ublock-origin-1.67.0+dfsg/.github/workflows/main.yml | 6
ublock-origin-1.67.0+dfsg/.gitignore | 1
ublock-origin-1.67.0+dfsg/.gitmodules | 6
ublock-origin-1.67.0+dfsg/.jshintrc | 22
ublock-origin-1.67.0+dfsg/CHANGELOG.md | 131
ublock-origin-1.67.0+dfsg/Makefile | 135
ublock-origin-1.67.0+dfsg/README.md | 30
ublock-origin-1.67.0+dfsg/RELEASE.HEAD.md | 12
ublock-origin-1.67.0+dfsg/assets/assets.dev.json | 89
ublock-origin-1.67.0+dfsg/assets/assets.json | 95
ublock-origin-1.67.0+dfsg/debian/changelog | 13
ublock-origin-1.67.0+dfsg/debian/control | 4
ublock-origin-1.67.0+dfsg/debian/copyright | 1
ublock-origin-1.67.0+dfsg/debian/patches/CVE-2025-4215.patch | 96
ublock-origin-1.67.0+dfsg/debian/patches/series | 1
ublock-origin-1.67.0+dfsg/debian/webext-ublock-origin-chromium.lintian-overrides | 1
ublock-origin-1.67.0+dfsg/dist/chromium/publish-beta.py | 190
ublock-origin-1.67.0+dfsg/dist/chromium/publish-stable.py | 190
ublock-origin-1.67.0+dfsg/dist/firefox/publish-signed-beta.py | 331
ublock-origin-1.67.0+dfsg/dist/firefox/updates.json | 24
ublock-origin-1.67.0+dfsg/dist/firefox/updates.template.json | 13
ublock-origin-1.67.0+dfsg/dist/mv3/chromium/publish-beta.py | 195
ublock-origin-1.67.0+dfsg/dist/mv3/firefox/publish-signed-beta.py | 326
ublock-origin-1.67.0+dfsg/dist/mv3/firefox/updates.json | 13
ublock-origin-1.67.0+dfsg/dist/mv3/firefox/updates.template.json | 13
ublock-origin-1.67.0+dfsg/dist/version | 2
ublock-origin-1.67.0+dfsg/eslint.config.mjs | 51
ublock-origin-1.67.0+dfsg/package-lock.json | 1163
ublock-origin-1.67.0+dfsg/package.json | 32
ublock-origin-1.67.0+dfsg/platform/browser/main.js | 123
ublock-origin-1.67.0+dfsg/platform/browser/test.html | 71
ublock-origin-1.67.0+dfsg/platform/chromium/is-webrtc-supported.html | 2
ublock-origin-1.67.0+dfsg/platform/chromium/is-webrtc-supported.js | 6
ublock-origin-1.67.0+dfsg/platform/chromium/manifest.json | 2
ublock-origin-1.67.0+dfsg/platform/chromium/vapi-background-ext.js | 9
ublock-origin-1.67.0+dfsg/platform/common/vapi-background.js | 55
ublock-origin-1.67.0+dfsg/platform/common/vapi-client.js | 2
ublock-origin-1.67.0+dfsg/platform/common/vapi-common.js | 9
ublock-origin-1.67.0+dfsg/platform/dig/snfe.js | 14
ublock-origin-1.67.0+dfsg/platform/firefox/manifest.json | 4
ublock-origin-1.67.0+dfsg/platform/firefox/vapi-background-ext.js | 8
ublock-origin-1.67.0+dfsg/platform/firefox/webext.js | 2
ublock-origin-1.67.0+dfsg/platform/mv3/README.md | 15
ublock-origin-1.67.0+dfsg/platform/mv3/chromium/manifest.json | 42
ublock-origin-1.67.0+dfsg/platform/mv3/description/en.md | 29
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ar.txt | 28
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.az.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.be.txt | 26
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.bg.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.bn.txt | 22
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.br_FR.txt | 24
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.bs.txt | 24
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ca.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.cs.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.cv.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.cy.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.da.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.de.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.el.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.en_GB.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.eo.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.es.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.et.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.eu.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fa.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fi.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fil.txt | 22
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fr.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.fy.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.gl.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.gu.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.he.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.hi.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.hr.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.hu.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.hy.txt | 24
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.id.txt | 24
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.it.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ja.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ka.txt | 24
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.kk.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.kn.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ko.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.lt.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.lv.txt | 24
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.mk.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ml.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.mr.txt | 30
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ms.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.nb.txt | 22
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.nl.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.oc.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.pa.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.pl.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.pt_BR.txt | 26
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.pt_PT.txt | 26
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ro.txt | 24
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ru.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.si.txt | 34
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sk.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sl.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.so.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sq.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sr.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sv.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.sw.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ta.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.te.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.th.txt | 30
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.tr.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.uk.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.ur.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.vi.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.zh_CN.txt | 26
ublock-origin-1.67.0+dfsg/platform/mv3/description/webstore.zh_TW.txt | 20
ublock-origin-1.67.0+dfsg/platform/mv3/edge/patch-extension.js | 71
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ar/messages.json | 186
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/az/messages.json | 156
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/be/messages.json | 154
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/bg/messages.json | 148
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/bn/messages.json | 208
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/br_FR/messages.json | 162
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/bs/messages.json | 212
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ca/messages.json | 150
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/cs/messages.json | 152
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/cv/messages.json | 158
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/cy/messages.json | 166
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/da/messages.json | 160
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/de/messages.json | 158
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/el/messages.json | 158
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/en/messages.json | 158
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/en_GB/messages.json | 152
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/eo/messages.json | 158
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/es/messages.json | 158
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/et/messages.json | 156
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/eu/messages.json | 172
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fa/messages.json | 156
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fi/messages.json | 162
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fil/messages.json | 212
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fr/messages.json | 158
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/fy/messages.json | 154
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/gl/messages.json | 156
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/gu/messages.json | 158
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/he/messages.json | 148
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/hi/messages.json | 178
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/hr/messages.json | 160
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/hu/messages.json | 152
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/hy/messages.json | 164
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/id/messages.json | 148
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/it/messages.json | 204
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ja/messages.json | 156
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ka/messages.json | 150
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/kk/messages.json | 158
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/kn/messages.json | 156
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ko/messages.json | 148
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/lt/messages.json | 158
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/lv/messages.json | 150
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/mk/messages.json | 148
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ml/messages.json | 156
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/mr/messages.json | 158
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ms/messages.json | 156
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/nb/messages.json | 212
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/nl/messages.json | 160
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/oc/messages.json | 158
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/pa/messages.json | 150
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/pl/messages.json | 150
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/pt_BR/messages.json | 206
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/pt_PT/messages.json | 164
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ro/messages.json | 208
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ru/messages.json | 160
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/si/messages.json | 196
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sk/messages.json | 158
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sl/messages.json | 158
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/so/messages.json | 158
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sq/messages.json | 160
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sr/messages.json | 152
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sv/messages.json | 160
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/sw/messages.json | 158
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ta/messages.json | 158
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/te/messages.json | 158
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/th/messages.json | 256
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/tr/messages.json | 170
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/uk/messages.json | 152
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/ur/messages.json | 156
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/vi/messages.json | 148
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/zh_CN/messages.json | 168
ublock-origin-1.67.0+dfsg/platform/mv3/extension/_locales/zh_TW/messages.json | 150
ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/dashboard-common.css | 8
ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/dashboard.css | 37
ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/develop.css | 168
ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/filtering-mode.css | 50
ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/matched-rules.css | 3
ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/picker-ui.css | 144
ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/popup.css | 284
ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/report.css | 3
ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/settings.css | 159
ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/tool-overlay-ui.css | 99
ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/unpicker-ui.css | 64
ublock-origin-1.67.0+dfsg/platform/mv3/extension/css/zapper-ui.css | 29
ublock-origin-1.67.0+dfsg/platform/mv3/extension/dashboard.html | 152
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/action.js | 110
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/admin.js | 126
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/background.js | 537
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/backup-restore.js | 153
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/config.js | 20
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/dashboard.js | 56
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/debug.js | 119
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/develop.js | 624
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/dnr-editor.js | 180
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/dnr-parser.js | 581
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ext-compat.js | 103
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ext.js | 52
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/fetch.js | 6
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/filter-lists.js | 57
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/filter-manager-ui.js | 486
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/filter-manager.js | 277
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/mode-editor.js | 91
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/mode-manager.js | 133
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/mode-parser.js | 211
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/picker-ui.js | 422
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/popup.js | 231
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/report.js | 48
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ro-dnr-editor.js | 104
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ruleset-manager.js | 634
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/rw-dnr-editor.js | 409
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting-manager.js | 337
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-api.js | 33
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-declarative.js | 157
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-generic.js | 68
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-procedural-api.js | 813
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-procedural.js | 852
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-specific.js | 100
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-user-terminate.js | 45
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/css-user.js | 48
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/isolated-api.js | 80
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/picker.js | 303
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/tool-overlay.js | 367
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/toolbar-icon.js | 27
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/unpicker.js | 57
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/scripting/zapper.js | 138
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/settings.js | 160
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/strictblock.js | 8
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/theme.js | 25
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/tool-overlay-ui.js | 237
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/troubleshooting.js | 130
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/ubo-parser.js | 581
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/unpicker-ui.js | 171
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/utils.js | 93
ublock-origin-1.67.0+dfsg/platform/mv3/extension/js/zapper-ui.js | 133
ublock-origin-1.67.0+dfsg/platform/mv3/extension/lib/codemirror/README.md | 9
ublock-origin-1.67.0+dfsg/platform/mv3/extension/lib/codemirror/codemirror.LICENSE | 21
ublock-origin-1.67.0+dfsg/platform/mv3/extension/managed_storage.json | 27
ublock-origin-1.67.0+dfsg/platform/mv3/extension/matched-rules.html | 1
ublock-origin-1.67.0+dfsg/platform/mv3/extension/picker-ui.html | 56
ublock-origin-1.67.0+dfsg/platform/mv3/extension/popup.html | 45
ublock-origin-1.67.0+dfsg/platform/mv3/extension/report.html | 12
ublock-origin-1.67.0+dfsg/platform/mv3/extension/strictblock.html | 1
ublock-origin-1.67.0+dfsg/platform/mv3/extension/unpicker-ui.html | 40
ublock-origin-1.67.0+dfsg/platform/mv3/extension/zapper-ui.html | 32
ublock-origin-1.67.0+dfsg/platform/mv3/firefox/background.html | 10
ublock-origin-1.67.0+dfsg/platform/mv3/firefox/manifest.json | 38
ublock-origin-1.67.0+dfsg/platform/mv3/firefox/patch-ruleset.js | 30
ublock-origin-1.67.0+dfsg/platform/mv3/make-rulesets.js | 934
ublock-origin-1.67.0+dfsg/platform/mv3/make-scriptlets.js | 51
ublock-origin-1.67.0+dfsg/platform/mv3/rulesets.json | 636
ublock-origin-1.67.0+dfsg/platform/mv3/safari/css-api.js | 46
ublock-origin-1.67.0+dfsg/platform/mv3/safari/css-user.js | 59
ublock-origin-1.67.0+dfsg/platform/mv3/safari/ext-compat.js | 223
ublock-origin-1.67.0+dfsg/platform/mv3/safari/manifest.json | 89
ublock-origin-1.67.0+dfsg/platform/mv3/safari/patch-extension.js | 107
ublock-origin-1.67.0+dfsg/platform/mv3/safari/patch-ruleset.js | 69
ublock-origin-1.67.0+dfsg/platform/mv3/safe-replace.js | 4
ublock-origin-1.67.0+dfsg/platform/mv3/salvage-ruleids.mjs | 9
ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-declarative.template.js | 51
ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-generic.template.js | 72
ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-procedural.template.js | 15
ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/css-specific.template.js | 15
ublock-origin-1.67.0+dfsg/platform/mv3/scriptlets/scriptlet.template.js | 145
ublock-origin-1.67.0+dfsg/platform/nodejs/build.js | 5
ublock-origin-1.67.0+dfsg/platform/nodejs/index.js | 6
ublock-origin-1.67.0+dfsg/platform/npm/.eslintrc.json | 38
ublock-origin-1.67.0+dfsg/platform/npm/demo.js | 2
ublock-origin-1.67.0+dfsg/platform/npm/package-lock.json | 3043
ublock-origin-1.67.0+dfsg/platform/npm/package.json | 11
ublock-origin-1.67.0+dfsg/platform/npm/test.js | 7
ublock-origin-1.67.0+dfsg/platform/opera/manifest.json | 2
ublock-origin-1.67.0+dfsg/src/1p-filters.html | 1
ublock-origin-1.67.0+dfsg/src/3p-filters.html | 1
ublock-origin-1.67.0+dfsg/src/_locales/ar/messages.json | 126
ublock-origin-1.67.0+dfsg/src/_locales/az/messages.json | 16
ublock-origin-1.67.0+dfsg/src/_locales/be/messages.json | 48
ublock-origin-1.67.0+dfsg/src/_locales/bg/messages.json | 16
ublock-origin-1.67.0+dfsg/src/_locales/bn/messages.json | 22
ublock-origin-1.67.0+dfsg/src/_locales/br_FR/messages.json | 32
ublock-origin-1.67.0+dfsg/src/_locales/bs/messages.json | 36
ublock-origin-1.67.0+dfsg/src/_locales/ca/messages.json | 28
ublock-origin-1.67.0+dfsg/src/_locales/cs/messages.json | 18
ublock-origin-1.67.0+dfsg/src/_locales/cv/messages.json | 22
ublock-origin-1.67.0+dfsg/src/_locales/cy/messages.json | 66
ublock-origin-1.67.0+dfsg/src/_locales/da/messages.json | 22
ublock-origin-1.67.0+dfsg/src/_locales/de/messages.json | 30
ublock-origin-1.67.0+dfsg/src/_locales/el/messages.json | 46
ublock-origin-1.67.0+dfsg/src/_locales/en/messages.json | 22
ublock-origin-1.67.0+dfsg/src/_locales/en_GB/messages.json | 16
ublock-origin-1.67.0+dfsg/src/_locales/eo/messages.json | 18
ublock-origin-1.67.0+dfsg/src/_locales/es/messages.json | 24
ublock-origin-1.67.0+dfsg/src/_locales/et/messages.json | 22
ublock-origin-1.67.0+dfsg/src/_locales/eu/messages.json | 18
ublock-origin-1.67.0+dfsg/src/_locales/fa/messages.json | 16
ublock-origin-1.67.0+dfsg/src/_locales/fi/messages.json | 26
ublock-origin-1.67.0+dfsg/src/_locales/fil/messages.json | 30
ublock-origin-1.67.0+dfsg/src/_locales/fr/messages.json | 24
ublock-origin-1.67.0+dfsg/src/_locales/fy/messages.json | 26
ublock-origin-1.67.0+dfsg/src/_locales/gl/messages.json | 20
ublock-origin-1.67.0+dfsg/src/_locales/gu/messages.json | 22
ublock-origin-1.67.0+dfsg/src/_locales/he/messages.json | 18
ublock-origin-1.67.0+dfsg/src/_locales/hi/messages.json | 18
ublock-origin-1.67.0+dfsg/src/_locales/hr/messages.json | 26
ublock-origin-1.67.0+dfsg/src/_locales/hu/messages.json | 16
ublock-origin-1.67.0+dfsg/src/_locales/hy/messages.json | 18
ublock-origin-1.67.0+dfsg/src/_locales/id/messages.json | 22
ublock-origin-1.67.0+dfsg/src/_locales/it/messages.json | 20
ublock-origin-1.67.0+dfsg/src/_locales/ja/messages.json | 16
ublock-origin-1.67.0+dfsg/src/_locales/ka/messages.json | 32
ublock-origin-1.67.0+dfsg/src/_locales/kk/messages.json | 22
ublock-origin-1.67.0+dfsg/src/_locales/kn/messages.json | 34
ublock-origin-1.67.0+dfsg/src/_locales/ko/messages.json | 16
ublock-origin-1.67.0+dfsg/src/_locales/lt/messages.json | 18
ublock-origin-1.67.0+dfsg/src/_locales/lv/messages.json | 42
ublock-origin-1.67.0+dfsg/src/_locales/mk/messages.json | 16
ublock-origin-1.67.0+dfsg/src/_locales/ml/messages.json | 18
ublock-origin-1.67.0+dfsg/src/_locales/mr/messages.json | 22
ublock-origin-1.67.0+dfsg/src/_locales/ms/messages.json | 16
ublock-origin-1.67.0+dfsg/src/_locales/nb/messages.json | 28
ublock-origin-1.67.0+dfsg/src/_locales/nl/messages.json | 26
ublock-origin-1.67.0+dfsg/src/_locales/oc/messages.json | 22
ublock-origin-1.67.0+dfsg/src/_locales/pa/messages.json | 16
ublock-origin-1.67.0+dfsg/src/_locales/pl/messages.json | 18
ublock-origin-1.67.0+dfsg/src/_locales/pt_BR/messages.json | 140
ublock-origin-1.67.0+dfsg/src/_locales/pt_PT/messages.json | 52
ublock-origin-1.67.0+dfsg/src/_locales/ro/messages.json | 30
ublock-origin-1.67.0+dfsg/src/_locales/ru/messages.json | 22
ublock-origin-1.67.0+dfsg/src/_locales/si/messages.json | 304
ublock-origin-1.67.0+dfsg/src/_locales/sk/messages.json | 24
ublock-origin-1.67.0+dfsg/src/_locales/sl/messages.json | 16
ublock-origin-1.67.0+dfsg/src/_locales/so/messages.json | 22
ublock-origin-1.67.0+dfsg/src/_locales/sq/messages.json | 24
ublock-origin-1.67.0+dfsg/src/_locales/sr/messages.json | 16
ublock-origin-1.67.0+dfsg/src/_locales/sv/messages.json | 26
ublock-origin-1.67.0+dfsg/src/_locales/sw/messages.json | 16
ublock-origin-1.67.0+dfsg/src/_locales/ta/messages.json | 18
ublock-origin-1.67.0+dfsg/src/_locales/te/messages.json | 18
ublock-origin-1.67.0+dfsg/src/_locales/th/messages.json | 272
ublock-origin-1.67.0+dfsg/src/_locales/tr/messages.json | 26
ublock-origin-1.67.0+dfsg/src/_locales/uk/messages.json | 16
ublock-origin-1.67.0+dfsg/src/_locales/ur/messages.json | 22
ublock-origin-1.67.0+dfsg/src/_locales/vi/messages.json | 48
ublock-origin-1.67.0+dfsg/src/_locales/zh_CN/messages.json | 20
ublock-origin-1.67.0+dfsg/src/_locales/zh_TW/messages.json | 110
ublock-origin-1.67.0+dfsg/src/about.html | 1
ublock-origin-1.67.0+dfsg/src/advanced-settings.html | 3
ublock-origin-1.67.0+dfsg/src/asset-viewer.html | 3
ublock-origin-1.67.0+dfsg/src/blank.html | 11
ublock-origin-1.67.0+dfsg/src/code-viewer.html | 1
ublock-origin-1.67.0+dfsg/src/css/codemirror.css | 6
ublock-origin-1.67.0+dfsg/src/css/common.css | 11
ublock-origin-1.67.0+dfsg/src/css/dashboard.css | 2
ublock-origin-1.67.0+dfsg/src/css/document-blocked.css | 22
ublock-origin-1.67.0+dfsg/src/css/epicker-ui.css | 23
ublock-origin-1.67.0+dfsg/src/css/themes/default.css | 18
ublock-origin-1.67.0+dfsg/src/dashboard.html | 5
ublock-origin-1.67.0+dfsg/src/devtools.html | 3
ublock-origin-1.67.0+dfsg/src/document-blocked.html | 42
ublock-origin-1.67.0+dfsg/src/dyna-rules.html | 1
ublock-origin-1.67.0+dfsg/src/js/1p-filters.js | 7
ublock-origin-1.67.0+dfsg/src/js/3p-filters.js | 8
ublock-origin-1.67.0+dfsg/src/js/about.js | 2
ublock-origin-1.67.0+dfsg/src/js/advanced-settings.js | 4
ublock-origin-1.67.0+dfsg/src/js/arglist-parser.js | 4
ublock-origin-1.67.0+dfsg/src/js/asset-viewer.js | 6
ublock-origin-1.67.0+dfsg/src/js/assets.js | 34
ublock-origin-1.67.0+dfsg/src/js/background.js | 6
ublock-origin-1.67.0+dfsg/src/js/base64-custom.js | 2
ublock-origin-1.67.0+dfsg/src/js/benchmarks.js | 7
ublock-origin-1.67.0+dfsg/src/js/biditrie.js | 76
ublock-origin-1.67.0+dfsg/src/js/cachestorage.js | 14
ublock-origin-1.67.0+dfsg/src/js/click2load.js | 2
ublock-origin-1.67.0+dfsg/src/js/cloud-ui.js | 6
ublock-origin-1.67.0+dfsg/src/js/code-viewer.js | 45
ublock-origin-1.67.0+dfsg/src/js/codemirror/search-thread.js | 9
ublock-origin-1.67.0+dfsg/src/js/codemirror/search.js | 2
ublock-origin-1.67.0+dfsg/src/js/codemirror/ubo-dynamic-filtering.js | 4
ublock-origin-1.67.0+dfsg/src/js/codemirror/ubo-static-filtering.js | 7
ublock-origin-1.67.0+dfsg/src/js/commands.js | 6
ublock-origin-1.67.0+dfsg/src/js/console.js | 2
ublock-origin-1.67.0+dfsg/src/js/contentscript-extra.js | 3
ublock-origin-1.67.0+dfsg/src/js/contentscript.js | 10
ublock-origin-1.67.0+dfsg/src/js/contextmenu.js | 2
ublock-origin-1.67.0+dfsg/src/js/cosmetic-filtering.js | 129
ublock-origin-1.67.0+dfsg/src/js/dashboard-common.js | 2
ublock-origin-1.67.0+dfsg/src/js/dashboard.js | 4
ublock-origin-1.67.0+dfsg/src/js/devtools.js | 1
ublock-origin-1.67.0+dfsg/src/js/diff-updater.js | 21
ublock-origin-1.67.0+dfsg/src/js/document-blocked.js | 122
ublock-origin-1.67.0+dfsg/src/js/dom-inspector.js | 31
ublock-origin-1.67.0+dfsg/src/js/dom.js | 10
ublock-origin-1.67.0+dfsg/src/js/dyna-rules.js | 21
ublock-origin-1.67.0+dfsg/src/js/dynamic-net-filtering.js | 14
ublock-origin-1.67.0+dfsg/src/js/epicker-ui.js | 5
ublock-origin-1.67.0+dfsg/src/js/fa-icons.js | 2
ublock-origin-1.67.0+dfsg/src/js/filtering-engines.js | 4
ublock-origin-1.67.0+dfsg/src/js/hnswitches.js | 13
ublock-origin-1.67.0+dfsg/src/js/hntrie.js | 1
ublock-origin-1.67.0+dfsg/src/js/html-filtering.js | 91
ublock-origin-1.67.0+dfsg/src/js/httpheader-filtering.js | 80
ublock-origin-1.67.0+dfsg/src/js/i18n.js | 7
ublock-origin-1.67.0+dfsg/src/js/jsonpath.js | 524
ublock-origin-1.67.0+dfsg/src/js/logger-ui-inspector.js | 2
ublock-origin-1.67.0+dfsg/src/js/logger-ui.js | 26
ublock-origin-1.67.0+dfsg/src/js/logger.js | 4
ublock-origin-1.67.0+dfsg/src/js/lz4.js | 4
ublock-origin-1.67.0+dfsg/src/js/messaging.js | 20
ublock-origin-1.67.0+dfsg/src/js/mrucache.js | 2
ublock-origin-1.67.0+dfsg/src/js/pagestore.js | 31
ublock-origin-1.67.0+dfsg/src/js/popup-fenix.js | 113
ublock-origin-1.67.0+dfsg/src/js/redirect-engine.js | 8
ublock-origin-1.67.0+dfsg/src/js/redirect-resources.js | 1
ublock-origin-1.67.0+dfsg/src/js/regex-analyzer.js | 256
ublock-origin-1.67.0+dfsg/src/js/resources/attribute.js | 4
ublock-origin-1.67.0+dfsg/src/js/resources/cookie.js | 40
ublock-origin-1.67.0+dfsg/src/js/resources/create-html.js | 113
ublock-origin-1.67.0+dfsg/src/js/resources/href-sanitizer.js | 34
ublock-origin-1.67.0+dfsg/src/js/resources/json-edit.js | 1105
ublock-origin-1.67.0+dfsg/src/js/resources/json-prune.js | 275
ublock-origin-1.67.0+dfsg/src/js/resources/localstorage.js | 2
ublock-origin-1.67.0+dfsg/src/js/resources/noeval.js | 58
ublock-origin-1.67.0+dfsg/src/js/resources/object-prune.js | 272
ublock-origin-1.67.0+dfsg/src/js/resources/parse-replace.js | 8
ublock-origin-1.67.0+dfsg/src/js/resources/prevent-fetch.js | 221
ublock-origin-1.67.0+dfsg/src/js/resources/prevent-innerHTML.js | 82
ublock-origin-1.67.0+dfsg/src/js/resources/prevent-settimeout.js | 14
ublock-origin-1.67.0+dfsg/src/js/resources/proxy-apply.js | 6
ublock-origin-1.67.0+dfsg/src/js/resources/replace-argument.js | 29
ublock-origin-1.67.0+dfsg/src/js/resources/run-at.js | 2
ublock-origin-1.67.0+dfsg/src/js/resources/safe-self.js | 6
ublock-origin-1.67.0+dfsg/src/js/resources/scriptlets.js | 1269
ublock-origin-1.67.0+dfsg/src/js/resources/set-constant.js | 4
ublock-origin-1.67.0+dfsg/src/js/resources/shared.js | 18
ublock-origin-1.67.0+dfsg/src/js/resources/stack-trace.js | 148
ublock-origin-1.67.0+dfsg/src/js/resources/utils.js | 192
ublock-origin-1.67.0+dfsg/src/js/reverselookup-worker.js | 84
ublock-origin-1.67.0+dfsg/src/js/reverselookup.js | 29
ublock-origin-1.67.0+dfsg/src/js/s14e-serializer.js | 15
ublock-origin-1.67.0+dfsg/src/js/scriptlet-filtering-core.js | 153
ublock-origin-1.67.0+dfsg/src/js/scriptlet-filtering.js | 48
ublock-origin-1.67.0+dfsg/src/js/scriptlets/cosmetic-logger.js | 10
ublock-origin-1.67.0+dfsg/src/js/scriptlets/cosmetic-off.js | 2
ublock-origin-1.67.0+dfsg/src/js/scriptlets/cosmetic-on.js | 2
ublock-origin-1.67.0+dfsg/src/js/scriptlets/cosmetic-report.js | 10
ublock-origin-1.67.0+dfsg/src/js/scriptlets/dom-inspector.js | 6
ublock-origin-1.67.0+dfsg/src/js/scriptlets/dom-survey-elements.js | 2
ublock-origin-1.67.0+dfsg/src/js/scriptlets/dom-survey-scripts.js | 2
ublock-origin-1.67.0+dfsg/src/js/scriptlets/epicker.js | 10
ublock-origin-1.67.0+dfsg/src/js/scriptlets/load-3p-css.js | 4
ublock-origin-1.67.0+dfsg/src/js/scriptlets/load-large-media-all.js | 2
ublock-origin-1.67.0+dfsg/src/js/scriptlets/noscript-spoof.js | 50
ublock-origin-1.67.0+dfsg/src/js/scriptlets/scriptlet-loglevel-1.js | 2
ublock-origin-1.67.0+dfsg/src/js/scriptlets/scriptlet-loglevel-2.js | 2
ublock-origin-1.67.0+dfsg/src/js/scriptlets/should-inject-contentscript.js | 2
ublock-origin-1.67.0+dfsg/src/js/scriptlets/subscriber.js | 6
ublock-origin-1.67.0+dfsg/src/js/scriptlets/updater.js | 6
ublock-origin-1.67.0+dfsg/src/js/settings.js | 6
ublock-origin-1.67.0+dfsg/src/js/start.js | 47
ublock-origin-1.67.0+dfsg/src/js/static-dnr-filtering.js | 116
ublock-origin-1.67.0+dfsg/src/js/static-ext-filtering-db.js | 273
ublock-origin-1.67.0+dfsg/src/js/static-ext-filtering.js | 6
ublock-origin-1.67.0+dfsg/src/js/static-filtering-io.js | 2
ublock-origin-1.67.0+dfsg/src/js/static-filtering-parser.js | 475
ublock-origin-1.67.0+dfsg/src/js/static-net-filtering.js | 356
ublock-origin-1.67.0+dfsg/src/js/storage.js | 42
ublock-origin-1.67.0+dfsg/src/js/support.js | 6
ublock-origin-1.67.0+dfsg/src/js/tab.js | 50
ublock-origin-1.67.0+dfsg/src/js/tasks.js | 6
ublock-origin-1.67.0+dfsg/src/js/text-encode.js | 100
ublock-origin-1.67.0+dfsg/src/js/text-utils.js | 2
ublock-origin-1.67.0+dfsg/src/js/theme.js | 6
ublock-origin-1.67.0+dfsg/src/js/traffic.js | 177
ublock-origin-1.67.0+dfsg/src/js/ublock.js | 97
ublock-origin-1.67.0+dfsg/src/js/uri-utils.js | 20
ublock-origin-1.67.0+dfsg/src/js/url-net-filtering.js | 4
ublock-origin-1.67.0+dfsg/src/js/urlskip.js | 5
ublock-origin-1.67.0+dfsg/src/js/utils.js | 10
ublock-origin-1.67.0+dfsg/src/js/wasm/README.md | 2
ublock-origin-1.67.0+dfsg/src/js/wasm/biditrie.wat | 38
ublock-origin-1.67.0+dfsg/src/js/whitelist.js | 12
ublock-origin-1.67.0+dfsg/src/logger-ui.html | 3
ublock-origin-1.67.0+dfsg/src/no-dashboard.html | 1
ublock-origin-1.67.0+dfsg/src/popup-fenix.html | 3
ublock-origin-1.67.0+dfsg/src/settings.html | 1
ublock-origin-1.67.0+dfsg/src/support.html | 3
ublock-origin-1.67.0+dfsg/src/web_accessible_resources/epicker-ui.html | 2
ublock-origin-1.67.0+dfsg/src/web_accessible_resources/fingerprint2.js | 2
ublock-origin-1.67.0+dfsg/src/web_accessible_resources/google-ima.js | 21
ublock-origin-1.67.0+dfsg/src/whitelist.html | 1
ublock-origin-1.67.0+dfsg/tools/jsonpath-tool.html | 197
ublock-origin-1.67.0+dfsg/tools/make-mv3.sh | 209
ublock-origin-1.67.0+dfsg/tools/make-nodejs.sh | 64
ublock-origin-1.67.0+dfsg/tools/make-npm.sh | 1
ublock-origin-1.67.0+dfsg/uAssets/.github/ISSUE_TEMPLATE/bug_report.yml | 38
ublock-origin-1.67.0+dfsg/uAssets/.github/ISSUE_TEMPLATE/report_from_ubo.yml | 38
ublock-origin-1.67.0+dfsg/uAssets/.github/ISSUE_TEMPLATE/specific_report_from_ubo.yml | 36
ublock-origin-1.67.0+dfsg/uAssets/.github/ISSUE_TEMPLATE/specific_report_from_ubol.yml | 44
ublock-origin-1.67.0+dfsg/uAssets/.github/workflows/main.yml | 10
ublock-origin-1.67.0+dfsg/uAssets/.github/workflows/on-issue-created.yml | 54
ublock-origin-1.67.0+dfsg/uAssets/.github/workflows/on-youtube-issue.yml | 4
ublock-origin-1.67.0+dfsg/uAssets/.gitignore | 1
ublock-origin-1.67.0+dfsg/uAssets/filters/annoyances-cookies.txt | 2682
ublock-origin-1.67.0+dfsg/uAssets/filters/annoyances-others.txt | 858
ublock-origin-1.67.0+dfsg/uAssets/filters/badlists.txt | 5
ublock-origin-1.67.0+dfsg/uAssets/filters/badware.txt | 4177
ublock-origin-1.67.0+dfsg/uAssets/filters/experimental.txt | 36
ublock-origin-1.67.0+dfsg/uAssets/filters/filters-2020.txt | 814
ublock-origin-1.67.0+dfsg/uAssets/filters/filters-2021.txt | 1043
ublock-origin-1.67.0+dfsg/uAssets/filters/filters-2022.txt | 1466
ublock-origin-1.67.0+dfsg/uAssets/filters/filters-2023.txt | 1548
ublock-origin-1.67.0+dfsg/uAssets/filters/filters-2024.txt | 1334
ublock-origin-1.67.0+dfsg/uAssets/filters/filters-2025.txt | 2691
ublock-origin-1.67.0+dfsg/uAssets/filters/filters-general.txt | 2737
ublock-origin-1.67.0+dfsg/uAssets/filters/filters-mobile.txt | 45
ublock-origin-1.67.0+dfsg/uAssets/filters/filters.txt | 2411
ublock-origin-1.67.0+dfsg/uAssets/filters/lan-block.txt | 49
ublock-origin-1.67.0+dfsg/uAssets/filters/legacy.txt | 4
ublock-origin-1.67.0+dfsg/uAssets/filters/privacy.txt | 1136
ublock-origin-1.67.0+dfsg/uAssets/filters/quick-fixes.txt | 419
ublock-origin-1.67.0+dfsg/uAssets/filters/resource-abuse.txt | 39
ublock-origin-1.67.0+dfsg/uAssets/filters/ubo-link-shorteners.txt | 879
ublock-origin-1.67.0+dfsg/uAssets/filters/ubol-filters.txt | 320
ublock-origin-1.67.0+dfsg/uAssets/filters/unbreak.txt | 581
ublock-origin-1.67.0+dfsg/uAssets/templates/ublock-experimental.template | 8
ublock-origin-1.67.0+dfsg/uAssets/templates/ublock-filters.template | 2
ublock-origin-1.67.0+dfsg/uAssets/thirdparties/easylist/easylist-annoyances.txt | 446
ublock-origin-1.67.0+dfsg/uAssets/thirdparties/easylist/easylist-chat.txt | 37
ublock-origin-1.67.0+dfsg/uAssets/thirdparties/easylist/easylist-cookies.txt | 4416
ublock-origin-1.67.0+dfsg/uAssets/thirdparties/easylist/easylist-newsletters.txt | 755
ublock-origin-1.67.0+dfsg/uAssets/thirdparties/easylist/easylist-notifications.txt | 142
ublock-origin-1.67.0+dfsg/uAssets/thirdparties/easylist/easylist-social.txt | 772
ublock-origin-1.67.0+dfsg/uAssets/thirdparties/easylist/easylist.txt |53713 ++++++----
ublock-origin-1.67.0+dfsg/uAssets/thirdparties/easylist/easyprivacy.txt | 3185
ublock-origin-1.67.0+dfsg/uAssets/thirdparties/publicsuffix.org/list/effective_tld_names.dat | 670
ublock-origin-1.67.0+dfsg/uAssets/thirdparties/urlhaus-filter/urlhaus-filter-online.txt | 9075 +
ublock-origin-1.67.0+dfsg/uAssets/tools/make-easylist.mjs | 13
ublock-origin-1.67.0+dfsg/uAssets/tools/make-ublock.sh | 3
564 files changed, 90737 insertions(+), 54010 deletions(-)
diff -Nru ublock-origin-1.62.0+dfsg/.eslintrc.yml ublock-origin-1.67.0+dfsg/.eslintrc.yml
--- ublock-origin-1.62.0+dfsg/.eslintrc.yml 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/.eslintrc.yml 1970-01-01 00:00:00.000000000 +0000
@@ -1,30 +0,0 @@
-env:
- browser: true
- es2022: true
-extends: eslint:recommended
-parserOptions:
- sourceType: module
-rules:
- eqeqeq:
- - warn
- - always
- indent:
- - error
- - 4
- - ignoredNodes:
- - Program > BlockStatement
- - Program > ExpressionStatement > CallExpression > ArrowFunctionExpression > BlockStatement
- - Program > ExpressionStatement > CallExpression > FunctionExpression > BlockStatement
- - Program > IfStatement > BlockStatement
- - Program > VariableDeclaration > VariableDeclarator > CallExpression > ArrowFunctionExpression > BlockStatement
- - CallExpression > MemberExpression
- - ArrayExpression > *
- - ObjectExpression > *
- no-control-regex: off
- no-empty: off
- sort-imports: warn
- strict: warn
-globals:
- browser: readonly
- chrome: readonly
- vAPI: readonly
diff -Nru ublock-origin-1.62.0+dfsg/.github/workflows/RELEASE.HEAD.md ublock-origin-1.67.0+dfsg/.github/workflows/RELEASE.HEAD.md
--- ublock-origin-1.62.0+dfsg/.github/workflows/RELEASE.HEAD.md 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/.github/workflows/RELEASE.HEAD.md 2025-10-25 19:32:51.000000000 +0000
@@ -0,0 +1,7 @@
+[Commits to Master Since This Release](https://github.com/gorhill/uBlock/compare/%version%...master)
+
+#### How to Install the Developer Build:
+
+- **Firefox**: Signing pending
+ uBO works best on Gecko-based browsers, check out [why](https://github.com/gorhill/uBlock/wiki/uBlock-Origin-works-best-on-Firefox).
+- **Chromium**: Install directly from the [Chrome Web Store](https://chromewebstore.google.com/detail/ublock-origin-development/cgbcahbpdhpcegmbfconppldiemgcoii).
diff -Nru ublock-origin-1.62.0+dfsg/.github/workflows/main.yml ublock-origin-1.67.0+dfsg/.github/workflows/main.yml
--- ublock-origin-1.62.0+dfsg/.github/workflows/main.yml 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/.github/workflows/main.yml 2025-10-25 19:32:51.000000000 +0000
@@ -29,13 +29,11 @@
run: |
tools/make-chromium.sh ${{ env.VERSION }}
tools/make-firefox.sh ${{ env.VERSION }}
- tools/make-thunderbird.sh ${{ env.VERSION }}
- tools/make-npm.sh ${{ env.VERSION }}
- name: Assemble release notes
run: |
> release.body.txt
grep -m1 -B10000 -- "----------" CHANGELOG.md >> release.body.txt
- sed -e 's/%version%/${{ env.VERSION }}/g' RELEASE.HEAD.md >> release.body.txt
+ sed -e 's/%version%/${{ env.VERSION }}/g' .github/workflows/RELEASE.HEAD.md >> release.body.txt
- name: Create GitHub release
id: create_release
uses: softprops/action-gh-release@v2
@@ -50,5 +48,3 @@
files: |
dist/build/uBlock0_${{ env.VERSION }}.chromium.zip
dist/build/uBlock0_${{ env.VERSION }}.firefox.xpi
- dist/build/uBlock0_${{ env.VERSION }}.thunderbird.xpi
- dist/build/uBlock0_${{ env.VERSION }}.npm.tgz
diff -Nru ublock-origin-1.62.0+dfsg/.gitignore ublock-origin-1.67.0+dfsg/.gitignore
--- ublock-origin-1.62.0+dfsg/.gitignore 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/.gitignore 2025-10-25 19:32:51.000000000 +0000
@@ -4,3 +4,4 @@
node_modules/
/dist/build/
/tmp/
+.DS_Store
diff -Nru ublock-origin-1.62.0+dfsg/.gitmodules ublock-origin-1.67.0+dfsg/.gitmodules
--- ublock-origin-1.62.0+dfsg/.gitmodules 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/.gitmodules 2025-10-25 19:32:51.000000000 +0000
@@ -0,0 +1,6 @@
+[submodule "platform/mv3/extension/lib/codemirror/codemirror-ubol"]
+ path = platform/mv3/extension/lib/codemirror/codemirror-ubol
+ url = https://github.com/gorhill/codemirror-ubol.git
+[submodule "publish-extension"]
+ path = publish-extension
+ url = https://github.com/gorhill/publish-extension.git
diff -Nru ublock-origin-1.62.0+dfsg/.jshintrc ublock-origin-1.67.0+dfsg/.jshintrc
--- ublock-origin-1.62.0+dfsg/.jshintrc 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/.jshintrc 1970-01-01 00:00:00.000000000 +0000
@@ -1,22 +0,0 @@
-{
- "browser": true,
- "devel": true,
- "eqeqeq": true,
- "esversion": 11,
- "globals": {
- "chrome": false, // global variable in Chromium, Chrome, Opera
- "globalThis": false,
- "self": false,
- "vAPI": false,
- "URLSearchParams": false,
- "WebAssembly": false
- },
- "laxbreak": true,
- "newcap": false,
- "nonew": false,
- "strict": "global",
- "sub": true,
- "undef": true,
- "unused": true,
- "validthis": true
-}
diff -Nru ublock-origin-1.62.0+dfsg/CHANGELOG.md ublock-origin-1.67.0+dfsg/CHANGELOG.md
--- ublock-origin-1.62.0+dfsg/CHANGELOG.md 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/CHANGELOG.md 2025-10-25 19:32:51.000000000 +0000
@@ -1,3 +1,134 @@
+- [Improve `href-sanitizer` scriptlet](https://github.com/gorhill/uBlock/commit/a43d1d8c42)
+- [Fix `editInboundObjectFn` utility scriptlet](https://github.com/gorhill/uBlock/commit/d376adaae8)
+- [Improve `trusted-replace-argument` scriptlet](https://github.com/gorhill/uBlock/commit/52bc354bce)
+- [Add ability to test against regex in JSONPath expressions](https://github.com/gorhill/uBlock/commit/f36d2b8496)
+- [Improve `proxy-apply` utility scriptlet](https://github.com/gorhill/uBlock/commit/dd4f764920)
+- [Fix `removeparam` for multiple query parameters with same name](https://github.com/gorhill/uBlock/commit/3e5ea3b03f)
+- [Improve `trusted-click-element` scriptlet](https://github.com/gorhill/uBlock/commit/9aa91ba111)
+- [Improve `google-ima` shim](https://github.com/gorhill/uBlock/commit/8de47f250d)
+- [Add back a uBO-specific version of "CERT.PL's Warning List"](https://github.com/gorhill/uBlock/commit/87dddb7d78)
+
+----------
+
+# 1.66.4
+
+- [Fix potential infinite loop when scanning for `$` anchor](https://github.com/gorhill/uBlock/commit/889c0eb208)
+- [Allow generic exception for `replace=` option](https://github.com/gorhill/uBlock/commit/52dba4116e)
+
+----------
+
+# 1.66.2
+
+- [Fix version snafu](https://github.com/gorhill/uBlock/commit/50cb780107)
+
+----------
+
+# 1.66.0
+
+- [Improve `prevent-fetch` scriptlet](https://github.com/gorhill/uBlock/commit/d2bce26e7d)
+- [Add support to strict-block from `ipaddress=` option](https://github.com/gorhill/uBlock/commit/6327aae56c)
+- [Improve rendering with high-contrast theme](https://github.com/gorhill/uBlock/commit/5d7e5ee3a0) (fix suggested by @emv33)
+- [Fix undue fetch from remote server at first install](https://github.com/gorhill/uBlock/commit/9327e19233)
+- [Improve compatibility of `uritransform=` with DNR syntax](https://github.com/gorhill/uBlock/commit/aaf35d9d71)
+- [Allow usage of `csp=`/`permissions=` with resource type object](https://github.com/gorhill/uBlock/commit/07e9f805bb)
+- [JSONPath: Add ability to select root node for appending/modifying](https://github.com/gorhill/uBlock/commit/faff035203)
+- [JSONPath: Add ability to substitute a pattern within a string value](https://github.com/gorhill/uBlock/commit/38ca6d41ff)
+- [Remove "CERT.PL's Warning List" from stock lists](https://github.com/gorhill/uBlock/commit/e713e133eb)
+- [Fix incorrect CNAME-related test in advanced settings](https://github.com/gorhill/uBlock/commit/171ddd3e06)
+- [Remove "AdGuard Tracking Protection"from stock list](https://github.com/gorhill/uBlock/commit/14a9572c86)
+- [Add filter list for experimental filters](https://github.com/gorhill/uBlock/commit/d88814bc12)
+- [Improve `fingerprint2.js` shim](https://github.com/gorhill/uBlock/commit/7d9317bb17)
+- [Make `google-ima` a valid injectable scriptlet](https://github.com/gorhill/uBlock/commit/47cbb43a0e)
+- [Improve `abort-current-script` scriptlet](https://github.com/gorhill/uBlock/commit/fef50e59f2)
+- [Fix potential exception in procedural operator `:matches-attr`](https://github.com/gorhill/uBlock/commit/e07e7bbd09)
+- [Improve reporting of `reason` option in strict-blocked pages](https://github.com/gorhill/uBlock/commit/b7510eee61)
+- [Improve `prevent-innerHTML` scriptlet](https://github.com/gorhill/uBlock/commit/b0396029bd)
+
+----------
+
+# 1.65.0
+
+## Fixes / changes
+
+- [Reset `important` option flag at `header` evaluation time](https://github.com/gorhill/uBlock/commit/66b68b4442)
+- [Fix broken reverse lookup of filter lists](https://github.com/gorhill/uBlock/commit/527b4a201f)
+- [Add `[trusted-]edit-inbound-object` scriptlets](https://github.com/gorhill/uBlock/commit/6e466cf945)
+- [Improve `remove-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/0a8ea58bb7)
+- [Add `json-edit`-related scriptlets](https://github.com/gorhill/uBlock/commit/87e0434c90)
+- [Improve `trusted-set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/3a2bb62519)
+- [Force cache bypass reload when no-scripting switch is toggled](https://github.com/gorhill/uBlock/commit/4affe343dd)
+- [Improve `jsonl[...]` suite of scriptlets](https://github.com/gorhill/uBlock/commit/ed9999efd6)
+- [Add support for network filter option `message`](https://github.com/gorhill/uBlock/commit/d8298bb067)
+ - [Complete support for reporing strict-block messages](https://github.com/gorhill/uBlock/commit/253ef7ade3)
+- [Make `header=` syntax compatible with DNR rules](https://github.com/gorhill/uBlock/commit/408b538e75)
+- [Counter CodeMirror's `pointer-events: none` on scrollbars](https://github.com/gorhill/uBlock/commit/c44f043ed3)
+- [Fix element picker issue with explicit dark theme](https://github.com/gorhill/uBlock/commit/0130fdf4a1)
+
+----------
+
+# 1.64.0
+
+## Fixes / changes
+
+- [Use custom blank page for embedded iframe in dashboard](https://github.com/gorhill/uBlock/commit/8cd6212867)
+- [Use `color-scheme` `meta` tag, as suggested](https://github.com/gorhill/uBlock/commit/5c029b3532)
+- [Bring zapper look in line with uBO Lite's zapper](https://github.com/gorhill/uBlock/commit/3f59f94b60)
+- [Ignore `start_page` transition for popup-blocking purpose](https://github.com/gorhill/uBlock/commit/0243a141a7)
+- [Exclude `chrome:` as valid openers for popup candidates](https://github.com/gorhill/uBlock/commit/59f4aca010)
+- [Fetch diff patches from "reliable" servers only](https://github.com/gorhill/uBlock/commit/8b964a8c54)
+- [Add `trusted-create-html` scriptlet](https://github.com/gorhill/uBlock/commit/20dd606504)
+- [Mind potential race condition when dynamically registering scriptlets](https://github.com/gorhill/uBlock/commit/15e832da8a)
+- [Fix undue unchecking of setting in "My filters"](https://github.com/gorhill/uBlock/commit/2bb6999e3f)
+- [Add path support as target option in static extended filtering](https://github.com/gorhill/uBlock/commit/8b696a691a)
+- [Add `trusted-prevent-fetch` scriptlet](https://github.com/gorhill/uBlock/commit/4ce26b63ff)
+- [Code viewer shouldn't be maximizable](https://github.com/gorhill/uBlock/commit/97e740bd2c)
+- [Add `json-edit` suite of scriptlets; extend `replace=` option](https://github.com/gorhill/uBlock/commit/b18daa53aa)
+- [Improve `trusted-prevent-dom-bypass` scriptlet](https://github.com/gorhill/uBlock/commit/68a256bdde)
+- [Add `jsonl-prune-xhr-response`/`jsonl-prune-fetch-response` scriptlets](https://github.com/gorhill/uBlock/commit/95a3be9d56)
+- [Improve `[json-prune|trusted-replace]-fetch-response` scriptlets](https://github.com/gorhill/uBlock/commit/88fa550a96)
+
+----------
+
+# 1.63.2
+
+## Fixes / changes
+
+- [Fix TypedArray overflow](https://github.com/gorhill/uBlock/commit/76b80baaea)
+- [Add prevent-innerHTML scriptlet](https://github.com/gorhill/uBlock/commit/fe744816f1)
+
+----------
+
+# 1.63.0
+
+## Fixes / changes
+
+- [Improve `prevent-set[Timeout|Interval]` scriptlets](https://github.com/gorhill/uBlock/commit/d36ea89a02)
+- [Add quit button to element zapper mode](https://github.com/gorhill/uBlock/commit/4aebdbb0a9)
+- [Improve `trusted-override-element-method` scriptlet](https://github.com/gorhill/uBlock/commit/9e946ce0c3)
+- [Disable obsolete cache-control workaround for Firefox](https://github.com/gorhill/uBlock/commit/34cea70924)
+- [Improve `overlay-buster` scriptlet](https://github.com/gorhill/uBlock/commit/fc231998b9)
+- [Add ability to inject scriptlets according to origin of ancestor contexts](https://github.com/gorhill/uBlock/commit/a483f7955f)
+- [Fix range parser in prevent-setTimeout scriptlet](https://github.com/gorhill/uBlock/commit/e636c32f2a)
+- [Add filter option synonyms for `strict1p`/`strict3p`](https://github.com/gorhill/uBlock/commit/34df044808)
+- [Increase URL buffer size to 8192 (from 2048)](https://github.com/gorhill/uBlock/commit/36404543e4)
+- [Use onmessage/postMessage instead of BroadcastChannel in diff updater](https://github.com/gorhill/uBlock/commit/ea8853cda3)
+- [Improve `disable-newtab-links` scriptlet](https://github.com/gorhill/uBlock/commit/d41989e62a)
+- [Improve `prevent-addEventListener` scriptlet](https://github.com/gorhill/uBlock/commit/9c26a07b53)
+- [Fix reverse lookup of `##^responseheader(...)` filters](https://github.com/gorhill/uBlock/commit/5921e50e03)
+- [Improve `evaldata-prune` scriptlet](https://github.com/gorhill/uBlock/commit/9bb1a2baaf)
+- [Comply with Mozilla's "User Consent and Control"](https://github.com/gorhill/uBlock/commit/344539d793)
+- [Improve `noeval-if` scriptlet](https://github.com/gorhill/uBlock/commit/0df7faffac)
+- [Add "closed","next", "mandatory", "agree/disagree" values to `set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/35a47d674b) (by @ryanbr)
+- [Add `decline` value to `set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/4b12247da1)
+- [Improve `abort-on-stack-trace` scriptlet](https://github.com/gorhill/uBlock/commit/b617926c1c)
+- [Improve `href-sanitizer` scriptlet](https://github.com/gorhill/uBlock/commit/551c6bc6eb)
+
+----------
+
+# 1.62.0
+
+## Fixes / changes
+
- [Fix deserialization of ArrayBuffer shared by multiple TypedArrays](https://github.com/gorhill/uBlock/commit/c92a518218)
- [Improve `trusted-suppress-native-method` scriptlet](https://github.com/gorhill/uBlock/commit/cb6c11ab6f)
- [Improve `urlskip=` filter option](https://github.com/gorhill/uBlock/commit/a7aa755f18)
diff -Nru ublock-origin-1.62.0+dfsg/Makefile ublock-origin-1.67.0+dfsg/Makefile
--- ublock-origin-1.62.0+dfsg/Makefile 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/Makefile 2025-10-25 19:32:51.000000000 +0000
@@ -2,12 +2,24 @@
run_options := $(filter-out $@,$(MAKECMDGOALS))
.PHONY: all clean cleanassets test lint chromium opera firefox npm dig \
- mv3 mv3-quick mv3-chromium mv3-firefox \
- compare maxcost medcost mincost modifiers record wasm
+ mv3-chromium mv3-firefox mv3-edge mv3-safari ubol-codemirror \
+ compare maxcost medcost mincost modifiers record wasm \
+ publish-chromium publish-edge publish-firefox \
+ publish-dev-chromium publish-dev-firefox \
+ upload-firefox upload-dev-firefox
-sources := $(wildcard assets/* assets/*/* dist/version src/* src/*/* src/*/*/* src/*/*/*/*)
-platform := $(wildcard platform/* platform/*/* platform/*/*/* platform/*/*/*/* platform/*/*/*/*/*)
+sources := ./dist/version $(shell find ./assets -type f) $(shell find ./src -type f)
+platform := $(wildcard platform/*/*)
assets := dist/build/uAssets
+mv3-sources := \
+ $(shell find ./src -type f) \
+ $(wildcard platform/mv3/*) \
+ $(shell find ./platform/mv3/extension -name codemirror-ubol -prune -o -type f) \
+ platform/mv3/extension/lib/codemirror/codemirror-ubol/dist/cm6.bundle.ubol.min.js
+mv3-data := $(shell find ./dist/build/mv3-data -type f)
+
+mv3-edge-deps := $(wildcard platform/mv3/edge/*)
+mv3-safari-deps := $(wildcard platform/mv3/safari/*)
all: chromium firefox npm
@@ -32,20 +44,16 @@
dist/build/uBlock0.npm: tools/make-nodejs.sh $(sources) $(platform) $(assets)
tools/make-npm.sh
-# Build the Node.js package.
npm: dist/build/uBlock0.npm
-lint: npm
- cd dist/build/uBlock0.npm && npm run lint
-
-test: npm
- cd dist/build/uBlock0.npm && npm run test
+# Dev tools
+node_modules:
+ npm install
-test-full-battery: npm
- cd dist/build/uBlock0.npm && npm run test-full-battery
+init: node_modules
-check-leaks: npm
- cd dist/build/uBlock0.npm && npm run check-leaks
+lint: init
+ npm run lint
dist/build/uBlock0.dig: tools/make-nodejs.sh $(sources) $(platform) $(assets)
tools/make-dig.sh
@@ -56,31 +64,112 @@
dig-snfe: dig
cd dist/build/uBlock0.dig && npm run snfe $(run_options)
-dist/build/uBOLite.chromium: tools/make-mv3.sh $(sources) $(platform)
+dist/build/mv3-data:
+ mkdir -p dist/build/mv3-data
+
+ubol-codemirror:
+ $(MAKE) -sC platform/mv3/extension/lib/codemirror/codemirror-ubol/ ubol.bundle
+
+dist/build/uBOLite.chromium: tools/make-mv3.sh $(mv3-sources) $(platform) $(mv3-data) dist/build/mv3-data
tools/make-mv3.sh chromium
-mv3-chromium: dist/build/uBOLite.chromium
+mv3-chromium: ubol-codemirror dist/build/uBOLite.chromium
-dist/build/uBOLite.firefox: tools/make-mv3.sh $(sources) $(platform)
+dist/build/uBOLite.firefox: tools/make-mv3.sh $(mv3-sources) $(platform) $(mv3-data) dist/build/mv3-data
tools/make-mv3.sh firefox
-mv3-firefox: dist/build/uBOLite.firefox
+mv3-firefox: ubol-codemirror dist/build/uBOLite.firefox
-mv3-quick: tools/make-mv3.sh $(sources) $(platform)
- tools/make-mv3.sh quick
+dist/build/uBOLite.edge: tools/make-mv3.sh $(mv3-sources) $(mv3-edge-deps) $(mv3-data) dist/build/mv3-data
+ tools/make-mv3.sh edge
-mv3-full: tools/make-mv3.sh $(sources) $(platform)
- tools/make-mv3.sh full
+mv3-edge: ubol-codemirror dist/build/uBOLite.edge
+
+dist/build/uBOLite.safari: tools/make-mv3.sh $(mv3-sources) $(mv3-safari-deps) $(mv3-data) dist/build/mv3-data
+ tools/make-mv3.sh safari
+
+mv3-safari: ubol-codemirror dist/build/uBOLite.safari
dist/build/uAssets:
tools/pull-assets.sh
clean:
- rm -rf dist/build tmp/node_modules
+ rm -rf dist/build tmp/node_modules node_modules
cleanassets:
rm -rf dist/build/mv3-data dist/build/uAssets
+# Usage: make publish-publish version=?
+publish-chromium:
+ node publish-extension/publish-chromium.js \
+ ghowner=gorhill \
+ ghrepo=uBlock \
+ ghtag=$(version) \
+ ghasset=chromium \
+ storeid=cjpalhdlnbpafiamejdnhcphjbkeiagm
+
+# Usage: make publish-edge version=?
+publish-edge:
+ node publish-extension/publish-edge.js \
+ ghowner=gorhill \
+ ghrepo=uBlock \
+ ghtag=$(version) \
+ ghasset=chromium \
+ datebasedmajor=1 \
+ storeid=odfafepnkmbhccpbejgmiehpchacaeak \
+ productid=$(shell secret-tool lookup token ubo_edge_id)
+
+# Usage: make publish-firefox version=?
+publish-firefox:
+ node publish-extension/publish-firefox.js \
+ ghowner=gorhill \
+ ghrepo=uBlock \
+ ghtag=$(version) \
+ ghasset=firefox \
+ storeid=uBlock0@raymondhill.net \
+ channel=listed
+
+# Usage: make publish-dev-chromium version=?
+publish-dev-chromium:
+ node publish-extension/publish-chromium.js \
+ ghowner=gorhill \
+ ghrepo=uBlock \
+ ghtag=$(version) \
+ ghasset=chromium \
+ storeid=cgbcahbpdhpcegmbfconppldiemgcoii
+
+# Usage: make publish-dev-firefox version=?
+publish-dev-firefox:
+ node publish-extension/publish-firefox.js \
+ ghowner=gorhill \
+ ghrepo=uBlock \
+ ghtag=$(version) \
+ ghasset=firefox \
+ storeid=uBlock0@raymondhill.net \
+ channel=unlisted \
+ updatepath=./dist/firefox/updates.json
+
+# Usage: make upload-firefox version=?
+upload-firefox:
+ node publish-extension/upload-firefox.js \
+ ghowner=gorhill \
+ ghrepo=uBlock \
+ ghtag=$(version) \
+ ghasset=firefox \
+ storeid=uBlock0@raymondhill.net \
+ channel=listed
+
+# Usage: make upload-dev-firefox version=?
+upload-dev-firefox:
+ node publish-extension/upload-firefox.js \
+ ghowner=gorhill \
+ ghrepo=uBlock \
+ ghtag=$(version) \
+ ghasset=firefox \
+ storeid=uBlock0@raymondhill.net \
+ channel=unlisted \
+ updatepath=./dist/firefox/updates.json
+
# Not real targets, just convenient for auto-completion at shell prompt
compare:
@echo
diff -Nru ublock-origin-1.62.0+dfsg/README.md ublock-origin-1.67.0+dfsg/README.md
--- ublock-origin-1.62.0+dfsg/README.md 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/README.md 2025-10-25 19:32:51.000000000 +0000
@@ -15,25 +15,15 @@
uBlock Origin (uBO)
-
-BEWARE! uBO is (and has always been) COMPLETELY UNRELATED to the website ublock.org.
-
-***
-
-
-
-
-
-
-
-
-***
-
-
-
-IMPORTANT: About Google Chrome's "This extension may soon no longer be supported"
-
+| Browser | Install from ... | Status |
+| :-------: | ---------------- | ------ |
+|
| Firefox Add-ons | [uBO works best on Firefox](https://github.com/gorhill/uBlock/wiki/uBlock-Origin-works-best-on-Firefox) |
+|
| Edge Add-ons |
+|
| Opera Add-ons |
+|
| Chrome Web Store | About Google Chrome's "This extension may soon no longer be supported"
End of support on Chrome 139 |
+|
| Thunderbird Add-ons | [No longer updated and stuck at 1.49.2.](https://github.com/uBlockOrigin/uBlock-issues/issues/2928) Later versions require "GitHub - Releases". |
+|
| GitHub - Releases | Stable and development versions on Firefox, Chromium MV2, and Thunderbird. Must be placed manually into web browsers; the Chromium and Thunderbird versions usually won't auto-update.
***
@@ -105,7 +95,7 @@
[Chrome Web Store][Chrome]
-[Microsoft Edge Add-ons][Edge] (Published by: [Nicole Rolls][Nicole Rolls])
+[Microsoft Edge Add-ons][Edge] (Published by [Nicole Rolls][Nicole Rolls] until version 1.62. Ownership transfer at version 1.64.)
[Opera Add-ons][Opera]
@@ -148,7 +138,7 @@
[Peter Lowe's Blocklist]: https://pgl.yoyo.org/adservers/
[Malicious Blocklist]: https://gitlab.com/malware-filter/urlhaus-filter#malicious-url-blocklist
-[Performance]: https://www.debugbear.com/blog/chrome-extension-performance-2021#how-do-ad-blockers-and-privacy-tools-affect-browser-performance
+[Performance]: https://www.debugbear.com/blog/chrome-extensions-website-performance#the-impact-of-ad-blocking-on-website-performance
[EasyPrivacy]: https://easylist.to/#easyprivacy
[Thunderbird]: https://addons.thunderbird.net/thunderbird/addon/ublock-origin/
[Chrome Dev]: https://chromewebstore.google.com/detail/ublock-origin-development/cgbcahbpdhpcegmbfconppldiemgcoii
diff -Nru ublock-origin-1.62.0+dfsg/RELEASE.HEAD.md ublock-origin-1.67.0+dfsg/RELEASE.HEAD.md
--- ublock-origin-1.62.0+dfsg/RELEASE.HEAD.md 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/RELEASE.HEAD.md 1970-01-01 00:00:00.000000000 +0000
@@ -1,12 +0,0 @@
-[Commits to Master Since This Release](https://github.com/gorhill/uBlock/compare/%version%...master)
-
-#### How to Install the Developer Build:
-
-- **Firefox**: Download the build from [uBlock0_%version%.firefox.signed.xpi](https://github.com/gorhill/uBlock/releases/download/%version%/uBlock0_%version%.firefox.signed.xpi).
- - uBO works best on Firefox, check out [why](https://github.com/gorhill/uBlock/wiki/uBlock-Origin-works-best-on-Firefox).
-
-- **Chromium**: Install directly from the [Chrome Web Store](https://chromewebstore.google.com/detail/ublock-origin-development/cgbcahbpdhpcegmbfconppldiemgcoii).
-
-- **Thunderbird**: Download [uBlock0_%version%.thunderbird.xpi](https://github.com/gorhill/uBlock/releases/download/%version%/uBlock0_%version%.thunderbird.xpi) and drag it into Thunderbird's _Add-ons Manager_ (requires Thunderbird 91+).
-
-- **Node.js**: You can import from [npm](https://www.npmjs.com/package/@gorhill/ubo-core) or download and unzip [uBlock0_%version%.npm.tgz](https://github.com/gorhill/uBlock/releases/download/%version%/uBlock0_%version%.npm.tgz).
diff -Nru ublock-origin-1.62.0+dfsg/assets/assets.dev.json ublock-origin-1.67.0+dfsg/assets/assets.dev.json
--- ublock-origin-1.62.0+dfsg/assets/assets.dev.json 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/assets/assets.dev.json 2025-10-25 19:32:51.000000000 +0000
@@ -52,6 +52,10 @@
"https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/filters.min.txt",
"https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/filters.min.txt"
],
+ "patchURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/",
+ "https://ublockorigin.pages.dev/filters/"
+ ],
"supportURL": "https://github.com/uBlockOrigin/uAssets"
},
"ublock-badware": {
@@ -71,6 +75,10 @@
"https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/badware.min.txt",
"https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/badware.min.txt"
],
+ "patchURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/",
+ "https://ublockorigin.pages.dev/filters/"
+ ],
"supportURL": "https://github.com/uBlockOrigin/uAssets",
"instructionURL": "https://github.com/gorhill/uBlock/wiki/Badware-risks"
},
@@ -91,6 +99,10 @@
"https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/privacy.min.txt",
"https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/privacy.min.txt"
],
+ "patchURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/",
+ "https://ublockorigin.pages.dev/filters/"
+ ],
"supportURL": "https://github.com/uBlockOrigin/uAssets"
},
"ublock-unbreak": {
@@ -109,6 +121,10 @@
"https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/unbreak.min.txt",
"https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/unbreak.min.txt"
],
+ "patchURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/",
+ "https://ublockorigin.pages.dev/filters/"
+ ],
"supportURL": "https://github.com/uBlockOrigin/uAssets"
},
"ublock-quick-fixes": {
@@ -127,6 +143,28 @@
"https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/quick-fixes.min.txt",
"https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/quick-fixes.min.txt"
],
+ "patchURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/",
+ "https://ublockorigin.pages.dev/filters/"
+ ],
+ "supportURL": "https://github.com/uBlockOrigin/uAssets"
+ },
+ "ublock-experimental": {
+ "content": "filters",
+ "group": "default",
+ "off": true,
+ "title": "uBlock filters – Experimental",
+ "contentURL": "https://ublockorigin.github.io/uAssets/filters/experimental.txt",
+ "cdnURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/experimental.min.txt",
+ "https://ublockorigin.pages.dev/filters/experimental.min.txt",
+ "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/experimental.min.txt",
+ "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/experimental.min.txt"
+ ],
+ "patchURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/",
+ "https://ublockorigin.pages.dev/filters/"
+ ],
"supportURL": "https://github.com/uBlockOrigin/uAssets"
},
"adguard-generic": {
@@ -163,6 +201,10 @@
"https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist.txt",
"https://ublockorigin.pages.dev/thirdparties/easylist.txt"
],
+ "patchURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/",
+ "https://ublockorigin.pages.dev/filters/"
+ ],
"supportURL": "https://easylist.to/"
},
"adguard-spyware-url": {
@@ -174,14 +216,6 @@
"contentURL": "https://filters.adtidy.org/extension/ublock/filters/17.txt",
"supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters"
},
- "adguard-spyware": {
- "content": "filters",
- "group": "privacy",
- "off": true,
- "title": "AdGuard Tracking Protection",
- "contentURL": "https://filters.adtidy.org/extension/ublock/filters/3.txt",
- "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters"
- },
"block-lan": {
"content": "filters",
"group": "privacy",
@@ -212,6 +246,10 @@
"https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easyprivacy.txt",
"https://ublockorigin.pages.dev/thirdparties/easyprivacy.txt"
],
+ "patchURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/",
+ "https://ublockorigin.pages.dev/filters/"
+ ],
"supportURL": "https://easylist.to/"
},
"urlhaus-1": {
@@ -478,6 +516,10 @@
"https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/annoyances.min.txt",
"https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/annoyances.min.txt"
],
+ "patchURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/",
+ "https://ublockorigin.pages.dev/filters/"
+ ],
"supportURL": "https://github.com/uBlockOrigin/uAssets"
},
"dpollock-0": {
@@ -520,7 +562,7 @@
"off": true,
"title": "🇪🇬eg 🇸🇦sa 🇲🇦ma 🇩🇿dz: Liste AR",
"tags": "ads arabic اَلْعَرَبِيَّةُ",
- "lang": "ar",
+ "lang": "ar kab",
"contentURL": "https://easylist-downloads.adblockplus.org/Liste_AR.txt",
"supportURL": "https://forums.lanik.us/viewforum.php?f=98"
},
@@ -593,7 +635,7 @@
"off": true,
"title": "🇫🇷fr 🇨🇦ca: AdGuard Français",
"tags": "ads french",
- "lang": "ar br ff fr lb oc son",
+ "lang": "ar br ff fr kab lb oc son",
"contentURL": "https://filters.adtidy.org/extension/ublock/filters/16.txt",
"supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters"
},
@@ -647,7 +689,7 @@
"off": true,
"title": "🇮🇳in 🇱🇰lk 🇳🇵np: IndianList",
"tags": "ads assamese bengali gujarati hindi kannada malayalam marathi nepali punjabi sinhala tamil telugu",
- "lang": "as bn gu hi kn ml mr ne pa si ta te",
+ "lang": "as bn gu hi kn ml mr ne pa sat si ta te",
"contentURL": "https://easylist-downloads.adblockplus.org/indianlist.txt",
"supportURL": "https://github.com/mediumkreation/IndianList"
},
@@ -694,7 +736,7 @@
"off": true,
"title": "🇮🇹it: EasyList Italy",
"tags": "ads italian",
- "lang": "it lij",
+ "lang": "fur it lij sc",
"contentURL": "https://easylist-downloads.adblockplus.org/easylistitaly.txt",
"supportURL": "https://forums.lanik.us/viewforum.php?f=96"
},
@@ -784,21 +826,20 @@
"off": true,
"title": "🇵🇱pl: Oficjalne Polskie Filtry do uBlocka Origin",
"tags": "ads polish polski",
- "lang": "szl pl",
+ "lang": "szl pl _",
"contentURL": "https://raw.githubusercontent.com/MajkiIT/polish-ads-filter/master/polish-adblock-filters/adblock.txt",
- "supportURL": "https://github.com/MajkiIT/polish-ads-filter/issues",
- "instructionURL": "https://github.com/MajkiIT/polish-ads-filter#polish-filters-for-adblock-ublock-origin--adguard"
+ "supportURL": "https://github.com/MajkiIT/polish-ads-filter"
},
- "POL-2": {
+ "POL-3": {
"content": "filters",
"group": "regions",
"parent": "🇵🇱pl: Oficjalne Polskie Filtry",
"off": true,
- "title": "🇵🇱pl: Oficjalne polskie filtry przeciwko alertom o Adblocku",
- "tags": "ads polish polski",
+ "title": "🇵🇱pl: CERT.PL's Warning List",
+ "tags": "malware polish polski",
"lang": "szl pl",
- "contentURL": "https://raw.githubusercontent.com/olegwukr/polish-privacy-filters/master/anti-adblock.txt",
- "supportURL": "https://github.com/olegwukr/polish-privacy-filters/issues"
+ "contentURL": "https://hole.cert.pl/domains/v2/domains_ublock.txt",
+ "supportURL": "https://cert.pl/lista-ostrzezen/"
},
"ROU-1": {
"content": "filters",
@@ -818,7 +859,7 @@
"parent": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList",
"off": true,
"title": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList",
- "tags": "ads belarusian беларуская kazakh tatar russian русский ukrainian українська uzbek",
+ "tags": "ads belarusian беларуская kazakh tatar russian русский ukrainian українська uzbek uk",
"lang": "be kk tt ru uz",
"contentURL": "https://raw.githubusercontent.com/easylist/ruadlist/master/RuAdList-uBO.txt",
"cdnURLs": [
@@ -913,11 +954,11 @@
"content": "filters",
"group": "regions",
"off": true,
- "title": "🇺🇦ua: Ukrainian Filters",
+ "title": "🇺🇦ua: AdGuard Ukrainian",
"tags": "ads ukraine україна",
"lang": "uk",
- "contentURL": "https://raw.githubusercontent.com/ukrainianfilters/lists/main/combined/uBO/uBO.txt",
- "supportURL": "https://github.com/ukrainianfilters/lists"
+ "contentURL": "https://filters.adtidy.org/extension/ublock/filters/23.txt",
+ "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters"
},
"VIE-1": {
"content": "filters",
diff -Nru ublock-origin-1.62.0+dfsg/assets/assets.json ublock-origin-1.67.0+dfsg/assets/assets.json
--- ublock-origin-1.62.0+dfsg/assets/assets.json 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/assets/assets.json 2025-10-25 19:32:51.000000000 +0000
@@ -52,6 +52,10 @@
"https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/filters.min.txt",
"https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/filters.min.txt"
],
+ "patchURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/",
+ "https://ublockorigin.pages.dev/filters/"
+ ],
"supportURL": "https://github.com/uBlockOrigin/uAssets"
},
"ublock-badware": {
@@ -71,6 +75,10 @@
"https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/badware.min.txt",
"https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/badware.min.txt"
],
+ "patchURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/",
+ "https://ublockorigin.pages.dev/filters/"
+ ],
"supportURL": "https://github.com/uBlockOrigin/uAssets",
"instructionURL": "https://github.com/gorhill/uBlock/wiki/Badware-risks"
},
@@ -91,6 +99,10 @@
"https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/privacy.min.txt",
"https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/privacy.min.txt"
],
+ "patchURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/",
+ "https://ublockorigin.pages.dev/filters/"
+ ],
"supportURL": "https://github.com/uBlockOrigin/uAssets"
},
"ublock-unbreak": {
@@ -109,6 +121,10 @@
"https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/unbreak.min.txt",
"https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/unbreak.min.txt"
],
+ "patchURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/",
+ "https://ublockorigin.pages.dev/filters/"
+ ],
"supportURL": "https://github.com/uBlockOrigin/uAssets"
},
"ublock-quick-fixes": {
@@ -127,6 +143,28 @@
"https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/quick-fixes.min.txt",
"https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/quick-fixes.min.txt"
],
+ "patchURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/",
+ "https://ublockorigin.pages.dev/filters/"
+ ],
+ "supportURL": "https://github.com/uBlockOrigin/uAssets"
+ },
+ "ublock-experimental": {
+ "content": "filters",
+ "group": "default",
+ "off": true,
+ "title": "uBlock filters – Experimental",
+ "contentURL": "https://ublockorigin.github.io/uAssets/filters/experimental.txt",
+ "cdnURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/experimental.min.txt",
+ "https://ublockorigin.pages.dev/filters/experimental.min.txt",
+ "https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/experimental.min.txt",
+ "https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/experimental.min.txt"
+ ],
+ "patchURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/",
+ "https://ublockorigin.pages.dev/filters/"
+ ],
"supportURL": "https://github.com/uBlockOrigin/uAssets"
},
"adguard-generic": {
@@ -163,6 +201,10 @@
"https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easylist.txt",
"https://ublockorigin.pages.dev/thirdparties/easylist.txt"
],
+ "patchURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/",
+ "https://ublockorigin.pages.dev/filters/"
+ ],
"supportURL": "https://easylist.to/"
},
"adguard-spyware-url": {
@@ -174,14 +216,6 @@
"contentURL": "https://filters.adtidy.org/extension/ublock/filters/17.txt",
"supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters"
},
- "adguard-spyware": {
- "content": "filters",
- "group": "privacy",
- "off": true,
- "title": "AdGuard Tracking Protection",
- "contentURL": "https://filters.adtidy.org/extension/ublock/filters/3.txt",
- "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters"
- },
"block-lan": {
"content": "filters",
"group": "privacy",
@@ -212,6 +246,10 @@
"https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/thirdparties/easyprivacy.txt",
"https://ublockorigin.pages.dev/thirdparties/easyprivacy.txt"
],
+ "patchURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/",
+ "https://ublockorigin.pages.dev/filters/"
+ ],
"supportURL": "https://easylist.to/"
},
"urlhaus-1": {
@@ -478,6 +516,10 @@
"https://cdn.jsdelivr.net/gh/uBlockOrigin/uAssetsCDN@main/filters/annoyances.min.txt",
"https://cdn.statically.io/gh/uBlockOrigin/uAssetsCDN/main/filters/annoyances.min.txt"
],
+ "patchURLs": [
+ "https://ublockorigin.github.io/uAssetsCDN/filters/",
+ "https://ublockorigin.pages.dev/filters/"
+ ],
"supportURL": "https://github.com/uBlockOrigin/uAssets"
},
"dpollock-0": {
@@ -520,7 +562,7 @@
"off": true,
"title": "🇪🇬eg 🇸🇦sa 🇲🇦ma 🇩🇿dz: Liste AR",
"tags": "ads arabic اَلْعَرَبِيَّةُ",
- "lang": "ar",
+ "lang": "ar kab",
"contentURL": "https://easylist-downloads.adblockplus.org/Liste_AR.txt",
"supportURL": "https://forums.lanik.us/viewforum.php?f=98"
},
@@ -593,7 +635,7 @@
"off": true,
"title": "🇫🇷fr 🇨🇦ca: AdGuard Français",
"tags": "ads french",
- "lang": "ar br ff fr lb oc son",
+ "lang": "ar br ff fr kab lb oc son",
"contentURL": "https://filters.adtidy.org/extension/ublock/filters/16.txt",
"supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters"
},
@@ -647,7 +689,7 @@
"off": true,
"title": "🇮🇳in 🇱🇰lk 🇳🇵np: IndianList",
"tags": "ads assamese bengali gujarati hindi kannada malayalam marathi nepali punjabi sinhala tamil telugu",
- "lang": "as bn gu hi kn ml mr ne pa si ta te",
+ "lang": "as bn gu hi kn ml mr ne pa sat si ta te",
"contentURL": "https://easylist-downloads.adblockplus.org/indianlist.txt",
"supportURL": "https://github.com/mediumkreation/IndianList"
},
@@ -694,7 +736,7 @@
"off": true,
"title": "🇮🇹it: EasyList Italy",
"tags": "ads italian",
- "lang": "it lij",
+ "lang": "fur it lij sc",
"contentURL": "https://easylist-downloads.adblockplus.org/easylistitaly.txt",
"supportURL": "https://forums.lanik.us/viewforum.php?f=96"
},
@@ -784,21 +826,20 @@
"off": true,
"title": "🇵🇱pl: Oficjalne Polskie Filtry do uBlocka Origin",
"tags": "ads polish polski",
- "lang": "szl pl",
+ "lang": "szl pl _",
"contentURL": "https://raw.githubusercontent.com/MajkiIT/polish-ads-filter/master/polish-adblock-filters/adblock.txt",
- "supportURL": "https://github.com/MajkiIT/polish-ads-filter/issues",
- "instructionURL": "https://github.com/MajkiIT/polish-ads-filter#polish-filters-for-adblock-ublock-origin--adguard"
+ "supportURL": "https://github.com/MajkiIT/polish-ads-filter"
},
- "POL-2": {
+ "POL-3": {
"content": "filters",
"group": "regions",
"parent": "🇵🇱pl: Oficjalne Polskie Filtry",
"off": true,
- "title": "🇵🇱pl: Oficjalne polskie filtry przeciwko alertom o Adblocku",
- "tags": "ads polish polski",
+ "title": "🇵🇱pl: CERT.PL's Warning List",
+ "tags": "malware polish polski",
"lang": "szl pl",
- "contentURL": "https://raw.githubusercontent.com/olegwukr/polish-privacy-filters/master/anti-adblock.txt",
- "supportURL": "https://github.com/olegwukr/polish-privacy-filters/issues"
+ "contentURL": "https://hole.cert.pl/domains/v2/domains_ublock.txt",
+ "supportURL": "https://cert.pl/lista-ostrzezen/"
},
"ROU-1": {
"content": "filters",
@@ -818,8 +859,8 @@
"parent": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList",
"off": true,
"title": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList",
- "tags": "ads belarusian беларуская kazakh tatar russian русский ukrainian українська uzbek",
- "lang": "be kk tt ru uk uz",
+ "tags": "ads belarusian беларуская kazakh tatar russian русский ukrainian українська uzbek uk",
+ "lang": "be kk tt ru uz",
"contentURL": "https://raw.githubusercontent.com/easylist/ruadlist/master/RuAdList-uBO.txt",
"cdnURLs": [
"https://cdn.jsdelivr.net/gh/dimisa-RUAdList/RUAdListCDN@main/lists/ruadlist.ubo.min.txt",
@@ -909,6 +950,16 @@
"contentURL": "https://filters.adtidy.org/extension/ublock/filters/13.txt",
"supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters"
},
+ "UKR-0": {
+ "content": "filters",
+ "group": "regions",
+ "off": true,
+ "title": "🇺🇦ua: AdGuard Ukrainian",
+ "tags": "ads ukraine україна",
+ "lang": "uk",
+ "contentURL": "https://filters.adtidy.org/extension/ublock/filters/23.txt",
+ "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters"
+ },
"VIE-1": {
"content": "filters",
"group": "regions",
diff -Nru ublock-origin-1.62.0+dfsg/debian/changelog ublock-origin-1.67.0+dfsg/debian/changelog
--- ublock-origin-1.62.0+dfsg/debian/changelog 2025-06-10 15:49:10.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/debian/changelog 2025-10-31 13:56:50.000000000 +0000
@@ -1,3 +1,16 @@
+ublock-origin (1.67.0+dfsg-1~deb13u1) trixie; urgency=medium
+
+ * Backport version 1.67.0 to trixie to improve user experience and add new
+ filter capabilities.
+
+ -- Markus Koschany Fri, 31 Oct 2025 14:56:50 +0100
+
+ublock-origin (1.67.0+dfsg-1) unstable; urgency=medium
+
+ * New upstream version 1.67.0+dfsg.
+
+ -- Markus Koschany Sat, 25 Oct 2025 21:37:39 +0200
+
ublock-origin (1.62.0+dfsg-2) unstable; urgency=medium
* Fix CVE-2025-4215:
diff -Nru ublock-origin-1.62.0+dfsg/debian/control ublock-origin-1.67.0+dfsg/debian/control
--- ublock-origin-1.62.0+dfsg/debian/control 2025-06-10 15:49:10.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/debian/control 2025-10-31 13:56:50.000000000 +0000
@@ -8,12 +8,12 @@
Build-Depends:
binaryen,
debhelper-compat (= 13),
- nodejs,
node-css-tree,
node-js-beautify,
+ nodejs,
python3,
wabt
-Standards-Version: 4.7.0
+Standards-Version: 4.7.2
Homepage: https://github.com/gorhill/uBlock
Vcs-Git: https://salsa.debian.org/webext-team/ublock-origin.git
Vcs-Browser: https://salsa.debian.org/webext-team/ublock-origin
diff -Nru ublock-origin-1.62.0+dfsg/debian/copyright ublock-origin-1.67.0+dfsg/debian/copyright
--- ublock-origin-1.62.0+dfsg/debian/copyright 2025-06-10 15:49:10.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/debian/copyright 2025-10-31 13:56:50.000000000 +0000
@@ -676,4 +676,3 @@
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-
diff -Nru ublock-origin-1.62.0+dfsg/debian/patches/CVE-2025-4215.patch ublock-origin-1.67.0+dfsg/debian/patches/CVE-2025-4215.patch
--- ublock-origin-1.62.0+dfsg/debian/patches/CVE-2025-4215.patch 2025-06-10 15:49:10.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/debian/patches/CVE-2025-4215.patch 1970-01-01 00:00:00.000000000 +0000
@@ -1,96 +0,0 @@
-From: Markus Koschany
-Date: Tue, 10 Jun 2025 17:20:18 +0200
-Subject: CVE-2025-4215
-
-Bug-Debian: https://bugs.debian.org/1104635
-Origin: https://github.com/gorhill/uBlock/commit/eaedaf5b10d2f7857c6b77fbf7d4a80681d4d46c
----
- src/js/1p-filters.js | 4 ++--
- src/js/arglist-parser.js | 4 ++--
- src/js/static-filtering-parser.js | 4 ++--
- src/js/whitelist.js | 6 +++---
- 4 files changed, 9 insertions(+), 9 deletions(-)
-
-diff --git a/src/js/1p-filters.js b/src/js/1p-filters.js
-index 70ce256..b6237a7 100644
---- a/src/js/1p-filters.js
-+++ b/src/js/1p-filters.js
-@@ -111,12 +111,12 @@ function currentStateChanged() {
- }
-
- function getEditorText() {
-- const text = cmEditor.getValue().replace(/\s+$/, '');
-+ const text = cmEditor.getValue().trimEnd();
- return text === '' ? text : `${text}\n`;
- }
-
- function setEditorText(text) {
-- cmEditor.setValue(text.replace(/\s+$/, '') + '\n\n');
-+ cmEditor.setValue(`${text.trimEnd()}\n\n`);
- }
-
- /******************************************************************************/
-diff --git a/src/js/arglist-parser.js b/src/js/arglist-parser.js
-index d8200df..708029e 100644
---- a/src/js/arglist-parser.js
-+++ b/src/js/arglist-parser.js
-@@ -32,7 +32,7 @@ export class ArglistParser {
- this.transform = false;
- this.failed = false;
- this.reWhitespaceStart = /^\s+/;
-- this.reWhitespaceEnd = /\s+$/;
-+ this.reWhitespaceEnd = /(?:^|\S)(\s+)$/;
- this.reOddTrailingEscape = /(?:^|[^\\])(?:\\\\)*\\$/;
- this.reTrailingEscapeChars = /\\+$/;
- }
-@@ -90,7 +90,7 @@ export class ArglistParser {
- }
- rightWhitespaceCount(s) {
- const match = this.reWhitespaceEnd.exec(s);
-- return match === null ? 0 : match[0].length;
-+ return match === null ? 0 : match[1].length;
- }
- indexOfNextArgSeparator(pattern, separatorCode) {
- this.argBeg = this.argEnd = separatorCode !== this.separatorCode
-diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js
-index d3b4ca48..678f625 100644
---- a/src/js/static-filtering-parser.js
-+++ b/src/js/static-filtering-parser.js
-@@ -762,7 +762,7 @@ export class AstFilterParser {
- this.selectorCompiler = new ExtSelectorCompiler(options);
- // Regexes
- this.reWhitespaceStart = /^\s+/;
-- this.reWhitespaceEnd = /\s+$/;
-+ this.reWhitespaceEnd = /(?:^|\S)(\s+)$/;
- this.reCommentLine = /^(?:!|#\s|####|\[adblock)/i;
- this.reExtAnchor = /(#@?(?:\$\?|\$|%|\?)?#).{1,2}/;
- this.reInlineComment = /(?:\s+#).*?$/;
-@@ -2737,7 +2737,7 @@ export class AstFilterParser {
-
- rightWhitespaceCount(s) {
- const match = this.reWhitespaceEnd.exec(s);
-- return match === null ? 0 : match[0].length;
-+ return match === null ? 0 : match[1].length;
- }
-
- nextCommaInCommaSeparatedListString(s, start) {
-diff --git a/src/js/whitelist.js b/src/js/whitelist.js
-index b8f0eaa..a946f35 100644
---- a/src/js/whitelist.js
-+++ b/src/js/whitelist.js
-@@ -101,12 +101,12 @@ uBlockDashboard.patchCodeMirrorEditor(cmEditor);
- /******************************************************************************/
-
- function getEditorText() {
-- let text = cmEditor.getValue().replace(/\s+$/, '');
-- return text === '' ? text : text + '\n';
-+ const text = cmEditor.getValue().trimEnd();
-+ return text === '' ? text : `${text}\n`;
- }
-
- function setEditorText(text) {
-- cmEditor.setValue(text.replace(/\s+$/, '') + '\n');
-+ cmEditor.setValue(`${text.trimEnd()}\n`);
- }
-
- /******************************************************************************/
diff -Nru ublock-origin-1.62.0+dfsg/debian/patches/series ublock-origin-1.67.0+dfsg/debian/patches/series
--- ublock-origin-1.62.0+dfsg/debian/patches/series 2025-06-10 15:49:10.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/debian/patches/series 2025-10-31 13:56:50.000000000 +0000
@@ -1,3 +1,2 @@
disable-nonfree-filters-by-default.patch
make-assets.patch
-CVE-2025-4215.patch
diff -Nru ublock-origin-1.62.0+dfsg/debian/webext-ublock-origin-chromium.lintian-overrides ublock-origin-1.67.0+dfsg/debian/webext-ublock-origin-chromium.lintian-overrides
--- ublock-origin-1.62.0+dfsg/debian/webext-ublock-origin-chromium.lintian-overrides 2025-06-10 15:49:10.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/debian/webext-ublock-origin-chromium.lintian-overrides 2025-10-31 13:56:50.000000000 +0000
@@ -1,2 +1,3 @@
# This is a false-positive.
privacy-breach-google-adsense
+
diff -Nru ublock-origin-1.62.0+dfsg/dist/chromium/publish-beta.py ublock-origin-1.67.0+dfsg/dist/chromium/publish-beta.py
--- ublock-origin-1.62.0+dfsg/dist/chromium/publish-beta.py 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/dist/chromium/publish-beta.py 1970-01-01 00:00:00.000000000 +0000
@@ -1,190 +0,0 @@
-#!/usr/bin/env python3
-
-import datetime
-import json
-import os
-import re
-import requests
-import shutil
-import subprocess
-import sys
-import tempfile
-import time
-import zipfile
-
-from string import Template
-
-# - Download target (raw) uBlock0.chromium.zip from GitHub
-# - This is referred to as "raw" package
-# - This will fail if not a dev build
-# - Upload uBlock0.chromium.zip to Chrome store
-# - Publish uBlock0.chromium.zip to Chrome store
-
-# Find path to project root
-projdir = os.path.split(os.path.abspath(__file__))[0]
-while not os.path.isdir(os.path.join(projdir, '.git')):
- projdir = os.path.normpath(os.path.join(projdir, '..'))
-
-# We need a version string to work with
-if len(sys.argv) >= 2 and sys.argv[1]:
- version = sys.argv[1]
-else:
- version = input('Github release version: ')
-version.strip()
-if not re.search('^\d+\.\d+\.\d+(b|rc)\d+$', version):
- print('Error: Invalid version string.')
- exit(1)
-
-cs_extension_id = 'cgbcahbpdhpcegmbfconppldiemgcoii'
-tmpdir = tempfile.TemporaryDirectory()
-raw_zip_filename = 'uBlock0_' + version + '.chromium.zip'
-raw_zip_filepath = os.path.join(tmpdir.name, raw_zip_filename)
-github_owner = 'gorhill'
-github_repo = 'uBlock'
-
-# Load/save auth secrets
-# The tmp directory is excluded from git
-ubo_secrets = dict()
-ubo_secrets_filename = os.path.join(projdir, 'tmp', 'ubo_secrets')
-if os.path.isfile(ubo_secrets_filename):
- with open(ubo_secrets_filename) as f:
- ubo_secrets = json.load(f)
-
-def input_secret(prompt, token):
- if token in ubo_secrets:
- prompt += ' ✔'
- prompt += ': '
- value = input(prompt).strip()
- if len(value) == 0:
- if token not in ubo_secrets:
- print('Token error:', token)
- exit(1)
- value = ubo_secrets[token]
- elif token not in ubo_secrets or value != ubo_secrets[token]:
- ubo_secrets[token] = value
- exists = os.path.isfile(ubo_secrets_filename)
- with open(ubo_secrets_filename, 'w') as f:
- json.dump(ubo_secrets, f, indent=2)
- if not exists:
- os.chmod(ubo_secrets_filename, 0o600)
- return value
-
-
-# GitHub API token
-github_token = input_secret('Github token', 'github_token')
-github_auth = 'token ' + github_token
-
-#
-# Get metadata from GitHub about the release
-#
-
-# https://developer.github.com/v3/repos/releases/#get-a-single-release
-print('Downloading release info from GitHub...')
-release_info_url = 'https://api.github.com/repos/{0}/{1}/releases/tags/{2}'.format(github_owner, github_repo, version)
-headers = { 'Authorization': github_auth, }
-response = requests.get(release_info_url, headers=headers)
-if response.status_code != 200:
- print('Error: Release not found: {0}'.format(response.status_code))
- exit(1)
-release_info = response.json()
-
-#
-# Extract URL to raw package from metadata
-#
-
-# Find url for uBlock0.chromium.zip
-raw_zip_url = ''
-for asset in release_info['assets']:
- if asset['name'] == raw_zip_filename:
- raw_zip_url = asset['url']
-if len(raw_zip_url) == 0:
- print('Error: Release asset URL not found')
- exit(1)
-
-#
-# Download raw package from GitHub
-#
-
-# https://developer.github.com/v3/repos/releases/#get-a-single-release-asset
-print('Downloading raw zip package from GitHub...')
-headers = {
- 'Authorization': github_auth,
- 'Accept': 'application/octet-stream',
-}
-response = requests.get(raw_zip_url, headers=headers)
-# Redirections are transparently handled:
-# http://docs.python-requests.org/en/master/user/quickstart/#redirection-and-history
-if response.status_code != 200:
- print('Error: Downloading raw package failed -- server error {0}'.format(response.status_code))
- exit(1)
-with open(raw_zip_filepath, 'wb') as f:
- f.write(response.content)
-print('Downloaded raw package saved as {0}'.format(raw_zip_filepath))
-
-#
-# Upload to Chrome store
-#
-
-# Auth tokens
-cs_id = input_secret('Chrome store id', 'cs_id')
-cs_secret = input_secret('Chrome store secret', 'cs_secret')
-cs_refresh = input_secret('Chrome store refresh token', 'cs_refresh')
-
-print('Uploading to Chrome store...')
-with open(raw_zip_filepath, 'rb') as f:
- print('Generating access token...')
- auth_url = 'https://accounts.google.com/o/oauth2/token'
- auth_payload = {
- 'client_id': cs_id,
- 'client_secret': cs_secret,
- 'grant_type': 'refresh_token',
- 'refresh_token': cs_refresh,
- }
- auth_response = requests.post(auth_url, data=auth_payload)
- if auth_response.status_code != 200:
- print('Error: Auth failed -- server error {0}'.format(auth_response.status_code))
- print(auth_response.text)
- exit(1)
- response_dict = auth_response.json()
- if 'access_token' not in response_dict:
- print('Error: Auth failed -- no access token')
- exit(1)
- # Prepare access token
- cs_auth = 'Bearer ' + response_dict['access_token']
- headers = {
- 'Authorization': cs_auth,
- 'x-goog-api-version': '2',
- }
- # Upload
- print('Uploading package...')
- upload_url = 'https://www.googleapis.com/upload/chromewebstore/v1.1/items/{0}'.format(cs_extension_id)
- upload_response = requests.put(upload_url, headers=headers, data=f)
- f.close()
- if upload_response.status_code != 200:
- print('Upload failed -- server error {0}'.format(upload_response.status_code))
- print(upload_response.text)
- exit(1)
- response_dict = upload_response.json();
- if 'uploadState' not in response_dict or response_dict['uploadState'] != 'SUCCESS':
- print('Upload failed -- server error {0}'.format(response_dict['uploadState']))
- exit(1)
- print('Upload succeeded.')
- # Publish
- print('Publishing package...')
- publish_url = 'https://www.googleapis.com/chromewebstore/v1.1/items/{0}/publish'.format(cs_extension_id)
- headers = {
- 'Authorization': cs_auth,
- 'x-goog-api-version': '2',
- 'Content-Length': '0',
- }
- publish_response = requests.post(publish_url, headers=headers)
- if publish_response.status_code != 200:
- print('Error: Chrome store publishing failed -- server error {0}'.format(publish_response.status_code))
- exit(1)
- response_dict = publish_response.json();
- if 'status' not in response_dict or response_dict['status'][0] != 'OK':
- print('Publishing failed -- server error {0}'.format(response_dict['status']))
- exit(1)
- print('Publishing succeeded.')
-
-print('All done.')
diff -Nru ublock-origin-1.62.0+dfsg/dist/chromium/publish-stable.py ublock-origin-1.67.0+dfsg/dist/chromium/publish-stable.py
--- ublock-origin-1.62.0+dfsg/dist/chromium/publish-stable.py 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/dist/chromium/publish-stable.py 1970-01-01 00:00:00.000000000 +0000
@@ -1,190 +0,0 @@
-#!/usr/bin/env python3
-
-import datetime
-import json
-import os
-import re
-import requests
-import shutil
-import subprocess
-import sys
-import tempfile
-import time
-import zipfile
-
-from string import Template
-
-# - Download target (raw) uBlock0.chromium.zip from GitHub
-# - This is referred to as "raw" package
-# - This will fail if not a dev build
-# - Upload uBlock0.chromium.zip to Chrome store
-# - Publish uBlock0.chromium.zip to Chrome store
-
-# Find path to project root
-projdir = os.path.split(os.path.abspath(__file__))[0]
-while not os.path.isdir(os.path.join(projdir, '.git')):
- projdir = os.path.normpath(os.path.join(projdir, '..'))
-
-# We need a version string to work with
-if len(sys.argv) >= 2 and sys.argv[1]:
- version = sys.argv[1]
-else:
- version = input('Github release version: ')
-version.strip()
-if not re.search('^\d+\.\d+\.\d+$', version):
- print('Error: Invalid version string.')
- exit(1)
-
-cs_extension_id = 'cjpalhdlnbpafiamejdnhcphjbkeiagm'
-tmpdir = tempfile.TemporaryDirectory()
-raw_zip_filename = 'uBlock0_' + version + '.chromium.zip'
-raw_zip_filepath = os.path.join(tmpdir.name, raw_zip_filename)
-github_owner = 'gorhill'
-github_repo = 'uBlock'
-
-# Load/save auth secrets
-# The tmp directory is excluded from git
-ubo_secrets = dict()
-ubo_secrets_filename = os.path.join(projdir, 'tmp', 'ubo_secrets')
-if os.path.isfile(ubo_secrets_filename):
- with open(ubo_secrets_filename) as f:
- ubo_secrets = json.load(f)
-
-def input_secret(prompt, token):
- if token in ubo_secrets:
- prompt += ' ✔'
- prompt += ': '
- value = input(prompt).strip()
- if len(value) == 0:
- if token not in ubo_secrets:
- print('Token error:', token)
- exit(1)
- value = ubo_secrets[token]
- elif token not in ubo_secrets or value != ubo_secrets[token]:
- ubo_secrets[token] = value
- exists = os.path.isfile(ubo_secrets_filename)
- with open(ubo_secrets_filename, 'w') as f:
- json.dump(ubo_secrets, f, indent=2)
- if not exists:
- os.chmod(ubo_secrets_filename, 0o600)
- return value
-
-
-# GitHub API token
-github_token = input_secret('Github token', 'github_token')
-github_auth = 'token ' + github_token
-
-#
-# Get metadata from GitHub about the release
-#
-
-# https://developer.github.com/v3/repos/releases/#get-a-single-release
-print('Downloading release info from GitHub...')
-release_info_url = 'https://api.github.com/repos/{0}/{1}/releases/tags/{2}'.format(github_owner, github_repo, version)
-headers = { 'Authorization': github_auth, }
-response = requests.get(release_info_url, headers=headers)
-if response.status_code != 200:
- print('Error: Release not found: {0}'.format(response.status_code))
- exit(1)
-release_info = response.json()
-
-#
-# Extract URL to raw package from metadata
-#
-
-# Find url for uBlock0.chromium.zip
-raw_zip_url = ''
-for asset in release_info['assets']:
- if asset['name'] == raw_zip_filename:
- raw_zip_url = asset['url']
-if len(raw_zip_url) == 0:
- print('Error: Release asset URL not found')
- exit(1)
-
-#
-# Download raw package from GitHub
-#
-
-# https://developer.github.com/v3/repos/releases/#get-a-single-release-asset
-print('Downloading raw zip package from GitHub...')
-headers = {
- 'Authorization': github_auth,
- 'Accept': 'application/octet-stream',
-}
-response = requests.get(raw_zip_url, headers=headers)
-# Redirections are transparently handled:
-# http://docs.python-requests.org/en/master/user/quickstart/#redirection-and-history
-if response.status_code != 200:
- print('Error: Downloading raw package failed -- server error {0}'.format(response.status_code))
- exit(1)
-with open(raw_zip_filepath, 'wb') as f:
- f.write(response.content)
-print('Downloaded raw package saved as {0}'.format(raw_zip_filepath))
-
-#
-# Upload to Chrome store
-#
-
-# Auth tokens
-cs_id = input_secret('Chrome store id', 'cs_id')
-cs_secret = input_secret('Chrome store secret', 'cs_secret')
-cs_refresh = input_secret('Chrome store refresh token', 'cs_refresh')
-
-print('Uploading to Chrome store...')
-with open(raw_zip_filepath, 'rb') as f:
- print('Generating access token...')
- auth_url = 'https://accounts.google.com/o/oauth2/token'
- auth_payload = {
- 'client_id': cs_id,
- 'client_secret': cs_secret,
- 'grant_type': 'refresh_token',
- 'refresh_token': cs_refresh,
- }
- auth_response = requests.post(auth_url, data=auth_payload)
- if auth_response.status_code != 200:
- print('Error: Auth failed -- server error {0}'.format(auth_response.status_code))
- print(auth_response.text)
- exit(1)
- response_dict = auth_response.json()
- if 'access_token' not in response_dict:
- print('Error: Auth failed -- no access token')
- exit(1)
- # Prepare access token
- cs_auth = 'Bearer ' + response_dict['access_token']
- headers = {
- 'Authorization': cs_auth,
- 'x-goog-api-version': '2',
- }
- # Upload
- print('Uploading package...')
- upload_url = 'https://www.googleapis.com/upload/chromewebstore/v1.1/items/{0}'.format(cs_extension_id)
- upload_response = requests.put(upload_url, headers=headers, data=f)
- f.close()
- if upload_response.status_code != 200:
- print('Upload failed -- server error {0}'.format(upload_response.status_code))
- print(upload_response.text)
- exit(1)
- response_dict = upload_response.json();
- if 'uploadState' not in response_dict or response_dict['uploadState'] != 'SUCCESS':
- print('Upload failed -- server error {0}'.format(response_dict['uploadState']))
- exit(1)
- print('Upload succeeded.')
- # Publish
- print('Publishing package...')
- publish_url = 'https://www.googleapis.com/chromewebstore/v1.1/items/{0}/publish'.format(cs_extension_id)
- headers = {
- 'Authorization': cs_auth,
- 'x-goog-api-version': '2',
- 'Content-Length': '0',
- }
- publish_response = requests.post(publish_url, headers=headers)
- if publish_response.status_code != 200:
- print('Error: Chrome store publishing failed -- server error {0}'.format(publish_response.status_code))
- exit(1)
- response_dict = publish_response.json();
- if 'status' not in response_dict or response_dict['status'][0] != 'OK':
- print('Publishing failed -- server error {0}'.format(response_dict['status']))
- exit(1)
- print('Publishing succeeded.')
-
-print('All done.')
diff -Nru ublock-origin-1.62.0+dfsg/dist/firefox/publish-signed-beta.py ublock-origin-1.67.0+dfsg/dist/firefox/publish-signed-beta.py
--- ublock-origin-1.62.0+dfsg/dist/firefox/publish-signed-beta.py 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/dist/firefox/publish-signed-beta.py 1970-01-01 00:00:00.000000000 +0000
@@ -1,331 +0,0 @@
-#!/usr/bin/env python3
-
-import datetime
-import json
-import jwt
-import os
-import re
-import requests
-import shutil
-import subprocess
-import sys
-import tempfile
-import time
-import zipfile
-
-from string import Template
-
-# - Download target (raw) uBlock0.firefox.xpi from GitHub
-# - This is referred to as "raw" package
-# - This will fail if not a dev build
-# - Modify raw package to make it self-hosted
-# - This is referred to as "unsigned" package
-# - Ask AMO to sign uBlock0.firefox.xpi
-# - Generate JWT to be used for communication with server
-# - Upload unsigned package to AMO
-# - Wait for a valid download URL for signed package
-# - Download signed package as uBlock0.firefox.signed.xpi
-# - This is referred to as "signed" package
-# - Upload uBlock0.firefox.signed.xpi to GitHub
-# - Remove uBlock0.firefox.xpi from GitHub
-# - Modify updates.json to point to new version
-# - Commit changes to repo
-
-# Find path to project root
-projdir = os.path.split(os.path.abspath(__file__))[0]
-while not os.path.isdir(os.path.join(projdir, '.git')):
- projdir = os.path.normpath(os.path.join(projdir, '..'))
-# Check that found project root is valid
-version_filepath = os.path.join(projdir, 'dist', 'version')
-if not os.path.isfile(version_filepath):
- print('Version file not found.')
- exit(1)
-
-# We need a version string to work with
-if len(sys.argv) >= 2 and sys.argv[1]:
- tag_version = sys.argv[1]
-else:
- tag_version = input('Github release version: ')
-tag_version.strip()
-match = re.search('^(\d+\.\d+\.\d+)(?:(b|rc)(\d+))?$', tag_version)
-if not match:
- print('Error: Invalid version string.')
- exit(1)
-ext_version = match.group(1);
-if match.group(2):
- revision = int(match.group(3))
- if match.group(2) == 'rc':
- revision += 100;
- ext_version += '.' + str(revision)
-
-extension_id = 'uBlock0@raymondhill.net'
-tmpdir = tempfile.TemporaryDirectory()
-raw_xpi_filename = 'uBlock0_' + tag_version + '.firefox.xpi'
-raw_xpi_filepath = os.path.join(tmpdir.name, raw_xpi_filename)
-unsigned_xpi_filepath = os.path.join(tmpdir.name, 'uBlock0.firefox.unsigned.xpi')
-signed_xpi_filename = 'uBlock0_' + tag_version + '.firefox.signed.xpi'
-signed_xpi_filepath = os.path.join(tmpdir.name, signed_xpi_filename)
-github_owner = 'gorhill'
-github_repo = 'uBlock'
-
-# Load/save auth secrets
-# The tmp directory is excluded from git
-ubo_secrets = dict()
-ubo_secrets_filename = os.path.join(projdir, 'tmp', 'ubo_secrets')
-if os.path.isfile(ubo_secrets_filename):
- with open(ubo_secrets_filename) as f:
- ubo_secrets = json.load(f)
-
-def input_secret(prompt, token):
- if token in ubo_secrets:
- prompt += ' ✔'
- prompt += ': '
- value = input(prompt).strip()
- if len(value) == 0:
- if token not in ubo_secrets:
- print('Token error:', token)
- exit(1)
- value = ubo_secrets[token]
- elif token not in ubo_secrets or value != ubo_secrets[token]:
- ubo_secrets[token] = value
- exists = os.path.isfile(ubo_secrets_filename)
- with open(ubo_secrets_filename, 'w') as f:
- json.dump(ubo_secrets, f, indent=2)
- if not exists:
- os.chmod(ubo_secrets_filename, 0o600)
- return value
-
-# GitHub API token
-github_token = input_secret('Github token', 'github_token')
-github_auth = 'token ' + github_token
-
-#
-# Get metadata from GitHub about the release
-#
-
-# https://developer.github.com/v3/repos/releases/#get-a-single-release
-print('Downloading release info from GitHub...')
-release_info_url = 'https://api.github.com/repos/{0}/{1}/releases/tags/{2}'.format(github_owner, github_repo, tag_version)
-headers = { 'Authorization': github_auth, }
-response = requests.get(release_info_url, headers=headers)
-if response.status_code != 200:
- print('Error: Release not found: {0}'.format(response.status_code))
- exit(1)
-release_info = response.json()
-
-#
-# Extract URL to raw package from metadata
-#
-
-# Find url for uBlock0.firefox.xpi
-raw_xpi_url = ''
-for asset in release_info['assets']:
- if asset['name'] == signed_xpi_filename:
- print('Error: Found existing signed self-hosted package.')
- exit(1)
- if asset['name'] == raw_xpi_filename:
- raw_xpi_url = asset['url']
-if len(raw_xpi_url) == 0:
- print('Error: Release asset URL not found')
- exit(1)
-
-#
-# Download raw package from GitHub
-#
-
-# https://developer.github.com/v3/repos/releases/#get-a-single-release-asset
-print('Downloading raw xpi package from GitHub...')
-headers = {
- 'Authorization': github_auth,
- 'Accept': 'application/octet-stream',
-}
-response = requests.get(raw_xpi_url, headers=headers)
-# Redirections are transparently handled:
-# http://docs.python-requests.org/en/master/user/quickstart/#redirection-and-history
-if response.status_code != 200:
- print('Error: Downloading raw package failed -- server error {0}'.format(response.status_code))
- exit(1)
-with open(raw_xpi_filepath, 'wb') as f:
- f.write(response.content)
-print('Downloaded raw package saved as {0}'.format(raw_xpi_filepath))
-
-#
-# Convert the package to a self-hosted one: add `update_url` to the manifest
-#
-min_browser_version = '68';
-
-print('Converting raw xpi package into self-hosted xpi package...')
-with zipfile.ZipFile(raw_xpi_filepath, 'r') as zipin:
- with zipfile.ZipFile(unsigned_xpi_filepath, 'w') as zipout:
- for item in zipin.infolist():
- data = zipin.read(item.filename)
- if item.filename == 'manifest.json':
- manifest = json.loads(bytes.decode(data))
- min_browser_version = manifest['browser_specific_settings']['gecko']['strict_min_version']
- manifest['browser_specific_settings']['gecko']['update_url'] = 'https://raw.githubusercontent.com/{0}/{1}/master/dist/firefox/updates.json'.format(github_owner, github_repo)
- data = json.dumps(manifest, indent=2, separators=(',', ': '), sort_keys=True).encode()
- zipout.writestr(item, data)
-
-#
-# Ask AMO to sign the self-hosted package
-# - https://developer.mozilla.org/en-US/Add-ons/Distribution#Distributing_your_add-on
-# - https://pyjwt.readthedocs.io/en/latest/usage.html
-# - https://addons-server.readthedocs.io/en/latest/topics/api/auth.html
-# - https://addons-server.readthedocs.io/en/latest/topics/api/signing.html
-#
-
-amo_api_key = ''
-amo_secret = ''
-
-def get_jwt_auth():
- global amo_api_key
- if amo_api_key == '':
- amo_api_key = input_secret('AMO API key', 'amo_api_key')
- global amo_secret
- if amo_secret == '':
- amo_secret = input_secret('AMO API secret', 'amo_secret')
- amo_nonce = os.urandom(8).hex()
- jwt_payload = {
- 'iss': amo_api_key,
- 'jti': amo_nonce,
- 'iat': datetime.datetime.utcnow(),
- 'exp': datetime.datetime.utcnow() + datetime.timedelta(seconds=15),
- }
- return 'JWT ' + jwt.encode(jwt_payload, amo_secret)
-
-print('Ask AMO to sign self-hosted xpi package...')
-with open(unsigned_xpi_filepath, 'rb') as f:
- # https://blog.mozilla.org/addons/2019/11/11/security-improvements-in-amo-upload-tools/
- # "We recommend allowing up to 15 minutes."
- interval = 60 # check every 60 seconds
- countdown = 60 * 60 / interval # for at most 60 minutes
- headers = { 'Authorization': get_jwt_auth(), }
- data = { 'channel': 'unlisted' }
- files = { 'upload': f, }
- signing_url = 'https://addons.mozilla.org/api/v4/addons/{0}/versions/{1}/'.format(extension_id, ext_version)
- print('Submitting package to be signed...')
- response = requests.put(signing_url, headers=headers, data=data, files=files)
- if response.status_code != 202:
- print('Error: Creating new version failed -- server error {0}'.format(response.status_code))
- print(response.text)
- exit(1)
- print('Request for signing self-hosted xpi package succeeded.')
- signing_request_response = response.json();
- f.close()
- print('Waiting for AMO to process the request to sign the self-hosted xpi package...')
- # Wait for signed package to be ready
- signing_check_url = signing_request_response['url']
- while True:
- time.sleep(interval)
- sys.stdout.write('.')
- sys.stdout.flush()
- countdown -= 1
- if countdown <= 0:
- print('Error: AMO signing timed out')
- exit(1)
- headers = { 'Authorization': get_jwt_auth(), }
- response = requests.get(signing_check_url, headers=headers)
- if response.status_code != 200:
- print('Error: AMO signing failed -- server error {0}'.format(response.status_code))
- print(response.text)
- exit(1)
- signing_check_response = response.json()
- if not signing_check_response['processed']:
- continue
- if not signing_check_response['valid']:
- print('Error: AMO validation failed')
- print(response.text)
- exit(1)
- if not signing_check_response['files'] or len(signing_check_response['files']) == 0:
- continue
- if not signing_check_response['files'][0]['signed']:
- continue
- if not signing_check_response['files'][0]['download_url']:
- print('Error: AMO signing failed')
- print(response.text)
- exit(1)
- print('\r')
- print('Self-hosted xpi package successfully signed.')
- download_url = signing_check_response['files'][0]['download_url']
- print('Downloading signed self-hosted xpi package from {0}...'.format(download_url))
- response = requests.get(download_url, headers=headers)
- if response.status_code != 200:
- print('Error: Download signed package failed -- server error {0}'.format(response.status_code))
- print(response.text)
- exit(1)
- with open(signed_xpi_filepath, 'wb') as f:
- f.write(response.content)
- f.close()
- print('Signed self-hosted xpi package downloaded.')
- break
-
-#
-# Upload signed package to GitHub
-#
-
-# https://developer.github.com/v3/repos/releases/#upload-a-release-asset
-print('Uploading signed self-hosted xpi package to GitHub...')
-with open(signed_xpi_filepath, 'rb') as f:
- url = release_info['upload_url'].replace('{?name,label}', '?name=' + signed_xpi_filename)
- headers = {
- 'Authorization': github_auth,
- 'Content-Type': 'application/zip',
- }
- response = requests.post(url, headers=headers, data=f.read())
- if response.status_code != 201:
- print('Error: Upload signed package failed -- server error: {0}'.format(response.status_code))
- exit(1)
-
-#
-# Remove raw package from GitHub
-#
-
-# https://developer.github.com/v3/repos/releases/#delete-a-release-asset
-print('Remove raw xpi package from GitHub...')
-headers = { 'Authorization': github_auth, }
-response = requests.delete(raw_xpi_url, headers=headers)
-if response.status_code != 204:
- print('Error: Deletion of raw package failed -- server error: {0}'.format(response.status_code))
-
-#
-# Update updates.json to point to new package -- but only if just-signed
-# package is higher version than current one.
-#
-
-# Be sure we are in sync with potentially modified files on remote
-r = subprocess.run(['git', 'pull', 'origin', 'master'], stdout=subprocess.PIPE)
-rout = bytes.decode(r.stdout).strip()
-
-def int_from_version(version):
- parts = version.split('.')
- if len(parts) == 3:
- parts.append('0')
- return int(parts[0])*10e9 + int(parts[1])*10e6 + int(parts[2])*10e3 + int(parts[3])
-
-print('Update GitHub to point to newly signed self-hosted xpi package...')
-updates_json_filepath = os.path.join(projdir, 'dist', 'firefox', 'updates.json')
-with open(updates_json_filepath) as f:
- updates_json = json.load(f)
- f.close()
- previous_version = updates_json['addons'][extension_id]['updates'][0]['version']
- if int_from_version(ext_version) > int_from_version(previous_version):
- with open(os.path.join(projdir, 'dist', 'firefox', 'updates.template.json')) as f:
- template_json = Template(f.read())
- f.close()
- updates_json = template_json.substitute(ext_version=ext_version, tag_version=tag_version, min_browser_version=min_browser_version)
- with open(updates_json_filepath, 'w') as f:
- f.write(updates_json)
- f.close()
- # - Stage the changed file
- r = subprocess.run(['git', 'status', '-s', updates_json_filepath], stdout=subprocess.PIPE)
- rout = bytes.decode(r.stdout).strip()
- if len(rout) >= 2 and rout[1] == 'M':
- subprocess.run(['git', 'add', updates_json_filepath])
- # - Commit the staged file
- r = subprocess.run(['git', 'status', '-s', updates_json_filepath], stdout=subprocess.PIPE)
- rout = bytes.decode(r.stdout).strip()
- if len(rout) >= 2 and rout[0] == 'M':
- subprocess.run(['git', 'commit', '-m', 'Make Firefox dev build auto-update', updates_json_filepath])
- subprocess.run(['git', 'push', 'origin', 'HEAD'])
-
-print('All done.')
diff -Nru ublock-origin-1.62.0+dfsg/dist/firefox/updates.json ublock-origin-1.67.0+dfsg/dist/firefox/updates.json
--- ublock-origin-1.62.0+dfsg/dist/firefox/updates.json 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/dist/firefox/updates.json 2025-10-25 19:32:51.000000000 +0000
@@ -1,13 +1,17 @@
{
- "addons": {
- "uBlock0@raymondhill.net": {
- "updates": [
- {
- "version": "1.61.3.103",
- "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } },
- "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3rc3/uBlock0_1.61.3rc3.firefox.signed.xpi"
+ "addons": {
+ "uBlock0@raymondhill.net": {
+ "updates": [
+ {
+ "version": "1.66.5.2",
+ "browser_specific_settings": {
+ "gecko": {
+ "strict_min_version": "92.0"
+ }
+ },
+ "update_link": "https://github.com/gorhill/uBlock/releases/download/1.66.5b2/uBlock0_1.66.5b2.firefox.signed.xpi"
+ }
+ ]
}
- ]
}
- }
-}
+}
\ No newline at end of file
diff -Nru ublock-origin-1.62.0+dfsg/dist/firefox/updates.template.json ublock-origin-1.67.0+dfsg/dist/firefox/updates.template.json
--- ublock-origin-1.62.0+dfsg/dist/firefox/updates.template.json 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/dist/firefox/updates.template.json 1970-01-01 00:00:00.000000000 +0000
@@ -1,13 +0,0 @@
-{
- "addons": {
- "uBlock0@raymondhill.net": {
- "updates": [
- {
- "version": "$ext_version",
- "browser_specific_settings": { "gecko": { "strict_min_version": "$min_browser_version" } },
- "update_link": "https://github.com/gorhill/uBlock/releases/download/$tag_version/uBlock0_$tag_version.firefox.signed.xpi"
- }
- ]
- }
- }
-}
diff -Nru ublock-origin-1.62.0+dfsg/dist/mv3/chromium/publish-beta.py ublock-origin-1.67.0+dfsg/dist/mv3/chromium/publish-beta.py
--- ublock-origin-1.62.0+dfsg/dist/mv3/chromium/publish-beta.py 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/dist/mv3/chromium/publish-beta.py 1970-01-01 00:00:00.000000000 +0000
@@ -1,195 +0,0 @@
-#!/usr/bin/env python3
-
-import datetime
-import json
-import os
-import re
-import requests
-import shutil
-import subprocess
-import sys
-import tempfile
-import time
-import zipfile
-
-from string import Template
-
-# - Download target (raw) uBOLite_*.chromium.mv3.zip from GitHub
-# - This is referred to as "raw" package
-# - This will fail if not a dev build
-# - Upload uBOLite_*.chromium.mv3.zip to Chrome store
-# - Publish uBOLite_*.chromium.mv3.zip to Chrome store
-
-# Find path to project root
-projdir = os.path.split(os.path.abspath(__file__))[0]
-while not os.path.isdir(os.path.join(projdir, '.git')):
- projdir = os.path.normpath(os.path.join(projdir, '..'))
-
-# We need a version string to work with
-if len(sys.argv) >= 2 and sys.argv[1]:
- version = sys.argv[1]
-else:
- version = input('Github release version: ')
-version.strip()
-if not re.search('^uBOLite_\d+\.\d+\.\d+\.\d+$', version):
- print('Error: Invalid version string.')
- exit(1)
-
-cs_extension_id = 'ddkjiahejlhfcafbddmgiahcphecmpfh'
-tmpdir = tempfile.TemporaryDirectory()
-raw_zip_filename = ''
-raw_zip_filepath = ''
-github_owner = 'gorhill'
-github_repo = 'uBlock'
-
-# Load/save auth secrets
-# The build directory is excluded from git
-ubo_secrets = dict()
-ubo_secrets_filename = os.path.join(projdir, 'dist', 'build', 'ubo_secrets')
-if os.path.isfile(ubo_secrets_filename):
- with open(ubo_secrets_filename) as f:
- ubo_secrets = json.load(f)
-
-def input_secret(prompt, token):
- if token in ubo_secrets:
- prompt += ' ✔'
- prompt += ': '
- value = input(prompt).strip()
- if len(value) == 0:
- if token not in ubo_secrets:
- print('Token error:', token)
- exit(1)
- value = ubo_secrets[token]
- elif token not in ubo_secrets or value != ubo_secrets[token]:
- ubo_secrets[token] = value
- exists = os.path.isfile(ubo_secrets_filename)
- with open(ubo_secrets_filename, 'w') as f:
- json.dump(ubo_secrets, f, indent=2)
- if not exists:
- os.chmod(ubo_secrets_filename, 0o600)
- return value
-
-
-# GitHub API token
-github_token = input_secret('Github token', 'github_token')
-github_auth = 'token ' + github_token
-
-#
-# Get metadata from GitHub about the release
-#
-
-# https://developer.github.com/v3/repos/releases/#get-a-single-release
-print('Downloading release info from GitHub...')
-release_info_url = 'https://api.github.com/repos/{0}/{1}/releases/tags/{2}'.format(github_owner, github_repo, version)
-headers = { 'Authorization': github_auth, }
-response = requests.get(release_info_url, headers=headers)
-if response.status_code != 200:
- print('Error: Release not found: {0}'.format(response.status_code))
- exit(1)
-release_info = response.json()
-
-#
-# Extract URL to raw package from metadata
-#
-
-# Find url for uBOLite_*.chromium.mv3.zip
-raw_zip_url = ''
-for asset in release_info['assets']:
- if re.search('uBOLite_\d+.\d+.\d+.\d+.chromium.mv3.zip', asset['name']):
- raw_zip_url = asset['url']
- raw_zip_filename = asset['name']
- raw_zip_filepath = os.path.join(tmpdir.name, raw_zip_filename)
-if len(raw_zip_url) == 0:
- print('Error: Release asset URL not found')
- exit(1)
-if len(raw_zip_filepath) == 0:
- print('Error: Invalid release asset file not set')
- exit(1)
-
-#
-# Download raw package from GitHub
-#
-
-# https://developer.github.com/v3/repos/releases/#get-a-single-release-asset
-print('Downloading raw zip package from GitHub...')
-headers = {
- 'Authorization': github_auth,
- 'Accept': 'application/octet-stream',
-}
-response = requests.get(raw_zip_url, headers=headers)
-# Redirections are transparently handled:
-# http://docs.python-requests.org/en/master/user/quickstart/#redirection-and-history
-if response.status_code != 200:
- print('Error: Downloading raw package failed -- server error {0}'.format(response.status_code))
- exit(1)
-with open(raw_zip_filepath, 'wb') as f:
- f.write(response.content)
-print('Downloaded raw package saved as {0}'.format(raw_zip_filepath))
-
-#
-# Upload to Chrome store
-#
-
-# Auth tokens
-cs_id = input_secret('Chrome store id', 'cs_id')
-cs_secret = input_secret('Chrome store secret', 'cs_secret')
-cs_refresh = input_secret('Chrome store refresh token', 'cs_refresh')
-
-print('Uploading to Chrome store...')
-with open(raw_zip_filepath, 'rb') as f:
- print('Generating access token...')
- auth_url = 'https://accounts.google.com/o/oauth2/token'
- auth_payload = {
- 'client_id': cs_id,
- 'client_secret': cs_secret,
- 'grant_type': 'refresh_token',
- 'refresh_token': cs_refresh,
- }
- auth_response = requests.post(auth_url, data=auth_payload)
- if auth_response.status_code != 200:
- print('Error: Auth failed -- server error {0}'.format(auth_response.status_code))
- print(auth_response.text)
- exit(1)
- response_dict = auth_response.json()
- if 'access_token' not in response_dict:
- print('Error: Auth failed -- no access token')
- exit(1)
- # Prepare access token
- cs_auth = 'Bearer ' + response_dict['access_token']
- headers = {
- 'Authorization': cs_auth,
- 'x-goog-api-version': '2',
- }
- # Upload
- print('Uploading package...')
- upload_url = 'https://www.googleapis.com/upload/chromewebstore/v1.1/items/{0}'.format(cs_extension_id)
- upload_response = requests.put(upload_url, headers=headers, data=f)
- f.close()
- if upload_response.status_code != 200:
- print('Upload failed -- server error {0}'.format(upload_response.status_code))
- print(upload_response.text)
- exit(1)
- response_dict = upload_response.json();
- if 'uploadState' not in response_dict or response_dict['uploadState'] != 'SUCCESS':
- print('Upload failed -- server error {0}'.format(response_dict['uploadState']))
- exit(1)
- print('Upload succeeded.')
- # Publish
- print('Publishing package...')
- publish_url = 'https://www.googleapis.com/chromewebstore/v1.1/items/{0}/publish'.format(cs_extension_id)
- headers = {
- 'Authorization': cs_auth,
- 'x-goog-api-version': '2',
- 'Content-Length': '0',
- }
- publish_response = requests.post(publish_url, headers=headers)
- if publish_response.status_code != 200:
- print('Error: Chrome store publishing failed -- server error {0}'.format(publish_response.status_code))
- exit(1)
- response_dict = publish_response.json();
- if 'status' not in response_dict or response_dict['status'][0] != 'OK':
- print('Publishing failed -- server error {0}'.format(response_dict['status']))
- exit(1)
- print('Publishing succeeded.')
-
-print('All done.')
diff -Nru ublock-origin-1.62.0+dfsg/dist/mv3/firefox/publish-signed-beta.py ublock-origin-1.67.0+dfsg/dist/mv3/firefox/publish-signed-beta.py
--- ublock-origin-1.62.0+dfsg/dist/mv3/firefox/publish-signed-beta.py 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/dist/mv3/firefox/publish-signed-beta.py 1970-01-01 00:00:00.000000000 +0000
@@ -1,326 +0,0 @@
-#!/usr/bin/env python3
-
-import datetime
-import json
-import jwt
-import os
-import re
-import requests
-import shutil
-import subprocess
-import sys
-import tempfile
-import time
-import zipfile
-
-from string import Template
-
-# - Download target (raw) uBlock0.firefox.xpi from GitHub
-# - This is referred to as "raw" package
-# - This will fail if not a dev build
-# - Modify raw package to make it self-hosted
-# - This is referred to as "unsigned" package
-# - Ask AMO to sign uBlock0.firefox.xpi
-# - Generate JWT to be used for communication with server
-# - Upload unsigned package to AMO
-# - Wait for a valid download URL for signed package
-# - Download signed package as uBlock0.firefox.signed.xpi
-# - This is referred to as "signed" package
-# - Upload uBlock0.firefox.signed.xpi to GitHub
-# - Remove uBlock0.firefox.xpi from GitHub
-# - Modify updates.json to point to new version
-# - Commit changes to repo
-
-# Find path to project root
-projdir = os.path.split(os.path.abspath(__file__))[0]
-while not os.path.isdir(os.path.join(projdir, '.git')):
- projdir = os.path.normpath(os.path.join(projdir, '..'))
-# Check that found project root is valid
-version_filepath = os.path.join(projdir, 'dist', 'version')
-if not os.path.isfile(version_filepath):
- print('Version file not found.')
- exit(1)
-
-# We need a version string to work with
-if len(sys.argv) >= 2 and sys.argv[1]:
- tag_version = sys.argv[1]
-else:
- tag_version = input('Github release version: ')
-tag_version.strip()
-match = re.search('^uBOLite_(\d+\.\d+\.\d+.\d+)$', tag_version)
-if not match:
- print('Error: Invalid version string.')
- exit(1)
-ext_version = match.group(1);
-
-extension_id = 'uBOLite@raymondhill.net'
-tmpdir = tempfile.TemporaryDirectory()
-raw_xpi_filename = tag_version + '.firefox.mv3.xpi'
-raw_xpi_filepath = os.path.join(tmpdir.name, raw_xpi_filename)
-unsigned_xpi_filepath = os.path.join(tmpdir.name, 'uBOLite.firefox.unsigned.xpi')
-signed_xpi_filename = tag_version + '.firefox.signed.mv3.xpi'
-signed_xpi_filepath = os.path.join(tmpdir.name, signed_xpi_filename)
-github_owner = 'gorhill'
-github_repo = 'uBlock'
-
-# Load/save auth secrets
-# The tmp directory is excluded from git
-ubo_secrets = dict()
-ubo_secrets_filename = os.path.join(projdir, 'tmp', 'ubo_secrets')
-if os.path.isfile(ubo_secrets_filename):
- with open(ubo_secrets_filename) as f:
- ubo_secrets = json.load(f)
-
-def input_secret(prompt, token):
- if token in ubo_secrets:
- prompt += ' ✔'
- prompt += ': '
- value = input(prompt).strip()
- if len(value) == 0:
- if token not in ubo_secrets:
- print('Token error:', token)
- exit(1)
- value = ubo_secrets[token]
- elif token not in ubo_secrets or value != ubo_secrets[token]:
- ubo_secrets[token] = value
- exists = os.path.isfile(ubo_secrets_filename)
- with open(ubo_secrets_filename, 'w') as f:
- json.dump(ubo_secrets, f, indent=2)
- if not exists:
- os.chmod(ubo_secrets_filename, 0o600)
- return value
-
-# GitHub API token
-github_token = input_secret('Github token', 'github_token')
-github_auth = 'token ' + github_token
-
-#
-# Get metadata from GitHub about the release
-#
-
-# https://developer.github.com/v3/repos/releases/#get-a-single-release
-print('Downloading release info from GitHub...')
-release_info_url = 'https://api.github.com/repos/{0}/{1}/releases/tags/{2}'.format(github_owner, github_repo, tag_version)
-headers = { 'Authorization': github_auth, }
-response = requests.get(release_info_url, headers=headers)
-if response.status_code != 200:
- print('Error: Release not found: {0}'.format(response.status_code))
- exit(1)
-release_info = response.json()
-
-#
-# Extract URL to raw package from metadata
-#
-
-# Find url for uBlock0.firefox.xpi
-raw_xpi_url = ''
-for asset in release_info['assets']:
- if asset['name'] == signed_xpi_filename:
- print('Error: Found existing signed self-hosted package.')
- exit(1)
- if asset['name'] == raw_xpi_filename:
- raw_xpi_url = asset['url']
-if len(raw_xpi_url) == 0:
- print('Error: Release asset URL not found')
- exit(1)
-
-#
-# Download raw package from GitHub
-#
-
-# https://developer.github.com/v3/repos/releases/#get-a-single-release-asset
-print('Downloading raw xpi package from GitHub...')
-headers = {
- 'Authorization': github_auth,
- 'Accept': 'application/octet-stream',
-}
-response = requests.get(raw_xpi_url, headers=headers)
-# Redirections are transparently handled:
-# http://docs.python-requests.org/en/master/user/quickstart/#redirection-and-history
-if response.status_code != 200:
- print('Error: Downloading raw package failed -- server error {0}'.format(response.status_code))
- exit(1)
-with open(raw_xpi_filepath, 'wb') as f:
- f.write(response.content)
-print('Downloaded raw package saved as {0}'.format(raw_xpi_filepath))
-
-#
-# Convert the package to a self-hosted one: add `update_url` to the manifest
-#
-min_browser_version = '114.0';
-
-print('Converting raw xpi package into self-hosted xpi package...')
-with zipfile.ZipFile(raw_xpi_filepath, 'r') as zipin:
- with zipfile.ZipFile(unsigned_xpi_filepath, 'w') as zipout:
- for item in zipin.infolist():
- data = zipin.read(item.filename)
- if item.filename == 'manifest.json':
- manifest = json.loads(bytes.decode(data))
- min_browser_version = manifest['browser_specific_settings']['gecko']['strict_min_version']
- manifest['browser_specific_settings']['gecko']['update_url'] = 'https://raw.githubusercontent.com/{0}/{1}/master/dist/mv3/firefox/updates.json'.format(github_owner, github_repo)
- data = json.dumps(manifest, indent=2, separators=(',', ': '), sort_keys=True).encode()
- zipout.writestr(item, data)
-
-#
-# Ask AMO to sign the self-hosted package
-# - https://developer.mozilla.org/en-US/Add-ons/Distribution#Distributing_your_add-on
-# - https://pyjwt.readthedocs.io/en/latest/usage.html
-# - https://addons-server.readthedocs.io/en/latest/topics/api/auth.html
-# - https://addons-server.readthedocs.io/en/latest/topics/api/signing.html
-#
-
-amo_api_key = ''
-amo_secret = ''
-
-def get_jwt_auth():
- global amo_api_key
- if amo_api_key == '':
- amo_api_key = input_secret('AMO API key', 'amo_api_key')
- global amo_secret
- if amo_secret == '':
- amo_secret = input_secret('AMO API secret', 'amo_secret')
- amo_nonce = os.urandom(8).hex()
- jwt_payload = {
- 'iss': amo_api_key,
- 'jti': amo_nonce,
- 'iat': datetime.datetime.utcnow(),
- 'exp': datetime.datetime.utcnow() + datetime.timedelta(seconds=15),
- }
- return 'JWT ' + jwt.encode(jwt_payload, amo_secret)
-
-print('Ask AMO to sign self-hosted xpi package...')
-with open(unsigned_xpi_filepath, 'rb') as f:
- # https://blog.mozilla.org/addons/2019/11/11/security-improvements-in-amo-upload-tools/
- # "We recommend allowing up to 15 minutes."
- interval = 60 # check every 60 seconds
- countdown = 60 * 60 / interval # for at most 60 minutes
- headers = { 'Authorization': get_jwt_auth(), }
- data = { 'channel': 'unlisted' }
- files = { 'upload': f, }
- signing_url = 'https://addons.mozilla.org/api/v4/addons/{0}/versions/{1}/'.format(extension_id, ext_version)
- print('Submitting package to be signed...')
- response = requests.put(signing_url, headers=headers, data=data, files=files)
- if response.status_code != 202:
- print('Error: Creating new version failed -- server error {0}'.format(response.status_code))
- print(response.text)
- exit(1)
- print('Request for signing self-hosted xpi package succeeded.')
- signing_request_response = response.json();
- f.close()
- print('Waiting for AMO to process the request to sign the self-hosted xpi package...')
- # Wait for signed package to be ready
- signing_check_url = signing_request_response['url']
- while True:
- time.sleep(interval)
- sys.stdout.write('.')
- sys.stdout.flush()
- countdown -= 1
- if countdown <= 0:
- print('Error: AMO signing timed out')
- exit(1)
- headers = { 'Authorization': get_jwt_auth(), }
- response = requests.get(signing_check_url, headers=headers)
- if response.status_code != 200:
- print('Error: AMO signing failed -- server error {0}'.format(response.status_code))
- print(response.text)
- exit(1)
- signing_check_response = response.json()
- if not signing_check_response['processed']:
- continue
- if not signing_check_response['valid']:
- print('Error: AMO validation failed')
- print(response.text)
- exit(1)
- if not signing_check_response['files'] or len(signing_check_response['files']) == 0:
- continue
- if not signing_check_response['files'][0]['signed']:
- continue
- if not signing_check_response['files'][0]['download_url']:
- print('Error: AMO signing failed')
- print(response.text)
- exit(1)
- print('\r')
- print('Self-hosted xpi package successfully signed.')
- download_url = signing_check_response['files'][0]['download_url']
- print('Downloading signed self-hosted xpi package from {0}...'.format(download_url))
- response = requests.get(download_url, headers=headers)
- if response.status_code != 200:
- print('Error: Download signed package failed -- server error {0}'.format(response.status_code))
- print(response.text)
- exit(1)
- with open(signed_xpi_filepath, 'wb') as f:
- f.write(response.content)
- f.close()
- print('Signed self-hosted xpi package downloaded.')
- break
-
-#
-# Upload signed package to GitHub
-#
-
-# https://developer.github.com/v3/repos/releases/#upload-a-release-asset
-print('Uploading signed self-hosted xpi package to GitHub...')
-with open(signed_xpi_filepath, 'rb') as f:
- url = release_info['upload_url'].replace('{?name,label}', '?name=' + signed_xpi_filename)
- headers = {
- 'Authorization': github_auth,
- 'Content-Type': 'application/zip',
- }
- response = requests.post(url, headers=headers, data=f.read())
- if response.status_code != 201:
- print('Error: Upload signed package failed -- server error: {0}'.format(response.status_code))
- exit(1)
-
-#
-# Remove raw package from GitHub
-#
-
-# https://developer.github.com/v3/repos/releases/#delete-a-release-asset
-print('Remove raw xpi package from GitHub...')
-headers = { 'Authorization': github_auth, }
-response = requests.delete(raw_xpi_url, headers=headers)
-if response.status_code != 204:
- print('Error: Deletion of raw package failed -- server error: {0}'.format(response.status_code))
-
-#
-# Update updates.json to point to new package -- but only if just-signed
-# package is higher version than current one.
-#
-
-# Be sure we are in sync with potentially modified files on remote
-r = subprocess.run(['git', 'pull', 'origin', 'master'], stdout=subprocess.PIPE)
-rout = bytes.decode(r.stdout).strip()
-
-def int_from_version(version):
- parts = version.split('.')
- if len(parts) == 3:
- parts.append('0')
- return int(parts[0])*10e9 + int(parts[1])*10e6 + int(parts[2])*10e3 + int(parts[3])
-
-print('Update GitHub to point to newly signed self-hosted xpi package...')
-updates_json_filepath = os.path.join(projdir, 'dist', 'mv3', 'firefox', 'updates.json')
-with open(updates_json_filepath) as f:
- updates_json = json.load(f)
- f.close()
- previous_version = updates_json['addons'][extension_id]['updates'][0]['version']
- if int_from_version(ext_version) > int_from_version(previous_version):
- with open(os.path.join(projdir, 'dist', 'mv3', 'firefox', 'updates.template.json')) as f:
- template_json = Template(f.read())
- f.close()
- updates_json = template_json.substitute(ext_version=ext_version, tag_version=tag_version, min_browser_version=min_browser_version)
- with open(updates_json_filepath, 'w') as f:
- f.write(updates_json)
- f.close()
- # - Stage the changed file
- r = subprocess.run(['git', 'status', '-s', updates_json_filepath], stdout=subprocess.PIPE)
- rout = bytes.decode(r.stdout).strip()
- if len(rout) >= 2 and rout[1] == 'M':
- subprocess.run(['git', 'add', updates_json_filepath])
- # - Commit the staged file
- r = subprocess.run(['git', 'status', '-s', updates_json_filepath], stdout=subprocess.PIPE)
- rout = bytes.decode(r.stdout).strip()
- if len(rout) >= 2 and rout[0] == 'M':
- subprocess.run(['git', 'commit', '-m', 'Make Firefox dev build auto-update', updates_json_filepath])
- subprocess.run(['git', 'push', 'origin', 'HEAD'])
-
-print('All done.')
diff -Nru ublock-origin-1.62.0+dfsg/dist/mv3/firefox/updates.json ublock-origin-1.67.0+dfsg/dist/mv3/firefox/updates.json
--- ublock-origin-1.62.0+dfsg/dist/mv3/firefox/updates.json 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/dist/mv3/firefox/updates.json 1970-01-01 00:00:00.000000000 +0000
@@ -1,13 +0,0 @@
-{
- "addons": {
- "uBOLite@raymondhill.net": {
- "updates": [
- {
- "version": "1.0.23.8125",
- "browser_specific_settings": { "gecko": { "strict_min_version": "114.0" } },
- "update_link": "https://github.com/gorhill/uBlock/releases/download/uBOLite_1.0.23.8125/uBOLite_1.0.23.8125.firefox.signed.mv3.xpi"
- }
- ]
- }
- }
-}
diff -Nru ublock-origin-1.62.0+dfsg/dist/mv3/firefox/updates.template.json ublock-origin-1.67.0+dfsg/dist/mv3/firefox/updates.template.json
--- ublock-origin-1.62.0+dfsg/dist/mv3/firefox/updates.template.json 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/dist/mv3/firefox/updates.template.json 1970-01-01 00:00:00.000000000 +0000
@@ -1,13 +0,0 @@
-{
- "addons": {
- "uBOLite@raymondhill.net": {
- "updates": [
- {
- "version": "$ext_version",
- "browser_specific_settings": { "gecko": { "strict_min_version": "$min_browser_version" } },
- "update_link": "https://github.com/gorhill/uBlock/releases/download/$tag_version/$tag_version.firefox.signed.mv3.xpi"
- }
- ]
- }
- }
-}
diff -Nru ublock-origin-1.62.0+dfsg/dist/version ublock-origin-1.67.0+dfsg/dist/version
--- ublock-origin-1.62.0+dfsg/dist/version 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/dist/version 2025-10-25 19:32:51.000000000 +0000
@@ -1 +1 @@
-1.62.0
\ No newline at end of file
+1.67.0
\ No newline at end of file
diff -Nru ublock-origin-1.62.0+dfsg/eslint.config.mjs ublock-origin-1.67.0+dfsg/eslint.config.mjs
--- ublock-origin-1.62.0+dfsg/eslint.config.mjs 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/eslint.config.mjs 2025-10-25 19:32:51.000000000 +0000
@@ -0,0 +1,51 @@
+import js from "@eslint/js";
+import globals from "globals";
+import json from "@eslint/json";
+
+import { includeIgnoreFile } from "@eslint/compat";
+import path from "node:path";
+import { fileURLToPath } from "node:url";
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+const gitignorePath = path.resolve(__dirname, ".gitignore");
+
+export default [ includeIgnoreFile(gitignorePath), {
+ files: ["**/*.js", "**/*.mjs"],
+ ...js.configs.recommended,
+}, {
+ files: ["**/*.js", "**/*.mjs"],
+ languageOptions: {
+ globals: {
+ ...globals.browser,
+ browser: "readonly",
+ chrome: "readonly",
+ vAPI: "readonly",
+ },
+ sourceType: "module",
+ },
+ rules: {
+ eqeqeq: ["warn", "always"],
+ indent: ["error", 4, {
+ ignoredNodes: [
+ "Program > BlockStatement",
+ "Program > ExpressionStatement > CallExpression > ArrowFunctionExpression > BlockStatement",
+ "Program > ExpressionStatement > CallExpression > FunctionExpression > BlockStatement",
+ "Program > IfStatement > BlockStatement",
+ "Program > VariableDeclaration > VariableDeclarator > CallExpression > ArrowFunctionExpression > BlockStatement",
+ "CallExpression > MemberExpression",
+ "ArrayExpression > *",
+ "ObjectExpression > *",
+ ],
+ }],
+ "no-control-regex": "off",
+ "no-empty": "off",
+ "sort-imports": "error",
+ "strict": "error",
+ },
+}, {
+ files: ["**/*.json"],
+ ignores: ["package-lock.json"],
+ language: "json/json",
+ ...json.configs.recommended,
+} ];
diff -Nru ublock-origin-1.62.0+dfsg/package-lock.json ublock-origin-1.67.0+dfsg/package-lock.json
--- ublock-origin-1.62.0+dfsg/package-lock.json 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/package-lock.json 2025-10-25 19:32:51.000000000 +0000
@@ -0,0 +1,1163 @@
+{
+ "name": "uBlock",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "uBlock",
+ "version": "1.0.0",
+ "license": "GPLv3",
+ "devDependencies": {
+ "@eslint/compat": "^1.2.4",
+ "@eslint/js": "^9.17.0",
+ "@eslint/json": "^0.13.1",
+ "eslint": "^9.34.0",
+ "eslint-formatter-compact": "^8.40.0",
+ "globals": "^15.14.0"
+ },
+ "engines": {
+ "node": ">=22",
+ "npm": ">=11"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/compat": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.3.2.tgz",
+ "integrity": "sha512-jRNwzTbd6p2Rw4sZ1CgWRS8YMtqG15YyZf7zvb6gY2rB2u6n+2Z+ELW0GtL0fQgyl0pr4Y/BzBfng/BdsereRA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "peerDependencies": {
+ "eslint": "^8.40 || 9"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.6",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "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==",
+ "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/eslintrc": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
+ "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.34.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz",
+ "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/json": {
+ "version": "0.13.2",
+ "resolved": "https://registry.npmjs.org/@eslint/json/-/json-0.13.2.tgz",
+ "integrity": "sha512-yWLyRE18rHgHXhWigRpiyv1LDPkvWtC6oa7QHXW7YdP6gosJoq7BiLZW2yCs9U7zN7X4U3ZeOJjepA10XAOIMw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.15.2",
+ "@eslint/plugin-kit": "^0.3.5",
+ "@humanwhocodes/momoa": "^3.3.9",
+ "natural-compare": "^1.4.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.15.2",
+ "levn": "^0.4.1"
+ },
+ "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",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.6",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
+ "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.3.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",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/momoa": {
+ "version": "3.3.9",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-3.3.9.tgz",
+ "integrity": "sha512-LHw6Op4bJb3/3KZgOgwflJx5zY9XOy0NU1NuyUFKGdTwHYmP+PbnQGCYQJ8NVNlulLfQish34b0VuUlLYP3AXA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/acorn": {
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.34.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz",
+ "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.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/eslintrc": "^3.3.1",
+ "@eslint/js": "9.34.0",
+ "@eslint/plugin-kit": "^0.3.5",
+ "@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",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-formatter-compact": {
+ "version": "8.40.0",
+ "resolved": "https://registry.npmjs.org/eslint-formatter-compact/-/eslint-formatter-compact-8.40.0.tgz",
+ "integrity": "sha512-cwGUs113TgmTQXecx5kfRjB7m0y2wkDLSadPTE2pK6M/wO4N8PjmUaoWOFNCP9MHgsiZwgqd5bZFnDCnszC56Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff -Nru ublock-origin-1.62.0+dfsg/package.json ublock-origin-1.67.0+dfsg/package.json
--- ublock-origin-1.62.0+dfsg/package.json 1970-01-01 00:00:00.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/package.json 2025-10-25 19:32:51.000000000 +0000
@@ -0,0 +1,32 @@
+{
+ "name": "uBlock",
+ "version": "1.0.0",
+ "description": "npm dev tools",
+ "type": "module",
+ "scripts": {
+ "lint": "eslint --no-warn-ignored --ignore-pattern \"**/lib/\" --ignore-pattern \"**/npm/\" -- \"./src/js/*.js\" \"./src/js/**/*.js\" \"./**/*.json\" \"./platform/**/*.js\"",
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/gorhill/uBlock.git"
+ },
+ "author": "Raymond Hill",
+ "license": "GPLv3",
+ "bugs": {
+ "url": "https://github.com/gorhill/uBlock/issues"
+ },
+ "homepage": "https://github.com/gorhill/uBlock#readme",
+ "engines": {
+ "node": ">=22",
+ "npm": ">=11"
+ },
+ "devDependencies": {
+ "@eslint/compat": "^1.2.4",
+ "@eslint/js": "^9.17.0",
+ "@eslint/json": "^0.13.1",
+ "eslint": "^9.34.0",
+ "eslint-formatter-compact": "^8.40.0",
+ "globals": "^15.14.0"
+ }
+}
diff -Nru ublock-origin-1.62.0+dfsg/platform/browser/main.js ublock-origin-1.67.0+dfsg/platform/browser/main.js
--- ublock-origin-1.62.0+dfsg/platform/browser/main.js 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/platform/browser/main.js 1970-01-01 00:00:00.000000000 +0000
@@ -1,123 +0,0 @@
-/*******************************************************************************
-
- uBlock Origin - a browser extension to block requests.
- Copyright (C) 2014-present Raymond Hill
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see {http://www.gnu.org/licenses/}.
-
- Home: https://github.com/gorhill/uBlock
-*/
-
-'use strict';
-
-/******************************************************************************/
-
-import publicSuffixList from './lib/publicsuffixlist/publicsuffixlist.js';
-import punycode from './lib/punycode.js';
-
-import staticNetFilteringEngine from './js/static-net-filtering.js';
-import { FilteringContext } from './js/filtering-context.js';
-import { LineIterator } from './js/text-utils.js';
-import * as sfp from './js/static-filtering-parser.js';
-
-import {
- CompiledListReader,
- CompiledListWriter
-} from './js/static-filtering-io.js';
-
-/******************************************************************************/
-
-function compileList(rawText, writer) {
- const lineIter = new LineIterator(rawText);
- const parser = new sfp.AstFilterParser({
- interactive: true,
- maxTokenLength: staticNetFilteringEngine.MAX_TOKEN_LENGTH,
- });
- const compiler = staticNetFilteringEngine.createCompiler();
-
- while ( lineIter.eot() === false ) {
- let line = lineIter.next();
-
- while ( line.endsWith(' \\') ) {
- if ( lineIter.peek(4) !== ' ' ) { break; }
- line = line.slice(0, -2).trim() + lineIter.next().trim();
- }
- parser.parse(line);
-
- if ( parser.isFilter() === false ) { continue; }
- if ( parser.isNetworkFilter() === false ) { continue; }
- if ( compiler.compile(parser, writer) ) { continue; }
- if ( compiler.error !== undefined ) {
- console.info(JSON.stringify({
- realm: 'message',
- type: 'error',
- text: compiler.error
- }));
- }
- }
-
- return writer.toString();
-}
-
-function applyList(name, raw) {
- const writer = new CompiledListWriter();
- writer.properties.set('name', name);
- const compiled = compileList(raw, writer);
- const reader = new CompiledListReader(compiled);
- staticNetFilteringEngine.fromCompiled(reader);
-}
-
-function enableWASM(path) {
- return Promise.all([
- publicSuffixList.enableWASM(`${path}/lib/publicsuffixlist`),
- staticNetFilteringEngine.enableWASM(`${path}/js`),
- ]);
-}
-
-function pslInit(raw) {
- if ( typeof raw !== 'string' || raw.trim() === '' ) {
- console.info('Unable to populate public suffix list');
- return;
- }
- publicSuffixList.parse(raw, punycode.toASCII);
- console.info('Public suffix list populated');
-}
-
-function restart(lists) {
- // Remove all filters
- reset();
-
- if ( Array.isArray(lists) && lists.length !== 0 ) {
- // Populate filtering engine with filter lists
- for ( const { name, raw } of lists ) {
- applyList(name, raw);
- }
- // Commit changes
- staticNetFilteringEngine.freeze();
- staticNetFilteringEngine.optimize();
- }
-
- return staticNetFilteringEngine;
-}
-
-function reset() {
- staticNetFilteringEngine.reset();
-}
-
-export {
- FilteringContext,
- enableWASM,
- pslInit,
- restart,
-};
diff -Nru ublock-origin-1.62.0+dfsg/platform/browser/test.html ublock-origin-1.67.0+dfsg/platform/browser/test.html
--- ublock-origin-1.62.0+dfsg/platform/browser/test.html 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/platform/browser/test.html 1970-01-01 00:00:00.000000000 +0000
@@ -1,71 +0,0 @@
-
-
-
-
-uBO Static Network Filtering Engine
-
-
-
-
-
diff -Nru ublock-origin-1.62.0+dfsg/platform/chromium/is-webrtc-supported.html ublock-origin-1.67.0+dfsg/platform/chromium/is-webrtc-supported.html
--- ublock-origin-1.62.0+dfsg/platform/chromium/is-webrtc-supported.html 2025-02-09 18:18:39.000000000 +0000
+++ ublock-origin-1.67.0+dfsg/platform/chromium/is-webrtc-supported.html 2025-10-25 19:32:51.000000000 +0000
@@ -3,7 +3,7 @@
-
+