"
- ],
- "update_url": "https://www.eff.org/files/https-everywhere-chrome-updates.xml",
- "version": "2013.10.16"
-}
+ "webNavigation",
+ "webRequest",
+ "webRequestBlocking",
+ "tabs",
+ "cookies",
+ "storage",
+ "*://*/*",
+ "ftp://*/*"
+ ],
+ "version": "2022.5.24",
+ "web_accessible_resources": [
+ "/pages/cancel/index.html"
+ ]
+}
\ No newline at end of file
diff --git a/chromium/package-lock.json b/chromium/package-lock.json
new file mode 100644
index 000000000000..0886adcdb32c
--- /dev/null
+++ b/chromium/package-lock.json
@@ -0,0 +1,2909 @@
+{
+ "name": "https-everywhere",
+ "version": "1.0.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/core": {
+ "version": "7.11.1",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz",
+ "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.11.0",
+ "@babel/helper-module-transforms": "^7.11.0",
+ "@babel/helpers": "^7.10.4",
+ "@babel/parser": "^7.11.1",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.11.0",
+ "@babel/types": "^7.11.0",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.1",
+ "json5": "^2.1.2",
+ "lodash": "^4.17.19",
+ "resolve": "^1.3.2",
+ "semver": "^5.4.1",
+ "source-map": "^0.5.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/generator": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz",
+ "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.11.0",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-member-expression-to-functions": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz",
+ "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
+ "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz",
+ "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "^7.10.4",
+ "@babel/helper-replace-supers": "^7.10.4",
+ "@babel/helper-simple-access": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.11.0",
+ "lodash": "^4.17.19"
+ }
+ },
+ "@babel/helper-optimise-call-expression": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
+ "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-replace-supers": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz",
+ "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-member-expression-to-functions": "^7.10.4",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/traverse": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz",
+ "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+ "dev": true
+ },
+ "@babel/helpers": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz",
+ "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.11.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz",
+ "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==",
+ "dev": true
+ },
+ "@babel/runtime": {
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz",
+ "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==",
+ "dev": true,
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz",
+ "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.11.0",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/parser": "^7.11.0",
+ "@babel/types": "^7.11.0",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.19"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "@babel/types": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz",
+ "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@codemirror/autocomplete": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.0.2.tgz",
+ "integrity": "sha512-9PDjnllmXan/7Uax87KGORbxerDJ/cu10SB+n4Jz0zXMEvIh3+TGgZxhIvDOtaQ4jDBQEM7kHYW4vLdQB0DGZQ==",
+ "dev": true,
+ "requires": {
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0",
+ "@lezer/common": "^1.0.0"
+ }
+ },
+ "@codemirror/commands": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.0.1.tgz",
+ "integrity": "sha512-iNHDByicYqQjs0Wo1MKGfqNbMYMyhS9WV6EwMVwsHXImlFemgEUC+c5X22bXKBStN3qnwg4fArNZM+gkv22baQ==",
+ "dev": true,
+ "requires": {
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0",
+ "@lezer/common": "^1.0.0"
+ }
+ },
+ "@codemirror/language": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.2.0.tgz",
+ "integrity": "sha512-tabB0Ef/BflwoEmTB4a//WZ9P90UQyne9qWB9YFsmeS4bnEqSys7UpGk/da1URMXhyfuzWCwp+AQNMhvu8SfnA==",
+ "dev": true,
+ "requires": {
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0",
+ "@lezer/common": "^1.0.0",
+ "@lezer/highlight": "^1.0.0",
+ "@lezer/lr": "^1.0.0",
+ "style-mod": "^4.0.0"
+ }
+ },
+ "@codemirror/lint": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.0.0.tgz",
+ "integrity": "sha512-nUUXcJW1Xp54kNs+a1ToPLK8MadO0rMTnJB8Zk4Z8gBdrN0kqV7uvUraU/T2yqg+grDNR38Vmy/MrhQN/RgwiA==",
+ "dev": true,
+ "requires": {
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0",
+ "crelt": "^1.0.5"
+ }
+ },
+ "@codemirror/search": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.0.0.tgz",
+ "integrity": "sha512-rL0rd3AhI0TAsaJPUaEwC63KHLO7KL0Z/dYozXj6E7L3wNHRyx7RfE0/j5HsIf912EE5n2PCb4Vg0rGYmDv4UQ==",
+ "dev": true,
+ "requires": {
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0",
+ "crelt": "^1.0.5"
+ }
+ },
+ "@codemirror/state": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.1.0.tgz",
+ "integrity": "sha512-qbUr94DZTe6/V1VS7LDLz11rM/1t/nJxR1El4I6UaxDEdc0aZZvq6JCLJWiRmUf95NRAnDH6fhXn+PWp9wGCIg==",
+ "dev": true
+ },
+ "@codemirror/view": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.0.2.tgz",
+ "integrity": "sha512-mnVT/q1JvKPjpmjXJNeCi/xHyaJ3abGJsumIVpdQ1nE1MXAyHf7GHWt8QpWMUvDiqF0j+inkhVR2OviTdFFX7Q==",
+ "dev": true,
+ "requires": {
+ "@codemirror/state": "^6.0.0",
+ "style-mod": "^4.0.0",
+ "w3c-keyname": "^2.2.4"
+ }
+ },
+ "@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "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
+ }
+ }
+ },
+ "@istanbuljs/schema": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz",
+ "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==",
+ "dev": true
+ },
+ "@lezer/common": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.0.0.tgz",
+ "integrity": "sha512-ohydQe+Hb+w4oMDvXzs8uuJd2NoA3D8YDcLiuDsLqH+yflDTPEpgCsWI3/6rH5C3BAedtH1/R51dxENldQceEA==",
+ "dev": true
+ },
+ "@lezer/highlight": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.0.0.tgz",
+ "integrity": "sha512-nsCnNtim90UKsB5YxoX65v3GEIw3iCHw9RM2DtdgkiqAbKh9pCdvi8AWNwkYf10Lu6fxNhXPpkpHbW6mihhvJA==",
+ "dev": true,
+ "requires": {
+ "@lezer/common": "^1.0.0"
+ }
+ },
+ "@lezer/lr": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.1.0.tgz",
+ "integrity": "sha512-Iad04uVwk1PvSnj25mqj7zEEIRAsasbsTRmVzI0AUTs/+1Dz1//iYAaoLr7A+Xa7bZDfql5MKTxZmSlkYZD3Dg==",
+ "dev": true,
+ "requires": {
+ "@lezer/common": "^1.0.0"
+ }
+ },
+ "@sinonjs/commons": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz",
+ "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==",
+ "dev": true,
+ "requires": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "@sinonjs/fake-timers": {
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz",
+ "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/commons": "^1.7.0"
+ }
+ },
+ "@sinonjs/samsam": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz",
+ "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/commons": "^1.6.0",
+ "lodash.get": "^4.4.2",
+ "type-detect": "^4.0.8"
+ }
+ },
+ "@sinonjs/text-encoding": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz",
+ "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==",
+ "dev": true
+ },
+ "@types/color-name": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
+ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
+ "dev": true
+ },
+ "@ungap/promise-all-settled": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
+ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
+ "dev": true
+ },
+ "aggregate-error": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz",
+ "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==",
+ "dev": true,
+ "requires": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ }
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "append-transform": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz",
+ "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==",
+ "dev": true,
+ "requires": {
+ "default-require-extensions": "^3.0.0"
+ }
+ },
+ "archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
+ "dev": true
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "array-from": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz",
+ "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=",
+ "dev": true
+ },
+ "asn1": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ },
+ "assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
+ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "dev": true,
+ "requires": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true
+ },
+ "btoa": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz",
+ "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==",
+ "dev": true
+ },
+ "caching-transform": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz",
+ "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==",
+ "dev": true,
+ "requires": {
+ "hasha": "^5.0.0",
+ "make-dir": "^3.0.0",
+ "package-hash": "^4.0.0",
+ "write-file-atomic": "^3.0.0"
+ }
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
+ "chai": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz",
+ "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==",
+ "dev": true,
+ "requires": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.2",
+ "deep-eql": "^3.0.1",
+ "get-func-name": "^2.0.0",
+ "loupe": "^2.3.1",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.0.5"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+ "dev": true
+ },
+ "chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "requires": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ }
+ },
+ "clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "dev": true
+ },
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "codemirror": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz",
+ "integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==",
+ "dev": true,
+ "requires": {
+ "@codemirror/autocomplete": "^6.0.0",
+ "@codemirror/commands": "^6.0.0",
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/lint": "^6.0.0",
+ "@codemirror/search": "^6.0.0",
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "convert-source-map": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+ "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "core-js": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.1.tgz",
+ "integrity": "sha512-9Id2xHY1W7m8hCl8NkhQn5CufmF/WuR30BTRewvCXc1aZd3kMECwNZ69ndLbekKfakw9Rf2Xyc+QR6E7Gg+obg==",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "coveralls": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.1.tgz",
+ "integrity": "sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==",
+ "dev": true,
+ "requires": {
+ "js-yaml": "^3.13.1",
+ "lcov-parse": "^1.0.0",
+ "log-driver": "^1.2.7",
+ "minimist": "^1.2.5",
+ "request": "^2.88.2"
+ }
+ },
+ "crelt": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.5.tgz",
+ "integrity": "sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+ "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "deep-eql": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "dev": true,
+ "requires": {
+ "type-detect": "^4.0.0"
+ }
+ },
+ "default-require-extensions": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz",
+ "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==",
+ "dev": true,
+ "requires": {
+ "strip-bom": "^4.0.0"
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true
+ },
+ "diff": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+ "dev": true
+ },
+ "ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+ "dev": true,
+ "requires": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "es6-error": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
+ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
+ "dev": true
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "dev": true
+ },
+ "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
+ },
+ "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
+ },
+ "fetch-mock": {
+ "version": "9.11.0",
+ "resolved": "https://registry.npmjs.org/fetch-mock/-/fetch-mock-9.11.0.tgz",
+ "integrity": "sha512-PG1XUv+x7iag5p/iNHD4/jdpxL9FtVSqRMUQhPab4hVDt80T1MH5ehzVrL2IdXO9Q2iBggArFvPqjUbHFuI58Q==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.0.0",
+ "@babel/runtime": "^7.0.0",
+ "core-js": "^3.0.0",
+ "debug": "^4.1.1",
+ "glob-to-regexp": "^0.4.0",
+ "is-subset": "^0.1.1",
+ "lodash.isequal": "^4.5.0",
+ "path-to-regexp": "^2.2.1",
+ "querystring": "^0.2.0",
+ "whatwg-url": "^6.5.0"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "find-cache-dir": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
+ "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
+ "dev": true,
+ "requires": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ }
+ },
+ "find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true
+ },
+ "foreground-child": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
+ "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "dev": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "fromentries": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.1.tgz",
+ "integrity": "sha512-Xu2Qh8yqYuDhQGOhD5iJGninErSfI9A3FrriD3tjUgV5VbJFeH8vfgZ9HnC6jWN80QDVNQK5vmxRAmEAp7Mevw==",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
+ "gensync": {
+ "version": "1.0.0-beta.1",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
+ "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
+ "get-func-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+ "dev": true
+ },
+ "get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "dev": true
+ },
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+ "dev": true
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.3",
+ "har-schema": "^2.0.0"
+ }
+ },
+ "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
+ },
+ "hasha": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz",
+ "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==",
+ "dev": true,
+ "requires": {
+ "is-stream": "^2.0.0",
+ "type-fest": "^0.8.0"
+ }
+ },
+ "he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true
+ },
+ "html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "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,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+ "dev": true
+ },
+ "is-subset": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz",
+ "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=",
+ "dev": true
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "istanbul-lib-coverage": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
+ "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==",
+ "dev": true
+ },
+ "istanbul-lib-hook": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz",
+ "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==",
+ "dev": true,
+ "requires": {
+ "append-transform": "^2.0.0"
+ }
+ },
+ "istanbul-lib-instrument": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+ "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.7.5",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.0.0",
+ "semver": "^6.3.0"
+ }
+ },
+ "istanbul-lib-processinfo": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz",
+ "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==",
+ "dev": true,
+ "requires": {
+ "archy": "^1.0.0",
+ "cross-spawn": "^7.0.0",
+ "istanbul-lib-coverage": "^3.0.0-alpha.1",
+ "make-dir": "^3.0.0",
+ "p-map": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "uuid": "^3.3.3"
+ },
+ "dependencies": {
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "dev": true
+ }
+ }
+ },
+ "istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+ "dev": true,
+ "requires": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^3.0.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "istanbul-lib-source-maps": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz",
+ "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "istanbul-reports": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz",
+ "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==",
+ "dev": true,
+ "requires": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ }
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "dev": true
+ },
+ "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
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+ "dev": true
+ },
+ "json5": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+ "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "jsprim": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
+ "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.4.0",
+ "verror": "1.10.0"
+ }
+ },
+ "just-extend": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz",
+ "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==",
+ "dev": true
+ },
+ "lcov-parse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz",
+ "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=",
+ "dev": true
+ },
+ "locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^5.0.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "lodash.flattendeep": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
+ "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=",
+ "dev": true
+ },
+ "lodash.get": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
+ "dev": true
+ },
+ "lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "log-driver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz",
+ "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "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
+ }
+ }
+ },
+ "lolex": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz",
+ "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==",
+ "dev": true
+ },
+ "loupe": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.1.tgz",
+ "integrity": "sha512-EN1D3jyVmaX4tnajVlfbREU4axL647hLec1h/PXAb8CPDMJiYitcWF2UeLVNttRqaIqQs4x+mRvXf+d+TlDrCA==",
+ "dev": true,
+ "requires": {
+ "get-func-name": "^2.0.0"
+ }
+ },
+ "make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "requires": {
+ "semver": "^6.0.0"
+ }
+ },
+ "mime-db": {
+ "version": "1.48.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz",
+ "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.31",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz",
+ "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.48.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "mocha": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz",
+ "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==",
+ "dev": true,
+ "requires": {
+ "@ungap/promise-all-settled": "1.1.2",
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "7.2.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "nanoid": "3.3.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "dependencies": {
+ "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
+ },
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ }
+ }
+ },
+ "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
+ },
+ "glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "dependencies": {
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ }
+ }
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "minimatch": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
+ "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ }
+ }
+ },
+ "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
+ },
+ "supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "nan": {
+ "version": "2.16.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz",
+ "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==",
+ "dev": true
+ },
+ "nanoid": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
+ "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
+ "dev": true
+ },
+ "nise": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz",
+ "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/commons": "^1.8.3",
+ "@sinonjs/fake-timers": ">=5",
+ "@sinonjs/text-encoding": "^0.7.1",
+ "just-extend": "^4.0.2",
+ "path-to-regexp": "^1.7.0"
+ },
+ "dependencies": {
+ "@sinonjs/commons": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
+ "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
+ "dev": true,
+ "requires": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "path-to-regexp": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
+ "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
+ "dev": true,
+ "requires": {
+ "isarray": "0.0.1"
+ }
+ }
+ }
+ },
+ "node-preload": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz",
+ "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==",
+ "dev": true,
+ "requires": {
+ "process-on-spawn": "^1.0.0"
+ }
+ },
+ "node-webcrypto-ossl": {
+ "version": "1.0.49",
+ "resolved": "https://registry.npmjs.org/node-webcrypto-ossl/-/node-webcrypto-ossl-1.0.49.tgz",
+ "integrity": "sha512-Zs73PeTWoUXUFicvAaxZC6ZyVCuq1Eg/Q4rYqiWyBY4eWIbZPFiRIi/KRM0A9GVKBPRNraaXsVmRAC83jEQ6nw==",
+ "dev": true,
+ "requires": {
+ "mkdirp": "^0.5.5",
+ "nan": "^2.14.0",
+ "tslib": "^1.11.1",
+ "webcrypto-core": "^0.1.27"
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "nyc": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz",
+ "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==",
+ "dev": true,
+ "requires": {
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "caching-transform": "^4.0.0",
+ "convert-source-map": "^1.7.0",
+ "decamelize": "^1.2.0",
+ "find-cache-dir": "^3.2.0",
+ "find-up": "^4.1.0",
+ "foreground-child": "^2.0.0",
+ "get-package-type": "^0.1.0",
+ "glob": "^7.1.6",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-hook": "^3.0.0",
+ "istanbul-lib-instrument": "^4.0.0",
+ "istanbul-lib-processinfo": "^2.0.2",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.0.2",
+ "make-dir": "^3.0.0",
+ "node-preload": "^0.2.1",
+ "p-map": "^3.0.0",
+ "process-on-spawn": "^1.0.0",
+ "resolve-from": "^5.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "spawn-wrap": "^2.0.0",
+ "test-exclude": "^6.0.0",
+ "yargs": "^15.0.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "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
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "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
+ },
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "y18n": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
+ "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "dev": true,
+ "requires": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ }
+ }
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "p-limit": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
+ "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^3.0.2"
+ },
+ "dependencies": {
+ "p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "requires": {
+ "yocto-queue": "^0.1.0"
+ }
+ }
+ }
+ },
+ "p-map": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+ "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
+ "dev": true,
+ "requires": {
+ "aggregate-error": "^3.0.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
+ },
+ "package-hash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz",
+ "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.15",
+ "hasha": "^5.0.0",
+ "lodash.flattendeep": "^4.4.0",
+ "release-zalgo": "^1.0.0"
+ }
+ },
+ "pako": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.4.tgz",
+ "integrity": "sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==",
+ "dev": true
+ },
+ "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
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "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
+ },
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.4.0.tgz",
+ "integrity": "sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==",
+ "dev": true
+ },
+ "pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "dev": true
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true
+ },
+ "pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "requires": {
+ "find-up": "^4.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "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
+ }
+ }
+ },
+ "process-on-spawn": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz",
+ "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==",
+ "dev": true,
+ "requires": {
+ "fromentries": "^1.2.0"
+ }
+ },
+ "psl": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true
+ },
+ "querystring": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+ "dev": true
+ },
+ "randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.13.7",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
+ "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==",
+ "dev": true
+ },
+ "release-zalgo": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
+ "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=",
+ "dev": true,
+ "requires": {
+ "es6-error": "^4.0.1"
+ }
+ },
+ "request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.3",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+ "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ },
+ "serialize-javascript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+ "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "dev": true,
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true
+ },
+ "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,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "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
+ },
+ "signal-exit": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+ "dev": true
+ },
+ "sinon": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.0.tgz",
+ "integrity": "sha512-ugA6BFmE+WrJdh0owRZHToLd32Uw3Lxq6E6LtNRU+xTVBefx632h03Q7apXWRsRdZAJ41LB8aUfn2+O4jsDNMw==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/commons": "^1.8.3",
+ "@sinonjs/fake-timers": "^9.1.2",
+ "@sinonjs/samsam": "^6.1.1",
+ "diff": "^5.0.0",
+ "nise": "^5.1.1",
+ "supports-color": "^7.2.0"
+ },
+ "dependencies": {
+ "@sinonjs/commons": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
+ "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
+ "dev": true,
+ "requires": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "sinon-chrome": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/sinon-chrome/-/sinon-chrome-3.0.1.tgz",
+ "integrity": "sha512-NTEFhyuiWEMnRmIqldUiA2DhKn2EqnZxyEk5Ez5rBXj+Nl54aJ0MEmF4wjltrxecxd8zlNLxyE0HyLabev9JsQ==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.16.3",
+ "sinon": "^7.2.3",
+ "urijs": "^1.18.2"
+ },
+ "dependencies": {
+ "@sinonjs/formatio": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz",
+ "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/commons": "^1",
+ "@sinonjs/samsam": "^3.1.0"
+ }
+ },
+ "@sinonjs/samsam": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz",
+ "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/commons": "^1.3.0",
+ "array-from": "^2.1.1",
+ "lodash": "^4.17.15"
+ }
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "nise": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz",
+ "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/formatio": "^3.2.1",
+ "@sinonjs/text-encoding": "^0.7.1",
+ "just-extend": "^4.0.2",
+ "lolex": "^5.0.1",
+ "path-to-regexp": "^1.7.0"
+ },
+ "dependencies": {
+ "lolex": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz",
+ "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/commons": "^1.7.0"
+ }
+ }
+ }
+ },
+ "path-to-regexp": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
+ "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
+ "dev": true,
+ "requires": {
+ "isarray": "0.0.1"
+ }
+ },
+ "sinon": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz",
+ "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/commons": "^1.4.0",
+ "@sinonjs/formatio": "^3.2.1",
+ "@sinonjs/samsam": "^3.3.3",
+ "diff": "^3.5.0",
+ "lolex": "^4.2.0",
+ "nise": "^1.5.2",
+ "supports-color": "^5.5.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "spawn-wrap": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz",
+ "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==",
+ "dev": true,
+ "requires": {
+ "foreground-child": "^2.0.0",
+ "is-windows": "^1.0.2",
+ "make-dir": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "which": "^2.0.1"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "sshpk": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+ "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+ "dev": true,
+ "requires": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ }
+ },
+ "string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
+ "strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true
+ },
+ "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
+ },
+ "style-mod": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz",
+ "integrity": "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "requires": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "text-encoding": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz",
+ "integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "dev": true,
+ "requires": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "tslib": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+ "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+ "dev": true
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true
+ },
+ "type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true
+ },
+ "type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true
+ },
+ "typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "dev": true,
+ "requires": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "urijs": {
+ "version": "1.19.11",
+ "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz",
+ "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==",
+ "dev": true
+ },
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "dev": true
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "w3c-keyname": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.4.tgz",
+ "integrity": "sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw==",
+ "dev": true
+ },
+ "webcrypto-core": {
+ "version": "0.1.27",
+ "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-0.1.27.tgz",
+ "integrity": "sha512-r0MSFxvqaIjoqIKerm80P9+7n1dWBG88PYnshJk57J4uZuXlqNX8yQixrEIe3CGqrJ7xwfGM2SQGR4AlJYr02g==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.7.1"
+ }
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "whatwg-url": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz",
+ "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "^4.7.0",
+ "tr46": "^1.0.1",
+ "webidl-conversions": "^4.0.2"
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+ "dev": true
+ },
+ "workerpool": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
+ "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "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
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "dev": true,
+ "requires": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "requires": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "20.2.4",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "dev": true
+ },
+ "yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true
+ },
+ "decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "dev": true
+ }
+ }
+ },
+ "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
+ }
+ }
+}
diff --git a/chromium/package.json b/chromium/package.json
new file mode 100644
index 000000000000..8918b2b89a60
--- /dev/null
+++ b/chromium/package.json
@@ -0,0 +1,35 @@
+{
+ "name": "https-everywhere",
+ "version": "1.0.0",
+ "description": "",
+ "main": "utils.js",
+ "devDependencies": {
+ "atob": "^2.0.3",
+ "btoa": "^1.1.2",
+ "chai": "^4.2.0",
+ "coveralls": "^3.1.0",
+ "codemirror": "~6.0.1",
+ "fetch-mock": "^9.10.7",
+ "mocha": "^10.0.0",
+ "nan": "^2.14.1",
+ "node-webcrypto-ossl": "^1.0.49",
+ "nyc": "^15.1.0",
+ "pako": "~2.0.2",
+ "sinon": "^14.0.0",
+ "sinon-chrome": "^3.0.1",
+ "text-encoding": "^0.7.0"
+ },
+ "scripts": {
+ "test": "mocha",
+ "cover": "nyc --reporter=html --reporter=text mocha",
+ "report": "nyc report --reporter=text-lcov | coveralls"
+ },
+ "nyc": {
+ "exclude": [
+ "external"
+ ]
+ },
+ "keywords": [],
+ "author": "",
+ "license": "GPL-2.0+"
+}
diff --git a/chromium/pages/base.css b/chromium/pages/base.css
new file mode 100644
index 000000000000..92adbf8a2dd6
--- /dev/null
+++ b/chromium/pages/base.css
@@ -0,0 +1,46 @@
+:root {
+ --https-blue: #0a84ff;
+ --darker-blue: #0060df;
+ --text-main: #000;
+ --text-secondary: #464646;
+ --light-grey: #ececec;
+ --space: 5px;
+ --font: 'Lucida Grande', 'Segoe UI', Tahoma, 'DejaVu Sans', Arial, sans-serif;
+ --code-font: 'VeraMono';
+}
+
+/*--------------------------------------------------------------
+# Layout
+--------------------------------------------------------------*/
+.grid {
+ display: grid;
+ grid-template-columns: 1fr 1fr 1fr;
+ row-gap: 16px;
+}
+
+/*--------------------------------------------------------------
+# Typography
+--------------------------------------------------------------*/
+.font {
+ font-family: var(--font);
+}
+
+/*--------------------------------------------------------------
+# Elements
+--------------------------------------------------------------*/
+.button {
+ border: var(--https-blue) solid 1px;
+ color: var(--text-main);
+ display: block;
+ font-size: 12px;
+ font-weight: bold;
+ margin: var(--space) auto;
+ padding: 10px;
+ text-align: center;
+ text-decoration: none;
+}
+
+.button:hover {
+ background-color: var(--darker-blue);
+ color: #fff;
+}
diff --git a/chromium/pages/cancel/index.html b/chromium/pages/cancel/index.html
new file mode 100644
index 000000000000..ec2518437350
--- /dev/null
+++ b/chromium/pages/cancel/index.html
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+ ⚠ HTTPS Everywhere ⚠
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/chromium/pages/cancel/style.css b/chromium/pages/cancel/style.css
new file mode 100644
index 000000000000..aeba151a0749
--- /dev/null
+++ b/chromium/pages/cancel/style.css
@@ -0,0 +1,130 @@
+@import "../main.css";
+
+body {
+ display: grid;
+ grid-template-columns: 1fr 1fr 1fr;
+ margin: 2% auto;
+ font-size: 12pt;
+ font-family: sans-serif;
+ line-height: 150%;
+ row-gap: 16px;
+}
+
+/*---------
+# GRID LAYOUT
+---------*/
+.banner {
+ grid-column: 2;
+ grid-row: 1;
+}
+.explainer {
+ grid-column: 2;
+ grid-row: 2;
+}
+.copy_block {
+ grid-column: 2;
+ grid-row: 3;
+}
+.button_options {
+ grid-column: 2;
+ grid-row: 4;
+}
+
+h1 {
+ display: block;
+}
+
+h1 img {
+ width: 100%;
+ height: auto;
+}
+
+#url-paragraph {
+ display: inline-flex;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.ease_button {
+ background-color: #ec1e1e;
+ border: 1px solid #ec1e1e;
+ border-radius: 4px;
+ color: #fff;
+ cursor: pointer;
+ padding: 0.5em 1em;
+ float: none;
+ font-size: 12pt;
+ font-weight: normal;
+ margin: 8px 0;
+ line-height: 150%;
+}
+
+button:last-child {
+ margin: 0;
+}
+
+#url-value{
+ float: left;
+ font-weight: bold;
+ margin: 2% 2% 0 0;
+}
+#copy-url, #open-url-button{
+ background-color: var(--light-grey) !important;
+ border: 1px solid var(--text-secondary) !important;
+}
+#copy-url {
+ color: var(--text-secondary) !important;
+ font-size: 14px;
+}
+#open-url-button {
+ color: #666666 !important;
+}
+#copy-url:hover, #open-url-button:hover {
+ background-color: var(--text-secondary) !important;
+ border: 1px solid var(--text-secondary) !important;
+ color: var(--light-grey) !important;
+}
+
+@media screen and (max-width: 800px) {
+ body {
+ grid-template-columns: 1fr;
+ margin: 5%;
+ }
+ .banner {
+ grid-row: 1;
+ }
+ .explainer {
+ grid-row: 2;
+ }
+ .copy_block {
+ grid-row: 3;
+ }
+ .button_options {
+ grid-row: 4;
+ }
+ .ease_button {
+ width: 100%;
+ margin: 8px 0;
+ }
+}
+
+@media (prefers-color-scheme: dark) {
+ body {
+ background-color: #202023;
+ color: #f9f9fa;
+ }
+
+ a {
+ color: #45a1ff;
+ }
+
+ .ease_button {
+ color: #202023;
+ }
+
+ .ease_button:hover {
+ background-color: #202023;
+ border-color: #ec1e1e;
+ }
+}
diff --git a/chromium/pages/cancel/ux.js b/chromium/pages/cancel/ux.js
new file mode 100644
index 000000000000..d13dfdfb711a
--- /dev/null
+++ b/chromium/pages/cancel/ux.js
@@ -0,0 +1,124 @@
+/* global sendMessage */
+
+"use strict";
+
+let observer;
+document.addEventListener("DOMContentLoaded", () => {
+ const explainer = document.querySelector("[data-i18n=cancel_he_blocking_explainer]");
+ observer = new MutationObserver(() => {
+ replaceLink(explainer);
+ });
+ if (explainer.innerText.length > 0) {
+ replaceLink(explainer);
+ } else {
+ observer.observe(explainer, {childList: true});
+ }
+ displayURL();
+});
+
+function replaceLink(explainer) {
+ observer.disconnect();
+ const linkText = chrome.i18n.getMessage("cancel_he_blocking_network");
+ const link = document.createElement("a");
+ link.classList.add("wikilink");
+ link.href = "https://en.wikipedia.org/wiki/Downgrade_attack";
+ link.innerText = linkText;
+ explainer.innerHTML = explainer.innerHTML.replace(linkText, link.outerHTML);
+
+ /*
+ In response to translation of i18n string "cancel_he_blocking_network".
+ Within context of the paragraph and as a standalone string can be interpreted differently
+ langauge to language.
+
+ So if link fails to swap in replace, this conditional is triggered
+ */
+ if (document.getElementsByClassName("wikilink").length === 0) {
+ link.innerText = linkText;
+ explainer.after(link);
+ }
+
+}
+
+function displayURL() {
+ const searchParams = new URLSearchParams(window.location.search);
+ const originURL = searchParams.get('originURL');
+ const originURLLink = document.getElementById('url-value');
+ const openURLButton = document.getElementById('open-url-button');
+ const openHttpOnce = document.getElementById('http-once-button');
+ const copyButton = document.getElementById('copy-url');
+ const url = new URL(originURL);
+
+ originURLLink.innerText = originURL;
+ originURLLink.href = originURL;
+
+ openURLButton.addEventListener("click", function() {
+ sendMessage("disable_on_site", url.host, () => {
+ window.location = originURL;
+ });
+
+ return false;
+ });
+
+ // Copy URL Feature on EASE
+
+ function copyLinkAlternate() {
+ let isSuccessful = false;
+
+ const sel = window.getSelection();
+
+ try {
+ sel.removeAllRanges();
+
+ const range = document.createRange();
+ range.selectNode(originURLLink);
+
+ sel.addRange(range);
+
+ isSuccessful = document.execCommand("copy");
+
+ sel.removeAllRanges();
+
+ return isSuccessful;
+ } catch (err) {
+ console.error(err);
+
+ sel.removeAllRanges();
+
+ return false;
+ }
+ }
+
+ async function copyLink() {
+ try {
+ await navigator.clipboard.writeText(originURL);
+ return true;
+ } catch (err) {
+ return copyLinkAlternate();
+ }
+ }
+
+ let restoreTimeout = null;
+
+ copyButton.addEventListener("click", async () => {
+ if (await copyLink()) {
+ copyButton.innerText = chrome.i18n.getMessage("cancel_copied_url");
+
+ if (restoreTimeout !== null) {
+ clearTimeout(restoreTimeout);
+ }
+
+ restoreTimeout = setTimeout(() => {
+ copyButton.innerText = chrome.i18n.getMessage("cancel_copy_url");
+ restoreTimeout = null;
+ }, 1500);
+ }
+ });
+
+ openHttpOnce.addEventListener("click", function() {
+ sendMessage("disable_on_site_once", url.host, () => {
+ window.location = originURL;
+ });
+
+ return false;
+ });
+}
diff --git a/chromium/pages/debugging-rulesets/index.html b/chromium/pages/debugging-rulesets/index.html
new file mode 100644
index 000000000000..d3e91227f4c3
--- /dev/null
+++ b/chromium/pages/debugging-rulesets/index.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Enter ruleset XML below and click save when ready. These rulesets will be immediately activated upon saving, and will persist across restarts.
+ Warning: This should only be used for debugging rulesets. This feature is not guaranteed to work reliably for regular usage.
+ Note: Due to a bug in Chromium, it may be necessary to close the options ui before saving.
+
+ There are unsaved changes! Be sure to save them for them to take effect.
+
+
+ Saved!
+
+
+
+
diff --git a/chromium/pages/debugging-rulesets/style.css b/chromium/pages/debugging-rulesets/style.css
new file mode 100644
index 000000000000..e424c70b5a7b
--- /dev/null
+++ b/chromium/pages/debugging-rulesets/style.css
@@ -0,0 +1,40 @@
+.cm-s-main{
+ width: 100%;
+ height: 500px;
+}
+
+.cm-s-saved{
+ border: 1px solid black;
+}
+
+.cm-s-unsaved{
+ border: 1px solid red;
+}
+
+.section-explainer{
+ margin-bottom: 5px;
+}
+
+.section-header{
+ margin-bottom: 10px;
+}
+
+.section-header-span{
+ border-bottom: 1px solid #ccc;
+ font-size: 15px;
+}
+
+#saved-text{
+ display: none;
+ color: green;
+ font-weight: bold;
+ margin: 30px;
+}
+
+#unsaved-text{
+ font-weight: bold;
+ margin: 10px 0px;
+ color: red;
+ visibility: hidden;
+ text-align: center;
+}
diff --git a/chromium/pages/debugging-rulesets/ux.js b/chromium/pages/debugging-rulesets/ux.js
new file mode 100644
index 000000000000..0df93d8dd080
--- /dev/null
+++ b/chromium/pages/debugging-rulesets/ux.js
@@ -0,0 +1,46 @@
+/* global sendMessage, CodeMirror */
+
+"use strict";
+
+const savedTextElement = document.getElementById("saved-text");
+const unsavedTextElement = document.getElementById("unsaved-text");
+const savedTitle = "Debugging Rulesets";
+const unsavedTitle = "* Debugging Rulesets";
+
+document.title = savedTitle;
+
+const cm = CodeMirror.fromTextArea(
+ document.getElementById("codemirror-textarea"),
+ {
+ mode: "xml",
+ theme: "default main saved"
+ }
+);
+
+let valueHasChanged = false;
+sendMessage("get_option", { debugging_rulesets: "" }, item => {
+ cm.setValue(item.debugging_rulesets);
+ cm.on("change", cm => {
+ if (!(valueHasChanged)) {
+ valueHasChanged = true;
+ document.title = unsavedTitle;
+ cm.setOption("theme", "default main unsaved");
+ unsavedTextElement.style.visibility = "visible";
+ }
+ });
+});
+
+document.getElementById("save-button").addEventListener("click", e => {
+ e.preventDefault();
+ sendMessage("set_option", { debugging_rulesets: cm.getValue() }, () => {
+ savedTextElement.style.display = "block";
+ setTimeout(() => {
+ savedTextElement.style.display = "none";
+ }, 1000);
+
+ valueHasChanged = false;
+ document.title = savedTitle;
+ cm.setOption("theme", "default main saved");
+ unsavedTextElement.style.visibility = "hidden";
+ });
+});
diff --git a/chromium/pages/main.css b/chromium/pages/main.css
new file mode 100644
index 000000000000..2772c46141e7
--- /dev/null
+++ b/chromium/pages/main.css
@@ -0,0 +1,21 @@
+/*--------------------------------------------------------------
+>>> TABLE OF CONTENTS:
+----------------------------------------------------------------
+# Base
+ - Layout
+ - Typography
+ - Elements
+ - Links
+# Utilities
+ - Accessibility
+
+--------------------------------------------------------------*/
+
+/*--------------------------------------------------------------
+# Base
+--------------------------------------------------------------*/
+@import "base.css";
+
+/* Utilities - TBA
+--------------------------------------------- */
+
diff --git a/chromium/pages/options/index.html b/chromium/pages/options/index.html
new file mode 100644
index 000000000000..b6bdc337cfb3
--- /dev/null
+++ b/chromium/pages/options/index.html
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/chromium/pages/options/style.css b/chromium/pages/options/style.css
new file mode 100644
index 000000000000..032a7bad7a44
--- /dev/null
+++ b/chromium/pages/options/style.css
@@ -0,0 +1,264 @@
+@import "../main.css";
+
+body{
+ display: grid;
+ grid-template-columns: 1fr 1fr 1fr;
+}
+
+/*---------
+# GRID LAYOUT
+---------*/
+.header-wrapper, .section-wrapper {
+ margin: auto;
+}
+.header-wrapper {
+ display: inline-flex;
+ grid-column: 2;
+ grid-row: 1;
+}
+.section-wrapper {
+ grid-column: 2;
+ grid-row: 2;
+}
+#add-disabled-site-wrapper {
+ float: left;
+}
+#add-update-channel-wrapper {
+ display: inline-block;
+}
+
+.settings-wrapper{
+ margin: 10px 0 0 0;
+}
+
+.settings-wrapper#update-wrapper{
+ margin-bottom: 20px;
+}
+
+.settings-wrapper#show-devtools-tab-wrapper{
+ margin-bottom: 20px;
+}
+
+/** User rules Option**/
+.user-rules-wrapper-header {
+ font-weight: bold;
+ padding-left: 5px;
+}
+.user-rules-list-item:last-of-type {
+ border-bottom: none;
+}
+.user-rules-list-item {
+ border-bottom: 1px solid #ccc;
+ display: inline-flex;
+ margin-left: 5%;
+ width: 80%;
+}
+.user-rules-list-item p {
+ width: 100%;
+}
+
+/** Disabled Sites Option**/
+#add-disabled-site-invalid-host {
+ font-weight: bold;
+ color: red;
+ display: none;
+}
+.disabled-rules-wrapper-header {
+ font-weight: bold;
+ padding-left: 5px;
+}
+img.remove{
+ cursor: pointer;
+ float: right;
+ height: 15px;
+ margin-top: -34px;
+ width: 15px;
+}
+.disabled-rule-list-item:last-of-type {
+ border-bottom: none;
+}
+.disabled-rule-list-item {
+ border-bottom: 1px solid #ccc;
+ clear: both;
+}
+.disabled-rule-list-item p {
+ width: 80%;
+ word-wrap: anywhere;
+}
+
+.section-header{
+ margin-bottom: 10px;
+}
+
+#import{
+ margin-bottom: 10px;
+ float: right;
+}
+
+#import-confirmed{
+ display: none;
+}
+
+.section-header-span{
+ cursor: pointer;
+ padding: 8px;
+ margin-left: 0 !important;
+ margin-right: var(--space) !important;
+ display: inline-block;
+}
+
+.section-header-span.active{
+ background-color: var(--darker-blue);
+ color: #FFF;
+}
+.section-header-span.inactive{
+ background-color: var(--light-grey);
+}
+.section-header-span.inactive:hover {
+ background-color: var(--darker-blue);
+}
+
+.update-channel{
+ border: 1px solid grey;
+ border-radius: 20px;
+ margin-top: 30px;
+ margin-bottom: 30px;
+ padding: 6px;
+}
+
+.update-channel-name{
+ font-weight: bold;
+ font-size: 14px;
+ margin: 10px;
+}
+
+.update-channel-column-left {
+ width: 89px;
+ float: left;
+ font-size: 13px;
+ text-align: right;
+ margin-right: 10px;
+ min-height: 1px;
+}
+
+.update-channel-column-right {
+ float: left;
+ width: 380px;
+}
+
+textarea.update-channel-jwk {
+ width: 367px;
+ height: 250px;
+ resize: vertical;
+}
+
+input.update-channel-path-prefix, input.update-channel-scope {
+ width: 367px;
+}
+
+div.update-channel-row-scope {
+ margin-top: 3px;
+}
+
+.update-channel-column-right button {
+ float: right;
+ margin: 10px;
+ border-radius: 7px;
+}
+
+button#add-update-channel, button#add-disabled-site {
+ float: right;
+ height: 30px;
+ margin: 0px 10px 10px 10px;
+ padding: 6px;
+}
+
+input#update-channel-name, input#disabled-site {
+ float: right;
+}
+
+.clearer{
+ clear: both;
+}
+
+.update-channel-last-updated {
+ float: right;
+ font-weight: lighter;
+ font-size: 10px;
+}
+
+div#update-channels-error, div#update-channels-warning {
+ margin-top: 20px;
+ font-weight: bold;
+ padding: 10px;
+ border-radius: 10px;
+}
+
+div#update-channels-error {
+ background-color: #CC3333;
+ display: none;
+ color: white;
+}
+
+div#update-channels-warning {
+ background-color: #FFCC00;
+ font-color: black;
+}
+
+#update-channels-error-text{
+ display: inline-block;
+ width: 460px;
+}
+
+img#update-channels-error-hide {
+ float: right;
+}
+
+div#update-channels-last-checked {
+ margin-top: 10px;
+ float: right;
+ font-weight: bold;
+ font-size: 10px;
+}
+
+#update-channels-list {
+ display: inline-block;
+}
+
+@keyframes flash {
+ from {
+ background: #fc0;
+ }
+ to {
+ background: transparent;
+ }
+}
+
+#secretArea {
+ border-radius: 5px;
+ padding: 5px;
+}
+
+.hidden {
+ display: none
+}
+
+.flash {
+ animation: flash 1s ease-out;
+}
+
+@media (prefers-color-scheme: dark) {
+ body {
+ background-color: #202023;
+ color: #f9f9fa;
+ }
+
+ .section-header-span, div#update-channels-warning {
+ color: #000;
+ }
+
+ textarea, input[type=text] {
+ background-color: #202023;
+ color: #f9f9fa;
+ }
+}
diff --git a/chromium/pages/options/ux.js b/chromium/pages/options/ux.js
new file mode 100644
index 000000000000..07d94dc9928d
--- /dev/null
+++ b/chromium/pages/options/ux.js
@@ -0,0 +1,422 @@
+/* global sendMessage */
+/* global getOption_ */
+/* global e */
+/* global show, hide */
+
+"use strict";
+
+document.addEventListener("DOMContentLoaded", () => {
+ const secretArea = document.getElementById('secretArea');
+
+ const onKeyDownHandler = evt => {
+ if (evt.ctrlKey && evt.key === 'z') {
+ secretArea.classList.remove('hidden');
+ secretArea.classList.add('flash');
+
+ sendMessage('set_option', { developerMode: true });
+
+ document.removeEventListener('keydown', onKeyDownHandler);
+
+ evt.preventDefault();
+ }
+ };
+
+ sendMessage('get_option', { developerMode: false }, item => {
+ if (item.developerMode) {
+ secretArea.classList.remove('hidden');
+ } else {
+ document.addEventListener('keydown', onKeyDownHandler);
+ }
+ });
+
+ const autoUpdateRulesets = document.getElementById("autoUpdateRulesets");
+ const enableMixedRulesets = document.getElementById("enableMixedRulesets");
+ const showDevtoolsTab = document.getElementById("showDevtoolsTab");
+
+ const defaultOptions = {
+ autoUpdateRulesets: true,
+ enableMixedRulesets: false,
+ showDevtoolsTab: true
+ };
+
+ sendMessage("get_option", defaultOptions, item => {
+ autoUpdateRulesets.checked = item.autoUpdateRulesets;
+ enableMixedRulesets.checked = item.enableMixedRulesets;
+ showDevtoolsTab.checked = item.showDevtoolsTab;
+
+ autoUpdateRulesets.addEventListener("change", () => {
+ sendMessage("set_option", { autoUpdateRulesets: autoUpdateRulesets.checked });
+ });
+
+ enableMixedRulesets.addEventListener("change", () => {
+ sendMessage("set_option", { enableMixedRulesets: enableMixedRulesets.checked });
+ });
+
+ showDevtoolsTab.addEventListener("change", () => {
+ sendMessage("set_option", { showDevtoolsTab: showDevtoolsTab.checked });
+ });
+ });
+
+ function onlyShowSection(sectionId) {
+ document.querySelectorAll('.section-wrapper').forEach(sw => {
+ sw.style.display = "none";
+ });
+ document.getElementById(sectionId).style.display = "block";
+ }
+ onlyShowSection('general-settings-wrapper');
+
+ document.querySelectorAll('.section-header-span').forEach(shs => {
+ shs.addEventListener("click", () => {
+ document.querySelectorAll('.section-header-span').forEach(shs => {
+ shs.classList.remove("active");
+ shs.classList.add("inactive");
+ });
+ shs.classList.remove("inactive");
+ shs.classList.add("active");
+ onlyShowSection(shs.dataset.show);
+ });
+ });
+
+ function create_update_channel_element(update_channel, last_updated, locked) {
+ let ruleset_version_string;
+
+ if(last_updated) {
+ const ruleset_date = new Date(last_updated * 1000);
+ ruleset_version_string = ruleset_date.getUTCFullYear() + "." + (ruleset_date.getUTCMonth() + 1) + "." + ruleset_date.getUTCDate();
+ } else {
+ ruleset_version_string = "n/a";
+ }
+
+ const update_channel_div = document.createElement('div');
+ update_channel_div.className = "update-channel";
+
+ const update_channel_name = document.createElement('div');
+ update_channel_name.className = "update-channel-name";
+ update_channel_name.innerText = update_channel.name;
+ update_channel_div.appendChild(update_channel_name);
+ const update_channel_last_updated = document.createElement('div');
+ update_channel_last_updated.className = "update-channel-last-updated";
+ update_channel_last_updated.innerText = chrome.i18n.getMessage("options_storedRulesetsVersion") + ruleset_version_string;
+ update_channel_name.appendChild(update_channel_last_updated);
+
+ const update_channel_row_format = document.createElement('div');
+ update_channel_row_format.className = "update-channel-row-format";
+ update_channel_div.appendChild(update_channel_row_format);
+ const update_channel_format_column_left = document.createElement('div');
+ update_channel_format_column_left.className = "update-channel-column-left";
+ update_channel_format_column_left.innerText = "Format:";
+ update_channel_row_format.appendChild(update_channel_format_column_left);
+ const update_channel_format_column_right = document.createElement('div');
+ update_channel_format_column_right.className = "update-channel-column-right";
+ update_channel_row_format.appendChild(update_channel_format_column_right);
+ const update_channel_format = document.createElement('select');
+ update_channel_format.className = "update-channel-format";
+ update_channel_format.setAttribute("data-name", update_channel.name);
+ update_channel_format.disabled = locked;
+ update_channel_format_column_right.appendChild(update_channel_format);
+ const update_channel_format_option_ruleset = document.createElement('option');
+ update_channel_format_option_ruleset.value = "ruleset";
+ update_channel_format_option_ruleset.innerText = "ruleset";
+ update_channel_format_option_ruleset.defaultSelected = true;
+ update_channel_format_option_ruleset.selected = (update_channel.format == "ruleset");
+ update_channel_format.appendChild(update_channel_format_option_ruleset);
+ const update_channel_format_option_bloom = document.createElement('option');
+ update_channel_format_option_bloom.value = "bloom";
+ update_channel_format_option_bloom.innerText = "bloom";
+ update_channel_format_option_bloom.selected = (update_channel.format == "bloom");
+ update_channel_format.appendChild(update_channel_format_option_bloom);
+
+ const update_channel_row_jwk = document.createElement('div');
+ update_channel_row_jwk.className = "update-channel-row-jwk";
+ update_channel_div.appendChild(update_channel_row_jwk);
+ const update_channel_jwk_column_left = document.createElement('div');
+ update_channel_jwk_column_left.className = "update-channel-column-left";
+ update_channel_jwk_column_left.innerText = "JWK:";
+ update_channel_row_jwk.appendChild(update_channel_jwk_column_left);
+ const update_channel_jwk_column_right = document.createElement('div');
+ update_channel_jwk_column_right.className = "update-channel-column-right";
+ update_channel_row_jwk.appendChild(update_channel_jwk_column_right);
+ const update_channel_jwk = document.createElement('textarea');
+ update_channel_jwk.className = "update-channel-jwk";
+ update_channel_jwk.setAttribute("data-name", update_channel.name);
+ update_channel_jwk.disabled = locked;
+ update_channel_jwk.innerText = JSON.stringify(update_channel.jwk);
+ update_channel_jwk_column_right.appendChild(update_channel_jwk);
+
+ const update_channel_row_path_prefix = document.createElement('div');
+ update_channel_row_path_prefix.className = "update-channel-row-path-prefix";
+ update_channel_div.appendChild(update_channel_row_path_prefix);
+ const update_channel_path_prefix_column_left = document.createElement('div');
+ update_channel_path_prefix_column_left.className = "update-channel-column-left";
+ update_channel_path_prefix_column_left.innerText = "Path Prefix:";
+ update_channel_row_path_prefix.appendChild(update_channel_path_prefix_column_left);
+ const update_channel_path_prefix_column_right = document.createElement('div');
+ update_channel_path_prefix_column_right.className = "update-channel-column-right";
+ update_channel_row_path_prefix.appendChild(update_channel_path_prefix_column_right);
+ const update_channel_path_prefix = document.createElement('input');
+ update_channel_path_prefix.setAttribute("type", "text");
+ update_channel_path_prefix.className = "update-channel-path-prefix";
+ update_channel_path_prefix.setAttribute("data-name", update_channel.name);
+ update_channel_path_prefix.disabled = locked;
+ update_channel_path_prefix.value = update_channel.update_path_prefix;
+ update_channel_path_prefix_column_right.appendChild(update_channel_path_prefix);
+
+ let clearer = document.createElement('div');
+ clearer.className = "clearer";
+ update_channel_div.appendChild(clearer);
+
+ const update_channel_row_scope = document.createElement('div');
+ if(update_channel.format == "bloom") {
+ update_channel_row_scope.style.display = "none";
+ }
+ update_channel_row_scope.className = "update-channel-row-scope";
+ update_channel_div.appendChild(update_channel_row_scope);
+ const update_channel_scope_column_left = document.createElement('div');
+ update_channel_scope_column_left.className = "update-channel-column-left";
+ update_channel_scope_column_left.innerText = "Scope:";
+ update_channel_row_scope.appendChild(update_channel_scope_column_left);
+ const update_channel_scope_column_right = document.createElement('div');
+ update_channel_scope_column_right.className = "update-channel-column-right";
+ update_channel_row_scope.appendChild(update_channel_scope_column_right);
+ const update_channel_scope = document.createElement('input');
+ update_channel_scope.setAttribute("type", "text");
+ update_channel_scope.className = "update-channel-scope";
+ update_channel_scope.setAttribute("data-name", update_channel.name);
+ update_channel_scope.disabled = locked;
+ update_channel_scope.value = update_channel.scope;
+ update_channel_scope_column_right.appendChild(update_channel_scope);
+
+ const update_channel_row_controls = document.createElement('div');
+ update_channel_row_controls.className = "update-channel-row-controls";
+ update_channel_div.appendChild(update_channel_row_controls);
+ const update_channel_controls_column_left = document.createElement('div');
+ update_channel_controls_column_left.className = "update-channel-column-left";
+ update_channel_controls_column_left.innerText = " ";
+ update_channel_row_controls.appendChild(update_channel_controls_column_left);
+ const update_channel_controls_column_right = document.createElement('div');
+ update_channel_controls_column_right.className = "update-channel-column-right";
+ update_channel_row_controls.appendChild(update_channel_controls_column_right);
+ const update_channel_update = document.createElement('button');
+ update_channel_update.className = "update-channel-update";
+ update_channel_update.setAttribute("data-name", update_channel.name);
+ update_channel_update.disabled = locked;
+ update_channel_update.innerText = chrome.i18n.getMessage("options_update");
+ update_channel_controls_column_right.appendChild(update_channel_update);
+ const update_channel_delete = document.createElement('button');
+ update_channel_delete.className = "update-channel-update";
+ update_channel_delete.setAttribute("data-name", update_channel.name);
+ update_channel_delete.disabled = locked;
+ update_channel_delete.innerText = chrome.i18n.getMessage("options_delete");
+ update_channel_controls_column_right.appendChild(update_channel_delete);
+
+ clearer = document.createElement('div');
+ clearer.className = "clearer";
+ update_channel_div.appendChild(clearer);
+
+ update_channel_format.addEventListener("change", () => {
+ if(update_channel_format.value == "bloom") {
+ update_channel_row_scope.style.display = "none";
+ } else {
+ update_channel_row_scope.style.display = "block";
+ }
+ });
+ update_channel_delete.addEventListener("click", () => {
+ sendMessage("delete_update_channel", update_channel.name, () => {
+ render_update_channels();
+ });
+ });
+
+ update_channel_update.addEventListener("click", () => {
+ sendMessage("update_update_channel", {
+ name: update_channel.name,
+ format: update_channel_format.value,
+ jwk: JSON.parse(update_channel_jwk.value),
+ update_path_prefix: update_channel_path_prefix.value,
+ scope: update_channel_scope.value
+ }, () => {
+ render_update_channels();
+ });
+ });
+
+ return update_channel_div;
+ }
+
+ function render_update_channels() {
+ const update_channels_list = document.getElementById("update-channels-list");
+ while(update_channels_list.firstChild) {
+ update_channels_list.removeChild(update_channels_list.firstChild);
+ }
+
+ sendMessage("get_pinned_update_channels", null, item => {
+ for(const update_channel of item.update_channels) {
+ update_channels_list.appendChild(
+ create_update_channel_element(
+ update_channel,
+ item.last_updated[update_channel.name],
+ true,
+ )
+ );
+
+ }
+ });
+
+ sendMessage("get_stored_update_channels", null, item => {
+ for(const update_channel of item.update_channels) {
+ update_channels_list.appendChild(
+ create_update_channel_element(
+ update_channel,
+ item.last_updated[update_channel.name],
+ update_channel.locked === true,
+ )
+ );
+ }
+ });
+ }
+ render_update_channels();
+
+ const add_update_channel = document.getElementById("add-update-channel");
+ const update_channel_name_div = document.getElementById("update-channel-name");
+ const update_channels_error_text = document.getElementById("update-channels-error-text");
+ const update_channels_error = document.getElementById("update-channels-error");
+ update_channel_name_div.setAttribute("placeholder", chrome.i18n.getMessage("options_enterUpdateChannelName"));
+
+ function displayError(text) {
+ update_channels_error_text.innerText = text;
+ update_channels_error.style.display = "block";
+ window.scrollTo(0,0);
+ }
+
+ // Get a list of user Rules
+ sendMessage("get_user_rules", null, userRules => {
+ let user_rules_parent = e("user-rules-wrapper");
+
+ if ( 0 === userRules.length) {
+ hide(user_rules_parent);
+ return ;
+ }
+
+ // img element "remove button"
+ let templateRemove = document.createElement("img");
+ templateRemove.src = chrome.runtime.getURL("images/remove.png");
+ templateRemove.className = "remove";
+
+ for (const userRule of userRules) {
+ let user_rule_host = document.createElement("div");
+ let user_rule_name = document.createElement("p");
+ let remove = templateRemove.cloneNode(true);
+
+ user_rule_host.className = "user-rules-list-item";
+ user_rule_name.className = "user-rules-list-item-single";
+ user_rule_name.innerText = userRule.name;
+ user_rule_host.appendChild(user_rule_name);
+ user_rules_parent.appendChild(user_rule_host);
+ user_rule_host.appendChild(remove);
+
+ remove.addEventListener("click", () => {
+ // assume the removal is successful and hide ui element
+ hide( user_rule_host );
+ // remove the user rule
+ sendMessage("remove_rule", { ruleset: userRule, src: 'options' });
+ });
+ }
+ });
+
+ // HTTPS Everywhere Sites Disabled section in General Settings module
+ getOption_("disabledList", [], function(item) {
+ let rule_host_parent = e("disabled-rules-wrapper");
+
+ // img element "remove button"
+ let templateRemove = document.createElement("img");
+ templateRemove.src = chrome.runtime.getURL("images/remove.png");
+ templateRemove.className = "remove";
+
+ if( item ) {
+ for (const key of item.disabledList) {
+ let rule_host = document.createElement("div");
+ let remove = templateRemove.cloneNode(true);
+ let rule_host_site_name = document.createElement("p");
+
+ rule_host.className = "disabled-rule-list-item";
+ rule_host_site_name.className = "disabled-rule-list-item_single";
+ rule_host_site_name.innerText = key;
+ rule_host.appendChild( rule_host_site_name);
+ rule_host_parent.appendChild(rule_host);
+ rule_host.appendChild(remove);
+
+ remove.addEventListener("click", () => {
+ hide( rule_host );
+ sendMessage("enable_on_site", key);
+ });
+ }
+ }
+ });
+
+ const add_disabled_site = document.getElementById("add-disabled-site");
+ const disabled_site_input = document.getElementById("disabled-site");
+ const add_disabled_site_invalid_host = document.getElementById('add-disabled-site-invalid-host');
+ disabled_site_input.setAttribute("placeholder", chrome.i18n.getMessage("options_enterDisabledSite"));
+ function isValidHost(host) {
+ try {
+ new URL(`http://${host}/`);
+ return true;
+ } catch {
+ return false;
+ }
+ }
+ add_disabled_site.addEventListener("click", function() {
+ const host = disabled_site_input.value;
+
+ if (isValidHost(host)) {
+ hide(add_disabled_site_invalid_host);
+ sendMessage("disable_on_site", disabled_site_input.value, okay => {
+ if (okay) {
+ chrome.tabs.reload();
+ }
+ });
+ } else {
+ show(add_disabled_site_invalid_host);
+ }
+ });
+
+ add_update_channel.addEventListener("click", () => {
+ const update_channel_name = update_channel_name_div.value;
+ if(update_channel_name.trim() == "") {
+ displayError("Error: The update channel name is blank. Please enter another name.");
+ } else {
+ update_channel_name_div.value = "";
+ sendMessage("create_update_channel", update_channel_name, result => {
+ if(result == true) {
+ render_update_channels();
+ } else {
+ displayError("Error: There already exists an update channel with this name.");
+ }
+ });
+ }
+ });
+
+ const update_channels_error_hide = document.getElementById("update-channels-error-hide");
+ update_channels_error_hide.addEventListener("click", () => {
+ update_channels_error.style.display = "none";
+ });
+
+ const update_channels_last_checked = document.getElementById("update-channels-last-checked");
+ sendMessage("get_last_checked", null, last_checked => {
+ let last_checked_string;
+ if(last_checked) {
+ const last_checked_date = new Date(last_checked * 1000);
+ const options = {
+ year: '2-digit',
+ month: '2-digit',
+ day: '2-digit',
+ hour: '2-digit',
+ minute: '2-digit',
+ timeZoneName: 'short'
+ };
+ const customDateTime = new Intl.DateTimeFormat('default', options).format;
+ last_checked_string = customDateTime(last_checked_date);
+ } else {
+ last_checked_string = chrome.i18n.getMessage("options_updatesLastCheckedNever");
+ }
+ update_channels_last_checked.innerText = chrome.i18n.getMessage("options_updatesLastChecked") + last_checked_string;
+ });
+});
diff --git a/chromium/pages/popup/index.html b/chromium/pages/popup/index.html
new file mode 100644
index 000000000000..d9441f2d3e9d
--- /dev/null
+++ b/chromium/pages/popup/index.html
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+ Version:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/chromium/pages/popup/style.css b/chromium/pages/popup/style.css
new file mode 100644
index 000000000000..304f2f8bf23f
--- /dev/null
+++ b/chromium/pages/popup/style.css
@@ -0,0 +1,313 @@
+@import "../main.css";
+
+body {
+ color: var(--text-secondary);
+ font-family: 'Lucida Grande', 'Segoe UI', Tahoma, 'DejaVu Sans', Arial, sans-serif;
+ margin: 0;
+ max-width: 400px;
+ min-width: 360px;
+}
+
+header {
+ background-color: var(--light-grey);
+ color: var(--text-main);
+ display: flex;
+ padding: var(--space);
+}
+
+header h1 {
+ font-size: 2em;
+}
+
+header .logo-container {
+ margin: var(--space);
+ width: 85%;
+}
+
+header .logo-container img {
+ width: 100%;
+}
+
+header small {
+ color: #000;
+ display: block;
+ font-size: .70em;
+ font-weight: bold;
+ margin: 1%;
+ width: 100%;
+}
+
+h1 {
+ font-size: 16px;
+ margin: var(--space) auto
+}
+
+h2 {
+ clear: both;
+ font-size: 12px;
+ font-weight: normal;
+ margin: 0;
+}
+
+h3 {
+ font-size: 16px;
+}
+
+h1,
+h2 {
+ color: var(--text-main);
+}
+
+footer {
+ display: inline-flex;
+ margin: var(--space);
+}
+
+footer a.button {
+ margin: var(--space);
+}
+
+/* Elements */
+.settings_block {
+ padding: 5px 1em 20px 1em;
+ border-bottom: var(--light-grey) solid 1px;
+}
+
+.see_more__prompt {
+ color: var(--text-main);
+ cursor: pointer;
+ font-size: 12px;
+ float: right;
+ margin: 5px 0;
+ padding: 10px 0;
+}
+
+.see_more__arrow {
+ border: solid var(--darker-blue);
+ border-width: 0 3px 3px 0;
+ float: right;
+ margin-left: 10px;
+ margin-top: 3px;
+ padding: 3px;
+}
+
+.see_more__content.show p {
+ font-size: 12px;
+ margin: 10px 0;
+}
+
+.down {
+ transform: rotate(45deg);
+}
+
+.up {
+ transform: rotate(-135deg);
+}
+
+input[type=checkbox] {
+ opacity: 0;
+}
+
+label {
+ background: grey;
+ border-radius: 25px;
+ color: var(--text-main);
+ cursor: pointer;
+ display: block;
+ float: right;
+ font-weight: bold;
+ height: 30px;
+ position: relative;
+ text-indent: -400px;
+ width: 50px;
+}
+
+label:after {
+ background: #fff;
+ border-radius: 90px;
+ content: '';
+ height: 20px;
+ left: 5px;
+ position: absolute;
+ top: 5px;
+ transition: 0.3s; /* Acts on transform below */
+ width: 20px;
+}
+input:checked+label {
+ background: var(--https-blue);
+}
+/* position when checked*/
+input:checked+label:after {
+ left: calc(100% - 5px);
+ transform: translateX(-100%);
+}
+
+.label_nontoggle {
+ background: none;
+ border-radius: 0;
+ color: var(--text-main);
+ display: block;
+ font-weight: normal;
+ height: inherit;
+ position: relative;
+ text-indent: 0;
+ width: auto;
+}
+
+.label_nontoggle:after {
+ background: none;
+ border-radius: 0;
+ content: none;
+ height: auto;
+ left: initial;
+ position: relative;
+ top: initial;
+ transition: none;
+ width: auto;
+}
+
+/* Specific rules */
+.rule.checkbox {
+ clear: both;
+ margin: 5% auto;
+}
+
+.rule.checkbox .remove {
+ float: left;
+}
+
+.rule.checkbox label {
+ font-size: 12px;
+ font-weight: normal;
+ height: 25px;
+ text-indent: -285px;
+ width: 40px;
+}
+.rule.checkbox label:after {
+ border-radius: 20px;
+ height: 15px;
+ width: 15px;
+}
+
+#disable-on-this-site {
+ clear: both;
+}
+
+#disableButton {
+ display: block;
+}
+
+#HttpNowhere h1,
+#disableButton h1 {
+ float: left;
+}
+
+#RuleManagement {
+ padding: 5px 1em 10px 1em;
+}
+
+#settingsForThisSite h1 {
+ float: left;
+}
+
+#addRuleSection label,
+#addRuleSection button {
+ font-size: 14px;
+ width: 100%;
+}
+
+#addRuleSection input {
+ background: #fff;
+ border: 1px solid #000;
+ float: right;
+ margin: 5px auto;
+ padding: 5px;
+ width: 95%;
+}
+
+#new-rule-advanced,
+#new-rule-regular-text {
+ margin-top: 40px;
+}
+
+#HttpNowhere {
+ display: block;
+ padding: 5px 1em;
+}
+
+#StableRules h3 {
+ float: left;
+ margin: 10px;
+}
+#StableRules h2 {
+ margin-left: 10px;
+}
+#StableRules #RuleManagement--counter {
+ background: var(--darker-blue);
+ border-radius: 20px;
+ color: #fff;
+ display: block;
+ float: left;
+ font-size: 12px;
+ font-weight: bold;
+ height: 15px;
+ margin-top: 8px;
+ padding: 5px;
+ text-align: center;
+ width: 15px;
+}
+
+/* Event based */
+.see_more--clarified {
+ font-size: 12px;
+}
+
+/* Hide rules & options if the extension is off. */
+.disabled #RuleManagement,
+.disabled #HttpNowhere {
+ display: none;
+}
+
+/* By default the "Add a rule" link is hidden. It's shown on HTTPS sites only. */
+#addRuleSection {
+ display: none;
+}
+
+#rulesets-versions {
+ display: block;
+ clear: both;
+}
+
+.rulesets-version {
+ display: block;
+}
+
+#resetButton {
+ display: inline-flex;
+ margin: 10px;
+ width: 95%;
+}
+#reset-to-defaults {
+ width: 100%;
+}
+
+/* Initially hide section (until rules get added). */
+section.rules {
+ display: none;
+}
+
+/* For "see more" content */
+.hide {
+ height: 0;
+ opacity: 0;
+ overflow: hidden;
+ transition: 0s;
+ visibility: hidden;
+}
+
+.show {
+ clear: both;
+ opacity: 1;
+ transition: visibility 0s linear 0s, opacity 300ms;
+ visibility: visible;
+}
diff --git a/chromium/pages/popup/ux.js b/chromium/pages/popup/ux.js
new file mode 100644
index 000000000000..f38f22535b82
--- /dev/null
+++ b/chromium/pages/popup/ux.js
@@ -0,0 +1,417 @@
+/* global e */
+/* global hide */
+/* global show */
+/* global sendMessage */
+/* global getOption_ */
+/* global setOption_ */
+
+"use strict";
+
+/**
+ * Handles rule (de)activation in the popup
+ */
+function toggleRuleLine(event) {
+ getTab(activeTab => {
+ const set_ruleset = {
+ active: event.target.checked,
+ name: event.target.parentNode.innerText,
+ tab_id: activeTab.id,
+ };
+
+ sendMessage("set_ruleset_active_status", set_ruleset, () => {
+ // purge the name from the cache so that this unchecking is persistent.
+ sendMessage("delete_from_ruleset_cache", set_ruleset.name, () => {
+ // Now reload the selected tab of the current window.
+ chrome.tabs.reload(set_ruleset.tab_id);
+ });
+ });
+ });
+}
+
+/**
+ * @param {object} event
+ * @description Toggles content for user to view rules and explanations for different modes
+ */
+function toggleSeeMore(event) {
+ let target = event.target;
+ let content;
+
+ if (target !== this) {
+ content = document.querySelector('.see_more__content');
+ } else {
+ content = target.parentNode.querySelector('.see_more__content');
+ }
+
+ let arrow = target.parentNode.querySelector('.see_more__arrow');
+ let text = target.parentNode.querySelector('.see_more__text');
+
+ if(arrow.classList.contains('down')) {
+ arrow.classList.replace('down', 'up');
+ text.innerText = chrome.i18n.getMessage("menu_seeLess");
+ } else if (arrow.classList.contains('up')) {
+ arrow.classList.replace('up', 'down');
+ text.innerText = chrome.i18n.getMessage("menu_seeMore");
+ }
+
+ if (content.classList.contains('hide')) {
+ content.classList.replace('hide', 'show');
+ } else if (content.classList.contains('show')) {
+ content.classList.replace('show', 'hide');
+ }
+}
+
+/**
+ * Creates rule lines (including checkbox and icon) for the popup
+ * @param rulesets
+ * @param list_div
+ * @param {string} ruleType
+ * @returns {*}
+ */
+function appendRulesToListDiv(rulesets, list_div, ruleType) {
+ if (rulesets && rulesets.length) {
+ // template parent block for each ruleset
+ let templateLine = document.createElement("div");
+ templateLine.className = "rule checkbox";
+
+ // label "container"
+ let templateLabel = document.createElement("label");
+
+ // checkbox
+ let templateCheckbox = document.createElement("input");
+ templateCheckbox.type = "checkbox";
+
+ // label text
+ let templateLabelText = document.createElement("span");
+
+ // img "remove" button
+ let templateRemove = document.createElement("img");
+ templateRemove.src = chrome.runtime.getURL("images/remove.png");
+ templateRemove.className = "remove";
+
+ templateLine.appendChild(templateCheckbox);
+ templateLabel.appendChild(templateLabelText);
+ templateLine.appendChild(templateLabel);
+
+ let increment = 0;
+
+ for (const ruleset of rulesets) {
+ increment++;
+ let line = templateLine.cloneNode(true);
+ let checkbox = line.querySelector("input[type=checkbox]");
+ let label = line.querySelector("label");
+ let text = line.querySelector("span");
+
+ // For each "id" attribute in each checkbox input and "for" attribute in label
+ checkbox.setAttribute("id", `${ruleType}_ruleset_${increment}`);
+ label.setAttribute("for", `${ruleType}_ruleset_${increment}`);
+
+ checkbox.checked = ruleset.active;
+ text.innerText = ruleset.name;
+
+ // Add listener to capture the toggle event
+ line.addEventListener("click", toggleRuleLine);
+
+ if (ruleset.note && ruleset.note.length) {
+ line.title = ruleset.note;
+
+ if (ruleset.note === "user rule") {
+ let remove = templateRemove.cloneNode(true);
+ line.appendChild(remove);
+
+ remove.addEventListener("click", () => {
+ sendMessage("remove_rule", { ruleset, src: 'popup' }, () => {
+ list_div.removeChild(line);
+ });
+ });
+ }
+ }
+ list_div.appendChild(line);
+ }
+ show(list_div);
+ }
+}
+
+function showHttpNowhereUI() {
+ // Set up checkbox for HTTP nowhere mode
+ getOption_('httpNowhere', false, function(item) {
+ if (item.httpNowhere) {
+ e('http-nowhere-checkbox').checked = true;
+ e('HttpNowhere__header').innerText = chrome.i18n.getMessage("menu_encryptAllSitesEligibleOn");
+ e('HttpNowhere__explained').innerText = chrome.i18n.getMessage("menu_httpNoWhereExplainedBlocked");
+ } else {
+ e('HttpNowhere__header').innerText = chrome.i18n.getMessage("menu_encryptAllSitesEligibleOff");
+ e('HttpNowhere__explained').innerText = chrome.i18n.getMessage("menu_httpNoWhereExplainedAllowed");
+ }
+ e('HttpNowhere').style.visibility = "visible";
+ });
+};
+
+// Change the UI to reflect extension enabled/disabled
+function updateEnabledDisabledUI() {
+ getOption_('globalEnabled', true, function(item) {
+ e('onoffswitch').checked = item.globalEnabled;
+ e('disableButton').style.visibility = "visible";
+ // Hide or show the rules sections
+ if (item.globalEnabled) {
+ document.body.className = "";
+ e('onoffswitch_label').innerText = chrome.i18n.getMessage("menu_globalEnable");
+ showHttpNowhereUI();
+ } else {
+ document.body.className = "disabled";
+ e('onoffswitch_label').innerText = chrome.i18n.getMessage("menu_globalDisable");
+ }
+ });
+}
+
+// Toggle extension enabled/disabled status
+function toggleEnabledDisabled() {
+ let extension_toggle_effect = function() {
+ updateEnabledDisabledUI();
+ // The extension state changed, give some time for toggle animation and reload tab
+ setTimeout(function() {
+ chrome.tabs.reload();
+ window.close();
+ }, 1500);
+ };
+
+ getOption_('globalEnabled', true, function(item) {
+ setOption_('globalEnabled', !item.globalEnabled, extension_toggle_effect);
+ });
+}
+
+/**
+ * @description Create the list of rules for a specific tab
+ * @param activeTab
+ */
+function listRules(activeTab) {
+ sendMessage("get_applied_rulesets", activeTab.id, function(rulesets) {
+ if (rulesets) {
+ // show the number of potentially applicable rulesets
+ let counter = rulesets.length;
+ let counterElement = document.querySelector("#RuleManagement--counter");
+ counterElement.innerText = counter;
+
+ const stableRules = rulesets.filter(ruleset => ruleset.default_state);
+ const unstableRules = rulesets.filter(ruleset => !ruleset.default_state);
+
+ appendRulesToListDiv(stableRules, e("StableRules"), 'stable');
+ appendRulesToListDiv(unstableRules, e("UnstableRules"), 'unstable');
+ }
+
+ // Only show the "Add a rule" section if we're on an HTTPS page
+ if (/^https:/.test(activeTab.url)) {
+ show(e("addRuleSection"));
+ }
+ });
+}
+
+/**
+ * Fill in content into the popup on load
+ */
+document.addEventListener("DOMContentLoaded", function () {
+ getTab(tab => {
+ const url = new URL(tab.url);
+ sendMessage("check_if_site_disabled", url.host, disabled => {
+ if(!disabled) {
+ listRules(tab);
+ }
+ showEnableOrDisable(url, disabled);
+ });
+ });
+
+ // Set up the enabled/disabled switch & hide/show rules
+ updateEnabledDisabledUI();
+ e('onoffswitch').addEventListener('click', toggleEnabledDisabled);
+ e('http-nowhere-checkbox').addEventListener('click', toggleHttpNowhere, false);
+ e('RuleManagement__see_more--prompt').addEventListener('click', toggleSeeMore);
+
+ e('reset-to-defaults').addEventListener('click', () => {
+ sendMessage("is_firefox", null, is_firefox => {
+ if (is_firefox) {
+ sendMessage("reset_to_defaults", null, () => {
+ window.close();
+ });
+ } else {
+ if (confirm(chrome.i18n.getMessage("prefs_reset_defaults_message"))) {
+ sendMessage("reset_to_defaults", null, () => {
+ window.close();
+ });
+ }
+ }
+ });
+ });
+
+ // Print the extension's current version.
+ var the_manifest = chrome.runtime.getManifest();
+ var version_info = e('current-version');
+ version_info.innerText = the_manifest.version;
+
+ let rulesets_versions = e('rulesets-versions');
+
+ rulesets_versions.addSpan = function(update_channel_name, ruleset_version_string) {
+ let timestamp_span = document.createElement("span");
+ timestamp_span.className = "rulesets-version";
+ timestamp_span.innerText = `${chrome.i18n.getMessage("about_rulesets_version")} ${update_channel_name}: ${ruleset_version_string}`;
+ this.appendChild(timestamp_span);
+ };
+
+ sendMessage("get_update_channel_timestamps", null, timestamps => {
+ let replaces = timestamps.some(([update_channel, timestamp]) =>
+ update_channel.replaces_default_rulesets && timestamp > 0
+ );
+ if(!replaces) {
+ rulesets_versions.addSpan("EFF (Full, Bundled)", the_manifest.version);
+ }
+ for(let [update_channel, timestamp] of timestamps) {
+ if(timestamp > 0) {
+ let ruleset_date = new Date(timestamp * 1000);
+ let ruleset_version_string = ruleset_date.getUTCFullYear() + "." + (ruleset_date.getUTCMonth() + 1) + "." + ruleset_date.getUTCDate();
+
+ rulesets_versions.addSpan(update_channel.name, ruleset_version_string);
+ }
+ }
+ });
+ e("aboutTitle").title = chrome.i18n.getMessage("about_title");
+ e("add-rule-link").addEventListener("click", addManualRule);
+ e("disable-on-this-site").addEventListener("click", disableOnSite);
+ e("enable-on-this-site").addEventListener("click", enableOnSite);
+});
+
+var escapeForRegex = function( value ) {
+ return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
+};
+
+function showEnableOrDisable(url, disabled) {
+ if (["http:", "https:", "ftp:"].indexOf(url.protocol) != -1) {
+ const disableLink = e("disable-on-this-site");
+ const enableLink = e("enable-on-this-site");
+ const addRuleSection = e("addRuleSection");
+ const resetToDefaults = e('reset-to-defaults');
+ if (disabled) {
+ show(enableLink);
+ hide(disableLink);
+ hide(addRuleSection);
+ hide(resetToDefaults);
+ } else {
+ show(disableLink);
+ hide(enableLink);
+ }
+ } else {
+ const disableEnableSection = e("disableEnableSection");
+ hide(disableEnableSection);
+ }
+}
+
+/**
+ * Handles the manual addition of rules
+ */
+function addManualRule() {
+ getTab(function(tab) {
+ hide(e("add-rule-link"));
+ show(e("add-new-rule-div"));
+
+ const url = new URL(tab.url);
+
+ e("new-rule-host").value = url.host;
+
+ const escapedHost = escapeForRegex(url.host);
+
+ e("new-rule-regex").value = `^http://${escapedHost}/`;
+ e("new-rule-redirect").value = `https://${url.host}/`;
+ e("new-rule-name").value = "Manual rule for " + url.host;
+
+ e("add-new-rule-button").addEventListener("click", function() {
+ const params = {
+ /**
+ * FIXME: the current implementation forbide users setting custom
+ * ruleset names...
+ */
+ name: e("new-rule-host").value,
+ target : [e("new-rule-host").value],
+ rule: [{ to: e("new-rule-redirect").value, from: e("new-rule-regex").value }],
+ default_off: "user rule"
+ };
+ sendMessage("add_new_rule", params, function() {
+ location.reload();
+ });
+ });
+
+ e("cancel-new-rule").addEventListener("click", function() {
+ show(e("add-rule-link"));
+ hide(e("add-new-rule-div"));
+ });
+
+ e("new-rule-show-advanced-link").addEventListener("click", function() {
+ show(e("new-rule-advanced"));
+ hide(e("new-rule-regular-text"));
+ });
+
+ e("new-rule-hide-advanced-link").addEventListener("click", function() {
+ hide(e("new-rule-advanced"));
+ show(e("new-rule-regular-text"));
+ });
+ });
+}
+
+/**
+ * Disable HTTPS Everywhere on a particular FQDN
+ */
+function disableOnSite() {
+ getTab(function(tab) {
+ const url = new URL(tab.url);
+ sendMessage("disable_on_site", url.host);
+ chrome.tabs.reload(tab.id);
+ window.close();
+ });
+}
+
+function enableOnSite() {
+ getTab(function(tab) {
+ const url = new URL(tab.url);
+ sendMessage("enable_on_site", url.host);
+ chrome.tabs.reload(tab.id);
+ window.close();
+ });
+}
+
+/**
+ * @description Turns EASE Mode on and off
+ */
+function toggleHttpNowhere() {
+ getTab(tab => {
+ getOption_('httpNowhere', false, item => {
+ const enabled = !item.httpNowhere;
+ setOption_('httpNowhere', enabled, () => {
+ if (enabled) {
+ chrome.tabs.reload(tab.id);
+ e('HttpNowhere__header').innerText = chrome.i18n.getMessage("menu_encryptAllSitesEligibleOn");
+ e('HttpNowhere__explained').innerText = chrome.i18n.getMessage("menu_httpNoWhereExplainedBlocked");
+ } else {
+ e('HttpNowhere__header').innerText = chrome.i18n.getMessage("menu_encryptAllSitesEligibleOff");
+ e('HttpNowhere__explained').innerText = chrome.i18n.getMessage("menu_httpNoWhereExplainedAllowed");
+ }
+ });
+ });
+ });
+}
+
+function getTab(callback) {
+ let url = new URL(window.location.href);
+ if (url.searchParams.has('tabId')) {
+ let parentId = Number(url.searchParams.get('tabId'));
+ return chrome.tabs.get(parentId, callback);
+ }
+ chrome.tabs.query({active: true, lastFocusedWindow: true}, tabs => callback(tabs[0]));
+}
+
+// This code fixes a Chromium-specific bug that causes links in extension popup
+// to open in regular tab even if the popup is opened in incognito mode.
+
+document.addEventListener('click', e => {
+ const { target } = e;
+
+ if (target.matches('a[target="_blank"]')) {
+ chrome.tabs.create({ url: target.href });
+ e.preventDefault();
+ }
+});
diff --git a/chromium/pages/translation.js b/chromium/pages/translation.js
new file mode 100644
index 000000000000..c6c3163ab9a6
--- /dev/null
+++ b/chromium/pages/translation.js
@@ -0,0 +1,8 @@
+"use strict";
+
+document.addEventListener("DOMContentLoaded", () => {
+ // Auto-translate all elements with data-i18n attributes
+ for (const element of document.querySelectorAll("[data-i18n]")) {
+ element.innerText = chrome.i18n.getMessage(element.getAttribute("data-i18n")).replace(/"/g,"\"");
+ }
+});
diff --git a/chromium/pages/util.js b/chromium/pages/util.js
new file mode 100644
index 000000000000..4e5aea4f9acd
--- /dev/null
+++ b/chromium/pages/util.js
@@ -0,0 +1,46 @@
+/* exported e */
+/* exported hide */
+/* exported show */
+/* exported sendMessage */
+/* exported getOption_ */
+/* exported setOption_ */
+
+"use strict";
+
+/**
+ * Element helper functions
+ */
+function e(id) {
+ return document.getElementById(id);
+}
+
+function hide(elem) {
+ elem.style.display = "none";
+}
+
+function show(elem) {
+ elem.style.display = "block";
+}
+
+function sendMessage(type, object, callback) {
+ chrome.runtime.sendMessage({ type, object }, callback);
+}
+
+/**
+* Get an option from global settings
+* @param {string} opt
+* @param {mixed} defaultOpt
+* @param {object} callback
+* @returns mixed
+*/
+function getOption_(opt, defaultOpt, callback) {
+ let details = {};
+ details[opt] = defaultOpt;
+ sendMessage("get_option", details, callback);
+}
+
+function setOption_(opt, value, callback) {
+ var details = {};
+ details[opt] = value;
+ sendMessage("set_option", details, callback);
+}
diff --git a/chromium/popup.css b/chromium/popup.css
deleted file mode 100644
index ac0325024f7a..000000000000
--- a/chromium/popup.css
+++ /dev/null
@@ -1,95 +0,0 @@
-body {
- margin-left: 1em;
- margin-top: 0;
- margin-right: 1em;
- margin-bottom: 0;
- min-width: 20em;
-}
-
-/* Don't wrap text for important stuff. */
-h1, h2, h3, .rule {
- white-space: nowrap;
-}
-
-/* Initially hide section (until rules get added). */
-section.rules {
- position: fixed;
- visibility: hidden;
-}
-
-/* Underline rules that have notes. */
-.rule [title] {
- border-bottom: 1px dotted;
- cursor: help;
-}
-
-/* Favicons */
-.rule img {
- margin-left: 0.6em;
- vertical-align: bottom;
-}
-
-/*** Everything below is "reverse-engineered" from Chrome's Settings page. ***/
-
-/* Override a strange pixel offset in widgets.css. */
-.rule input[type="checkbox"] {
- bottom: 1px;
-}
-
-/* Override display attribute of text labels in widgets.css. */
-.rule span {
- display: inline !important;
-}
-
-body {
- /* Fonts Chrome specifies for each OS: */
- /* Linux: 'DejaVu Sans', Arial, sans-serif */
- /* Mac: 'Lucida Grande', sans-serif */
- /* Windows: 'Segoe UI', Tahoma, sans-serif */
- font-family: 'Lucida Grande', 'Segoe UI', Tahoma, 'DejaVu Sans', Arial, sans-serif;
- font-size: 75%;
- color: #303942;
- padding-top: 55px;
-}
-
-header {
- background-image: -webkit-linear-gradient(white, white 40%, rgba(255, 255, 255, 0.92));
- left: 1em;
- position: fixed;
- right: 1em;
- top: 0;
- z-index: 3;
-}
-
-header > h1 {
- margin: 0;
- padding: 21px 0 13px;
-}
-
-/* Create a border under the h1 (but before anything that gets appended
- * to the end of the header). */
-header > h1::after {
- background-color: #eee;
- content: ' ';
- display: block;
- height: 1px;
- position: relative;
- top: 13px;
-}
-
-section {
- -webkit-padding-start: 18px;
- -webkit-padding-end: 18px;
- margin-bottom: 24px;
- margin-top: 8px;
-}
-
-section > h3 {
- -webkit-margin-start: -18px;
-}
-
-footer {
- border-top: 1px solid #EEE;
- margin-top: 16px;
- padding: 8px 0;
-}
diff --git a/chromium/popup.html b/chromium/popup.html
deleted file mode 100755
index 7c9be67fbcc9..000000000000
--- a/chromium/popup.html
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/chromium/popup.js b/chromium/popup.js
deleted file mode 100644
index 1f1475b8e790..000000000000
--- a/chromium/popup.js
+++ /dev/null
@@ -1,90 +0,0 @@
-var backgroundPage = null;
-var stableRules = null;
-var unstableRules = null;
-var hostReg = /.*\/\/[^$/]*\//;
-
-function toggleRuleLine(checkbox, ruleset) {
- ruleset.active = checkbox.checked;
-
- if (ruleset.active != ruleset.default_state) {
- localStorage[ruleset.name] = ruleset.active;
- } else {
- delete localStorage[ruleset.name];
- }
-}
-
-function createRuleLine(ruleset) {
-
- // parent block for line
- var line = document.createElement("div");
- line.className = "rule checkbox";
-
- // label "container"
- var label = document.createElement("label");
-
- // checkbox
- var checkbox = document.createElement("input");
- checkbox.type = "checkbox";
- if (ruleset.active) {
- checkbox.setAttribute("checked", "");
- }
- checkbox.onchange = function(ev) {
- toggleRuleLine(checkbox, ruleset);
- };
- label.appendChild(checkbox);
-
- // favicon (from chrome's cache)
- var favicon = document.createElement("img");
- favicon.src = "chrome://favicon/";
- for (var i=0; i < ruleset.rules.length; i++) {
- var host = hostReg.exec(ruleset.rules[i].to);
- if (host) {
- favicon.src += host[0];
- break;
- }
- }
- label.appendChild(favicon);
-
- // label text
- var text = document.createElement("span");
- text.innerText = ruleset.name;
- if (ruleset.note.length) {
- text.title = ruleset.note;
- }
- label.appendChild(text);
-
- line.appendChild(label);
-
- return line;
-}
-
-function gotTab(tab) {
- var rulesets = backgroundPage.activeRulesets.getRulesets(tab.id);
-
- for (var r in rulesets) {
- var listDiv = stableRules;
- if (!rulesets[r].default_state) {
- listDiv = unstableRules;
- }
- listDiv.appendChild(createRuleLine(rulesets[r]));
- listDiv.style.position = "static";
- listDiv.style.visibility = "visible";
- }
-}
-
-document.addEventListener("DOMContentLoaded", function () {
- backgroundPage = chrome.extension.getBackgroundPage();
- stableRules = document.getElementById("StableRules");
- unstableRules = document.getElementById("UnstableRules");
- chrome.tabs.getSelected(null, gotTab);
-
- // auto-translate all elements with i18n attributes
- var e = document.querySelectorAll("[i18n]");
- for (var i=0; i < e.length; i++) {
- e[i].innerHTML = chrome.i18n.getMessage(e[i].getAttribute("i18n"));
- }
-
- // other translations
- document.getElementById("whatIsThis").setAttribute("title", chrome.i18n.getMessage("chrome_what_is_this_title"));
-});
-
diff --git a/chromium/rules.js b/chromium/rules.js
deleted file mode 100644
index cfe7f52c1770..000000000000
--- a/chromium/rules.js
+++ /dev/null
@@ -1,311 +0,0 @@
-// A cache for potentiallyApplicableRulesets
-// Size chosen /completely/ arbitrarily.
-var ruleCache = new LRUCache(2048);
-
-function Rule(from, to) {
- //this.from = from;
- this.to = to;
- this.from_c = new RegExp(from);
-}
-
-function Exclusion(pattern) {
- //this.pattern = pattern;
- this.pattern_c = new RegExp(pattern);
-}
-
-function CookieRule(host, cookiename) {
- this.host = host;
- this.host_c = new RegExp(host);
- this.name = cookiename;
- this.name_c = new RegExp(cookiename);
-}
-
-function RuleSet(set_name, match_rule, default_state, note) {
- this.name = set_name;
- if (match_rule)
- this.ruleset_match_c = new RegExp(match_rule);
- else
- this.ruleset_match_c = null;
- this.rules = [];
- this.exclusions = [];
- this.targets = [];
- this.cookierules = [];
- this.active = default_state;
- this.default_state = default_state;
- this.note = note;
-}
-
-RuleSet.prototype = {
- apply: function(urispec) {
- var returl = null;
- // If a rulset has a match_rule and it fails, go no further
- if (this.ruleset_match_c && !this.ruleset_match_c.test(urispec)) {
- log(VERB, "ruleset_match_c excluded " + urispec);
- return null;
- }
- // Even so, if we're covered by an exclusion, go home
- for(var i = 0; i < this.exclusions.length; ++i) {
- if (this.exclusions[i].pattern_c.test(urispec)) {
- log(DBUG,"excluded uri " + urispec);
- return null;
- }
- }
- // Okay, now find the first rule that triggers
- for(var i = 0; i < this.rules.length; ++i) {
- returl = urispec.replace(this.rules[i].from_c,
- this.rules[i].to);
- if (returl != urispec) {
- return returl;
- }
- }
- if (this.ruleset_match_c) {
- // This is not an error, because we do not insist the matchrule
- // precisely describes to target space of URLs ot redirected
- log(DBUG,"Ruleset "+this.name
- +" had an applicable match-rule but no matching rules");
- }
- return null;
- },
-
-};
-
-
-function RuleSets() {
- // Load rules into structure
- this.targets = {};
-
- for(var i = 0; i < rule_list.length; i++) {
- var xhr = new XMLHttpRequest();
- // Use blocking XHR to ensure everything is loaded by the time
- // we return.
- //var that = this;
- //xhr.onreadystatechange = function() { that.loadRuleSet(xhr); }
- xhr.open("GET", chrome.extension.getURL(rule_list[i]), false);
- //xhr.open("GET", chrome.extension.getURL(rule_list[i]), true);
- xhr.send(null);
- this.loadRuleSet(xhr);
- }
- this.global_rulesets = this.targets["*"] ? this.targets["*"] : [];
-}
-
-RuleSets.prototype = {
-
- localPlatformRegexp: (function() {
- if (/(OPR|Opera)[\/\s](\d+\.\d+)/.test(navigator.userAgent)) {
- log(DBUG, 'Detected that we are running Opera');
- return new RegExp("chromium|mixedcontent");
- } else {
- log(DBUG, 'Detected that we are running Chrome/Chromium');
- return new RegExp("chromium");
- }
- })(),
-
- loadRuleSet: function(xhr) {
- // Get file contents
- if (xhr.readyState != 4) {
- return;
- }
-
- // XXX: Validation + error checking
- var sets = xhr.responseXML.getElementsByTagName("ruleset");
- for (var i = 0; i < sets.length; ++i) {
- this.parseOneRuleset(sets[i]);
- }
- },
-
- parseOneRuleset: function(ruletag) {
- var default_state = true;
- var note = "";
- if (ruletag.attributes.default_off) {
- default_state = false;
- note += ruletag.attributes.default_off.value + "\n";
- }
-
- // If a ruleset declares a platform, and we don't match it, treat it as
- // off-by-default
- var platform = ruletag.getAttribute("platform");
- if (platform) {
- if (platform.search(this.localPlatformRegexp) == -1) {
- default_state = false;
- }
- note += "Platform(s): " + platform + "\n";
- }
-
- var rule_set = new RuleSet(ruletag.getAttribute("name"),
- ruletag.getAttribute("match_rule"),
- default_state,
- note.trim());
-
- // Read user prefs
- if (rule_set.name in localStorage) {
- rule_set.active = (localStorage[rule_set.name] == "true");
- }
-
- var rules = ruletag.getElementsByTagName("rule");
- for(var j = 0; j < rules.length; j++) {
- rule_set.rules.push(new Rule(rules[j].getAttribute("from"),
- rules[j].getAttribute("to")));
- }
-
- var exclusions = ruletag.getElementsByTagName("exclusion");
- for(var j = 0; j < exclusions.length; j++) {
- rule_set.exclusions.push(
- new Exclusion(exclusions[j].getAttribute("pattern")));
- }
-
- var cookierules = ruletag.getElementsByTagName("securecookie");
- for(var j = 0; j < cookierules.length; j++) {
- rule_set.cookierules.push(new CookieRule(cookierules[j].getAttribute("host"),
- cookierules[j].getAttribute("name")));
- }
-
- var targets = ruletag.getElementsByTagName("target");
- for(var j = 0; j < targets.length; j++) {
- var host = targets[j].getAttribute("host");
- if (!(host in this.targets)) {
- this.targets[host] = [];
- }
- this.targets[host].push(rule_set);
- }
- },
-
- setInsert: function(intoList, fromList) {
- // Insert any elements from fromList into intoList, if they are not
- // already there. fromList may be null.
- if (!fromList) return;
- for (var i = 0; i < fromList.length; i++)
- if (intoList.indexOf(fromList[i]) == -1)
- intoList.push(fromList[i]);
- },
-
- potentiallyApplicableRulesets: function(host) {
- // Return a list of rulesets that apply to this host
- var tmp, t;
- // Have we cached this result? If so, return it!
- var cached_item = ruleCache.get(host);
- if (cached_item !== undefined) {
- log(DBUG, "Rulseset cache hit for " + host);
- return cached_item;
- }
- log(DBUG, "Ruleset cache miss for " + host);
-
- var results = this.global_rulesets.slice(0); // copy global_rulesets
- if (this.targets[host])
- results = results.concat(this.targets[host]);
- // replace each portion of the domain with a * in turn
- var segmented = host.split(".");
- for (var i = 0; i < segmented.length; ++i) {
- tmp = segmented[i];
- segmented[i] = "*";
- t = segmented.join(".");
- segmented[i] = tmp;
- this.setInsert(results, this.targets[t]);
- }
- // now eat away from the left, with *, so that for x.y.z.google.com we
- // check *.z.google.com and *.google.com (we did *.y.z.google.com above)
- for (var i = 2; i <= segmented.length - 2; ++i) {
- t = "*." + segmented.slice(i,segmented.length).join(".");
- this.setInsert(results, this.targets[t]);
- }
- log(DBUG,"Applicable rules for " + host + ":");
- if (results.length == 0)
- log(DBUG, " None");
- else
- for (var i = 0; i < results.length; ++i)
- log(DBUG, " " + results[i].name);
-
- // Insert results into the ruleset cache
- ruleCache.set(host, results);
- return results;
- },
-
- shouldSecureCookie: function(cookie, knownHttps) {
- // Check to see if the Cookie object c meets any of our cookierule citeria
- // for being marked as secure. knownHttps is true if the context for this
- // cookie being set is known to be https.
- //log(DBUG, "Testing cookie:");
- //log(DBUG, " name: " + cookie.name);
- //log(DBUG, " host: " + cookie.host);
- //log(DBUG, " domain: " + cookie.domain);
- //log(DBUG, " rawhost: " + cookie.rawHost);
- var hostname = cookie.domain;
- // cookie domain scopes can start with .
- while (hostname.charAt(0) == ".")
- hostname = hostname.slice(1);
-
- var rs = this.potentiallyApplicableRulesets(hostname);
- for (var i = 0; i < rs.length; ++i) {
- var ruleset = rs[i];
- if (ruleset.active) {
- if (!knownHttps && !this.safeToSecureCookie(hostname))
- continue;
- for (var j = 0; j < ruleset.cookierules.length; j++) {
- var cr = ruleset.cookierules[j];
- if (cr.host_c.test(cookie.domain) && cr.name_c.test(cookie.name)) {
- return ruleset;
- }
- //log(WARN, "no match domain " + cr.host_c.test(cookie.domain) +
- // " name " + cr.name_c.test(cookie.name));
- //log(WARN, "with " + cookie.domain + " " + cookie.name);
- //log(WARN, "and " + cr.host + " " + cr.name);
- }
- }
- }
- return null;
- },
-
- safeToSecureCookie: function(domain) {
- // Check if the domain might be being served over HTTP. If so, it isn't
- // safe to secure a cookie! We can't always know this for sure because
- // observing cookie-changed doesn't give us enough context to know the
- // full origin URI.
-
- // First, if there are any redirect loops on this domain, don't secure
- // cookies. XXX This is not a very satisfactory heuristic. Sometimes we
- // would want to secure the cookie anyway, because the URLs that loop are
- // not authenticated or not important. Also by the time the loop has been
- // observed and the domain blacklisted, a cookie might already have been
- // flagged as secure.
-
- if (domain in domainBlacklist) {
- log(INFO, "cookies for " + domain + "blacklisted");
- return false;
- }
-
- // If we passed that test, make up a random URL on the domain, and see if
- // we would HTTPSify that.
-
- try {
- var nonce_path = "/" + Math.random().toString();
- nonce_path = nonce_path + nonce_path;
- var test_uri = "http://" + domain + nonce_path;
- } catch (e) {
- log(WARN, "explosion in safeToSecureCookie for " + domain + "\n"
- + "(" + e + ")");
- return false;
- }
-
- log(INFO, "Testing securecookie applicability with " + test_uri);
- var rs = this.potentiallyApplicableRulesets(domain);
- for (var i = 0; i < rs.length; ++i) {
- if (!rs[i].active) continue;
- var rewrite = rs[i].apply(test_uri);
- if (rewrite) {
- log(INFO, "Yes: " + rewrite);
- return true;
- }
- }
- log(INFO, "(NO)");
- return false;
- },
-
- rewriteURI: function(urispec, host) {
- var newuri = null;
- var rs = this.potentiallyApplicableRulesets(host);
- for(var i = 0; i < rs.length; ++i) {
- if (rs[i].active && (newuri = rs[i].apply(urispec)))
- return newuri;
- }
- return null;
- },
-};
diff --git a/chromium/setversion.py b/chromium/setversion.py
deleted file mode 100755
index 8de18f70a82b..000000000000
--- a/chromium/setversion.py
+++ /dev/null
@@ -1,12 +0,0 @@
-import json
-from datetime import date
-
-# Set the version in manifest.json to one based on today's date.
-
-t = date.today()
-f = open('chromium/manifest.json')
-manifest = json.loads(f.read())
-f.close()
-manifest['version'] = `t.year` +'.'+ `t.month` +'.'+ `t.day`
-f = open('chromium/manifest.json','w')
-f.write(json.dumps(manifest,indent=4,sort_keys=True))
diff --git a/chromium/test/.eslintrc b/chromium/test/.eslintrc
new file mode 100644
index 000000000000..8a30ebae0f21
--- /dev/null
+++ b/chromium/test/.eslintrc
@@ -0,0 +1,6 @@
+{
+ "env": {
+ "node": true,
+ "mocha": true
+ }
+}
diff --git a/chromium/test/example.rulesets.gz b/chromium/test/example.rulesets.gz
new file mode 100644
index 000000000000..401811763ff8
Binary files /dev/null and b/chromium/test/example.rulesets.gz differ
diff --git a/chromium/test/incognito_test.js b/chromium/test/incognito_test.js
new file mode 100644
index 000000000000..64cbe5ab8aa5
--- /dev/null
+++ b/chromium/test/incognito_test.js
@@ -0,0 +1,59 @@
+'use strict';
+
+const expect = require('chai').expect,
+ tu = require('./testing_utils'),
+ incognito = require('../background-scripts/incognito');
+
+describe('incognito.js', function() {
+ beforeEach(function() {
+ tu.stubber([
+ ['chrome.windows.onCreated.addListener', tu.Mock()],
+ ['chrome.windows.onRemoved.addListener', tu.Mock()],
+ ['chrome.windows.getAll', tu.Mock()],
+ ]);
+ });
+
+ describe('onIncognitoDestruction', function() {
+ beforeEach(function() {
+ incognito.state.incognito_session_exists = false;
+ this.callbackCalled = false;
+ this.callback = () => this.callbackCalled = true;
+ this.instance = incognito.onIncognitoDestruction(this.callback);
+ });
+
+ it('no incognito session by default', function() {
+ expect(incognito.state.incognito_session_exists).to.be.false;
+ });
+
+ it('with no incognito, callback not called', async function() {
+ incognito.state.incognito_session_exists = false;
+
+ await this.instance.detect_incognito_destruction();
+
+ expect(this.callbackCalled).to.be.false;
+ });
+
+ it('with incognitos still open, callback not called', async function() {
+ incognito.state.incognito_session_exists = true;
+ chrome.windows.getAll = func => func([{incognito: true}]);
+
+ await this.instance.detect_incognito_destruction();
+
+ expect(this.callbackCalled, 'not called').to.be.false;
+ });
+
+ it('callback called when last incognito closed', async function() {
+ incognito.state.incognito_session_exists = true;
+ chrome.windows.getAll = func => func([]);
+
+ await this.instance.detect_incognito_destruction();
+ expect(incognito.state.incognito_session_exists, 'constant changed').to.be.false;
+ expect(this.callbackCalled).to.be.true;
+ });
+
+ it('detects when an incognito window is created', function() {
+ this.instance.detect_incognito_creation({incognito: true});
+ expect(incognito.state.incognito_session_exists, 'constant changed').to.be.true;
+ });
+ });
+});
diff --git a/chromium/test/ip_utils_test.js b/chromium/test/ip_utils_test.js
new file mode 100644
index 000000000000..6301872ae646
--- /dev/null
+++ b/chromium/test/ip_utils_test.js
@@ -0,0 +1,92 @@
+'use strict';
+
+const { parseIp, isIpInRange, isLocalIp } = require('../background-scripts/ip_utils');
+
+const assert = require('chai').assert;
+
+describe('ip_utils.js', () => {
+ describe('parseIp', () => {
+ it('rejects an empty string', () => {
+ assert(parseIp('') === -1);
+ });
+
+ it('rejects a string consisting entirely of dots', () => {
+ assert(parseIp('.') === -1);
+ assert(parseIp('..') === -1);
+ assert(parseIp('...') === -1);
+ assert(parseIp('....') === -1);
+ });
+
+ it('rejects a string consisting only of digits', () => {
+ assert(parseIp('1') === -1);
+ });
+
+ it('rejects a string not consisting of four parts separated by dots', () => {
+ assert(parseIp('1.1') === -1);
+ assert(parseIp('1.1.1') === -1);
+ assert(parseIp('1.1.1.1.1') === -1);
+ });
+
+ it('rejects a well-formed IP address followed by one or multiple trailing dots', () => {
+ assert(parseIp('1.1.1.1.') === -1);
+ assert(parseIp('1.1.1.1..') === -1);
+ assert(parseIp('1.1.1.1...') === -1);
+ });
+
+ it('rejects an IP address-like string with omitted parts', () => {
+ assert(parseIp('.1.1.1') === -1);
+ assert(parseIp('1..1.1') === -1);
+ assert(parseIp('1.1..1') === -1);
+ assert(parseIp('1.1.1.') === -1);
+ });
+
+ it('rejects an IP address-like string with invalid parts', () => {
+ assert(parseIp('192.168.1.256') === -1);
+ assert(parseIp('192.168.256.1') === -1);
+ assert(parseIp('192.256.1.1') === -1);
+ assert(parseIp('256.168.1.1') === -1);
+ assert(parseIp('256.168.1.-1') === -1);
+ });
+
+ it('correctly parses well-formed IP addresses', () => {
+ assert(parseIp('192.168.0.1') === 0xc0a80001);
+ assert(parseIp('127.0.0.1') === 0x7f000001);
+ assert(parseIp('1.1.1.1') === 0x01010101);
+ assert(parseIp('8.8.8.8') === 0x08080808);
+ });
+ });
+
+ describe('isIpInRange', () => {
+ it('correctly detects if IP is in range', () => {
+ assert(isIpInRange(0xabadcafe, [0x00000000, 0x00000000]));
+ assert(isIpInRange(0x7f000001, [0x7f000000, 0xff000000]));
+ assert(isIpInRange(0xc0a80001, [0xc0a80000, 0xffff0000]));
+ assert(isIpInRange(0xc0a80101, [0xc0a80100, 0xffffff00]));
+ assert(isIpInRange(0xdeadbeef, [0xdeadbeef, 0xffffffff]));
+ });
+
+ it('correctly detects if IP is outside of range', () => {
+ assert(!isIpInRange(0xaaaaaaaa, [0xdeadbeef, 0xffffffff]));
+ assert(!isIpInRange(0xaaaaaaaa, [0x7f000000, 0xff000000]));
+ assert(!isIpInRange(0xaaaaaaaa, [0xc0a80000, 0xffff0000]));
+ });
+ });
+
+ describe('isLocalIp', () => {
+ it('correctly detects if IP is a private network or loopback address', () => {
+ assert(isLocalIp(0x00000000));
+ assert(isLocalIp(0x7fabcdef));
+ assert(isLocalIp(0x0aabcdef));
+ assert(isLocalIp(0xc0a8abcd));
+ assert(isLocalIp(0xac1abcde));
+ });
+
+ it('correctly detects if IP is not a private network or loopback address', () => {
+ assert(!isLocalIp(0x00abcdef));
+ assert(!isLocalIp(0x01010101));
+ assert(!isLocalIp(0x01000001));
+ assert(!isLocalIp(0x08080808));
+ assert(!isLocalIp(0x08080404));
+ });
+ });
+});
diff --git a/chromium/test/rules_test.js b/chromium/test/rules_test.js
new file mode 100644
index 000000000000..ae31ad0060ba
--- /dev/null
+++ b/chromium/test/rules_test.js
@@ -0,0 +1,221 @@
+'use strict';
+
+const text_encoding = require('text-encoding');
+global.TextDecoder = text_encoding.TextDecoder;
+global.TextEncoder = text_encoding.TextEncoder;
+global.self = global;
+require("../../lib-wasm/pkg/https_everywhere_lib_wasm.js");
+
+const assert = require('chai').assert,
+ rules = require('../background-scripts/rules');
+
+const Rule = rules.Rule,
+ RuleSet = rules.RuleSet,
+ RuleSets = rules.RuleSets,
+ getRule = rules.getRule;
+
+
+describe('rules.js', function() {
+ let test_str = 'test';
+
+ describe('Rule', function() {
+ it('constructs trivial rule', function() {
+ let rule = new Rule('^http:', 'https:');
+ assert.equal(rule.to, rules.trivial_rule.to);
+ assert.deepEqual(rule.from_c, rules.trivial_rule.from_c);
+ });
+ });
+
+ describe('getRule', function() {
+ it('returns trivial rule object', function() {
+ let trivial = rules.trivial_rule;
+ let rule = getRule('^http:', 'https:');
+ assert.equal(rule, trivial);
+ });
+ });
+
+ describe('RuleSet', function() {
+ beforeEach(function() {
+ this.ruleset = new RuleSet('set_name', true, 'note');
+ });
+
+ describe('#apply', function() {
+ it('excludes excluded uris', function() {
+ this.ruleset.exclusions = new RegExp(test_str);
+ assert.isNull(this.ruleset.apply(test_str));
+ });
+
+ it('rewrites uris', function() {
+ let rule = new Rule('^http:', 'https:');
+ this.ruleset.rules.push(rule);
+ assert.equal(this.ruleset.apply('http://example.com/'), 'https://example.com/');
+ });
+
+ it('does nothing when empty', function() {
+ assert.isNull(this.ruleset.apply('http://example.com/'));
+ });
+ });
+
+ describe('#isEquivalentTo', function() {
+ let inputs = ['a', 'b', 'c'];
+
+ it('not equivalent with different input', function() {
+ let rs = new RuleSet(...inputs);
+ assert.isFalse(
+ rs.isEquivalentTo(new RuleSet('e', 'f', 'g'))
+ );
+ });
+ it('not equivalent with different exclusions', function() {
+ let rs_a = new RuleSet(...inputs),
+ rs_b = new RuleSet(...inputs);
+ rs_a.exclusions = new RegExp('foo');
+ rs_b.exclusions = new RegExp('bar');
+
+ assert.isFalse(rs_a.isEquivalentTo(rs_b));
+ });
+
+ it('not equivalent with different rules', function() {
+ let rs_a = new RuleSet(...inputs),
+ rs_b = new RuleSet(...inputs);
+ rs_a.rules.push(new Rule('a', 'a'));
+ rs_b.rules.push(new Rule('b', 'b'));
+
+ assert.isFalse(rs_a.isEquivalentTo(rs_b));
+ });
+
+ it('equivalent to self', function() {
+ let rs = new RuleSet(...inputs);
+ assert.isTrue(rs.isEquivalentTo(rs));
+ });
+ });
+ });
+
+ describe('RuleSets', function() {
+ let rules_json = [{
+ name: "Freerangekitten.com",
+ rule: [{
+ to: "https:",
+ from: "^http:"
+ }],
+ target: ["freerangekitten.com", "www.freerangekitten.com"],
+ exclusion: ["foo", "bar"]
+ }];
+
+ beforeEach(function() {
+ this.rsets = new RuleSets();
+ });
+
+ describe('#addFromJson', function() {
+ it('can add a rule', function() {
+ this.rsets.addFromJson(rules_json);
+ assert.isTrue(this.rsets.targets.has('freerangekitten.com'));
+ });
+
+ it('parses exclusions', function() {
+ this.rsets.addFromJson(rules_json);
+ let rs = [...this.rsets.targets.get('freerangekitten.com')][0];
+ assert.strictEqual(rs.exclusions.source, "foo|bar");
+ });
+ });
+
+ describe('#rewriteURI', function() {
+ it('rewrites host added from json', function() {
+ let host = 'freerangekitten.com';
+ this.rsets.addFromJson(rules_json);
+
+ let newuri = this.rsets.rewriteURI('http://' + host + '/', host);
+
+ assert.strictEqual(newuri, 'https://' + host + '/', 'protocol changed to https');
+ });
+
+ it('does not rewrite unknown hosts', function() {
+ assert.isNull(this.rsets.rewriteURI('http://unknown.com/', 'unknown.com'));
+ });
+
+ it('does not rewrite excluded URLs', function() {
+ this.rsets.addFromJson(rules_json);
+ assert.isNull(this.rsets.rewriteURI('http://freerangekitten.com/foo', 'freerangekitten.com'));
+ assert.isNull(this.rsets.rewriteURI('http://www.freerangekitten.com/bar', 'freerangekitten.com'));
+
+ let newuri = this.rsets.rewriteURI('http://freerangekitten.com/baz', 'freerangekitten.com');
+ assert.strictEqual(newuri, 'https://freerangekitten.com/baz', 'protocol changed to https');
+ });
+ });
+
+ describe('#potentiallyApplicableRulesets', function() {
+ let host = 'example.com',
+ value = [host];
+
+ it('returns nothing when empty', function() {
+ assert.isEmpty(this.rsets.potentiallyApplicableRulesets(host));
+ });
+
+ it('returns nothing for malformed hosts', function() {
+ assert.isEmpty(this.rsets.potentiallyApplicableRulesets('....'));
+ });
+
+ it('returns nothing for empty hosts', function() {
+ assert.isEmpty(this.rsets.potentiallyApplicableRulesets(''));
+ });
+
+ it('returns cached rulesets', function() {
+ this.rsets.ruleCache.set(host, value);
+ assert.deepEqual(this.rsets.potentiallyApplicableRulesets(host), value);
+ });
+
+ it('caches results', function() {
+ this.rsets.targets.set(host, value);
+
+ assert.isEmpty(this.rsets.ruleCache);
+ this.rsets.potentiallyApplicableRulesets(host);
+ assert.isTrue(this.rsets.ruleCache.has(host));
+ });
+
+ describe('wildcard matching', function() {
+
+ it('no wildcard', function() {
+ let target = host;
+ this.rsets.targets.set(target, value);
+
+ let result = this.rsets.potentiallyApplicableRulesets(target),
+ expected = new Set(value);
+
+ assert.deepEqual(result, expected);
+ });
+
+ it('matches left hand side wildcards', function() {
+ let target = '*.' + host;
+ this.rsets.targets.set(target, value);
+
+ let res1 = this.rsets.potentiallyApplicableRulesets('sub.' + host);
+ assert.deepEqual(res1, new Set(value), 'default case');
+
+ let res2 = this.rsets.potentiallyApplicableRulesets(host);
+ assert.isEmpty(res2, 'wildcard does not match parent domains');
+
+ let res3 = this.rsets.potentiallyApplicableRulesets('moresub.sub.' + host);
+ assert.deepEqual(res3, new Set(value), 'wildcard matches sub domains');
+ });
+
+ it('matches right wildcards', function() {
+ const target = host + '.*';
+ this.rsets.targets.set(target, value);
+
+ const res1 = this.rsets.potentiallyApplicableRulesets(host + '.tld');
+ assert.deepEqual(res1, new Set(value), 'default case');
+
+ const res2 = this.rsets.potentiallyApplicableRulesets(host + '.tld.com');
+ assert.isEmpty(res2, 'wildcard matches second level domains');
+ });
+
+ it('ignore middle wildcards', function() {
+ const target = 'www.*.' + host;
+ this.rsets.targets.set(target, value);
+
+ const res1 = this.rsets.potentiallyApplicableRulesets('www.cdn.' + host);
+ assert.isEmpty(res1, 'middle wildcards are matched');
+ });
+ });
+ });
+ });
+});
diff --git a/chromium/test/testing_utils.js b/chromium/test/testing_utils.js
new file mode 100644
index 000000000000..66657aa8fb93
--- /dev/null
+++ b/chromium/test/testing_utils.js
@@ -0,0 +1,29 @@
+'use strict';
+
+function Mock() {
+ let out = function() {
+ out.calledWith = Array.from(arguments);
+ };
+ return out;
+}
+
+function stub(name, value) {
+ let parts = name.split('.'),
+ last = parts.pop(),
+ part = global;
+ parts.forEach(partName => {
+ if (!part.hasOwnProperty(partName)) {
+ part[partName] = {};
+ }
+ part = part[partName];
+ });
+ part[last] = value;
+}
+
+function stubber(namesValues) {
+ namesValues.forEach(nameValue => {
+ stub(...nameValue);
+ });
+}
+
+Object.assign(exports, {Mock, stub, stubber});
diff --git a/chromium/test/update_test.js b/chromium/test/update_test.js
new file mode 100644
index 000000000000..33d96412168e
--- /dev/null
+++ b/chromium/test/update_test.js
@@ -0,0 +1,71 @@
+'use strict';
+
+const assert = require('chai').assert,
+ update = require('../background-scripts/update'),
+ chrome = require("sinon-chrome"),
+ util = require('../background-scripts/util'),
+ atob = require("atob"),
+ TextDecoder = require('text-encoding').TextDecoder,
+ sinon = require('sinon');
+
+const fs = require('fs'),
+ { update_channels } = require('../background-scripts/update_channels'),
+ pako = require('../external/pako-1.0.5/pako_inflate.min.js');
+
+util.setDefaultLogLevel(util.WARN);
+
+describe('update.js', function() {
+ const example_rulesets_gz = fs.readFileSync(__dirname + '/example.rulesets.gz');
+
+ describe('applyStoredRulesets', function() {
+ beforeEach(() => {
+ chrome.flush();
+ if(util.loadExtensionFile.restore) {
+ util.loadExtensionFile.restore();
+ }
+ });
+
+ it('applies compressed rulesets from chrome.storage', function(done) {
+ let apply_promises = [];
+
+ for(let update_channel of update_channels) {
+ const key = 'rulesets: ' + update_channel.name;
+ chrome.storage.local.get.withArgs(key).yields({[key]: example_rulesets_gz});
+ }
+
+ update.applyStoredRulesets({addFromJson: response => {
+ apply_promises.push(new Promise(resolve => {
+ assert.isArray(response);
+ assert.equal(response[0].name, "Example.com");
+ resolve();
+ }));
+
+
+ Promise.all(apply_promises).then(() => done());
+
+ }});
+
+ });
+
+ it('applies rulesets from local extension file', function(done) {
+ for(let update_channel of update_channels) {
+ const key = 'rulesets: ' + update_channel.name;
+ chrome.storage.local.get.withArgs(key).yields({});
+ }
+
+ const example_rulesets_byte_array = pako.inflate(atob(example_rulesets_gz));
+ const example_rulesets = new TextDecoder("utf-8").decode(example_rulesets_byte_array);
+ const example_rulesets_json = JSON.parse(example_rulesets);
+
+ sinon.stub(util, "loadExtensionFile").returns(example_rulesets_json.rulesets);
+
+ update.applyStoredRulesets({addFromJson: response => {
+ assert.isArray(response);
+ assert.equal(response[0].name, "Example.com");
+ done();
+ }});
+ });
+
+ });
+
+});
diff --git a/chromium/test/util_test.js b/chromium/test/util_test.js
new file mode 100644
index 000000000000..af43df7440d1
--- /dev/null
+++ b/chromium/test/util_test.js
@@ -0,0 +1,105 @@
+'use strict';
+
+const assert = require('chai').assert,
+ util = require('../background-scripts/util');
+
+
+describe('util.js', function() {
+ describe('nullIterable', function() {
+ it('is iterable zero times and is size 0', function() {
+ let count = 0;
+ for (let _ of util.nullIterable) { // eslint-disable-line no-unused-vars
+ count += 1;
+ }
+ assert.strictEqual(count, 0);
+ assert.strictEqual(util.nullIterable.size, 0);
+ assert.isEmpty(util.nullIterable);
+ });
+ });
+
+ describe('isValidHostname', function() {
+ it('return true for common hosts', function() {
+ assert.strictEqual(util.isValidHostname('example.com'). true);
+ assert.strictEqual(util.isValidHostname('www.example.com'). true);
+ assert.strictEqual(util.isValidHostname('www.subdomain.example.com'). true);
+ });
+
+ it('return true for wildcard hosts', function() {
+ assert.strictEqual(util.isValidHostname('example.*'). true);
+ assert.strictEqual(util.isValidHostname('example.com.*'). true);
+ assert.strictEqual(util.isValidHostname('*.example.com'). true);
+ assert.strictEqual(util.isValidHostname('*.subdomain.example.com'). true);
+ });
+
+ it('return false for ill-formed hosts', function() {
+ // construct a lengthy hostname which host.length > 255
+ let prefix = "e1234567890.";
+ let lengthyHostname = "example.com";
+
+ for (let i = 0; i < 100; ++i) {
+ lengthyHostname = (prefix + lengthyHostname);
+ }
+
+ assert.strictEqual(util.isValidHostname(null), false);
+ assert.strictEqual(util.isValidHostname(''), false);
+ assert.strictEqual(util.isValidHostname(lengthyHostname), false);
+ assert.strictEqual(util.isValidHostname('example..com'), false);
+ assert.strictEqual(util.isValidHostname('www.example..com'), false);
+ });
+ });
+
+ describe('getNormalisedHostname', function() {
+ it('preserve port numbers', function() {
+ assert.strictEqual(util.getNormalisedHostname('example.com'), 'example.com');
+ assert.strictEqual(util.getNormalisedHostname('example.com:8080'), 'example.com:8080');
+ });
+
+ it('removes tailing dots and preserve port numbers', function() {
+ assert.strictEqual(util.getNormalisedHostname('example.com.'), 'example.com');
+ assert.strictEqual(util.getNormalisedHostname('example.com.:8080'), 'example.com:8080');
+ assert.strictEqual(util.getNormalisedHostname('example.com..'), 'example.com');
+ assert.strictEqual(util.getNormalisedHostname('example.com..:8080'), 'example.com:8080');
+ });
+
+ it('preserves a single dot', function() {
+ assert.strictEqual(util.getNormalisedHostname('.'), '.');
+ });
+ });
+
+ describe('getWildcardExpressions', function() {
+ it('return empty result for ill-formed hosts', function() {
+ assert.strictEqual(util.getWildcardExpressions(null).size, 0);
+ assert.strictEqual(util.getWildcardExpressions('').size, 0);
+ assert.strictEqual(util.getWildcardExpressions('example.com..').size, 0);
+ });
+
+ it('return empty result for wildcard hosts', function() {
+ assert.strictEqual(util.getWildcardExpressions('example.*').size, 0);
+ assert.strictEqual(util.getWildcardExpressions('example.com.*').size, 0);
+ assert.strictEqual(util.getWildcardExpressions('*.example.com').size, 0);
+ assert.strictEqual(util.getWildcardExpressions('*.subdomain.example.com').size, 0);
+ });
+
+ it('return list of supported wildcard expression', function() {
+ const params = {
+ 'example.com': [
+ 'example.*'
+ ],
+ 'www.example.com': [
+ 'www.example.*',
+ '*.example.com'
+ ],
+ 'x.y.z.google.com': [
+ 'x.y.z.google.*',
+ '*.y.z.google.com',
+ '*.z.google.com',
+ '*.google.com',
+ ]
+ };
+
+ for (const host in params) {
+ assert.deepEqual(util.getWildcardExpressions(host), params[host]);
+ }
+ });
+ });
+});
diff --git a/chromium/updates-master.xml b/chromium/updates-master.xml
deleted file mode 100644
index f6cb139b03ce..000000000000
--- a/chromium/updates-master.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/chromium/util.js b/chromium/util.js
deleted file mode 100644
index ede0e66c9a17..000000000000
--- a/chromium/util.js
+++ /dev/null
@@ -1,20 +0,0 @@
-VERB=1;
-DBUG=2;
-INFO=3;
-NOTE=4;
-WARN=5;
-// FYI: Logging everything is /very/ slow. Chrome will log & buffer
-// these console logs even when the debug tools are closed. :(
-
-// TODO: Add an easy UI to change the log level.
-// (Developers can just type DEFAULT_LOG_LEVEL=1 in the console)
-DEFAULT_LOG_LEVEL=4;
-function log(level, str) {
- if (level >= DEFAULT_LOG_LEVEL) {
- if (level === WARN) {
- // Show warning with a little yellow icon in Chrome.
- console.warn(str);
- }
- console.log(str);
- }
-}
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 000000000000..129e8e6890a4
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,13 @@
+# HTTPS Everywhere Documentation
+
+The markdown files contained in this path provide documentation for
+contributing to HTTPS Everywhere. These files are also templates that can be
+used to generate the markup for HTTPS Everywhere pages under
+`https://www.eff.org/https-everywhere`. To do so, install the program `pandoc`
+and run
+
+ pandoc faq.md
+
+Copy the output, excluding the header on the first line, to the source of the
+relevant page within the CMS. Note that some of the pages are dynamically
+generated and are not generated from templates contained here.
diff --git a/docs/adrs/bloom-filter-rule-signing.md b/docs/adrs/bloom-filter-rule-signing.md
new file mode 100644
index 000000000000..09b0fda6f2aa
--- /dev/null
+++ b/docs/adrs/bloom-filter-rule-signing.md
@@ -0,0 +1,28 @@
+# Bloom Filters and Async Rust for Ruleset Signing
+
+* Status: Deployed
+* Deciders: EFF (@zoracon and @hainish)
+* Deploy Date: 2021-03-03
+
+## Context and Problem Statement
+
+With larger ruleset lists to be signed on the DuckDuckGo Update channel, a better way to digest and form ruleset files were needed.
+
+## Decision Drivers
+
+* Bloom filters are able to ingest greater data sets at less memory expense
+* Rust is already incorporated in HTTPS Everywhere and is a memory safe language
+
+## Decision Outcome
+
+Created an async Rust script that ingests DuckDuckGo's Smarter Encryption list, compares to the Majestic Million list, and forms a bloom file and associated metadata.
+
+### Consequences and Concerns
+
+An accepted false positive is declared when the filter is generated.
+
+[Comment](https://github.com/EFForg/https-everywhere/pull/19910#issuecomment-771102775)
+
+## Links for Further Context
+* [Bloom Filter Script](https://github.com/EFForg/generate-smarter-encryption-bloom-filter)
+
diff --git a/docs/adrs/duckduckgo-smarter-encryption.md b/docs/adrs/duckduckgo-smarter-encryption.md
new file mode 100644
index 000000000000..a9c49824c9ae
--- /dev/null
+++ b/docs/adrs/duckduckgo-smarter-encryption.md
@@ -0,0 +1,33 @@
+# Incorporating DuckDuckGo Smarter Encryption
+
+* Status: Pending
+* Deciders: EFF (@zoracon and @hainish) and DuckDuckGo
+* Deploy Date: 2021-04-15
+
+## Context and Problem Statement
+
+With the increased HTTPS traffic, the current model of listed sites that support HTTPS is no longer a maintenance task that makes sense to uphold.
+
+## Decision Drivers
+
+* Firefox has an HTTPS-Only option
+* Browsers and websites are moving away from issues that created need for more granular ruleset maintenance.
+ * Mixed content is now blocked in major browsers
+ * Different domains for secure connection are now an older habit (i.e. secure.google.com)
+ * TLS 1.0, 1.1 deprecation
+* Chrome’s Manifest V3 will force the extensions to have a ruleset cap. Instead of competing with other extensions like DuckDuckGo, if the user prefers to use HTTPS Everywhere or DuckDuckGo's privacy essentials, we will provide the same coverage.
+* DuckDuckGo’s Smarter Encryption covers more domains than our current, more manual model.
+
+## Decision Outcome
+
+We chose to add the DuckDuckGo Smarter Encryption update channel, because it no longer is beneficial to diverse efforts with others with similar goals in this space.
+
+### Consequences and Concerns
+
+* We have many downstream partners supported and unofficial that rely on our current rulesets. This transition gives them time to make the needed decisions on their before we completely switch over to using DuckDuckGo's Smarter Encryption, and sunset our current rulesets in HTTPS Everywhere
+* …
+
+## Links for Further Context
+
+* https://spreadprivacy.com/duckduckgo-smarter-encryption/
+* https://www.eff.org/deeplinks/2020/11/10-years-https-everywhere
\ No newline at end of file
diff --git a/docs/default b/docs/default
new file mode 120000
index 000000000000..3e0b4191bfec
--- /dev/null
+++ b/docs/default
@@ -0,0 +1 @@
+en_US
\ No newline at end of file
diff --git a/docs/en_US/development.md b/docs/en_US/development.md
new file mode 100644
index 000000000000..b6041f652a98
--- /dev/null
+++ b/docs/en_US/development.md
@@ -0,0 +1,138 @@
+## HTTPS Everywhere Development
+
+### Pointers for developers
+
+* **License:** GPL version 3+ (although most of the code is GPL-2 compatible)
+* **Source code:** Available via Git with `git clone
+ https://github.com/EFForg/https-everywhere.git`. You can fork and open pull
+ requests using Github at
+ [https://github.com/EFForg/https-everywhere](https://github.com/EFForg/https-everywhere).
+* **Translations:** If you would like to help translate HTTPS Everywhere into
+ another language, you can do that [through
+ Transifex](https://www.transifex.com/otf/torproject/).
+* **Bug tracker:** Use the [GitHub issue
+ tracker](https://github.com/EFForg/https-everywhere/issues/) or the [Tor
+ Project issue tracker](https://trac.torproject.org/projects/tor/report/19).
+ For the Tor Project issue tracker, you can make an account or use the
+ anonymous one — "cypherpunks"/"writecode". You won't see replies unless you
+ put an email address in the CC field. Bugs that are caused by rulesets
+ should be tagged "httpse-ruleset-bug", and can be viewed [in this
+ report](https://trac.torproject.org/projects/tor/report/48).
+* **Mailing lists:** The
+ [https-everywhere](https://lists.eff.org/mailman/listinfo/https-everywhere)
+ list ([archives](https://lists.eff.org/pipermail/https-everywhere/)) is for
+ discussing the project as a whole; the
+ [https-everywhere-rules](https://lists.eff.org/mailman/listinfo/https-everywhere-rules)
+ mailing list
+ ([archives](https://lists.eff.org/pipermail/https-everywhere-rules)) is for
+ discussing the [rulesets](https://www.eff.org/https-everywhere/rulesets)
+ and their contents, including patches and git pull requests.
+* **IRC:** `#https-everywhere` on `irc.oftc.net`; if you don't have an IRC
+ client application already installed, you can [use this webchat
+ interface](https://webchat.oftc.net/?channels=#https-everywhere). If you
+ ask a question, be sure to stay in the channel — someone may reply a few
+ hours or a few days later.
+
+### Testing and contributing changes to the source code
+
+HTTPS Everywhere consists of a large number of rules for switching sites from
+HTTP to HTTPS. You can read more about how to write these rules
+[here](https://www.eff.org/https-everywhere/rulesets).
+
+If you want to create new rules to submit to us, we expect them to be in the
+src/chrome/content/rules directory. That directory also contains a useful
+script, make-trivial-rule, to create a simple rule for a specified domain.
+There is also a script in test/validations/special/run.py, to check all the
+pending rules for several common errors and oversights. For example, if you
+wanted to make a rule for the example.com domain, you could run
+
+ bash ./make-trivial-rule example.com
+
+inside the rules directory. This would create Example.com.xml, which you could
+then take a look at and edit based on your knowledge of any specific URLs at
+example.com that do or don't work in HTTPS.
+
+Before submitting your change, you should test it in Firefox and/or Chrome, as
+applicable. You can build the latest version of the extension and run it in a
+standalone Firefox profile using:
+
+ bash ./test.sh --justrun
+
+Similarly, to build and run in a standalone Chromium profile, run:
+
+ bash ./run-chromium.sh
+
+You should thoroughly test your changes on the target site: Navigate to as wide
+a variety of pages as you can find. Try to comment or log in if applicable.
+Make sure everything still works properly.
+
+After running your manual tests, run the automated tests and the fetch tests:
+
+ bash ./test.sh
+
+ bash ./fetch-test.sh
+
+This will catch some of the most common types of errors, but is not a
+guaranteed of correctness.
+
+Once you've tested your changes, you can submit them for review via any of the
+following:
+
+* Open a pull request at
+ [https://github.com/EFForg/https-everywhere](https://github.com/EFForg/https-everywhere).
+* Email https-everywhere-rules@eff.org to tell us about your changes. You can
+ use the following command to create a patch file: `git format-patch`
+
+### A quick HOWTO on working with Git
+
+You may want to also look at the [Git Reference](http://gitref.org/), [GitHub
+Help Site](https://help.github.com/) and the [Tor Project's Git
+documentation](https://gitweb.torproject.org/githax.git/tree/doc/Howto.txt) to
+fill in the gaps here, but the below should be enough to get the basics of the
+workflow down.
+
+First, tell git your name:
+
+ git config --global user.name "Your Name"
+ git config --global user.email "you@example.com"
+
+Then, get a copy of the 'origin' repository:
+
+ git clone https://github.com/EFForg/https-everywhere.git
+ cd https-everywhere
+
+Alternatively, if you already have a Github account, you can create a "fork" of
+the repository on Github at
+[https://github.com/EFForg/https-everywhere](https://github.com/EFForg/https-everywhere).
+See [this page](https://help.github.com/articles/fork-a-repo) for a tutorial.
+
+Once you have a local copy of the repository, create a new branch for your
+changes and check it out:
+
+ git checkout -b my-new-rules master
+
+When you want to send us your work, you'll need to add any new files to the
+index with git add:
+
+ git add ./src/chrome/content/rules/MyRule1.xml
+ git add ./src/chrome/content/rules/MyRule2.xml
+
+You can now commit your changes to the local branch. To make things easier, you
+should commit each xml file individually:
+
+ git commit ./src/chrome/content/rules/MyRule1.xml
+ git commit ./src/chrome/content/rules/MyRule2.xml
+
+Now, you need a place to publish your changes. You can create a github account
+here: [https://github.com/join](https://help.github.com/).
+[https://help.github.com/](https://help.github.com/) describes the account
+creation process and some other github-specific things.
+
+Once you have created your account and added your remote in your local
+checkout, you want to push your branch to your github remote:
+
+ git push github my-new-rules:my-new-rules
+
+Periodically, you should re-fetch the master repository:
+
+ git pull master
diff --git a/docs/en_US/faq.md b/docs/en_US/faq.md
new file mode 100644
index 000000000000..1a805b5bcf53
--- /dev/null
+++ b/docs/en_US/faq.md
@@ -0,0 +1,308 @@
+## HTTPS Everywhere FAQ
+
+This page answers frequently-asked questions about EFF's [HTTPS
+Everywhere](https://www.eff.org/https-everywhere) project. If your question
+isn't answered below, you can try the resources [listed
+here](https://www.eff.org/https-everywhere/development).
+
+* [What if HTTPS Everywhere breaks some site that I
+ use?](#what-if-https-everywhere-breaks-some-site-that-i-use)
+* [Why is HTTPS Everywhere preventing me from joining this hotel/school/other
+ wireless
+ network?](#why-is-https-everywhere-preventing-me-from-joining-this-hotelschoolother-wireless-network)
+* [Will there be a version of HTTPS Everywhere for IE, Safari, or some other
+ browser?](#will-there-be-a-version-of-https-everywhere-for-ie-safari-or-some-other-browser)
+* [Why use a allowlist of sites that support HTTPS? Why can't you try to use
+ HTTPS for every last site, and only fall back to HTTP if it isn't
+ available?](#why-use-a-allowlist-of-sites-that-support-https-why-cant-you-try-to-use-https-for-every-last-site-and-only-fall-back-to-http-if-it-isnt-available)
+* [How do I get rid of/move the HTTPS Everywhere button in the
+ toolbar?](#how-do-i-get-rid-ofmove-the-https-everywhere-button-in-the-toolbar)
+* [When does HTTPS Everywhere protect me? When does it not protect
+ me?](#when-does-https-everywhere-protect-me-when-does-it-not-protect-me)
+* [What does HTTPS Everywhere protect me
+ against?](#what-does-https-everywhere-protect-me-against)
+* [How do I get support for an additional site in HTTPS
+ Everywhere?](#how-do-i-get-support-for-an-additional-site-in-https-everywhere)
+* [What if the site doesn't support HTTPS, or only supports it for some
+ activities, like entering credit card
+ information?](#what-if-the-site-doesnt-support-https-or-only-supports-it-for-some-activities-like-entering-credit-card-information)
+* [Isn't it more expensive or slower for a site to support HTTPS compared to
+ regular
+ HTTP?](#isnt-it-more-expensive-or-slower-for-a-site-to-support-https-compared-to-regular-http)
+* [Why should I use HTTPS Everywhere instead of just typing https:// at the
+ beginning of site
+ names?](#why-should-i-use-https-everywhere-instead-of-just-typing-https-at-the-beginning-of-site-names)
+* [Why does HTTPS Everywhere include rules for sites like PayPal that already
+ require HTTPS on all their
+ pages?](#why-does-https-everywhere-include-rules-for-sites-like-paypal-that-already-require-https-on-all-their-pages)
+* [What do the different colors for rulesets in the Firefox toolbar menu
+ mean?](#what-do-the-different-colors-for-rulesets-in-the-firefox-toolbar-menu-mean)
+* [What do the different colors of the HTTPS Everywhere icon
+ mean?](#what-do-the-different-colors-of-the-https-everywhere-icon-mean)
+* [I'm having a problem installing the browser
+ extension.](#im-having-a-problem-installing-the-browser-extension.)
+* [How do I uninstall/remove HTTPS
+ Everywhere?](#how-do-i-uninstallremove-https-everywhere)
+* [How do I add my own site to HTTPS
+ Everywhere?](#how-do-i-add-my-own-site-to-https-everywhere)
+* [Can I help translate HTTPS Everywhere into my own
+ language?](#can-i-help-translate-https-everywhere-into-my-own-language)
+
+### [What if HTTPS Everywhere breaks some site that I use?](#what-if-https-everywhere-breaks-some-site-that-i-use)
+
+This is occasionally possible because of inconsistent support for HTTPS on
+sites (e.g., when a site seems to support HTTPS access but makes a few,
+unpredictable, parts of the site unavailable in HTTPS). If you [report the
+problem to us](https://github.com/EFForg/https-everywhere/issues), we can try
+to fix it. In the meantime, you can disable the rule affecting that particular
+site in your own copy of HTTPS Everywhere by clicking on the HTTPS Everywhere
+toolbar button and unchecking the rule for that site.
+
+You can also report the problem to the site, since they have the power to fix
+it!
+
+### [Why is HTTPS Everywhere preventing me from joining this hotel/school/other wireless network?](#why-is-https-everywhere-preventing-me-from-joining-this-hotelschoolother-wireless-network)
+
+Some wireless networks hijack your HTTP connections when you first join them,
+in order to demand authentication or simply to try to make you agree to terms
+of use. HTTPS pages are protected against this type of hijacking, which is as
+it should be. If you go to a website that isn't protected by HTTPS Everywhere
+or by HSTS (currently, example.com is one such site), that will allow your
+connection to be captured and redirected to the authentication or terms of use
+page.
+
+### [Will there be a version of HTTPS Everywhere for IE, Safari, or some other browser?](#will-there-be-a-version-of-https-everywhere-for-ie-safari-or-some-other-browser)
+
+As of early 2012, the Safari extension API does not offer a way to perform
+secure rewriting of http requests to https. But if you happen to know a way to
+perform secure request rewriting in these browsers, feel free to let us know at
+https-everywhere at EFF.org (but note that modifying document.location or
+window.location in JavaScript is not secure).
+
+### [Why use a allowlist of sites that support HTTPS? Why can't you try to use HTTPS for every last site, and only fall back to HTTP if it isn't available?](#why-use-a-allowlist-of-sites-that-support-https-why-cant-you-try-to-use-https-for-every-last-site-and-only-fall-back-to-http-if-it-isnt-available)
+
+There are several problems with the idea of trying to automatically detect
+HTTPS on every site. There is no guarantee that sites are going to give the
+same response via HTTPS that they give via HTTP. Also, it's not possible to
+test for HTTPS in real time without introducing security vulnerabilities (What
+should the extension do if the HTTPS connection attempt fails? Falling back to
+insecure HTTP isn't safe). And in some cases, HTTPS Everywhere has to perform
+quite complicated transformations on URIs — for example until recently the
+Wikipedia rule had to turn an address like
+`http://en.wikipedia.org/wiki/World_Wide_Web` into one like
+`https://secure.wikimedia.org/wikipedia/en/wiki/World_Wide_Web` because HTTPS
+was not available on Wikipedia's usual domains.
+
+### [How do I get rid of/move the HTTPS Everywhere button in the toolbar?](#how-do-i-get-rid-ofmove-the-https-everywhere-button-in-the-toolbar)
+
+The HTTPS Everywhere button is useful because it allows you to see, and
+disable, a ruleset if it happens to be causing problems with a site. But if
+you'd rather disable it, go to View->Toolbars->Customize, and drag the button
+out of the toolbar into the Addons bar at the bottom of the page. Then you can
+hide the Addons bar. (In theory you should be able to drag it into the tray of
+available icons too, but that may trigger [this
+bug](https://trac.torproject.org/projects/tor/ticket/6276).
+
+### [When does HTTPS Everywhere protect me? When does it not protect me?](#when-does-https-everywhere-protect-me-when-does-it-not-protect-me)
+
+HTTPS Everywhere protects you only when you are using _encrypted portions of
+supported web sites_. On a supported site, it will automatically activate HTTPS
+encryption for all known supported parts of the site (for some sites, this
+might be only a portion of the entire site). For example, if your web mail
+provider does not support HTTPS at all, HTTPS Everywhere can't make your access
+to your web mail secure. Similarly, if a site allows HTTPS for text but not
+images, someone might be able to see which images your browser loads and guess
+what you're accessing.
+
+HTTPS Everywhere depends entirely on the security features of the individual
+web sites that you use; it _activates_ those security features, but it can't
+_create_ them if they don't already exist. If you use a site not supported by
+HTTPS Everywhere or a site that provides some information in an insecure way,
+HTTPS Everywhere can't provide additional protection for your use of that site.
+Please remember to check that a particular site's security is working to the
+level you expect before sending or receiving confidential information,
+including passwords.
+
+One way to determine what level of protection you're getting when using a
+particular site is to use a packet-sniffing tool like
+[Wireshark](https://www.wireshark.org/) to record your own communications with
+the site. The resulting view of your communications is about the same as what
+an eavesdropper on your wifi network or at your ISP would see. This way, you
+can determine whether some or all of your communications would be protected;
+however, it may be quite time-consuming to make sense of the Wireshark output
+with enough care to get a definitive answer.
+
+You can also turn on the "Block all HTTP requests" feature for added
+protection. Instead of loading insecure pages or images, HTTPS Everywhere will
+block them outright.
+
+### [What does HTTPS Everywhere protect me against?](#what-does-https-everywhere-protect-me-against)
+
+On supported parts of supported sites, HTTPS Everywhere enables the sites'
+HTTPS protection which can protect you against eavesdropping and tampering with
+the contents of the site or with the information you send to the site. Ideally,
+this provides some protection against an attacker learning the content of the
+information flowing in each direction — for instance, the text of e-mail
+messages you send or receive through a webmail site, the products you browse or
+purchase on an e-commerce site, or the particular articles you read on a
+reference site.
+
+However, HTTPS Everywhere **does not conceal the identities of the sites you
+access**, the amount of time you spend using them, or the amount of information
+you upload or download from a particular site. For example, if you access
+`http://www.eff.org/issues/nsa-spying` and HTTPS Everywhere rewrites it to
+`https://www.eff.org/issues/nsa-spying`, an eavesdropper can still trivially
+recognize that you are accessing www.eff.org (but might not know which issue
+you are reading about). In general, the entire hostname part of the URL remains
+exposed to the eavesdropper because this must be sent repeatedly in unencrypted
+form while setting up the connection. Another way of saying this is that HTTPS
+was never designed to conceal the identity of the sites that you visit.
+
+Researchers have also shown that it may be possible for someone to figure out
+more about what you're doing on a site merely through careful observation of
+the amount of data you upload and download, or the timing patterns of your use
+of the site. A simple example is that if the site only has one page of a
+certain total size, anyone downloading exactly that much data from the site is
+probably accessing that page.
+
+If you want to protect yourself against monitoring of the sites you visit,
+consider using HTTPS Everywhere together with software like
+[Tor](https://www.torproject.org/).
+
+### [How do I get support for an additional site in HTTPS Everywhere?](#how-do-i-get-support-for-an-additional-site-in-https-everywhere)
+
+You can learn [how to write
+rules](https://www.eff.org/https-everywhere/rulesets) that teach HTTPS
+Everywhere to support new sites. You can install these rules in your own
+browser or send them to us for possible inclusion in the official version.
+
+### [What if the site doesn't support HTTPS, or only supports it for some activities, like entering credit card information?](#what-if-the-site-doesnt-support-https-or-only-supports-it-for-some-activities-like-entering-credit-card-information)
+
+You could try to contact the site and point out that using HTTPS for all site
+features is an increasingly common practice nowadays and protects users (and
+sites) against a variety of Internet attacks. For instance, it defends against
+the ability of other people on a wifi network to spy on your use of the site or
+even take over your account. You can also point out that credit card numbers
+aren't the only information you consider private or sensitive.
+
+Sites like Google, Twitter, and Facebook now support HTTPS for non-financial
+information — for general privacy and security reasons.
+
+### [Isn't it more expensive or slower for a site to support HTTPS compared to regular HTTP?](#isnt-it-more-expensive-or-slower-for-a-site-to-support-https-compared-to-regular-http)
+
+It can be, but some sites have been pleasantly surprised to see how practical
+it can be. Also, experts at Google are currently implementing several
+enhancements to the TLS protocol that make HTTPS dramatically faster; if these
+enhancements are added to the standard soon, the speed gap between the two
+should almost disappear. See [Adam Langley's description of the HTTPS
+deployment
+situation](https://www.imperialviolet.org/2010/06/25/overclocking-ssl.html) for
+more details on these issues. Notably, Langley states: "In order to [enable
+HTTPS by default for Gmail] we had to deploy no additional machines and no
+special hardware. On our production frontend machines, SSL/TLS accounts for
+less than 1% of the CPU load, less than 10KB of memory per connection and less
+than 2% of network overhead."
+
+It used to be expensive to purchase a certificate for HTTPS usage, but they can
+now be obtained for free from [Let's Encrypt](https://letsencrypt.org/) as
+well.
+
+### [Why should I use HTTPS Everywhere instead of just typing https:// at the beginning of site names?](#why-should-i-use-https-everywhere-instead-of-just-typing-https-at-the-beginning-of-site-names)
+
+Even if you normally type https://, HTTPS Everywhere might protect you if you
+occasionally forget. Also, it can rewrite other people's links that you follow.
+For instance, if you click on a link to
+`http://en.wikipedia.org/wiki/EFF_Pioneer_Award`, HTTPS Everywhere will
+automatically rewrite the link to
+`https://en.wikimedia.org/wikipedia/en/wiki/EFF_Pioneer_Award`. Thus, you might
+get some protection even if you wouldn't have noticed that the target site is
+available in HTTPS.
+
+### [Why does HTTPS Everywhere include rules for sites like PayPal that already require HTTPS on all their pages?](#why-does-https-everywhere-include-rules-for-sites-like-paypal-that-already-require-https-on-all-their-pages)
+
+HTTPS Everywhere, like the [HSTS
+spec](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security), tries to
+address an attack called [SSL stripping](https://moxie.org/software/sslstrip/).
+Users are only protected against the SSL stripping attack if their browsers
+don't even _try_ to connect to the HTTP version of the site — even if the site
+would have redirected them to the HTTPS version. With HTTPS Everywhere, the
+browser won't even attempt the insecure HTTP connection, even if that's what
+you ask it to do. (Note that HTTPS Everywhere currently does not include a
+comprehensive list of such sites, which are mainly financial institutions.)
+
+### [What do the different colors for rulesets in the Firefox toolbar menu mean?](#what-do-the-different-colors-for-rulesets-in-the-firefox-toolbar-menu-mean)
+
+The colors are:
+
+Dark Green: ruleset was active in loading the resources in the current page.
+
+Light Green: ruleset was ready to prevent HTTP loads in the current page, but
+everything that the ruleset would have covered was loaded over HTTPS anyway (in
+the code, light green is called a "moot rule").
+
+Dark Brown or Clockwise Red Arrow: broken rule -- the ruleset is active but the
+server is redirecting at least some URLs back from HTTPS to HTTP.
+
+Gray: the ruleset is disabled.
+
+### [What do the different colors of the HTTPS Everywhere icon mean?](#what-do-the-different-colors-of-the-https-everywhere-icon-mean)
+
+The colors are:
+
+Light Blue: HTTPS Everywhere is enabled.
+
+Dark Blue: HTTPS Everywhere is both enabled and active in loading resources in
+the current page.
+
+Red: All unencrypted requests will be blocked by HTTPS Everywhere.
+
+Gray: HTTPS Everywhere is disabled.
+
+### [I'm having a problem installing the browser extension.](#im-having-a-problem-installing-the-browser-extension.)
+
+Some people report that installing HTTPS Everywhere gives them the error: "The
+addon could not be downloaded because of a connection failure on www.eff.org."
+This may be caused by Avast anti-virus, which blocks installation of browser
+extensions. You may be able to [install from addons.mozilla.org
+instead](https://addons.mozilla.org/en-US/firefox/addon/https-everywhere/).
+
+### [How do I uninstall/remove HTTPS Everywhere?](#how-do-i-uninstallremove-https-everywhere)
+
+In Firefox: Click the menu button in the top right of the window at the end of
+the toolbar (it looks like three horizontal lines), and then click "Add-ons"
+(it looks like a puzzle piece). Scroll until you see HTTPS Everywhere, and then
+click the "Remove" button all the way on the right. You can then safely close
+the Add-ons tab.
+
+In Chrome: Click the menu button in the top right of the window at the end of
+the toolbar (it looks like three horizontal lines), and then click "Settings"
+near the bottom. On the left, click "Extensions". Scroll until you see HTTPS
+Everywhere, and then click the trash can icon on the right, and then click
+"Remove" to confirm removal. You can then safely close the Settings tab.
+
+### [How do I add my own site to HTTPS Everywhere?](#how-do-i-add-my-own-site-to-https-everywhere)
+
+We're excited that you want your site in HTTPS Everywhere! However, remember
+that not everyone who visits your site has our extension installed. If you run
+a web site, you can make it default to HTTPS for everyone, not just HTTPS
+Everywhere users. And it's less work! The steps you should take, in order, are:
+
+1. Set up a
+ [redirect](https://www.sslshopper.com/apache-redirect-http-to-https.html)
+ from HTTP to HTTPS on your site.
+2. [Add the Strict-Transport-Security (HSTS) header on your
+ site.](https://raymii.org/s/tutorials/HTTP_Strict_Transport_Security_for_Apache_NGINX_and_Lighttpd.html)
+3. [Add your site to the HSTS Preload list.](https://hstspreload.appspot.com/)
+
+These steps will give your site much better protection than adding it to HTTPS
+Everywhere. Generally speaking, once you are done, there is no need to add your
+site to HTTPS Everywhere. However, if you would still like to, please follow
+the [instructions on writing
+rulesets](https://eff.org/https-everywhere/rulesets), and indicate that you are
+the author of the web site when you submit your pull request.
+
+### [Can I help translate HTTPS Everywhere into my own language? ](#can-i-help-translate-https-everywhere-into-my-own-language)
+
+Yes! We use the Tor Project's Transifex account for translations, please sign
+up to help translate at
+[https://www.transifex.com/otf/torproject](https://www.transifex.com/otf/torproject).
diff --git a/docs/en_US/https-everywhere-popup-updated.png b/docs/en_US/https-everywhere-popup-updated.png
new file mode 100644
index 000000000000..02023090383a
Binary files /dev/null and b/docs/en_US/https-everywhere-popup-updated.png differ
diff --git a/docs/en_US/https-everywhere-popup.png b/docs/en_US/https-everywhere-popup.png
new file mode 100644
index 000000000000..373cba228739
Binary files /dev/null and b/docs/en_US/https-everywhere-popup.png differ
diff --git a/docs/en_US/https-updates.png b/docs/en_US/https-updates.png
new file mode 100644
index 000000000000..61b79a28a0b5
Binary files /dev/null and b/docs/en_US/https-updates.png differ
diff --git a/docs/en_US/my-lan.png b/docs/en_US/my-lan.png
new file mode 100644
index 000000000000..4442b022754f
Binary files /dev/null and b/docs/en_US/my-lan.png differ
diff --git a/docs/en_US/options.png b/docs/en_US/options.png
new file mode 100644
index 000000000000..77b8e5d5dce4
Binary files /dev/null and b/docs/en_US/options.png differ
diff --git a/docs/en_US/ruleset-update-channels.md b/docs/en_US/ruleset-update-channels.md
new file mode 100644
index 000000000000..24828ac0129d
--- /dev/null
+++ b/docs/en_US/ruleset-update-channels.md
@@ -0,0 +1,180 @@
+* [Ruleset Update Channels](#ruleset-update-channels)
+ * [Update Channel Format & Logic](#update-channel-format--logic)
+ * [Publishing Custom Update Channels](#publishing-custom-update-channels)
+ * [1. Creating an RSA key and generating a `jwk` object from it](#1-creating-an-rsa-key-and-generating-a-jwk-object-from-it)
+ * [2. Signing rulesets with this key](#2-signing-rulesets-with-this-key)
+ * [Setup](#setup)
+ * [Signing](#signing)
+ * [3. Publishing those rulesets somewhere](#3-publishing-those-rulesets-somewhere)
+ * [4. Getting users to use your update channel](#4-getting-users-to-use-your-update-channel)
+ * [Adding and Deleting Update Channels](#adding-and-deleting-update-channels)
+
+# Ruleset Update Channels
+
+Whenever you download HTTPS Everywhere, it comes with a long list of *rulesets* that are maintained by the community. These rulesets tell HTTPS Everywhere when and how to redirect requests to the secure version of a site. HTTPS Everywhere includes tens of thousands of these rulesets, which are public and ever-changing as we expand and improve coverage. They are delivered to you with each new version of the extension, along with all the code that makes up the extension itself. Between and in addition to extension updates, code within the extension fetches regular updates to the rulesets. This ensures that you get more up-to-date coverage for sites that offer HTTPS, and you'll encounter fewer sites that break due to bugs in our list of supported sites.
+
+
+
+We deliver these rulesets via what we call an *update channel*. Currently, HTTPS Everywhere is delivered with a single update channel, named `EFF (Full)`. You can see this channel when you click on the HTTPS Everywhere icon and look at the bottom of the popup:
+
+
+
+First, the extension version is shown (in this case 2018.8.22), and then the version of the rulesets for a given update channel is shown (in this case 2018.8.30).
+
+## Update Channel Format & Logic
+
+Update channels can be found in [`chromium/background-scripts/update_channels.js`](https://github.com/EFForg/https-everywhere/blob/master/chromium/background-scripts/update_channels.js), and consist of:
+
+1. A `name` string, which identifies it and will be displayed in the extension popup
+2. A `jwk` object, which defines the RSA public key to use when verifying downloaded rulesets
+3. A `update_path_prefix` string, which tells the extension where to look for new rulesets
+4. A `scope` string, which is used to construct a JavaScript `RegExp` object
+5. A `replaces_default_rulesets` boolean, which tells the extension whether to overwrite the rulesets bundled with the extension
+
+Every 24 hours, the extension checks the URL contained in `update_path_prefix` appended with `/latest-rulesets-timestamp` (in the case of `EFF (Full)`, `https://www.https-rulesets.org/v1//latest-rulesets-timestamp`). If it discovers the timestamp has updated since the last time it fetched the rulesets, it will download a new ruleset, following the format `update_path_prefix` appended with `default.rulesets.XXXXXXXXXX.gz`, where `XXXXXXXXXX` is the timestamp discovered in the previous request. At the same time, a corresponding signature for that file is downloaded, `update_path_prefix` appended with `rulesets-signature.XXXXXXXXXX.sha256`, again with the timestamp replacing the `XXXXXXXXXX`.
+
+It then attempts to verify the rulesets, which are signed with the private RSA key corresponding to the public key in the update channel's `jwk` object. If the signature verifies, the rulesets are stored and applied to the running instance of the extension. If it can not be verified, the rulesets are discarded and the last known good state is used.
+
+Once the rulesets are stored, they will be allowed to operate on URLs only within the `scope` of the update channel, as found above. URLs must match the regular expression in this string in order to be redirected. This string will be used as the first and only argument when constructing a JavaScript `RegExp` object. If you wanted to define an update channel that only operated on URLs with the `www` subdomain, you could do so by entering the string `^https?://www\\.`, for example:
+
+```javascript
+> re = new RegExp('^https?://www\\.');
+/^https?:\/\/www\./
+> "http://www.example.com/".match(re);
+[ 'http://www.',
+ index: 0,
+ input: 'http://www.example.com/',
+ groups: undefined ]
+> "http://example.com/".match(re);
+null
+```
+
+## Publishing Custom Update Channels
+
+In addition to the rulesets contained in the EFF update channel, you may want to publish your own. There are a few instances where this may be useful:
+
+1. You are on a corporate LAN and would rather not divulge the internal DNS records for various services by submitting rulesets to the public list
+2. You are an organization that verifies `onion` services, and would like to create vanity URLs for the `onion` services that you've verified (this will make [usability of onion URLs](https://blog.torproject.org/cooking-onions-names-your-onions) much better)
+3. You would like to implement tracker blocking within HTTPS Everywhere by forwarding a list of hosts to an unroutable address
+
+There may be additional use cases not enumerated here. For this to be effective, an organization has to publish their own custom update channel. This involves a few steps:
+
+1. Creating an RSA key and generating a `jwk` object from it
+2. Signing rulesets with this key
+3. Publishing those rulesets somewhere
+4. Getting users to use your update channel
+
+We will go through each of these in sequence, but first, you'll want to consider if you want your signing process airgapped or not. Airgapped signing has the advantage of making it hard for malware to exfiltrate key material and thus forge a signed ruleset update, but it will also make it slightly more difficult to sign. If you decide on an airgapped signing process, you may want to copy the script [`utils/sign-rulesets/async-airgap.sh`](https://github.com/EFForg/https-everywhere/blob/master/utils/sign-rulesets/async-airgap.sh) to the airgap *before* cutting off networking for the last time. You may also want to install the `python-qr` code on this machine to easily copy the RSA public key to your development environment, once generated, as well as `qrencode` and `eog` for ease in the signing process.
+
+### 1. Creating an RSA key and generating a `jwk` object from it
+
+To create an RSA key, issue the following command (either on your development machine if you are not using an airgapped process, or the airgap if you are):
+
+ openssl genrsa -out key.pem 4092
+
+Your RSA keypair will now be stored in the file `key.pem`. To generate a corresping public key, issue this command:
+
+ openssl rsa -in key.pem -outform PEM -pubout -out public.pem
+
+Your public key is now stored in `public.pem`. If you are using an airgap, copy this public key (with whatever method is safest in your setup, perhaps with the `qr` command) to your development environment.
+
+At this point, you will need to generate a `jwk` object from the public key. This can be done with the `pem-jwk` node package. You'll have to download node.js and npm, or just issue this command in docker:
+
+ sudo docker run -it -v $(pwd):/opt --workdir /opt node bash
+
+And you will be booted into a node environment. Next, run
+
+ npm install -g pem-jwk
+
+This will install the `pem-jwk` package globally. You can now run
+
+ cat public.pem | pem-jwk
+
+And you should see a `jwk` object displayed. Take note of this, you will need it later.
+
+### 2. Signing rulesets with this key
+
+#### Setup
+
+On your development machine, clone or download the HTTPS Everywhere repository. Since it's quite large, it will suffice to do a shallow clone:
+
+ git clone --depth=1 https://github.com/EFForg/https-everywhere.git
+
+or
+
+ curl -sLO https://github.com/EFForg/https-everywhere/archive/master.zip; unzip master.zip; mv https-everywhere-master https-everywhere
+
+Next,
+
+ cd https-everywhere
+ rm rules/*.xml
+
+This will remove all the rulesets bundled with the extension itself. All the rulesets you want to sign for your update channel must be in the `rules` directory before moving to the next step. Generate an example ruleset or use your own ruleset:
+
+ cd rules
+ ./make-trivial-rule example.com
+ cd ..
+
+#### Signing
+
+You will need python 3.6 on your system or available via docker for the next step.
+
+ sudo docker run -it -v $(pwd):/opt --workdir /opt python:3.6 bash
+
+Next, run
+
+ python3 utils/merge-rulesets.py
+
+You should see the following output:
+
+```shell
+ * Parsing XML ruleset and constructing JSON library...
+ * Writing JSON library to src/chrome/content/rules/default.rulesets
+ * Everything is okay.
+```
+
+This prepares the file you are about to sign. If your do not have an airgap, run the following command:
+
+ utils/sign-rulesets/standalone.sh /path/to/key.pem /some/output/path
+
+If you have an airgapped setup, run the following command on your development machine:
+
+ utils/sign-rulesets/async-request.sh /path/to/public.pem /some/output/path
+
+This will display a hash for signing, as well as a metahash. On your airgap machine, run the `async-airgap.sh` script that you had previously copied to it:
+
+ ./async-airgap.sh /path/to/key.pem SHA256_HASH
+
+typing the hash carefully. Check the metahash to make sure it is the same as what was displayed on your development machine. This will output base64-encoded data as well as a QR code representing that data that you can scan, and send that data to your development machine. Once you have that data from the QR code pasted into the development machine prompt, press Ctrl-D and you should have output indicating that your rulesets have been signed successfully.
+
+### 3. Publishing those rulesets somewhere
+
+Once you've signed the rulesets successfully, choose a public URL to make these rulesets accessible. You may want to use a CDN if you expect a lot of traffic on this endpoint. Your rulesets as well as their signatures are stored in `/some/output/path` you chose above, you need only to upload them to an endpoint your users can access.
+
+### 4. Getting users to use your update channel
+
+Once you've established an update channel by publishing your rulesets, you'll want to let your users know how to use them. From step 1 above, you have a `jwk` object. You may want to also only allow modification of certain URLs, using the `scope` field. The `update_path_prefix` field will simply be the public URL that you chose in step 3.
+
+If your users are using a custom build of HTTPS Everywhere (such as in a corporate LAN environment), you can modify [`chromium/background-scripts/update_channels.js`](https://github.com/EFForg/https-everywhere/blob/master/chromium/background-scripts/update_channels.js) to include a new update channel in the same format as the EFF update channel.
+
+In most cases, your users will just be using a standard HTTPS Everywhere build. In this case, they will have to add your update channel using the UX, as explained below.
+
+## Adding and Deleting Update Channels
+
+In addition to being defined in `update_channels.js`, users can add additional update channels via the extension options.
+
+In Firefox, enter `about:addons` into the URL bar, then click on `Extensions` on the left navbar, then click `Preferences` next to the HTTPS Everywhere extension.
+
+In Chrome, right-click on the HTTPS Everywhere icon and click `Options`.
+
+You will now see the HTTPS Everywhere options page. Click `Update Channels`.
+
+You will now see a list of update channels, with `EFF (Full)` being the first. Below, you can add a new update channel. Once you hit `Update`, the channel will download a new ruleset release (if available) from the channel.
+
+
+
+If a new ruleset update is available, after a few seconds you should now see the new ruleset version in the bottom of the extension popup:
+
+
+
+You can also delete rulesets from the extension options. Under `Update Channels`, just click `Delete` for the channel you want to delete. This will immediately remove the rulesets from this update channel.
diff --git a/docs/en_US/rulesets.md b/docs/en_US/rulesets.md
new file mode 100644
index 000000000000..f9f71f020f34
--- /dev/null
+++ b/docs/en_US/rulesets.md
@@ -0,0 +1,208 @@
+## HTTPS Everywhere Rulesets
+
+This page describes how to write rulesets for [HTTPS
+Everywhere](https://eff.org/https-everywhere), a browser extension that
+switches sites over from HTTP to HTTPS automatically. HTTPS Everywhere comes
+with [thousands](https://atlas.eff.org/index.html) of rulesets that
+tell HTTPS Everywhere which sites it should switch to HTTPS and how. If there
+is a site that offers HTTPS and is not handled by the extension, this guide
+will explain how to add that site.
+
+#### [Rulesets](#rulesets)
+
+A `ruleset` is an [XML](https://www.xml.com/pub/a/98/10/guide0.html?page=2) file
+describing behavior for a site or group of sites. A ruleset contains one or
+more `rules`. For example, here is
+[`RabbitMQ.xml`](https://github.com/efforg/https-everywhere/blob/master/src/chrome/content/rules/RabbitMQ.xml),
+from the addon distribution:
+
+```xml
+
+
+
+
+
+
+```
+
+The `target` tag specifies which web sites the ruleset applies to. The `rule`
+tag specifies how URLs on those web sites should be rewritten. This rule says
+that any URLs on `rabbitmq.com` and `www.rabbitmq.com` should be modified by
+replacing "http:" with "https:".
+
+When the browser loads a URL, HTTPS Everywhere takes the host name (e.g.
+www.rabbitmq.com) and searches its ruleset database for rulesets that
+match that host name.
+
+HTTPS Everywhere then tries each rule in those rulesets against the full URL.
+If the [Regular
+Expression](https://www.regular-expressions.info/quickstart.html), or regexp, in
+one of those rules matches, HTTPS Everywhere [rewrites the
+URL](#rules-and-regular-expressions) according the `to` attribute of the rule.
+
+#### [Wildcard Targets](#wildcard-targets)
+
+To cover all of a domain's subdomains, you may want to specify a wildcard
+target like `*.twitter.com`. Specifying this type of left-side wildcard matches
+any host name with `.twitter.com` as a suffix, e.g. `www.twitter.com` or
+`urls.api.twitter.com`. You can also specify a right-side wildcard like
+`www.google.*`. Right-side wildcards, unlike left-side wildcards, apply only
+one level deep. So if you want to cover all countries you'll generally need to
+specify `www.google.*`, `www.google.co.*`, and `www.google.com.*` to cover
+domains like `www.google.co.uk` or `www.google.com.au`. You should use wildcard
+targets only when you have rules that apply to the entire wildcard space. If
+your rules only apply to specific hosts, you should list each host as a
+separate target.
+
+#### [Rules and Regular Expressions](#rules-and-regular-expressions)
+
+The `rule` tags do the actual rewriting work. The `from` attribute of each rule
+is a [regular expression](https://www.regular-expressions.info/quickstart.html)
+matched against a full URL. You can use rules to rewrite URLs in simple or
+complicated ways. Here's a simplified (and now obsolete) example for Wikipedia:
+
+```xml
+
+
+
+
+
+```
+
+The `to` attribute replaces the text matched by the `from` attribute. It can
+contain placeholders like `$1` that are replaced with the text matched inside
+the parentheses.
+
+This rule rewrites a URL like `http://fr.wikipedia.org/wiki/Chose` to
+`https://secure.wikimedia.org/wikipedia/fr/wiki/Chose`. Notice, again, that the
+target is allowed to contain (just one) * as a wildcard meaning "any".
+
+Rules are applied in the order they are listed within each ruleset. Order
+between rulesets is unspecified. Only the first rule or exception matching a
+given URL is applied.
+
+Rules are evaluated using [Javascript regular
+expressions](https://www.regular-expressions.info/javascript.html), which are
+similar but not identical to [Perl-style regular
+expressions.](https://www.regular-expressions.info/pcre.html) Note that if your
+rules include ampersands (&), they need to be appropriately XML-encoded:
+replace each occurrence of **&** with **&**.
+
+#### [Exclusions](#exclusions)
+
+An exclusion specifies a pattern, using a regular expression, for URLs where
+the rule should **not** be applied. The Stack Exchange rule contains an
+exclusion for the OpenID login path, which breaks logins if it is rewritten:
+
+```xml
+
+```
+
+Exclusions are always evaluated before rules in a given ruleset. Matching any
+exclusion means that a URL won't match any rules within the same ruleset.
+However, if other rulesets match the same target hosts, the rules in those
+rulesets will still be tried.
+
+#### [Style Guide](#style-guide)
+
+There are many different ways you can write a ruleset, or regular expression
+within the ruleset. It's easier for everyone to understand the rulesets if they
+follow similar practices. You should read and follow the [Ruleset style
+guide](https://github.com/EFForg/https-everywhere/blob/master/CONTRIBUTING.md#ruleset-style-guide).
+Some of the guidelines in that document are intended to make [Ruleset
+testing](https://github.com/EFForg/https-everywhere/blob/master/ruleset-testing.md)
+less cumbersome.
+
+#### [Secure Cookies](#secure-cookies)
+
+Many HTTPS websites fail to correctly set the [secure
+flag](https://en.wikipedia.org/wiki/HTTP_cookie#Secure_and_HttpOnly)
+on authentication and/or tracking cookies. HTTPS Everywhere provides a facility
+for turning this flag on. For instance:
+
+```xml
+
+```
+
+The "host" parameter is a regexp specifying which domains should have their
+cookies secured; the "name" parameter is a regexp specifying which cookies
+should be secured. For a cookie to be secured, it must be sent by a target host
+for that ruleset. It must also be sent over HTTPS and match the name regexp.
+For cookies set by Javascript in a web page, the Firefox extension can't tell
+which host set the cookie and instead uses the domain attribute of the cookie
+to check against target hosts. A cookie whose domain attribute starts with a
+"." (the default, if not specified by Javascript) will be matched as if it was
+sent from a host name made by stripping the leading dot.
+
+#### [Testing](#testing)
+
+We use an [automated
+checker](https://github.com/hiviah/https-everywhere-checker) to run some basic
+tests on all rulesets. This is described in more detail in our [Ruleset
+Testing](https://github.com/EFForg/https-everywhere/blob/master/ruleset-testing.md)
+document, but in short there are two parts: Your ruleset must have enough test
+URLs to cover all the various types of URL covered by your rules. And each of
+those test URLs must load, both before rewriting and after rewriting. Every
+target host tag generates an implicit test URL unless it contains a wildcard.
+You can add additional test URLs manually using the `` tag.
+The test URLs you add this way should be real pages loaded from the site, or
+real images, CSS, and Javascript if you have rules that specifically affect
+those resources.
+
+You can test rulesets in the browser using a hidden debugging page, but please
+be aware that this approach should only be used for debugging purposes and
+should not be used for setting up personal custom rules. You can access the
+hidden debugging page this way:
+
+* Firefox: `about:addons` > HTTPS Everywhere preferences > click under
+ `General Settings` > press Ctrl-Z
+* Chromium/Chrome: `chrome://extensions/` > HTTPS Everywhere options > click
+ under `General Settings` > press Ctrl-Z
+
+You might need to disable popup blocking for the page to appear. Once you have
+loaded the page, you might find it convenient to bookmark it for later use.
+
+If you've tested your rule and are sure it would be of use to the world at
+large, submit it as a [pull
+request](https://help.github.com/articles/using-pull-requests/) on our [GitHub
+repository](https://github.com/EFForg/https-everywhere/) or send it to the
+rulesets mailing list at `https-everywhere-rules AT eff.org`. Please be aware
+that this is a public and publicly-archived mailing list.
+
+#### [make-trivial-rule](#make-trivial-rule)
+
+As an alternative to writing rules by hand, there are scripts you can run from
+a Unix command line to automate the process of creating a simple rule for a
+specified domain. These scripts are not included with HTTPS Everywhere releases
+but are available in our development repository and are described in [our
+development documentation](https://www.eff.org/https-everywhere/development).
+
+#### [Disabling a ruleset by default](#disabling-a-ruleset-by-default)
+
+Sometimes rulesets are useful or interesting, but cause problems that make them
+unsuitable for being enabled by default in everyone's browsers. Typically when
+a ruleset has problems we will disable it by default until someone has time to
+fix it. You can do this by adding a `default_off` attribute to the ruleset
+element, with a value explaining why the rule is off.
+
+```xml
+
+
+
+
+```
+
+You can add more details, like a link to a bug report, in the comments for the
+file.
+
+#### [Mixed Content Blocking (MCB)](#mixed-content-blocking-mcb)
+
+Some rulesets may trigger active mixed content (i.e. scripts loaded over HTTP
+instead of HTTPS). This type of mixed content is blocked in most major browsers,
+before HTTPS Everywhere has a chance to rewrite the URLs to an HTTPS version.
+This generally breaks the site. Depending on their configuration and threat
+model, some users might however decide to enable these rulesets via a global
+option in HTTPS Everywhere. To that effect, such rulesets are identified with
+the specific `platform="mixedcontent"` attribute to the ruleset element.
diff --git a/docs/es/faq.md b/docs/es/faq.md
new file mode 100644
index 000000000000..bdd7547fc376
--- /dev/null
+++ b/docs/es/faq.md
@@ -0,0 +1,327 @@
+## Preguntas Frecuentes sobre "HTTPS Everywhere"
+
+Esta página responde a las preguntas más frecuentes sobre el proyecto de la EFF
+[HTTPS Everywhere](https://www.eff.org/https-everywhere) "HTTPS en todos
+lados". Si no encuentra la respuesta a su pregunta, puede intentar con los
+recursos [enumerados aquí](https://www.eff.org/https-everywhere/development).
+
+* [¿Qué pasa si HTTPS Everywhere rompe algún sitio que
+ uso?](#what-if-https-everywhere-breaks-some-site-that-i-use)
+* [¿Por qué HTTPS Everywhere me impide unirme a la red del hotel/escuela u
+ otra red
+ inalámbrica?](#why-is-https-everywhere-preventing-me-from-joining-this-hotelschoolother-wireless-network)
+* [¿Habrá una versión de HTTPS Everywhere para IE, Safari o algún otro
+ navegador?](#will-there-be-a-version-of-https-everywhere-for-ie-safari-or-some-other-browser)
+* [¿Por qué utilizar una lista de sitios aprobados que admiten HTTPS? ¿Por qué
+ no pueden intentar utilizar HTTPS para cada sitio, y sólo volver a HTTP si
+ no está
+ disponible?](#why-use-a-allowlist-of-sites-that-support-https-why-cant-you-try-to-use-https-for-every-last-site-and-only-fall-back-to-http-if-it-isnt-available)
+* [¿Cómo puedo eliminar o mover el botón HTTPS Everywhere de la barra de
+ herramientas?](#how-do-i-get-rid-ofmove-the-https-everywhere-button-in-the-toolbar)
+* [¿Cuándo me protege HTTPS Everywhere? ¿Cuándo no me
+ protege?](#when-does-https-everywhere-protect-me-when-does-it-not-protect-me)
+* [¿De qué me protege HTTPS
+ Everywhere?](#what-does-https-everywhere-protect-me-against)
+* [¿Cómo obtengo soporte para un sitio adicional en HTTPS
+ Everywhere?](#how-do-i-get-support-for-an-additional-site-in-https-everywhere)
+* [¿Qué pasa si el sitio no admite HTTPS, o si sólo lo admite para algunas
+ actividades, como introducir información de la tarjeta de
+ crédito?](#what-if-the-site-doesnt-support-https-or-only-supports-it-for-some-activities-like-entering-credit-card-information)
+* [¿No es más caro o lento para un sitio usar HTTPS en comparación con HTTP
+ normal?](#isnt-it-more-expensive-or-slower-for-a-site-to-support-https-compared-to-regular-http)
+* [¿Por qué debría usar HTTPS Everywhere en lugar de simplemente teclear
+ https:// al principio del nombre de un
+ sitio?](#why-should-i-use-https-everywhere-instead-of-just-typing-https-at-the-beginning-of-site-names)
+* [¿Por qué HTTPS Everywhere incluye reglas para sitios como PayPal que ya
+ requieren HTTPS en todas sus
+ páginas?](#why-does-https-everywhere-include-rules-for-sites-like-paypal-that-already-require-https-on-all-their-pages)
+* [¿Qué significan los diferentes colores de las reglas en el menú de la
+ barra de herramientas en
+ Firefox?](#what-do-the-different-colors-for-rulesets-in-the-firefox-toolbar-menu-mean)
+* [¿Qué significan los diferentes colores del icono de HTTPS
+ Everywhere?](#what-do-the-different-colors-of-the-https-everywhere-icon-mean)
+* [Tengo un problema al instalar la extensión del
+ navegador.](#im-having-a-problem-installing-the-browser-extension.)
+* [¿Cómo desinstalo/elimino HTTPS
+ Everywhere?](#how-do-i-uninstallremove-https-everywhere)
+* [¿Cómo agrego mi propio sitio a HTTPS
+ Everywhere?](#how-do-i-add-my-own-site-to-https-everywhere)
+* [¿Puedo ayudar a traducir HTTPS Everywhere a mi propio
+ idioma?](#can-i-help-translate-https-everywhere-into-my-own-language)
+
+### [¿Qué pasa si HTTPS Everywhere rompe algún sitio que uso?](#what-if-https-everywhere-breaks-some-site-that-i-use)
+
+Esto es ocasionalmente posible debido al soporte inconsistente de HTTPS en
+sitios (por ejemplo, cuando un sitio parece soportar HTTPS pero hace algunas
+partes del sitio, imprededicibles, indisponibles por medio de HTTPS). Si nos
+[informa del problema](https://github.com/EFForg/https-everywhere/issues),
+podemos intentar solucionarlo. Mientras tanto, puede desactivar la regla que
+afecta a ese sitio en particular en su propia copia de HTTPS Everywhere
+haciendo clic en el botón de la barra de herramientas HTTPS Everywhere y
+desmarcando la regla para ese sitio.
+
+También puede informar el problema al sitio, ya que ellos tienen el poder para
+solucionarlo!
+
+### [¿Por qué HTTPS Everywhere me impide unirme a la red del hotel/escuela u otra red inalámbrica?](#why-is-https-everywhere-preventing-me-from-joining-this-hotelschoolother-wireless-network)
+
+Algunas redes inalámbricas secuestran sus conexiones HTTP cuando se une por
+primera vez a ellas, con el fin de exigir su autenticación o simplemente
+intentar hacer que acepte los términos de uso. Las páginas HTTPS están
+protegidas contra este tipo de secuestro, que es como debería ser. Si va a un
+sitio web que no está protegido por HTTPS Everywhere o por HSTS (actualmente,
+example.com es uno de esos sitios), permitirá que su conexión sea capturada y
+redirigida a la página de autenticación o términos de uso.
+
+### [¿Habrá una versión de HTTPS Everywhere para IE, Safari o algún otro navegador?](#will-there-be-a-version-of-https-everywhere-for-ie-safari-or-some-other-browser)
+
+A principios de 2012, la API para extensiones de Safari no ofrece una forma de
+realizar la reescritura segura de las solicitudes HTTP a HTTPS. Pero si por
+casualidad conoce una forma de realizar la reescritura segura de solicitudes en
+estos navegadores, no dude en hacérnoslo saber en https-everywhere en EFF.org
+(pero tenga en cuenta que modificar document.location o window.location en
+JavaScript no es seguro).
+
+### [¿Por qué utilizar una lista de sitios aprobados que admiten HTTPS? ¿Por qué no pueden intentar utilizar HTTPS para cada sitio, y sólo volver a HTTP si no está disponible?](#why-use-a-allowlist-of-sites-that-support-https-why-cant-you-try-to-use-https-for-every-last-site-and-only-fall-back-to-http-if-it-isnt-available)
+
+Hay varios problemas con la idea de tratar de detectar automáticamente HTTPS en
+cada sitio. No hay ninguna garantía de que los sitios van a dar la misma
+respuesta a través de HTTPS que a través de HTTP. Además, no es posible probar
+HTTPS en tiempo real sin introducir vulnerabilidades de seguridad (¿Qué debería
+hacer la extensión si falla el intento de conexión por HTTPS? Volver a un HTTP
+inseguro no es seguro). Y en algunos casos, HTTPS Everywhere tiene que llevar a
+cabo transformaciones bastante complicadas en URIs - por ejemplo, hasta
+recientemente la regla de Wikipedia tenía que convertir una dirección como
+`http://en.wikipedia.org/wiki/World_Wide_Web` en
+`https://secure.wikimedia.org/wikipedia/en/wiki/World_Wide_Web` por que HTTPS
+no estaba disponible en los dominios habituales de Wikipedia.
+
+### [¿Cómo puedo eliminar o mover el botón HTTPS Everywhere de la barra de herramientas?](#how-do-i-get-rid-ofmove-the-https-everywhere-button-in-the-toolbar)
+
+El botón HTTPS Everywhere es útil porque le permite ver y desactivar un
+conjunto de reglas si causa problemas con un sitio. Pero si prefiere
+desactivarla, vaya a Ver->Barras de herramientas->Personalizar y arrastre el
+botón fuera de la barra de herramientas y dentro en la barra de complementos en
+la parte inferior de la página. Después, puede ocultar la barra de
+complementos. (En teoría, debería poder arrastrarlo a la bandeja de iconos
+disponibles también, pero eso puede desencadenar [este
+error](https://trac.torproject.org/projects/tor/ticket/6276).
+
+### [¿Cuándo me protege HTTPS Everywhere? ¿Cuándo no me protege?](#when-does-https-everywhere-protect-me-when-does-it-not-protect-me)
+
+HTTPS Everywhere lo protege sólo cuando está utilizando _porciones cifradas de
+sitios web soportados_. En un sitio soportado, se activará automáticamente el
+cifrado HTTPS para todas las partes soportadas conocidas del sitio (para
+algunos sitios, esto podría ser sólo una parte de todo el sitio). Por ejemplo,
+si su proveedor de correo web no admite HTTPS en absoluto, HTTPS Everywhere no
+puede hacer que su acceso a su correo web sea seguro. Del mismo modo, si un
+sitio permite HTTPS para texto pero no para imágenes, es posible que alguien
+vea las imágenes que cargue el navegador y adivine a qué está accediendo.
+
+HTTPS Everywhere depende completamente de las características de seguridad de
+los sitios web individuales que utilice; _Activa_ estas funciones de seguridad,
+pero no las puede _crear_ si no existen. Si utiliza un sitio no no soportado
+por HTTPS Everywhere o un sitio que proporciona cierta información de forma
+insegura, HTTPS Everywhere no puede proporcionar protección adicional para su
+uso de ese sitio. Por favor recuerde verificar que la seguridad de un sitio en
+particular está funcionando al nivel que usted espera antes de enviar o recibir
+información confidencial, incluyendo contraseñas.
+
+Una forma de determinar el nivel de protección que obtendrá al utilizar un
+sitio en particular es utilizar una herramienta de análisis de paquetes como
+[Wireshark] (https://www.wireshark.org/) para registrar sus propias
+comunicaciones con el sitio. La vista resultante de sus comunicaciones es
+aproximadamente igual a lo que un escucha secreto vería en su red wifi o en su
+ISP. De esta manera, puede determinar si algunas o todas sus comunicaciones
+estarían protegidas; Sin embargo, puede tomar bastante tiempo hacer sentido a
+la vista de Wireshark con suficiente cuidado para obtener una respuesta
+definitiva.
+
+También puede activar la función "Bloquear todas las solicitudes HTTP" para
+obtener mayor protección. En lugar de cargar páginas o imágenes inseguras,
+HTTPS Everywhere las bloqueará completamente.
+
+### [¿De qué me protege HTTPS Everywhere?](#what-does-https-everywhere-protect-me-against)
+
+En las partes compatibles de los sitios admitidos, HTTPS Everywhere habilita la
+protección HTTPS de los sitios, lo que le puede proteger contra la escucha y la
+manipulación indebida del contenido del sitio o de la información que envía al
+sitio. Idealmente, esto proporciona cierta protección contra un atacante que
+aprende el contenido de la información que fluye en ambos sentidos - por
+ejemplo, el texto de los mensajes de correo electrónico que envía o recibe a
+través de un sitio de webmail, los productos que navega o compra en un comercio
+electrónico Sitio o los artículos particulares que lea en un sitio de
+referencia.
+
+Sin embargo, HTTPS Everywhere **no oculta las identidades de los sitios a los
+que accede**, la cantidad de tiempo que pasa con ellos ni la cantidad de
+información que carga o descarga desde un sitio en particular. Por ejemplo, si
+accede a `http://www.eff.org/issues/nsa-spying` y HTTPS Everywhere vuelve a
+escribirlo como `https://www.eff.org/issues/nsa-spying`, un espía todavía puede
+reconocer de forma trivial que está accediendo a www.eff.org (pero puede que no
+sepa qué tema está leyendo). En general, toda la parte del nombre de dominio de
+una URL permanece expuesta al intruso, ya que ésta debe enviarse repetidamente
+en forma no cifrada durante el establecimiento de la conexión. Otra forma de
+decirlo es que HTTPS nunca fue diseñado para ocultar la identidad de los sitios
+que visita.
+
+Investigadores también han demostrado que es posible que alguien pueda
+averiguar más acerca de lo que está haciendo en un sitio simplemente a través
+de una cuidadosa observación de la cantidad de datos que sube y descarga, o los
+patrones de tiempo de su uso del sitio. Un ejemplo simple es que si el sitio
+sólo tiene una página de cierto tamaño total, cualquier persona que descargue
+exactamente esa cantidad de datos del sitio probablemente está accediendo a esa
+página.
+
+Si desea protegerse contra el monitoreo de los sitios que visita, considere
+usar HTTPS Everywhere junto con software como
+[Tor](https://www.torproject.org/).
+
+### [¿Cómo obtengo soporte para un sitio adicional en HTTPS Everywhere?](#how-do-i-get-support-for-an-additional-site-in-https-everywhere)
+
+Puede aprender [como escribir
+reglas](https://www.eff.org/https-everywhere/rulesets) que enseñan a HTTPS
+Everywhere a soportar nuevos sitios. Puede instalar estas reglas en su propio
+navegador o enviárnoslas para su posible inclusión en la versión oficial.
+
+### [¿Qué pasa si el sitio no admite HTTPS, o si sólo lo admite para algunas actividades, como introducir información de la tarjeta de crédito?](#what-if-the-site-doesnt-support-https-or-only-supports-it-for-some-activities-like-entering-credit-card-information)
+
+Podría tratar de ponerse en contacto con el sitio y señalar que el uso de HTTPS
+para todas las características del sitio es una práctica cada vez más común hoy
+en día y protege a los usuarios (y sitios) contra una variedad de ataques de
+Internet. Por ejemplo, le defiende contra la capacidad de otras personas en una
+red inalámbrica de espiar su uso del sitio o incluso tomar control de su
+cuenta. También puede señalar que los números de tarjetas de crédito no son la
+única información que usted considera privada o sensible.
+
+Sitios como Google, Twitter y Facebook ahora soportan HTTPS para información no
+financiera, por razones de privacidad y seguridad general.
+
+### [¿No es más caro o lento para un sitio usar HTTPS en comparación con HTTP normal?](#isnt-it-more-expensive-or-slower-for-a-site-to-support-https-compared-to-regular-http)
+
+Puede ser, pero algunos sitios han sido gratamente sorprendidos al ver lo
+práctico que puede ser. Además, los expertos de Google están actualmente
+implementando varias mejoras en el protocolo TLS que hacen HTTPS dramáticamente
+más rápido; si estas mejoras se añaden a la norma pronto, la brecha de
+velocidad entre los dos debería casi desaparecer. Ver [la descripción de Adam
+Langley de la situación de la implementación de
+HTTPS](https://www.imperialviolet.org/2010/06/25/overclocking-ssl.html) para
+más detalles sobre esta cuestión. En particular, Langley afirma: "Para
+[habilitar HTTPS de forma predeterminada para Gmail] no tuvimos que desplegar
+máquinas adicionales ni hardware especial. En nuestras máquinas frontend de
+producción, SSL/TLS representa menos del 1% de la carga del CPU, menos de 10KB
+de memoria por conexión y menos del 2% de la sobrecarga de red".
+
+Solía ser caro comprar un certificado para el uso de HTTPS, pero ahora se puede
+obtener de forma gratuita en [Let's Encrypt](https://letsencrypt.org/) de igual
+manera.
+
+### [¿Por qué debría usar HTTPS Everywhere en lugar de simplemente teclear https:// al principio del nombre de un sitio?](#why-should-i-use-https-everywhere-instead-of-just-typing-https-at-the-beginning-of-site-names)
+
+Incluso si normalmente escribe https://, HTTPS Everywhere podría protegerlo si
+alguna vez lo olvida. Además, puede reescribir los enlaces que siga de otras
+personas. Por ejemplo, si hace clic en un enlace a
+`http://en.wikipedia.org/wiki/EFF_Pioneer_Award`, HTTPS Everywhere volverá a
+escribir el enlace de forma automática como
+`https://en.wikimedia.org/wikipedia/en/wiki/EFF_Pioneer_Award`. Por lo tanto,
+puede obtener alguna protección incluso si no hubiera notado que el sitio de
+destino está disponible en HTTPS.
+
+### [¿Por qué HTTPS Everywhere incluye reglas para sitios como PayPal que ya requieren HTTPS en todas sus páginas?](#why-does-https-everywhere-include-rules-for-sites-like-paypal-that-already-require-https-on-all-their-pages)
+
+HTTPS Everywhere, como la [especificación
+HSTS](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security), trata de
+abordar un ataque llamado [SSL
+stripping](https://moxie.org/software/sslstrip/). Los usuarios sólo están
+protegidos contra un ataque "SSL stripping" si sus navegadores ni siquiera
+_intentan_ conectarse a la versión HTTP del sitio, incluso si el sitio los
+hubiera redirigido a la versión HTTPS. Con HTTPS Everywhere, el navegador ni
+siquiera intenta la conexión HTTP insegura, incluso si eso es lo que usted le
+pide que haga. (Tenga en cuenta que actualmente HTTPS Everywhere no incluye una
+lista completa de dichos sitios, que son principalmente instituciones
+financieras).
+
+### [¿Qué significan los diferentes colores de las reglas en el menú de la barra de herramientas en Firefox?](#what-do-the-different-colors-for-rulesets-in-the-firefox-toolbar-menu-mean)
+
+Los colores son:
+
+Verde oscuro: el conjunto de reglas estaba activa durante la carga de recursos
+en la página actual.
+
+Verde claro: el conjunto de reglas estaba listo para evitar las cargas HTTP en
+la página actual, pero todo lo que el conjunto de reglas habría cubierto se
+cargó a través de HTTPS de todos modos (en el código, verde claro se le llama
+una "regla discutible").
+
+Marrón oscuro o Flecha roja en el sentido de las agujas del reloj: regla rota
+-- el conjunto de reglas está activo, pero el servidor está redirigiendo al
+menos algunas direcciones URL de HTTPS a HTTP.
+
+Gris: el conjunto de reglas está deshabilitado.
+
+### [¿Qué significan los diferentes colores del icono de HTTPS Everywhere?](#what-do-the-different-colors-of-the-https-everywhere-icon-mean)
+
+Los colores son:
+
+Azul claro: HTTPS Everywhere está habilitado.
+
+Azul oscuro: HTTPS Everywhere está habilitado y activo para cargar recursos en
+la página actual.
+
+Rojo: Todas las peticiones sin cifrar serán bloqueadas por HTTPS Everywhere.
+
+Gris: HTTPS Everywhere está deshabilitado.
+
+### [Tengo un problema al instalar la extensión del navegador.](#im-having-a-problem-installing-the-browser-extension.)
+
+Algunas personas informan que la instalación de HTTPS Everywhere les da el
+error: "El complemento no se pudo descargar debido a un error de conexión en
+www.eff.org". Esto puede ser causado por el antivirus Avast, que bloquea la
+instalación de extensiones de navegador. Puede que pueda [instalarlo desde
+addons.mozilla.org](https://addons.mozilla.org/en-US/firefox/addon/https-everywhere/).
+
+### [¿Cómo desinstalo/elimino HTTPS Everywhere?](#how-do-i-uninstallremove-https-everywhere)
+
+En Firefox: Haga clic en el botón de menú en la parte superior derecha de la
+ventana al final de la barra de herramientas (aparece como tres líneas
+horizontales) y, a continuación, haga clic en "Complementos" (parece una pieza
+de rompecabezas). Desplácese hasta que vea HTTPS Everywhere y a continuación
+haga clic en el botón "Eliminar" que se encuentra completamente a la derecha.
+Al finalizar, puede cerrar la ventana de complementos.
+
+En Chrome: haga clic en el botón de menú situado en la parte superior derecha
+de la ventana al final de la barra de herramientas (aparece como tres líneas
+horizontales) y, a continuación, haz clic en "Configuración" cerca de la parte
+inferior. A la izquierda, haga clic en "Extensiones". Desplácese hasta que vea
+HTTPS Everywhere y a continuación, haga clic en el icono de la papelera de la
+derecha y haga clic en "Eliminar" para confirmar la eliminación. Al finalizar,
+puede cerrar la ventana de configuración.
+
+### [¿Cómo agrego mi propio sitio a HTTPS Everywhere?](#how-do-i-add-my-own-site-to-https-everywhere)
+
+Estamos contentos de que desee que su sitio en HTTPS Everywhere! Sin embargo,
+recuerde que no todos los que visitan su sitio tienen instalada nuestra
+extensión. Si administra un sitio web, puede configurarlo para que use de forma
+predeterminada HTTPS para todos, no solo para los usuarios de HTTPS Everywhere.
+Y es menos trabajo! Los pasos que usted debe tomar, en orden, son:
+
+1. Configure un
+ [redireccionamiento](https://www.sslshopper.com/apache-redirect-http-to-https.html)
+ de HTTP a HTTPS en su sitio.
+2. [Agregue el header "Strict-Transport-Security" (HSTS) en su
+ sitio.](https://raymii.org/s/tutorials/HTTP_Strict_Transport_Security_for_Apache_NGINX_and_Lighttpd.html)
+3. [Agregue su sitio a la lista de precarga de
+ HSTS.](https://hstspreload.appspot.com/)
+
+Estos pasos le darán a su sitio una protección mucho mejor que añadirlo a HTTPS
+Everywhere. En términos generales, una vez que haya terminado, no es necesario
+agregar su sitio a HTTPS Everywhere. Sin embargo, si lo aún desea, siga las
+[instrucciones sobre escribir conjuntos de
+reglas](https://eff.org/https-everywhere/rulesets), e indique que usted es el
+autor del sitio cuando solicite un "pull request".
+
+### [¿Puedo ayudar a traducir HTTPS Everywhere a mi propio idioma? ](#can-i-help-translate-https-everywhere-into-my-own-language)
+
+¡Sí! Utilizamos la cuenta Transifex de Tor Project para las traducciones, por
+favor inscríbase para ayudar a traducir en
+[https://www.transifex.com/otf/torproject](https://www.transifex.com/otf/torproject).
diff --git a/dummy-chromium.pem b/dummy-chromium.pem
new file mode 100644
index 000000000000..b6bb2a5ed409
--- /dev/null
+++ b/dummy-chromium.pem
@@ -0,0 +1,13 @@
+-----BEGIN PRIVATE KEY-----
+MIIB5gIBADANBgkqhkiG9w0BAQEFAASCAdAwggHMAgEAAmEA3BZGOZsEWGEc82Yz
+Ddrey4Vp8dV4AQZPu2tM32Z6ZEx2538G3bWu5g0OPzX8Oqvzqr8ZRIvxcBbL3kgZ
+5wnhjVRTlWy0jxZDHCvVsATzhbhAt505zljHaRS1PrCYfV/nAgMBAAECYCQpRMCS
+R9R9oFQdpqXQIGswMIgbmuwQLWmN58ONAu8X4TGIHYiwIVyLKJwaMqcxOTn753Us
+7vFbGwoMnO3Krzh1Xn9z6uKnB7dDotgc9ZIQ5Ja8ExjJhl5iBMSWePYWAQIxAPRo
+yZ+JdWu+/y+/F6KsiCDx8EmdV8Dd09BogXH31S2VtSUEfZd/UDUPgbRgo+c9dwIx
+AOaGNJyJbHY4UCxC2hRBRZGNlic8SaFKEQAtN28gMWMDMgAh0ik8YtrPffBed+bN
+EQIxAOwTAx0MItTt6YLu6x9/0wUva89PIWHzYhKdvtqcbdbYEd4tljntCUYXMktO
+RUKoRQIxAL/3PHKqoc6kwGbLWO2LGVLHNCYCN1J/6j5aaRI6HcZVD9s6TteV+MA8
+D6UOFgz18QIxAJKXHDXXF+LXGsOwRMcp8nqg9Ri9daWW74JWyozFRqIsRhnhDhw9
+8f4cUAPw7BquBw==
+-----END PRIVATE KEY-----
diff --git a/hooks/precommit b/hooks/precommit
index 0f2873b9ca42..04c65b738ac5 100755
--- a/hooks/precommit
+++ b/hooks/precommit
@@ -39,7 +39,7 @@ if [ "$CHANGED_RULESETS" ]; then
continue
fi
- ./utils/trivial-validate.py --quiet $FILE
+ python3 test/validations/special/run.py --quiet $FILE
RESULT=$?
if [ $RESULT -ne 0 ]; then
diff --git a/hooks/update b/hooks/update
index 40918f5c3ce9..d45a5f2d2f1d 100644
--- a/hooks/update
+++ b/hooks/update
@@ -42,21 +42,18 @@ echo "attempting to validate $newrev" >&2
# --- Test build
-if [ -f makexpi.sh && -f makecrx.sh ]; then
- ./makexpi.sh
- XPIBULID=$?
+if [ -f make.sh ]; then
+ ./make.sh
+ EXTBULID=$?
- ./makecrx.sh
- CRXBUILD=$?
-
- if [ "$XPIBULID" != 0 || "$CRXBUILD" != 0 ]; then
+ if [ "$EXTBULID" != 0 ]; then
echo "*** build failed" >&2
exit 1
else
exit 0
fi
else
- echo "*** could not find makexpi.sh or makecrx.sh." >&2
+ echo "*** could not find make.sh." >&2
exit 1
fi
diff --git a/image-src/https-everywhere-half-24.xcf.gz b/image-src/https-everywhere-half-24.xcf.gz
deleted file mode 100644
index ee5cfaf115fe..000000000000
Binary files a/image-src/https-everywhere-half-24.xcf.gz and /dev/null differ
diff --git a/image-src/https-everywhere.xcf b/image-src/https-everywhere.xcf
deleted file mode 100644
index 076a49ebdf56..000000000000
Binary files a/image-src/https-everywhere.xcf and /dev/null differ
diff --git a/image-src/ssl-observatory.jpg b/image-src/ssl-observatory.jpg
deleted file mode 100644
index 0241bee91b55..000000000000
Binary files a/image-src/ssl-observatory.jpg and /dev/null differ
diff --git a/install-dev-dependencies.sh b/install-dev-dependencies.sh
new file mode 100755
index 000000000000..9259d02b8676
--- /dev/null
+++ b/install-dev-dependencies.sh
@@ -0,0 +1,127 @@
+#!/bin/bash
+# Install packages that are necessary and/or useful to build and debug
+# HTTPS Everywhere
+set -o errexit
+
+if [ "$1" != "--no-prompt" ]; then
+ echo
+ echo "Warning: Installing the development dependencies for HTTPS Everywhere"
+ echo "may alter your system, installing requirements both within the package"
+ echo "management system and also external binaries."
+ echo
+ echo -n "Are you sure you want to continue? [y/N]: "
+ read CONTINUE
+ CONTINUE=`echo $CONTINUE | xargs | head -c 1 | awk '{print tolower($0)}'`
+ if [ "$CONTINUE" != "y" ]; then
+ exit
+ fi
+ echo
+fi
+
+if [ $UID != 0 ]; then
+ SUDO_SHIM=sudo
+fi
+
+if [ "`uname -m`" == "x86_64" ]; then
+ ARCH=64
+else
+ ARCH=32
+fi
+
+# debian based installation
+if type apt-get>/dev/null 2>&1; then
+ $SUDO_SHIM apt-get update
+ $SUDO_SHIM apt-get install -y lsb-release
+ BROWSERS="firefox chromium-browser"
+ CHROMEDRIVER="chromium-chromedriver"
+ if [[ "$(lsb_release -is)" == "Debian" ]]; then
+ # Chromium takes the name of 'chromium' instead of 'chromium-browser' in
+ # Debian 7 (wheezy) and later.
+ BROWSERS="firefox-esr chromium"
+ CHROMEDRIVER="chromium-driver"
+ fi
+ $SUDO_SHIM apt-get install -y libxml2-dev libxml2-utils libxslt1-dev \
+ python3-dev $BROWSERS zip sqlite3 python3-pip libcurl4-openssl-dev xvfb \
+ nodejs \
+ npm \
+ libssl-dev git curl $CHROMEDRIVER
+ if ! type geckodriver >/dev/null 2>&1; then
+ curl -LO "https://github.com/mozilla/geckodriver/releases/download/v0.24.0/geckodriver-v0.24.0-linux$ARCH.tar.gz"
+ tar -zxvf "geckodriver-v0.24.0-linux$ARCH.tar.gz"
+ rm -f "geckodriver-v0.24.0-linux$ARCH.tar.gz"
+ $SUDO_SHIM mv geckodriver /usr/bin/geckodriver
+ $SUDO_SHIM chown root /usr/bin/geckodriver
+ $SUDO_SHIM chmod 755 /usr/bin/geckodriver
+ fi
+ if [ ! -f /usr/lib/chromium-browser/chromedriver ] && [ -f `which chromedriver` ]; then
+ $SUDO_SHIM ln -s `which chromedriver` /usr/lib/chromium-browser/chromedriver
+ fi
+
+# macOS installation
+elif type brew >/dev/null 2>&1; then
+ brew list python &>/dev/null || brew install python
+ brew cask install chromedriver
+ brew install libxml2 gnu-sed
+ brew install node
+ if ! echo $PATH | grep -ql /usr/local/bin ; then
+ echo '/usr/local/bin not found in $PATH, please add it.'
+ fi
+
+# distros that use rpm (Fedora, Suse, CentOS) installation
+elif type dnf >/dev/null 2>&1; then
+ $SUDO_SHIM dnf install -y firefox gcc git libcurl-devel libxml2-devel \
+ libxslt-devel python3-devel redhat-rpm-config xorg-x11-server-Xvfb which \
+ findutils procps openssl openssl-devel chromium GConf2
+ if ! type chromedriver >/dev/null; then
+ curl -O "https://chromedriver.storage.googleapis.com/2.23/chromedriver_linux$ARCH.zip"
+ unzip "chromedriver_linux$ARCH.zip"
+ rm -f "chromedriver_linux$ARCH.zip"
+ $SUDO_SHIM mv chromedriver /usr/bin/chromedriver
+ $SUDO_SHIM chown root /usr/bin/chromedriver
+ $SUDO_SHIM chmod 755 /usr/bin/chromedriver
+ fi
+ if ! type geckodriver >/dev/null 2>&1; then
+ curl -LO "https://github.com/mozilla/geckodriver/releases/download/v0.24.0/geckodriver-v0.24.0-macos.tar.gz"
+ tar -zxvf "geckodriver-v0.24.0-macos.tar.gz"
+ rm -f "geckodriver-v0.24.0-macos.tar.gz"
+ $SUDO_SHIM mv geckodriver /usr/bin/geckodriver
+ $SUDO_SHIM chown root /usr/bin/geckodriver
+ $SUDO_SHIM chmod 755 /usr/bin/geckodriver
+ fi
+
+ # This is needed for Firefox on some systems. See here for more information:
+ # https://github.com/EFForg/https-everywhere/pull/5584#issuecomment-238655443
+ if [ ! -f /var/lib/dbus/machine-id ]; then
+ $SUDO_SHIM sh -c 'dbus-uuidgen > /var/lib/dbus/machine-id'
+ fi
+ export PYCURL_SSL_LIBRARY=openssl
+
+ #Node
+ curl -sL https://rpm.nodesource.com/setup_12.x | $SUDO_SHIM bash -
+ $SUDO_SHIM yum install -y nodejs
+ $SUDO_SHIM yum install gcc-c++ make
+else
+ echo \
+ "Your distro isn't supported by this script yet!"\
+ "Please install dependencies manually."
+ exit
+fi
+
+# Get the addon SDK submodule and rule checker
+git submodule init
+git submodule update
+
+# Install Python packages
+pip3 install --user -r requirements.txt
+cd test/rules
+pip3 install --user -r requirements.txt
+cd -
+cd test/chromium
+pip3 install --user -r requirements.txt
+cd -
+
+# Install Node Package for CRX Verification
+$SUDO_SHIM npm -g i crx3-utils
+
+# Install git hook to run tests before pushing.
+ln -sf ../../test.sh .git/hooks/pre-push
diff --git a/lib-wasm b/lib-wasm
new file mode 160000
index 000000000000..dfad18667846
--- /dev/null
+++ b/lib-wasm
@@ -0,0 +1 @@
+Subproject commit dfad186678467a3f78e0d6a61400ed2f9c5d663d
diff --git a/make.sh b/make.sh
new file mode 100755
index 000000000000..415b80090c4a
--- /dev/null
+++ b/make.sh
@@ -0,0 +1,235 @@
+#!/usr/bin/env bash
+
+# Build an HTTPS Everywhere .crx & .xpi extension
+#
+# To build the current state of the tree:
+#
+# ./make.sh
+#
+# To build a particular tagged release:
+#
+# ./make.sh
+#
+# eg:
+#
+# ./make.sh 2017.8.15
+#
+# Note that .crx files must be signed; this script makes you a
+# "dummy-chromium.pem" private key for you to sign your own local releases,
+# but these .crx files won't detect and upgrade to official HTTPS Everywhere
+# releases signed by EFF :/. We should find a more elegant arrangement.
+
+! getopt --test > /dev/null
+if [[ ${PIPESTATUS[0]} -ne 4 ]]; then
+ echo 'I’m sorry, `getopt --test` failed in this environment.'
+ exit 1
+fi
+
+OPTIONS=eck:
+LONGOPTS=remove-extension-update,remove-update-channels,key:
+! PARSED=$(getopt --options=$OPTIONS --longoptions=$LONGOPTS --name "$0" -- "$@")
+if [[ ${PIPESTATUS[0]} -ne 0 ]]; then
+ # e.g. return value is 1
+ # then getopt has complained about wrong arguments to stdout
+ exit 2
+fi
+
+# read getopt’s output this way to handle the quoting right:
+eval set -- "$PARSED"
+
+REMOVE_EXTENSION_UPDATE=false
+REMOVE_UPDATE_CHANNELS=false
+KEY=$(pwd)/dummy-chromium.pem
+while true; do
+ case "$1" in
+ -e|--remove-extension-update)
+ REMOVE_EXTENSION_UPDATE=true
+ shift
+ ;;
+ -c|--remove-update-channels)
+ REMOVE_UPDATE_CHANNELS=true
+ shift
+ ;;
+ -k|--key)
+ KEY="$2"
+ shift 2
+ ;;
+ --)
+ shift
+ break
+ ;;
+ *)
+ echo "Programming error"
+ exit 3
+ ;;
+ esac
+done
+
+if [ "${KEY:0:1}" != "/" ]; then
+ echo "Key must be specified as an absolute path."
+ exit 4
+fi
+
+
+
+
+cd $(dirname $0)
+
+if [ -n "$1" ]; then
+ BRANCH=`git branch | head -n 1 | cut -d \ -f 2-`
+ SUBDIR=checkout
+ [ -d $SUBDIR ] || mkdir $SUBDIR
+ cp -r -f -a .git $SUBDIR
+ cd $SUBDIR
+ git reset --hard "$1"
+ git submodule update --recursive -f
+fi
+
+VERSION=`python3 -c "import json ; print(json.loads(open('chromium/manifest.json').read())['version'])"`
+
+echo "Building version" $VERSION
+
+[ -d pkg ] || mkdir -p pkg
+[ -e pkg/crx-cws ] && rm -rf pkg/crx-cws
+[ -e pkg/crx-eff ] && rm -rf pkg/crx-eff
+[ -e pkg/xpi-amo ] && rm -rf pkg/xpi-amo
+[ -e pkg/xpi-eff ] && rm -rf pkg/xpi-eff
+
+# Clean up obsolete ruleset databases, just in case they still exist.
+rm -f src/chrome/content/rules/default.rulesets src/defaults/rulesets.sqlite
+
+mkdir -p pkg/crx-cws/rules
+cd pkg/crx-cws
+cp -a ../../chromium/* ./
+# Turn the Firefox translations into the appropriate Chrome format:
+rm -rf _locales/
+mkdir _locales/
+python3 ../../utils/chromium-translations.py ../../translations/ _locales/
+python3 ../../utils/chromium-translations.py ../../src/chrome/locale/ _locales/
+do_not_ship="*.py *.xml"
+rm -f $do_not_ship
+
+mkdir wasm
+cp ../../lib-wasm/pkg/*.wasm wasm
+cp ../../lib-wasm/pkg/*.js wasm
+
+cd ../..
+
+python3 ./utils/merge-rulesets.py || exit 5
+
+cp src/chrome/content/rules/default.rulesets pkg/crx-cws/rules/default.rulesets
+
+sed -i -e "s/VERSION/$VERSION/g" pkg/crx-cws/manifest.json
+
+for x in `cat .build_exclusions`; do
+ rm -rf pkg/crx-cws/$x
+done
+
+cp -a pkg/crx-cws pkg/crx-eff
+cp -a pkg/crx-cws pkg/xpi-amo
+cp -a pkg/crx-cws pkg/xpi-eff
+cp -a src/META-INF pkg/xpi-amo
+cp -a src/META-INF pkg/xpi-eff
+
+
+# Remove the 'applications' manifest key from the crx version of the extension, change the 'author' string to a hash, and add the "update_url" manifest key
+# "update_url" needs to be present to avoid problems reported in https://bugs.chromium.org/p/chromium/issues/detail?id=805755
+python3 -c "import json; m=json.loads(open('pkg/crx-cws/manifest.json').read()); m['author']={'email': 'eff.software.projects@gmail.com'}; del m['applications']; m['update_url'] = 'https://clients2.google.com/service/update2/crx'; open('pkg/crx-cws/manifest.json','w').write(json.dumps(m,indent=4,sort_keys=True))"
+python3 -c "import json; m=json.loads(open('pkg/crx-eff/manifest.json').read()); m['author']={'email': 'eff.software.projects@gmail.com'}; del m['applications']; open('pkg/crx-eff/manifest.json','w').write(json.dumps(m,indent=4,sort_keys=True))"
+# Remove the 'update_url' manifest key from the xpi version of the extension delivered to AMO
+python3 -c "import json; m=json.loads(open('pkg/xpi-amo/manifest.json').read()); del m['applications']['gecko']['update_url']; m['applications']['gecko']['id'] = 'https-everywhere@eff.org'; open('pkg/xpi-amo/manifest.json','w').write(json.dumps(m,indent=4,sort_keys=True))"
+
+# Remove the incognito key in AMO packages: #16394
+python3 -c "import json; m=json.loads(open('pkg/xpi-amo/manifest.json').read()); del m['incognito']; open('pkg/xpi-amo/manifest.json','w').write(json.dumps(m,indent=4,sort_keys=True))"
+python3 -c "import json; m=json.loads(open('pkg/xpi-eff/manifest.json').read()); del m['incognito']; open('pkg/xpi-eff/manifest.json','w').write(json.dumps(m,indent=4,sort_keys=True))"
+
+# If the --remove-extension-update flag is set, ensure the extension is unable to update
+if $REMOVE_EXTENSION_UPDATE; then
+ echo "Flag --remove-extension-update specified. Removing the XPI extensions' ability to update."
+ python3 -c "import json; m=json.loads(open('pkg/xpi-amo/manifest.json').read()); m['applications']['gecko']['update_url'] = 'https://127.0.0.1'; open('pkg/xpi-amo/manifest.json','w').write(json.dumps(m,indent=4,sort_keys=True))"
+ python3 -c "import json; m=json.loads(open('pkg/xpi-eff/manifest.json').read()); m['applications']['gecko']['update_url'] = 'https://127.0.0.1'; open('pkg/xpi-eff/manifest.json','w').write(json.dumps(m,indent=4,sort_keys=True))"
+fi
+
+# If the --remove-update-channels flag is set, remove all out-of-band update channels
+if $REMOVE_UPDATE_CHANNELS; then
+ echo "Flag --remove-update-channels specified. Removing all out-of-band update channels."
+ echo "require.scopes.update_channels.update_channels = [];" >> pkg/crx-cws/background-scripts/update_channels.js
+ echo "require.scopes.update_channels.update_channels = [];" >> pkg/crx-eff/background-scripts/update_channels.js
+ echo "require.scopes.update_channels.update_channels = [];" >> pkg/xpi-amo/background-scripts/update_channels.js
+ echo "require.scopes.update_channels.update_channels = [];" >> pkg/xpi-eff/background-scripts/update_channels.js
+fi
+
+if [ -n "$BRANCH" ] ; then
+ crx_cws="pkg/https-everywhere-$VERSION-cws.crx"
+ crx_eff="pkg/https-everywhere-$VERSION-eff.crx"
+ xpi_amo="pkg/https-everywhere-$VERSION-amo.xpi"
+ xpi_eff="pkg/https-everywhere-$VERSION-eff.xpi"
+
+else
+ crx_cws="pkg/https-everywhere-$VERSION~pre-cws.crx"
+ crx_eff="pkg/https-everywhere-$VERSION~pre-eff.crx"
+ xpi_amo="pkg/https-everywhere-$VERSION~pre-amo.xpi"
+ xpi_eff="pkg/https-everywhere-$VERSION~pre-eff.xpi"
+fi
+if ! [ -f "$KEY" ] ; then
+ echo "Making a dummy signing key for local build purposes"
+ openssl genrsa -out /tmp/dummy-chromium.pem 768
+ openssl pkcs8 -topk8 -nocrypt -in /tmp/dummy-chromium.pem -out $KEY
+fi
+
+
+# now pack the crx'es
+BROWSER="chromium-browser"
+which $BROWSER || BROWSER="chromium"
+
+$BROWSER --no-message-box --pack-extension="pkg/crx-cws" --pack-extension-key="$KEY" 2> /dev/null
+$BROWSER --no-message-box --pack-extension="pkg/crx-eff" --pack-extension-key="$KEY" 2> /dev/null
+
+mv pkg/crx-cws.crx $crx_cws
+mv pkg/crx-eff.crx $crx_eff
+
+echo >&2 "CWS crx package has sha256sum: `openssl dgst -sha256 -binary "$crx_cws" | xxd -p`"
+echo >&2 "EFF crx package has sha256sum: `openssl dgst -sha256 -binary "$crx_eff" | xxd -p`"
+
+# now zip up the xpi AMO dir
+name=pkg/xpi-amo
+dir=pkg/xpi-amo
+zip="$name.zip"
+
+cwd=$(pwd -P)
+(cd "$dir" && ../../utils/create_zip.py -n "$cwd/$zip" -x "../../.build_exclusions" .)
+echo >&2 "AMO xpi package has sha256sum: `openssl dgst -sha256 -binary "$cwd/$zip" | xxd -p`"
+
+cp $zip $xpi_amo
+
+# now zip up the xpi EFF dir
+name=pkg/xpi-eff
+dir=pkg/xpi-eff
+zip="$name.zip"
+
+cwd=$(pwd -P)
+(cd "$dir" && ../../utils/create_zip.py -n "$cwd/$zip" -x "../../.build_exclusions" .)
+echo >&2 "EFF xpi package has sha256sum: `openssl dgst -sha256 -binary "$cwd/$zip" | xxd -p`"
+
+cp $zip $xpi_eff
+
+bash utils/android-push.sh "$xpi_eff"
+
+echo >&2 "Total included rules: `find src/chrome/content/rules -name "*.xml" | wc -l`"
+echo >&2 "Rules disabled by default: `find src/chrome/content/rules -name "*.xml" | xargs grep -F default_off | wc -l`"
+
+# send the following to stdout so scripts can parse it
+# see test/selenium/shim.py
+echo "Created $xpi_amo"
+echo "Created $xpi_eff"
+echo "Created $crx_cws"
+echo "Created $crx_eff"
+
+if [ -n "$BRANCH" ]; then
+ cd ..
+ cp $SUBDIR/$crx_cws pkg
+ cp $SUBDIR/$crx_eff pkg
+ cp $SUBDIR/$xpi_amo pkg
+ cp $SUBDIR/$xpi_eff pkg
+ rm -rf $SUBDIR
+fi
diff --git a/makecrx.sh b/makecrx.sh
deleted file mode 100755
index f8ab66b990ac..000000000000
--- a/makecrx.sh
+++ /dev/null
@@ -1,158 +0,0 @@
-#!/usr/bin/env bash
-
-# Build an HTTPS Everywhere .crx Chromium extension (for Chromium 17+)
-#
-# To build the current state of the tree:
-#
-# ./makecrx.sh
-#
-# To build a particular tagged release:
-#
-# ./makecrx.sh
-#
-# eg:
-#
-# ./makecrx.sh chrome-2012.1.26
-#
-# Note that .crx files must be signed; this script makes you a
-# "dummy-chromium.pem" private key for you to sign your own local releases,
-# but these .crx files won't detect and upgrade to official HTTPS Everywhere
-# releases signed by EFF :/. We should find a more elegant arrangement.
-
-if [ -n "$1" ]; then
- if [ "$1" = today ] ; then
- python chromium/setversion.py
- else
- BRANCH=`git branch | head -n 1 | cut -d \ -f 2-`
- SUBDIR=checkout
- [ -d $SUBDIR ] || mkdir $SUBDIR
- cp -r -f -a .git $SUBDIR
- cd $SUBDIR
- git reset --hard "$1"
- fi
-fi
-
-VERSION=`python -c "import json ; print(json.loads(open('chromium/manifest.json').read())['version'])"`
-
-echo "Building chrome version" $VERSION
-
-if [ -f utils/trivial-validate.py ]; then
- VALIDATE="python utils/trivial-validate.py --ignoredups google --ignoredups facebook"
-elif [ -x utils/trivial-validate ] ; then
- # This case probably never happens
- VALIDATE=./utils/trivial-validate
-else
- VALIDATE=./trivial-validate
-fi
-
-if $VALIDATE src/chrome/content/rules >&2
-then
- echo Validation of included rulesets completed. >&2
- echo >&2
-else
- echo ERROR: Validation of rulesets failed. >&2
- exit 1
-fi
-
-if [ -f utils/relaxng.xml -a -x "$(which xmllint)" ] >&2
-then
- if xmllint --noout --relaxng utils/relaxng.xml src/chrome/content/rules/*.xml
- then
- echo Validation of rulesets with RELAX NG grammar completed. >&2
- else
- echo ERROR: Validation of rulesets with RELAX NG grammar failed. >&2
- exit 1
- fi
-else
- echo Validation of rulesets with RELAX NG grammar was SKIPPED. >&2
-fi
-
-sed -e "s/VERSION/$VERSION/g" chromium/updates-master.xml > chromium/updates.xml
-
-[ -d pkg ] || mkdir -p pkg
-[ -e pkg/crx ] && rm -rf pkg/crx
-mkdir -p pkg/crx/rules
-cd pkg/crx
-cp -a ../../chromium/* .
-do_not_ship="*.py *.xml icon.jpg"
-rm -f $do_not_ship
-cd ../..
-
-python ./utils/merge-rulesets.py
-
-export RULESETS=chrome/content/rules/default.rulesets
-cp src/$RULESETS pkg/crx/rules/default.rulesets
-
-echo 'var rule_list = [' > pkg/crx/rule_list.js
-for i in $(find pkg/crx/rules/ -maxdepth 1 \( -name '*.xml' -o -name '*.rulesets' \))
-do
- echo "\"rules/$(basename $i)\"," >> pkg/crx/rule_list.js
-done
-echo '];' >> pkg/crx/rule_list.js
-sed -i -e "s/VERSION/$VERSION/g" pkg/crx/manifest.json
-#sed -i -e "s/VERSION/$VERSION/g" pkg/crx/updates.xml
-#sed -e "s/VERSION/$VERSION/g" pkg/updates-master.xml > pkg/crx/updates.xml
-
-if [ -n "$BRANCH" ] ; then
- crx="pkg/https-everywhere-$VERSION.crx"
- key=../dummy-chromium.pem
-else
- crx="pkg/https-everywhere-$VERSION~pre.crx"
- key=dummy-chromium.pem
-fi
-if ! [ -f "$key" ] ; then
- echo "Making a dummy signing key for local build purposes"
- openssl genrsa 2048 > "$key"
-fi
-
-## Based on https://code.google.com/chrome/extensions/crx.html
-
-dir=pkg/crx
-name=pkg/crx
-pub="$name.pub"
-sig="$name.sig"
-zip="$name.zip"
-trap 'rm -f "$pub" "$sig" "$zip"' EXIT
-
-# zip up the crx dir
-cwd=$(pwd -P)
-(cd "$dir" && python ../../utils/create_xpi.py -n "$cwd/$zip" -x "../../.build_exclusions" .)
-echo >&2 "Unsigned package has shasum: `shasum "$cwd/$zip"`"
-
-# signature
-openssl sha1 -sha1 -binary -sign "$key" < "$zip" > "$sig"
-
-# public key
-openssl rsa -pubout -outform DER < "$key" > "$pub" 2>/dev/null
-
-byte_swap () {
- # Take "abcdefgh" and return it as "ghefcdab"
- echo "${1:6:2}${1:4:2}${1:2:2}${1:0:2}"
-}
-
-crmagic_hex="4372 3234" # Cr24
-version_hex="0200 0000" # 2
-pub_len_hex=$(byte_swap $(printf '%08x\n' $(ls -l "$pub" | awk '{print $5}')))
-sig_len_hex=$(byte_swap $(printf '%08x\n' $(ls -l "$sig" | awk '{print $5}')))
-(
- echo "$crmagic_hex $version_hex $pub_len_hex $sig_len_hex" | xxd -r -p
- cat "$pub" "$sig" "$zip"
-) > "$crx"
-#rm -rf pkg/crx
-
-#python githubhelper.py $VERSION
-
-#git add chromium/updates.xml
-#git commit -m "release $VERSION"
-#git tag -s chrome-$VERSION -m "release $VERSION"
-#git push
-#git push --tags
-
-echo >&2 "Total included rules: `find src/chrome/content/rules -name "*.xml" | wc -l`"
-echo >&2 "Rules disabled by default: `find src/chrome/content/rules -name "*.xml" | xargs grep -F default_off | wc -l`"
-echo >&2 "Created $crx"
-if [ -n "$BRANCH" ]; then
- cd ..
- cp $SUBDIR/$crx pkg
- rm -rf $SUBDIR
-fi
diff --git a/makexpi.sh b/makexpi.sh
deleted file mode 100755
index bc7f442a54a1..000000000000
--- a/makexpi.sh
+++ /dev/null
@@ -1,146 +0,0 @@
-#!/bin/sh
-APP_NAME=https-everywhere
-
-# builds a .xpi from the git repository, placing the .xpi in the root
-# of the repository.
-#
-# invoke with no arguments to build from the current src directory.
-#
-# ./makexpi.sh
-#
-# OR, invoke with a tag name to build a specific branch or tag.
-#
-# e.g.:
-#
-# ./makexpi.sh 0.2.3.development.2
-
-cd "`dirname $0`"
-
-[ -d pkg ] || mkdir pkg
-
-# If the command line argument is a tag name, check that out and build it
-if [ -n "$1" ] && [ "$2" != "--no-recurse" ] && [ "$1" != "--fast" ] ; then
- BRANCH=`git branch | head -n 1 | cut -d \ -f 2-`
- SUBDIR=checkout
- [ -d $SUBDIR ] || mkdir $SUBDIR
- cp -r -f -a .git $SUBDIR
- cd $SUBDIR
- git reset --hard "$1"
- # Use the version of the build script that was current when that
- # tag/release/branch was made.
- ./makexpi.sh $1 --no-recurse || exit 1
- # The fact that the above works even when the thing you are building predates
- # support for --no-recurse in this script is (1) non-intuitive; (2) crazy; and (3)
- # involves two pristine checkouts of $1 within each other
-
- # Now escape from the horrible mess we've made
- cd ..
- XPI_NAME="$APP_NAME-$1.xpi"
- # In this mad recursive situation, sometimes old buggy build scripts make
- # the xpi as ./pkg :(
- if ! cp $SUBDIR/pkg/$XPI_NAME pkg/ ; then
- echo Recovering from hair-raising recursion:
- echo cp $SUBDIR/pkg pkg/$XPI_NAME
- cp $SUBDIR/pkg pkg/$XPI_NAME
- fi
- rm -rf $SUBDIR
- exit 0
-fi
-
-# =============== BEGIN VALIDATION ================
-# Unless we're in a hurry, validate the ruleset library & locales
-
-if [ "$1" != "--fast" ] ; then
- if [ -f utils/trivial-validate.py ]; then
- VALIDATE="python utils/trivial-validate.py --ignoredups google --ignoredups facebook"
- elif [ -f trivial-validate.py ] ; then
- VALIDATE="python trivial-validate.py --ignoredups google --ignoredups facebook"
- elif [ -x utils/trivial-validate ] ; then
- # This case probably never happens
- VALIDATE=./utils/trivial-validate
- else
- VALIDATE=./trivial-validate
- fi
-
- if $VALIDATE src/chrome/content/rules >&2
- then
- echo Validation of included rulesets completed. >&2
- echo >&2
- else
- echo ERROR: Validation of rulesets failed. >&2
- exit 1
- fi
-
- if [ -f utils/relaxng.xml -a -x "$(which xmllint)" ] >&2
- then
- if xmllint --noout --relaxng utils/relaxng.xml src/chrome/content/rules/*.xml
- then
- echo Validation of rulesets with RELAX NG grammar completed. >&2
- else
- echo ERROR: Validation of rulesets with RELAX NG grammar failed. >&2
- exit 1
- fi
- else
- echo Validation of rulesets with RELAX NG grammar was SKIPPED. >&2
- fi 2>&1 | grep -v validates
-
- if [ -x ./utils/compare-locales.sh ] >&2
- then
- if ./utils/compare-locales.sh >&2
- then
- echo Validation of included locales completed. >&2
- else
- echo ERROR: Validation of locales failed. >&2
- exit 1
- fi
- fi
-fi
-# =============== END VALIDATION ================
-
-# The name/version of the XPI we're building comes from src/install.rdf
-XPI_NAME="pkg/$APP_NAME-`grep em:version src/install.rdf | sed -e 's/[<>]/ /g' | cut -f3`"
-if [ "$1" ] && [ "$1" != "--fast" ] ; then
- XPI_NAME="$XPI_NAME.xpi"
-else
- XPI_NAME="$XPI_NAME~pre.xpi"
-fi
-
-[ -d pkg ] || mkdir pkg
-
-# Used for figuring out which branch to pull from when viewing source for rules
-GIT_OBJECT_FILE=".git/refs/heads/master"
-export GIT_COMMIT_ID="HEAD"
-if [ -e "$GIT_OBJECT_FILE" ]; then
- export GIT_COMMIT_ID=$(cat "$GIT_OBJECT_FILE")
-fi
-
-# Unless we're in a hurry and there's already a ruleset library, build it from
-# the ruleset .xml files
-
-if [ "$1" = "--fast" ] ; then
- FAST="--fast"
-fi
-python ./utils/merge-rulesets.py $FAST
-
-cd src
-
-# Build the XPI!
-rm -f "../$XPI_NAME"
-#zip -q -X -9r "../$XPI_NAME" . "-x@../.build_exclusions"
-
-python ../utils/create_xpi.py -n "../$XPI_NAME" -x "../.build_exclusions" "."
-
-ret="$?"
-if [ "$ret" != 0 ]; then
- rm -f "../$XPI_NAME"
- exit "$?"
-else
- echo >&2 "Total included rules: `find chrome/content/rules -name "*.xml" | wc -l`"
- echo >&2 "Rules disabled by default: `find chrome/content/rules -name "*.xml" | xargs grep -F default_off | wc -l`"
- echo >&2 "Created $XPI_NAME"
- if [ -n "$BRANCH" ]; then
- cd ../..
- cp $SUBDIR/$XPI_NAME pkg
- rm -rf $SUBDIR
- fi
-fi
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 000000000000..6f97e1d4cd67
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1 @@
+lxml>=3.3.3
diff --git a/rules b/rules
new file mode 120000
index 000000000000..619db51439da
--- /dev/null
+++ b/rules
@@ -0,0 +1 @@
+src/chrome/content/rules
\ No newline at end of file
diff --git a/ruleset-testing.md b/ruleset-testing.md
new file mode 100644
index 000000000000..9d3a6fb82304
--- /dev/null
+++ b/ruleset-testing.md
@@ -0,0 +1,62 @@
+# Ruleset coverage requirements
+
+We have an automated tester that checks URLs for all rulesets to ensure they
+still work. In order for that tester to work we need input URLs. We have
+additional testing in place to ensure that all rulesets have a sufficient number
+of test URLs to test them thoroughly.
+
+Goal: 100% coverage of all targets and all branches of all regexes in each
+ruleset.
+
+Each ruleset has a number of "implicit" test URLs based on the target hosts. For
+each target host e.g. `example.com`, there is an implicit test URL of
+`http://example.com/`. Exception: target hosts that contain a wildcard ("`*`")
+do not create an implicit test URL.
+
+Additional test URLs can be added with the new `` tag in the XML, e.g.
+``.
+
+Test URLs will be matched against the regexes in each `` and
+``. A test URL can only match against one `` and one
+``. Once all the test URLs have been matched up, we count the number
+of test URLs matching each `` and each ``, and make sure the
+count meets the minimum number. The minimum number of test URLs for each
+`` or `` is one plus the number of '`*`', '`+`', '`?`', or
+'`|`' characters in the regex. Since each of these characters increases the
+complexity of the regex (usually increasing the variety of URLs it can match),
+we require correspondingly more test URLs to ensure good coverage.
+
+# Example:
+```xml
+
+
+
+
+
+
+
+
+
+```
+This ruleset has one implicit test URL from a target host
+("`http://example.com/`"). The other target host has a wildcard, so creates no
+implicit test URL. There's a single rule. That rule contains a '`+`' and a
+'`?`', so it requires a total of three matching test URLs. We add the necessary
+test URLs using explicit `` tags.
+
+# Testing and Continuous Build
+
+Testing for ruleset coverage is now part of the Travis CI continuous build.
+Currently we only test rulesets that have been modified since February 2 2015.
+Submitting changes to any ruleset that does not meet the coverage requirements
+will break the build. This means that even fixes of existing rules may require
+additional work to bring them up to snuff.
+
+To run the tests locally, first install the development dependencies:
+
+ ./install-dev-dependencies.sh
+
+To test a specific ruleset:
+
+ test/manual.sh rules/Example.xml
diff --git a/src/Changelog b/src/Changelog
index 18e3403a9732..db2f228f30d0 100644
--- a/src/Changelog
+++ b/src/Changelog
@@ -1,5 +1,644 @@
+2022.5.24
+* Improved EASE mode prompt
+* Add background tab on install or update to educate users on HTTPS only mode features in their browsers
+* Updated dependencies
+
+2021.7.13
+* Amend Incognito Key for Chrome and Firefox #20092
+* Fix unexpected arithmetic operations on strings #20043
+* Remove Top Alexa Labeller #20083
+* Update deprecated log function #20101
+* Patch Chrome Test Failure #20102
+
+2021.4.15
+* Add DuckDuckGo Smarter Encryption update channel
+* Bloom filter for rulesets
+* Firefox Fenix option page updates for Android users
+* Move to Python 3 from Python 3.6
+* Fix undefined type access
+* Fix empty default types
+
+2021.1.27
+* EASE Mode UI Changes
+* NPM Dependency updates
+* Geckodriver pull update
+* Chromedriver pull update
+* Integrate CSS Grid for Options Page and EASE UI
+* Put Options in new tab
+
+2020.11.17
+* Copy URL in EASE interstitial
+* Dependapot NPM updates
+* CRX distribution scripts for transparency for Edge and Opera
+* Port inclusion on allowlist for EASE
+* UI change to reflect a global setting
+
+2020.8.13
+* Fix port based whitelsiting issue #19291
+* Update documentation
+* Update dependencies (NPM and Chromedriver)
+* Minor code fixes in JS
+
+2020.5.19
+* Reverting Onboarding page for the time being
+* Patch for whitelisting rules and EASE mode issue
+* Double rule load patch in update channels
+* Fix minor JS and UX issues
+
+2020.3.16
+* EASE HTTP Once CSS fix
+* Allow users to whitelist hosts from the option page
+* EASE mode fixes for locale issue
+* Fetch Test Prep, TLS 1.2 update
+* Fetch Test Prep, Updated check rules script
+* Fix options page appearance on Firefox when dark mode is on
+* Dark mode adjustments
+
+2019.11.7
+* EASE HTTP Once Exception
+* Add Private network IPs to exclusion for HTTPSE
+* Revert icons back to previous state
+* Optimizations to url handling and hsts prune
+
+2019.6.27
+ * Making stylistic changes for mobile friendliness in Fennec
+ * Inclusion and use of the lib-wasm submodule, lowering memory overhead
+ * Refactor secure cookie logic
+ * Code cleanup
+ * Bundled ruleset updates
+
+2019.6.4
+ * Fix bug where link HTML is replaced in cancel page, instead of text
+ * Bundled ruleset updates
+
+2019.5.13
+ * UI nd functionality patches for stable rules
+ * Translations string fixes
+ * Minor npm updates for HSTS pruning
+
+2019.5.6
+ * UI tweaks for spacing and font sizes
+ * Fix reload bug
+ * Patch for offline release channel
+
+2019.5.2
+ * UI changes in extension menu (#17854)
+ * EASE interstitial UI tweaks (#17347)
+ * Remove support for wildcard in the middle (#12319)
+ * Update default timestamp for deterministic builds (#17623)
+ * Refactor and enhance trivialize-cookie-rules.js (#17438)
+ * Run HSTS-prune and fix impacted rulesets (#17338)
+ * Update HSTS preload max age (#17564)
+ * Fix DeprecationWarning in HTTPS Everywhere Checker (#17596 )
+ * Fix Chromium local store exception (#17557)
+ * Remove middle wildcard support in rules.js (#17715)
+
+
+2019.1.31
+ * Change "Block all unencrypted requests" language to "Encrypt all sites eligible"
+ * EASE mode patches for interstitial page and reload to trigger for EASE mode
+ * ES Lint clean up
+ * Disable test for Chrome (will work in patch while disabled)
+ * Deprecate I.P.s in rulesets (Special case for DNS I.P.s)
+
+2019.1.7
+ * Change "Block all unencrypted requests" language to "Encrypt all sites eligible"
+ * Amend check_rules.py fetch test to disable rules only if all rules are problematic,
+ and comment rules out if other rules are functional in the set
+ * HSTS Prune and updates
+ * Bundled ruleset updates
+
+2018.10.31
+ * Add additional error code for 'Block all unencrypted requests' interstitial
+ page.
+ * Fix race condition when adding update channel
+ * Add UX to remove user rules in options page
+ * Bundled ruleset updates
+
+2018.9.19
+ * Ensure the 'Block all unencrypted requests' interstitial page catches more
+ HTTPS misconfigurations (#16418)
+ * Allow users to disable HTTPS Everywhere on specific sites. Add additional
+ UX controls in the options page for this. (#10041)
+ * Adding 'scope' to update channels, which defines regex limiting the URLs
+ an update channel is allowed to operate on (#16430)
+ * Bundled ruleset updates
+
+2018.8.22
+ * Adding a warning to pages which 'Block all unencrypted requests' is unable
+ to upgrade
+ * Adding a UX that enables users to add, delete, and edit update channels
+ * Reduces memory overhead by optimizing exclusion regex
+ * Block insecure FTP connections when 'Block all unencrypted requests'
+ is checked. This triggers a permissions dialogue in Firefox 57+, see
+ https://github.com/EFForg/https-everywhere/issues/16377#issuecomment-415492846
+ for more info.
+ * Bundled ruleset updates
+
+2018.6.21
+ * Fix: URLs with a hostname of '.' cause endless loop to be triggered
+ * Bundled ruleset updates
+
+2018.6.13
+ * Improve popup page performance and slightly reduce memory usage
+ * Measure and slightly improve memory usage for rulesets
+ * Fix CORS issues in Firefox. This bug was previously breaking embedded
+ videos or css on many websites. Chrome browser was not affected by this
+ bug
+ * Add "Reset to Defaults" option to reset the default ruleset states
+ * Add "Show Devtools tab" option to hide CDT tab
+ * Bundled ruleset updates
+
+2018.4.11
+ * Reduce out-of-band ruleset update TTL from 48 to 24 hours
+ * Bundled ruleset updates
+
+2018.4.3
+ * Applies the out-of-band ruleset updates, sourced from
+ https://www.https-rulesets.org/. Clients perform a periodic check for new
+ rulesets to download, which are verified with the Web Crypto API using a
+ pinned key, then applied.
+ * Ruleset updates
+
+2018.3.13
+ * The unused `cacert` platform was removed from rulesets for simplicity
+ * Organizing the add-on files into a clean directory structure
+ * Ruleset updates
+
+2018.2.26
+ * Many/most mixed content blocking issues are solved when enabling the
+ "Block all unencrypted requests" option thanks to the injection of the
+ upgrade-insecure-requests header. This means this option can be more
+ easily used for daily browsing with less site breakage.
+ * Rulesets are alphabetically sorted in HTTPS Everywhere popup, with the
+ first-party site (if covered) at the top.
+ * Fixes an obscure Android bug where rulesets don't appear in popup for the
+ first window that is opened after restart.
+ * Many ruleset bugs have been solved (some dating 3 years back!)
+
+2018.1.29
+ * Ruleset updates
+
+2018.1.11
+ * Ruleset updates
+
+2017.12.6
+ * Remove unnecessary files from release
+ * Ruleset updates
+
+2017.11.21
+ * Ruleset updates
+
+2017.10.30
+ * Introduce migrations, migrate settings from localStorage to storage api
+ * Firefox: full WebExtensions version
+
+2017.10.24
+ * Significant code refactor
+ * Fixes for Fennec
+ * Ruleset updates
+
+2017.10.4
+ * Markup and small UI changes
+ * Modularize JS, clean up control flow
+ * Ruleset updates
+
+2017.9.12
+ * Decrease memory footprint by using JSON in default.rulesets
+ * Markup changes
+ * Ruleset updates
+
+2017.8.31
+ * Add counter badge to indicate how many rulesets are active
+ * Use Map instead of Object for targets (improves lookups)
+ * Fix race condition with persistent storage
+ * Ruleset updates
+
+2017.8.19
+ * Fix wildcard matching
+ * Remove usage of HTML string assignment
+ * Ruleset updates
+
+2017.8.17
+ * Firefox: Fix localStorage reference for users with cookies disabled
+
+2017.8.15
+ * Incorporating numerous fixes for WebExtensions to work within Firefox
+ * Firefox: Creating Embedded WebExtension wrapper to migrate legacy settings
+ * Removing legacy XPCOM codebase, unifying Firefox and Chrome codebase
+ * Ruleset updates
+
+Firefox 5.2.21 / Chrome 2017.7.18
+ * Ruleset updates
+
+Firefox 5.2.20 / Chrome 2017.7.5
+ * Ruleset updates
+
+Firefox 5.2.19 / Chrome 2017.6.20
+ * Chrome: Allow advanced users to enable rulesets which cause MCB
+ * Chrome: Fix - removal of custom rulesets should persist
+ * Ruleset updates
+
+Firefox 5.2.18 / Chrome 2017.6.5
+ * FF: Suppress request to check.torproject.org if SSL Observatory is disabled
+ * Chrome: Adding "View All Rules" link to Atlas
+ * Chrome: Allow removal of user-added, custom rulesets
+ * Ruleset updates
+
+Firefox 5.2.17 / Chrome 2017.5.22
+ * Ruleset updates
+
+Firefox 5.2.16 / Chrome 2017.5.8
+ * Ruleset updates
+
+Firefox 5.2.15 / Chrome 2017.4.19
+ * Ruleset updates
+
+Firefox 5.2.14 / Chrome 2017.4.5
+ * Ruleset updates
+
+Firefox 5.2.13 / Chrome 2017.3.17
+ * Ruleset updates
+
+Firefox 5.2.12 / Chrome 2017.3.9
+ * Excepting loopback hostnames from 'HTTPS Nowhere' functionality
+ * Ruleset updates
+
+Firefox 5.2.11 / Chrome 2017.2.13
+ * Ruleset updates
+
+Firefox 5.2.10 / Chrome 2017.1.25
+ * Removing targets which are HSTS preloaded in all supported browsers
+ * Ruleset updates
+
+Firefox 5.2.9 / Chrome 2016.12.19
+ * Ruleset updates
+ * In HTTP Nowhere mode, attempt HTTPS before block
+
+Firefox 5.2.8 / Chrome 2016.11.30
+ * Ruleset fixes
+
+Firefox 5.2.7 / Chrome 2016.11.8
+ * Ruleset fixes
+
+Firefox 5.2.6 / Chrome 2016.10.20
+ * Ruleset fixes
+ * Fix for domain isolation in Tor Browser with SSL Observatory
+
+Firefox 5.2.5 / Chrome 2016.9.21
+ * Ruleset fixes
+ * Removing deprecated torbutton options
+
+Firefox 5.2.4 / Chrome 2016.9.1
+ * Ruleset fixes
+ * Chrome Dev: Possible fix to "Extension Corrupted" errors
+ * Firefox Android: Fixing numerous issues with UI and functionality
+ * Firefox: Expanding SSL Observatory popup window
+
+Firefox 5.2.3
+ * Bugfix release: fixing a possible DLL hijacking vulnerability
+
+Firefox 5.2.2 / Chrome 2016.8.24
+ * Ruleset fixes
+
+Firefox 5.2.1
+ * Bugfix release: fix CSS to prevent large icons
+
+Chrome 2016.7.19
+ * New release fixing icon inclusion problem
+
+Firefox 5.2.0 / Chrome 2016.7.18
+ * Ruleset fixes
+ * Updating icons
+ * 'Block all unencrypted requests' now allows requests to .onion addresses
+
+Firefox 5.1.10 / Chrome 2016.6.9
+ * Ruleset fixes
+ * Fixing Tor Browser race condition
+
+Firefox 5.1.9 / Chrome 2016.5.10
+ * Adds large Bitly branded domain ruleset
+ * Additional ruleset fixes
+
+Firefox 5.1.6 / Chrome 2016.4.4
+ * Ruleset fixes
+ * Fix bug in Chromium, Firefox to limit FQDN
+
+Firefox 5.1.5 / Chrome 2016.3.23
+ * Ruleset fixes
+ * Improve coverage tests
+ * Add trivialize-rules tool and trivialized rulesets
+ * Remove checker as submodule & add to mainline repo
+
+Firefox 5.1.4 / Chrome 2016.2.23
+ * Fixes for Firefox Dev Edition
+ * Chrome: Fix regressions in custom rule functions
+ * Firefox: Fix custom ruleset regression
+
+Firefox 5.1.3 / Chrome 2016.2.18
+ * Performance & memory usage improvements for Chrome
+ * Introduce temporary disable option on Chrome
+ * Bugfix: make custom rules disableable
+ * Improvements to tests
+ * Switch to using JSON to store rulesets
+
+Firefox 5.1.2 / Chrome 2015.12.16
+ * Ruleset fixes
+
+Firefox 5.1.1 / Chrome 2015.8.25
+ * Ruleset fixes
+ * Clean up some unused code that was causing review problems on AMO.
+
+Firefox 5.1.0
+ * Signed by AMO so it won't get a warning in Firefox
+
+Firefox 5.0.9
+ * Fixed missing translations from 5.0.8
+
+Firefox 5.0.8 / Chrome-2015.8.13
+ * Ruleset fixes
+ * Restore checkbox icons on Firefox
+ * Add a link to the HTTPS Everywhere Atlas
+
+Firefox 5.0.7 / Chrome-2015.7.17
+ * Ruleset fixes, in particular disable broken Netflix rule
+ * Fix "Add a rule" functionality in Chrome.
+
+Chrome-2015.7.15
+ * Fix a broken ruleset that caused Chrome version to fail to rewrite all URLs.
+
+Firefox 5.0.6 / Chrome-2015.7.13
+ * Ruleset fixes
+ * Move options from "Enable / Disable rules" into icon menu
+ * EFF 25th birthday edition!
+
+Firefox 5.0.5 / Chrome-2015.5.28
+ * Ruleset fixes
+ * Fix ordering of locales to default to English again.
+
+Firefox 5.0.4 / Chrome-2015.5.12
+ * Ruleset fixes
+
+Firefox 5.0.3 / Chrome-2015.4.23
+ * Ruleset fixes
+
+Firefox 5.0.2 / Chrome-2015.4.7
+ * Ruleset fixes
+
+Firefox 5.0.1 / Chrome-2015.3.31 (2015-03-31)
+ * Disabled some broken rulesets.
+ * Fixed and updated many rulesets.
+ * Better null checking in Firefox.
+ * Add "Block All HTTP Requests" in Chrome.
+
+Firefox 5.0 / Chrome-2015.3.23 (2015-03-23)
+ * First stable 5.0 release
+ Versus 4.0.3:
+ * Many new rulesets.
+ * Improved automated ruleset testing.
+ * Many new translations in Firefox version.
+ * Support for Firefox electrolysis (aka e10s aka process separation).
+
+Firefox 5.0development.4 (2015-03-20)
+ * Ruleset updates
+
+5.0development.3 (2015-03-10)
+ * Added automated ruleset testing.
+ * Disabled many rules that failed ruleset tests.
+ * Fix cookie securing so it works for wildcard cookies
+ even when a wildcard target host is not present.
+ * User rule creation in Chromium is only offered on HTTPS.
+ * Enabling and disabling user rules on Chromium works.
+ * Candidate for 5.0 series stable release.
+
+5.0development.2 (2014-12-22)
+ * Merged mobile support from 4.0 branch.
+ * New translations imported:
+ Catalan, Chinese (Taiwan), Croatian (Croatia),
+ Estonian, Faroese, French (Canada), Khmer, Malay (Malaysia),
+ Portuguese (Brazil), Romanian, Serbian, Sinhala (Sri Lanka),
+ Slovak (Slovakia), Slovenian (Slovenia), Thai, Ukrainian
+ * Various ruleset fixes.
+ * Candidate for a 5.0 series stable release.
+
+5.0development.1 (2014-11-25)
+ * Support for multi-process Firefox (aka electrolysis or e10s).
+ * Merge latest rulesets.
+
+Firefox 4.0.3 / Chrome-2015.01.22 (2015-01-22)
+ * Ruleset updates.
+ * Update SSL Observatory code to match Firefox API changes in hashing.
+ * Bring code in line with guidelines for addons.mozilla.org.
+
+4.0.2 (2014-10-15)
+ * Disable SSL 3 to Prevent POODLE attack:
+ https://github.com/EFForg/https-everywhere/pull/674
+ * NEW: HTTP Nowhere mode. Block all plaintext http
+ * Updates to Yahoo APIs, Fastly, VMWare, Netflix, Mashable, LinkedIn ,
+ Gitorious, Mozilla, msecnd, Hotmail, Live, Eniro, Steam, Phoronix,
+ net-security.org, Flickr, Craigslist, Apache.org, Joomla.org, Samsung,
+ Google IMages, Expedia, Akamai, Trip Advisor, Ikea, CEll, Leo.org, Facebook,
+ F-Secure, Dropbox, Courage Campaign, Box, Atlassian, Internet Archive,
+ localbitcoins.com, SOny, SciVerse, Web.com, Urgan Dictionary, Pornhub,
+ Fool.com, ClickBank, MGID, Which?, Microsoft, Barnes and Noble, Royal
+ Institute of GB, Wall Street Journal
+
+4.0.1 (2014-09-11)
+ * Significant new coverage: Reddit, Quora
+ * Fixes include:
+ Frontier Networks, Hotmail / Live, Microsoft, Mozilla, Ohio State, Rackspace, SJ.se, Timbo.se
+ https://github.com/EFForg/https-everywhere/issues/310
+ https://github.com/EFForg/https-everywhere/issues/500
+ https://trac.torproject.org/projects/tor/ticket/11402
+ https://trac.torproject.org/projects/tor/ticket/11418
+ https://trac.torproject.org/projects/tor/ticket/12583
+ https://trac.torproject.org/projects/tor/ticket/12104
+ https://trac.torproject.org/projects/tor/ticket/9466
+ https://github.com/EFForg/https-everywhere/issues/144
+ * Enhancements to MCB detection and subsequent ruleset fixes
+ https://github.com/EFForg/https-everywhere/issues/529
+
+chrome-2014.8.22 (2014-08-22)
+ * Rulesets from 4.0.0
+ * German translation
+
+4.0.0 (2014-08-04)
+ * Ruleset fixes to wikimedia, stanford-university, joyent, and gaytorrents.
+ * Merge Android Firefox branch, so Android now has the same release cycle
+ as the stable HTTPS Everywhere branch for Firefox.
+ * Remove old unused ContentPolicy code.
+
+5.0development.0 (2014-07-28)
+ * Various rules for new gaming sites:
+ https://github.com/EFForg/https-everywhere/pull/387
+ * Add exception for flashproxy:
+ https://github.com/EFForg/https-everywhere/issues/357
+ * Updates to joyent, moevideo, FreeDesktop, Gfycat, Bytemark, tchibo,
+ Kantonalbank rules, godaddy, Bing, Pcwelt.de, Gamestar.de, o2-online,
+ heise.de, mozdev.org, Wikimedia, Spotify, Stanford-University, various Swiss
+ websites, SourceForge, utwente.nl, teamfortress.com, Fastly, mozilla.org,
+ AmazonAws, Technology Review, jitsi, googlecode.com, CDT, and other rules.
+ * Add Denh.am, justeatuk, owncloud, seanmckaybeck.com, strimoid.pl,
+ elkosmasgr, mantisbt, IAPC, ReadTheDocs, tox.im, and other rules.
+ * Initialize Convergence's NSS.js with nss library path:
+ https://github.com/EFForg/https-everywhere/pull/315
+ * Add filter for OCSP and other requests that should be unrewritten:
+ https://github.com/EFForg/https-everywhere/pull/332
+ * Add testing framework and a few basic extension tests:
+ https://github.com/EFForg/https-everywhere/pull/338
+ * Fix Chrome redirect loop detection:
+ https://github.com/EFForg/https-everywhere/issues/289
+ * Fix loading of user rules:
+ https://github.com/EFForg/https-everywhere/pull/293
+ * Fix SSL Obs. preferences XML parsing bug.
+ * Add experimental "HTTP Nowhere" mode (blocks all HTTP requests):
+ https://github.com/EFForg/https-everywhere/pull/379
+
+chrome-2014.6.26 (2014-06-25)
+ * Ruleset fixes (same as 3.5.3)
+ * Fix redirect loop detection for HTTPS to HTTPS redirects (Github #289)
+ * Remove item from rule cache when it is disabled by the user
+
+3.5.3 (2014-06-25)
+ * Ruleset fixes to Mozilla, PCWorld, MacWorld, Google Books, 4chan blog,
+ BuzzFeed, BBC, googlecode, TechDirt, Wikia, Technology Review, Google
+ Translate, CDT, Science Direct, Sourceforge
+ * Fix rulesets.sqlite path, allowing global installation (Github #255)
+ * Revert components/ssl-observatory.js to 3.4.5, possibly fixing crash bug
+ (Github #262)
+ * Update observatory whitelist
+
+4.0development.17 (2014-05-23)
+ * Re-enable ability to see all rulesets in enable/disable dialog.
+ * Fix allowing global installation:
+ https://github.com/EFForg/https-everywhere/pull/255
+ * Better observatory whitelisting:
+ https://github.com/EFForg/https-everywhere/pull/276
+ * Add option for SSL obs. revoked cert warnings:
+ https://github.com/EFForg/https-everywhere/pull/278
+ * Numerous ruleset updates
+
+3.5.1 (2014-04-25)
+ * Revert https://github.com/EFForg/https-everywhere/pull/134 due to YouTube
+ breakage.
+ * Re-enable ability to see all rulesets in enable/disable dialog.
+ * Added more Debian coverage.
+ * Fixes to Doubleclick, Guardian, Heroku, Home Depot, HypeMachine, IMDB,
+ Justin.tv, Kikatek, Mozilla, MyFitnessPal, Pinterest, XKCD, Reuters,
+ Technet, Tumblr, Wordpress, Yandex, Youtube, Flickr.
+ * Fix Australis icon positioning:
+ https://github.com/EFForg/https-everywhere/pull/216
+
+chrome-2014.4.25
+ * Ruleset fixes (same as 3.5.1)
+
+chrome-2014.4.16
+ * Make Chrome build script compatible with Chrome release scripts.
+ * Fix disappearing icon: https://github.com/EFForg/https-everywhere/pull/220
+ * Fix XKCD images
+
+chrome-2014.4.14.1
+ * Revert back to chrome-2014.1.3 because of bug in Chrome release script.
+
+chrome-2014.4.14
+ * Add SV localization
+ * Add persistent user-generated rules, thanks to Vijay P.:
+ https://github.com/EFForg/https-everywhere/pull/60
+ * Use onBeforeRedirect for redirect loop detection:
+ https://github.com/EFForg/https-everywhere/pull/199
+ * Remove unneeded onBeforeSendHeaders listener:
+ https://github.com/EFForg/https-everywhere/pull/172
+ * Fix host-only cookie bug:
+ https://github.com/EFForg/https-everywhere/pull/166
+ * Split incognito mode:
+ https://github.com/EFForg/https-everywhere/pull/165
+ * Cleanup pageAction icon code:
+ https://github.com/EFForg/https-everywhere/pull/173
+ * Add and modify some rulesets (same as 3.5)
+
+3.5 (2014-04-14)
+ * Merge all non-ruleset changes from 4.0development.16
+ * Merge all new/modified rulesets from 4.0development.16 that are
+ in the Alexa Top 1000 using utils/alexa-ruleset-checker.py. For a full list,
+ see utils/alexa-logs/07042014.log.
+
+4.0development.16 (2014-04-14)
+ * Restore code that loads custom rule files:
+ https://github.com/EFForg/https-everywhere/pull/156
+ * Use loadContext interface to get windows associated with requests
+ * Reduce annoying logging messages
+ * Report cert warning pages to SSL Observatory
+ * Remove SSL Observatory observers when disabled
+ * Don't set LOAD_REPLACE flag:
+ https://github.com/EFForg/https-everywhere/pull/134
+ * Add script to merge rulesets in Alexa Top 1M, thanks to Claudio Moretti:
+ https://github.com/EFForg/https-everywhere/pull/149
+ * 8 new rules
+ * 59 modified rules
+
+4.0development.15 (2014-02-05)
+ * Replace the single XML ruleset library with an sqlite database of rulesets
+ that are loaded on demand
+ - reduces startup time by a factor of 10-20:
+ https://trac.torproject.org/projects/tor/ticket/10174
+ - reduces RAM usage https://trac.torproject.org/projects/tor/ticket/4804
+ - Is scalable: https://trac.torproject.org/projects/tor/ticket/6118
+ Further analysis in this thread:
+ https://lists.eff.org/pipermail/https-everywhere/2014-January/001919.html
+ * Implement a cleanup case to recover from some Observatory UI code bugs that
+ would leave the Observatory off incorrectly.
+ https://trac.torproject.org/projects/tor/ticket/10728
+ * Fix observatory - private browsing mode interaction
+ https://trac.torproject.org/projects/tor/ticket/10208
+ * Ship 848 new rulesets
+ * Update cert whitelist
+
+3.5android.0 (2014-01-31)
+ * First Firefox for Android release! :D
+ * Major UI changes for mobile compatibility
+ * Android channel update URL set to
+ https://www.eff.org/files/https-everywhere-android-update-2048.rdf
+ * Updated rulesets: Freenode, Imgur
+
+3.4.5 (2014-01-03)
+ * Updated license
+ * Updated README.md
+ * Updated contributors list
+ * Fix a performance bug when re-enabling HTTPS-Everywhere from its menu
+ * Observatory cert whitelist update
+ * Updated rules: Atlassian, Brightcove, MIT, Pidgin, Microsoft, Whonix,
+ Skanetrafiken, Stack-Exchange, Stack-Exchange-mixedcontent
+
+chrome-2014.1.3
+ * Various ruleset fixes
+ * Various performance improvements, thanks to Nick Semenkovich and Jacob
+ Hoffman-Andrews!
+ * Add LRU caching for rules
+ * Refactor out unused code
+ * Reload page when rule is disabled
+ * Upgrade URI.js
+ * Add fi translation
+
+3.4.4tbb (2013-12-06)
+ * Pseudorelease, just for Tor Browser Bundle usage
+ * Tiny ruleset tweaks (XKCD is back)!
+ * Create an about:config setting that overrules mixedcontent ruleset disablement
+
+3.4.3 (2013-12-03)
+ * Fixes: Cloudfront / Amazon MP3 player, Cornell/Arxiv, FlickR,
+ AmazonAWS/spiegel.tv
+ * Disable broken: Barns and Noble, Behance, Boards.ie, Elsevier, Kohls,
+ OpenDNS, Spin.de, Svenskakyrkan
+ * Deprecate the ContentPolicy API, fixing a crash bug
+ lurking since Firefox 20:
+ https://bugzilla.mozilla.org/show_bug.cgi?id=939180
+ * Fix really silly Observatory UI bug that would leave the Observatory off
+ for non-Tor users after they turned it on
+ * Update Observatory blacklist
+ * Bump maxVersion from Firefox 25 to 28.
+
4.0development.14 (2013-11-21)
- * Deprecate the ContentPolicy API, fixing a crash bug
+ * Deprecate the ContentPolicy API, fixing a crash bug
lurking since Firefox 20:
https://bugzilla.mozilla.org/show_bug.cgi?id=939180
* Fix really silly Observatory UI bug that would leave the Observatory off
@@ -60,10 +699,10 @@
the stable branch, and changed many stable rules
chrome-2013.8.17
- * Urgent bugfix release for
+ * Urgent bugfix release for
https://trac.torproject.org/projects/tor/ticket/9507
- release from the stable / 3.0 branch, not master
- - don't ship the development ruleset library, it's not ready for prime
+ - don't ship the development ruleset library, it's not ready for prime
time yet
- avoid performance hits from repeatedly re-testing rulesets
- other possible weirdness
@@ -133,7 +772,7 @@ chrome-2013-8.16
* Includes all fixes from 3.3
3.3
- * This major release fixed the following mixed content blocker (MCB)
+ * This major release fixed the following mixed content blocker (MCB)
related bugs in time for Firefox 23:
https://trac.torproject.org/projects/tor/ticket/9196
https://trac.torproject.org/projects/tor/ticket/8774
@@ -174,7 +813,7 @@ chrome-2013.7.10
chrome-2012.6.4
* The "factors of 12" chromium beta
* Various ruleset fixes:
- https://eff.org/r.5bSj
+ https://www.eff.org/r.5bSj
https://trac.torproject.org/projects/tor/ticket/8584
https://trac.torproject.org/projects/tor/ticket/8571
* Disable Myspace by default due to mixed content
@@ -182,19 +821,19 @@ chrome-2012.6.4
4.0development.8 (2013-06-04)
* Fix broken ruleset dialog in Firefox 22+
https://trac.torproject.org/projects/tor/ticket/8997
- * The toolbar button chnages to indicate active rulesets:
- https://trac.torproject.org/projects/tor/ticket/4886
+ * The toolbar button changes to indicate active rulesets:
+ https://trac.torproject.org/projects/tor/ticket/4886
* Ship 31 new rulesets
* New translations: Japanese and Sinhala
* Updated translations: Hungarian, Lithuanian, Slovenian
* Ruleset fixes from 3.2.2:
- https://eff.org/r.5bSj
+ https://www.eff.org/r.5bSj
* Observatory cert whitelist update
-
+
3.2.2 (2013-05-22)
* Quick turn-around release to unbreak support.apple.com
* Fixes for a number of other ruleset bugs:
- https://eff.org/r.5bSj
+ https://www.eff.org/r.5bSj
* Incremental observatory cert whitelist update
3.2.1 (2013-05-17)
@@ -215,7 +854,7 @@ chrome-2012.6.4
* Add a note hinting users how to toggle rulesets (thanks to Pavel Kazakov)
https://trac.torproject.org/projects/tor/ticket/4967
* Ship all fixes from 3.2:
- https://eff.org/r.b9Qc
+ https://www.eff.org/r.b9Qc
* Other known ruleset fixes: EA, Yandex
https://trac.torproject.org/projects/tor/ticket/8571
* Ship 1308 new rulesets!
@@ -224,16 +863,16 @@ chrome-2012.6.4
chrome-2012.4.30
* The "May day somewhere" chromium beta
* Ship all ruleset bugfixes from the Firefox 3.2 release:
- https://eff.org/r.b9Qc
+ https://www.eff.org/r.b9Qc
* Flag/disable mixed content rulesets: Apple Support, BBC, Dell support,
FBI, Wordpress, Zend
- https://eff.org/r.1bQt
+ https://www.eff.org/r.1bQt
* Disable VistaX64
https://trac.torproject.org/projects/tor/ticket/8801
3.2 (2013-04-25)
* Related trac bugs for this release:
- https://eff.org/r.b9Qc
+ https://www.eff.org/r.b9Qc
* New: MoinMoin
* Fixes: Adobe, Bahn.de, Cloudfront, Dell, Droplr, FBI, Google Maps,
Joomla, Juno Download, Lenovo, New York Times, SEC, Soundcloud,
@@ -274,7 +913,7 @@ chrome-2012.3.7
https://trac.torproject.org/projects/tor/ticket/8199
https://trac.torproject.org/projects/tor/ticket/8198
* Disable broken:
- American Public Media (for real this time), Asymmetric Publications,
+ American Public Media (for real this time), Asymmetric Publications,
Salsa Labs, Vimeo
https://trac.torproject.org/projects/tor/ticket/7650
https://trac.torproject.org/projects/tor/ticket/8280
@@ -290,7 +929,7 @@ chrome-2013.1.18
* Fix the implementation of safeToSecureCookie
- Get https://trac.torproject.org/projects/tor/ticket/7491 right(er)
- Fix https://trac.torproject.org/projects/tor/ticket/7855
- * Fix a ruleset processing bug, which would prevent
+ * Fix a ruleset processing bug, which would prevent
from matching x.y.z.com
* Ship all ruleset fixes from 3.1.2 and 3.1.3
- Except Etsy, where we're trying to fix rather than disable the ruleset
@@ -301,7 +940,7 @@ chrome-2013.1.18
3.1.3 (2013-1-18)
* Internet Freedom Day stable bugfix release
- * Fixes: CloudFront/Spotify, AmazonAWS (Amazon MP3s and product images), Libav,
+ * Fixes: CloudFront/Spotify, AmazonAWS (Amazon MP3s and product images), Libav,
Google Maps, UserEcho
https://trac.torproject.org/projects/tor/ticket/7931
https://trac.torproject.org/projects/tor/ticket/7888
@@ -343,7 +982,7 @@ chrome-2012.12.17
* Additionally disable: Automattic
4.0development.4 (2012-12-17)
- * Fix nasty bug that prevented Firefox downloads from Mozilla's CDN
+ * Fix nasty bug that prevented Firefox downloads from Mozilla's CDN
https://trac.torproject.org/projects/tor/ticket/7717
* Fix download from qt-project.org
* Ship 72 new rulesets
@@ -401,8 +1040,8 @@ chrome-2012.10.31
* Work around a nasty bug that was affecting some high-volume Live Youtube streams
(but not other live YouTube streams)
https://trac.torproject.org/projects/tor/ticket/7127
- * Other Fixes:
- AdaCore, Akamai/MTV3 Katsomo, Akamai/HP, Atlassian, Bahn.de, MySQL, NPR, PBS,
+ * Other Fixes:
+ AdaCore, Akamai/MTV3 Katsomo, Akamai/HP, Atlassian, Bahn.de, MySQL, NPR, PBS,
Phronoix Media/Openbenchmarking, SSRN, Spoki
https://trac.torproject.org/projects/tor/ticket/7219
https://trac.torproject.org/projects/tor/ticket/7180
@@ -418,12 +1057,12 @@ chrome-2012.10.31
https://trac.torproject.org/projects/tor/ticket/7114
https://trac.torproject.org/projects/tor/ticket/7138
https://trac.torproject.org/projects/tor/ticket/7107
-
+
3.0.3 (2012-10-29)
* Work around a nasty bug that was affecting some high-volume Live Youtube streams
(but not other live YouTube streams)
https://trac.torproject.org/projects/tor/ticket/7127
- * Other Fixes:
+ * Other Fixes:
AdaCore, Akamai/MTV3 Katsomo, Akamai/HP, Atlassian, Bahn.de, DemocracyNow, MySQL, NuGet,
PBS, Phronoix Media/Openbenchmarking, SSRN, Spoki
https://trac.torproject.org/projects/tor/ticket/7219
@@ -464,7 +1103,7 @@ chrome-2012.10.31
chrome-2012.10.18
* The "even more perfect" chromium alpha
- * Fixes from the last two Firefox releases:
+ * Fixes from the last two Firefox releases:
Microsoft (Bing login button), ZeniMax, Ubuntuone, TrueCrypt, Springer,
Optical Society, IMDB, Facebook, EzineArticles, Broadband Reports, Apache,
Akamai (exclude Zynga content to prevent breakage of some Zynga games),
@@ -488,8 +1127,8 @@ chrome-2012.10.18
hundreds of others
3.0.1 and 4.0development.1:
- * Fixes: adition.com, Akamai/SVTplay.se, Bahn.de, European Southern Observatory,
- IEEE, Indeed, Java, Librivox, Pinterest, New York Times, Springer, Vimeo,
+ * Fixes: adition.com, Akamai/SVTplay.se, Bahn.de, European Southern Observatory,
+ IEEE, Indeed, Java, Librivox, Pinterest, New York Times, Springer, Vimeo,
Shannon Health, O'Reilly Media
https://trac.torproject.org/projects/tor/ticket/7080
https://mail1.eff.org/pipermail/https-everywhere/2012-October/001583.html
@@ -514,7 +1153,7 @@ chrome-2012.10.9
3.0 (2012-10-04)
* Since version 2.x:
* 1,455 new active rulesets
- * UI improvements:
+ * UI improvements:
- right-click to view ruleset source in the config window
- translate some untranslated menus
- better icons in a few places (breaking/redirecting rules,
@@ -528,7 +1167,7 @@ chrome-2012.10.9
* Relative to 3.0development.8:
* Only promote the Decentralized SSL Observatory to 5% of non-Tor users
* Update the SSL Observatory whitelist of common cert chains
- * Fixes, mostly in the CDN/media playback department:
+ * Fixes, mostly in the CDN/media playback department:
Akamai/CNN, GO.com/ABC, AWS/Amazon Zeitgeist MP3 player,
AWS/Spiegel.tv, Technology Review, Cloudfront/Tunein,
Akamai/Discovery Channel, Beyond Security, OCaml, Gentoo,
@@ -564,14 +1203,14 @@ chrome-2012.9.21
https://trac.torproject.org/projects/tor/ticket/6848
* Replace jsURI with URI.js, fixing a number of bugs in the Chrome port
- https://trac.torproject.org/projects/tor/ticket/6197
- - Also breakage on other random pages like
+ - Also breakage on other random pages like
http://venturebeat.com/2012/09/13/how-do-not-track-could-destroy-the-internet-as-you-know-it/
* Fixes: AOL, Antispam.de, BBC, BitTorrent, Facebook, Gearhog, LinkPlus
Catalog, Microsoft, Mother Jones, Mozilla, Office.co.uk, OpenDNS,
PassThePopcorn, Piriform, WhatCD, uTorrent
* Disable broken: Paper.li, SVT.se, Soton.ac.uk
* Reenable: Referly
-
+
chrome-2012.9.10
* The "just add eleven" chromium alpha
* Time to test the updating mechanism from direct -> Chrome Web Store
@@ -659,7 +1298,7 @@ chrome-2012.8.15
Jottit
* Disable broken: Project Syndicate, Alton Towers, Network for Good
https://trac.torproject.org/projects/tor/ticket/6222
- * The Decentralized SSL Observatory client now saves up some certificates if
+ * The Decentralized SSL Observatory client now saves up some certificates if
the network blocks or MITMs attempts to submit them.
chrome-2012.6.21
@@ -675,8 +1314,8 @@ chrome-2012.6.21
https://trac.torproject.org/projects/tor/ticket/5893
* Ship 217 new rulesets (frozen; new rulesets now have to wait until 4.0
development)
- * Fixes: numerous, including: Boxee, CiteULike, MozillaMessaging,
- Yandex, Demonoid, Pirate Party, Gentoo, NYTimes, Microsoft,
+ * Fixes: numerous, including: Boxee, CiteULike, MozillaMessaging,
+ Yandex, Demonoid, Pirate Party, Gentoo, NYTimes, Microsoft,
Wikipedia, Lenovo, MyWOT
https://trac.torproject.org/projects/tor/ticket/5912
https://trac.torproject.org/projects/tor/ticket/6091
@@ -687,12 +1326,12 @@ chrome-2012.6.21
https://mail1.eff.org/pipermail/https-everywhere-rules/2012-June/001190.html
https://mail1.eff.org/pipermail/https-everywhere-rules/2012-May/001186.html
https://mail1.eff.org/pipermail/https-everywhere/2012-May/001433.html
- * Disable broken: MarketWatch, Disqus, Magento, Lavasoft,
+ * Disable broken: MarketWatch, Disqus, Magento, Lavasoft,
Typepad/Say Media, Thomas Cook, Thomson Reuters clients,
Science Daily, BinRev, Ikea, Interpol
https://trac.torproject.org/projects/tor/ticket/5899
https://trac.torproject.org/projects/tor/ticket/5496
-
+
chrome-2012.6.18
* The Divisible By Six Chromium Beta Release
* Ship 444 new Rulesets
@@ -731,11 +1370,11 @@ chrome-2012.5.1
Everywhere protection for cookies on some domains.
https://trac.torproject.org/projects/tor/ticket/5676
https://trac.torproject.org/projects/tor/ticket/2199
- * More efficient ruleset storage shrinks the .crx download by a factor of
+ * More efficient ruleset storage shrinks the .crx download by a factor of
about 4 (thanks fauxfaux)
https://trac.torproject.org/projects/tor/ticket/5275
* Disable buggy rulesets: IBM, Scribd, Wunderground, ReadWriteWeb,
- Pastebin.ca
+ Pastebin.ca
https://trac.torproject.org/projects/tor/ticket/5344
https://trac.torproject.org/projects/tor/ticket/5435
https://trac.torproject.org/projects/tor/ticket/5630
@@ -749,7 +1388,7 @@ chrome-2012.5.1
3.0development.2 (2012-04-26)
- * License change: the tree now includes some code from Convergence, which
+ * License change: the tree now includes some code from Convergence, which
is GPL v3+. Other code remains licensable as GPLv2+
* Ship 696 new rulesets (!!!), thanks to a lot of amazing work by Negres
* Fix a downgrade attack that might allow attackers to deny HTTPS
@@ -776,9 +1415,9 @@ chrome-2012.5.1
* Separate Observatory option to control self-signed cert submission
* Numerous other ruleset enhancements, fixes, and probably exciting new bugs
in Negres's ruleset changes
-
+
3.0development.1 (2012-03-14)
- * By default, use https://google.co.cctld instead of
+ * By default, use https://google.co.cctld instead of
encrypted.google.com
https://trac.torproject.org/projects/tor/ticket/5152
* Add an optional ruleset to use https://www.google.com
@@ -798,7 +1437,7 @@ chrome-2012.3.14
* Add an optional ruleset to search on https://www.google.com
instead of encrypted.google.com
* Switch non-US google searches to country sites by default
- * Better chrome context UI
+ * Better chrome context UI
2.2.3 (2012-09-25)
* Workaround for breakage in Amazon Look Inside the Book (via Cloudfront)
@@ -807,7 +1446,7 @@ chrome-2012.3.14
* Other fixes: PassThePopcorn, WhatCD, Antispam.de, RFCeditor,
Weatherspark / GoogleMaps
* Disable broken: SVT.se
-
+
2.2.1 (2012-08-17)
* Fix a configuration-parsing bug in 2.2 that would
ignore default_off rules if this was a first install
@@ -843,7 +1482,7 @@ chrome-2012.3.14
2.0.5 (2012-05-16)
* Rebuild 2.0.4 without a bug in the release scripts that prevented all the
rulesets from being absent
-
+
2.0.4 (2012-05-16)
* Fix for compatibility with some other Firefox extensions:
https://trac.torproject.org/projects/tor/ticket/5682
@@ -906,7 +1545,7 @@ chrome-2012.2.27
* Split Google Translate out of the Google APIs rule, and turn it off by
default on Chrome only:
Fixes https://trac.torproject.org/projects/tor/ticket/5196
- * Ship 19 new rulesets since last Chromium release
+ * Ship 19 new rulesets since last Chromium release
chrome-2012.2.9
* make rulesets elements work in the Chrome version
@@ -942,9 +1581,9 @@ chrome-2012.02.06{,.01}
* Ship 126 new rulesets
* Fixes: Wikipedia, Identi.ca, Verizon, CCC.de, UserScripts, Yandex,
Hidemyass, Mozilla, Pogo, Google, Google Images, Google Video,
- The Pirate Bay, AK Vorrat, JBoss
+ The Pirate Bay, AK Vorrat, JBoss
* Improvements: EFF, Flickr, RedHat, Diaspora, PrivatePaste, KDE,
- Portugese Govt
+ Portugese Govt
* Disable broken: NSF.gov, WHO.int, Economist
* New experimental Yahoo! ruleset (off by default)
* New translations: Spanish, Nederlands
@@ -959,8 +1598,8 @@ chrome-2012.02.06{,.01}
* Fixes: Java.com, Yandex, Wordpress, Wikipedia, Bahn.de, UNSW, Apache,
DuckDuckGo, Google Images
* Improvements: Debian, Tumblr, Apple, Facebook, VeriSign, Google Services,
- Flickr, Youtu.be
- * Disable broken: Target, OpenUniversity, TV.com, Radio Shack,
+ Flickr, Youtu.be
+ * Disable broken: Target, OpenUniversity, TV.com, Radio Shack,
Yahoo Mail :( :(,
Google Cache coverage in Google Services :( :( :(
@@ -1004,7 +1643,7 @@ chrome-2012.02.06{,.01}
(currently opt-in, with a popup prompt if you have Tor Button installed)
* Ship 164 new rulesets
* Enable Google Maps by default
- * Pending translations: Arabic, Dutch, German, Portugese, Latvian, Russian,
+ * Pending translations: Arabic, Dutch, German, Portugese, Latvian, Russian,
Swedish
* Fixes: OpenDNS, WordPress, Flickr
* Expansions & Improvements: Google Services, Twitter, Gowalla, Apple, Bit.ly
@@ -1057,9 +1696,9 @@ chrome-2012.02.06{,.01}
1.0.2 (2011-09-20)
* Major improvements to the Wikipedia ruleset
- * Disable broken/buggy rulesets: DeviantArt, eHow, About.me, Bandcamp,
+ * Disable broken/buggy rulesets: DeviantArt, eHow, About.me, Bandcamp,
StudiVZ, Securityfocus, BankofAmerica :( :( :(
- * Small fixes: OpenDNS, WordPress, links in the "About" page
+ * Small fixes: OpenDNS, WordPress, links in the "About" page
* Declare incompatibility with Firefox 7 & 8 until Mozilla fixes this:
https://bugzilla.mozilla.org/show_bug.cgi?id=677643
@@ -1103,7 +1742,7 @@ chrome-2012.02.06{,.01}
https://trac.torproject.org/projects/tor/ticket/2199
* By default, move context menu from toolbar to addons bar
* Ship 22 new rulesets
- * Add support for Google Plus, Accounts and AdWdords
+ * Add support for Google Plus, Accounts and AdWdords
* Improvements to Microsoft, Twitter and Gitorious
1.0.0development.1: (2011-06-27)
@@ -1111,7 +1750,7 @@ chrome-2012.02.06{,.01}
applicable to the current page (we can now stabilise the dev branch!)
* Ship 42 new rulesets
* Support for Google Image Search (except the very first landing page :/)
- * Fixes: Netflix, Plone
+ * Fixes: Netflix, Plone
* Improvements: Google APIs, Google Services, Mediawiki
* Disable broken rules: OKCupid, Surveymonkey
* Declare compatibility with recent Seamonkey releases
@@ -1119,29 +1758,29 @@ chrome-2012.02.06{,.01}
0.9.9.development.6:
* Optimistically declare compatibility with Firefoxes up to v 7.*
* Ship 193 new rulesets
- * Fixes & Improvements: Wikipedia, AmazonAWS, Google Images, Microsoft,
- Mozilla, Netflix, Google User Content, Twitter, Gitorious, AdBlock Plus,
+ * Fixes & Improvements: Wikipedia, AmazonAWS, Google Images, Microsoft,
+ Mozilla, Netflix, Google User Content, Twitter, Gitorious, AdBlock Plus,
Youtube, he.net, Bitcoin
- * Remove broken rules: Match.com
+ * Remove broken rules: Match.com
0.9.9.development.5:
* Compatible with Firefox 4.0.1+
* New ruleset management UI (thanks to katmagic and Stefan Tomanek)
* Ship 136 new rulesets
- * Fixes: reCAPTCHA, Google Images, Gentoo, Gitorious
- * Improvements: Bit.ly, Yahoo, Nokia
- * Disable: WashingtonPost :(, Doubleclick, OpenSSL.org (!)
-
+ * Fixes: reCAPTCHA, Google Images, Gentoo, Gitorious
+ * Improvements: Bit.ly, Yahoo, Nokia
+ * Disable: WashingtonPost :(, Doubleclick, OpenSSL.org (!)
+
0.9.9.development.4:
* Ship 117 new rulesets
- * Fixes: MySQL, GroupOn, country-specific Google news sites,
+ * Fixes: MySQL, GroupOn, country-specific Google news sites,
* Improvements: mail.com, WordPress
* Leave WashingtonPost ruleset on in the hope that it gets fixed soon :/
* Disable broken rules: HTC, I2P ...
0.9.9.development.3:
- * In the settings dialogue, offer "Reset defaults" instead of "Enable all"
+ * In the settings dialogue, offer "Reset defaults" instead of "Enable all"
* Merge fixes from NoScript that avoid some torbutton bugs
* Ship 56 new rulesets
* Numerous tweaks + fixes, including NYTimes and AddThis
@@ -1149,10 +1788,10 @@ chrome-2012.02.06{,.01}
0.9.9.development.2:
* Prevent the preferences window from swallowing the screen on OS X / Windows
- * Stop the StartCom rule from breaking StartCom OCSP/CRLs (which can't be HTTPS)
+ * Stop the StartCom rule from breaking StartCom OCSP/CRLs (which can't be HTTPS)
* Attempt to do the same for for CAcert
* Fixes to: Reddit, Drupal.org
- * Disable some problematic rulesets: Cisco, Opera
+ * Disable some problematic rulesets: Cisco, Opera
* Enable: Reddit
* Ship another 62 rulesets
@@ -1200,7 +1839,7 @@ chrome-2012.02.06{,.01}
* Support global installation for OS distributions (thanks dm0)
0.9.2:
- * Fix a bug in our redirection loop detection that was causing touble with
+ * Fix a bug in our redirection loop detection that was causing trouble with
some parts of NYTimes, Facebook, and other sites
(closes: https://trac.torproject.org/projects/tor/ticket/2217)
@@ -1213,7 +1852,7 @@ chrome-2012.02.06{,.01}
improvements!
* Split the stricter parts of the Facebook rule into a "Facebook+" rule.
It's what's required to protect Facebook from Firesheep and similar cookie
- theft attacks, but it may break apps, because apps.facebook.com currently
+ theft attacks, but it may break apps, because apps.facebook.com currently
has the wrong cert.
* Allow rulesets to specify that the secure flag should be set on some
cookies even if the site operator failed to do so
@@ -1238,7 +1877,7 @@ chrome-2012.02.06{,.01}
* Add scrollbars if there are a lot of rules present in the Preferences
dialog (may still be somewhat buggy...)
* Optimise GoogleServices.xml and support Google code search
- * Patch for future compatiability with Request Policy:
+ * Patch for future compatibility with Request Policy:
https://trac.torproject.org/projects/tor/ticket/1574
* Support for the Firefox 4 API
* The Amazon rule was causing a lot of glitches; it is now off by default
@@ -1252,7 +1891,7 @@ chrome-2012.02.06{,.01}
https://trac.torproject.org/projects/tor/ticket/1672
https://trac.torproject.org/projects/tor/ticket/1673
The patch breaks toolbar search suggestions. And who knows what else?
- * Don't send some country homepages to https://www.google.com/webhp?hl= ;
+ * Don't send some country homepages to https://www.google.com/webhp?hl= ;
use https://encrypted.google.com instead
* Cleanup and refactor the URI replacement and rewriting code. Should
hopefully fix https://trac.torproject.org/projects/tor/ticket/1649
@@ -1272,7 +1911,7 @@ chrome-2012.02.06{,.01}
0.2.1:
* Although google said https://www.google.com would continue to work, that
wasn't absolutely true.
- * The new encyrpted.google.com seems to require queries to be #q=thing
+ * The new encrypted.google.com seems to require queries to be #q=thing
rather than search?q=thing, at least some of the time. So let's do that.
0.2.0:
diff --git a/src/META-INF/cose.manifest b/src/META-INF/cose.manifest
new file mode 100644
index 000000000000..045ba86369fd
--- /dev/null
+++ b/src/META-INF/cose.manifest
@@ -0,0 +1,732 @@
+Manifest-Version: 1.0
+
+Name: manifest.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: X0hd0tplhCo2R8s3OE27fLAZFD8=
+SHA256-Digest: iKk69TG3OJJNjjAJPTe72S+qXa4k/xL8yKmPzAGmaxg=
+
+Name: package.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: HQyF0Be9Z+C72YzyWk6LqTSCxkU=
+SHA256-Digest: 1v7I/u/oNho1Z8rtRLepk7VY9i0r8EktoXSvvy92SsE=
+
+Name: _locales/ace/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/ach/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/af/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: iOMFMT97+EoNCW6DRomntg8GSHk=
+SHA256-Digest: cw+OPqn11qIyL1P5cFnPmxrYTVKQ0oPX10+1KjXtNoc=
+
+Name: _locales/af_ZA/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/ar/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: pxQQhQSkkjd9EAlMdZmvk+qmXhg=
+SHA256-Digest: MORqa6PigyGRYrjsjuUVk80TAKErKzIZy9G5UnPV20U=
+
+Name: _locales/ar_EG/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/ast/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: VdPNPPiC8Ro2JsmoBFkdW3TAy2c=
+SHA256-Digest: 4zrpaArMxcBnUHIyLdenD/CDBXFXDgnSki4HzzEB0J8=
+
+Name: _locales/az/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 3+BLldWYu7TK8cGkwWGVp8z0EUk=
+SHA256-Digest: hfU635JcDvcEJzmbg2zkxSrfMEe0SVNvq8U9wj1SvNg=
+
+Name: _locales/be/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: /7FQnv3lG2OqZFTdc3/fmuOznX8=
+SHA256-Digest: OrCo5OOtp9o91snpAQUrgUG1KbmJ7ScDZ3tncnnV2po=
+
+Name: _locales/bg/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: uvPzsM24ej+LdWMNASNfYE1+tBs=
+SHA256-Digest: Z0AMZvlkzgDfeSMbZQ+AdhZryI8kmsdpYpvOz8lM9TI=
+
+Name: _locales/bn/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: dVoXHkj2UXzj4ctLQ7g2+cQu/o8=
+SHA256-Digest: hTaM5b35bOJhTSV38ajtBg58bV5TdC47xttlYiZM/aU=
+
+Name: _locales/br/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ZW6ty00kj6yNkgcEnnvyQjjgrWg=
+SHA256-Digest: sTBK8ujpW+kR/M9mXe2ShZUChO9Ytu7gKVYQkaOwrZU=
+
+Name: _locales/bs/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: Vg2wDGtsbEZthKbRz9yUjj7Q8YA=
+SHA256-Digest: vQgF2n0ktL3LZ1rqMaiZvCxRRt41I6PLvVHRJYvHb8o=
+
+Name: _locales/ca/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: /COeM2de5nZc7h2xYUdMcQqMeJw=
+SHA256-Digest: otyh6c/nvuTuTZfmLv2FfYlbI6fkf9ibQ4zZYWll2Bk=
+
+Name: _locales/cmn/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/cs/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: PSPcBF4f2cciaztX/tDK489gG6w=
+SHA256-Digest: nhqVZbEdeQLOEfTuC4WQZqq4nVX6TLgsumEei+NDJjo=
+
+Name: _locales/cy/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: A9MVuoq+YeTB4AJ7qXIW2t/2reU=
+SHA256-Digest: MMpP51GLMadXFrMHt8O5C2q5x9ipotM+rbjBCSAIa0k=
+
+Name: _locales/da/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 6EA7b3gcz67OK5/NhNpqiv8JsRw=
+SHA256-Digest: XvGrh0Pr/cIN0+h7dYRhsWrE2sbpvCGejLUk5g2cb+M=
+
+Name: _locales/de/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 5DxSzfj3HAO19N93skW8074DacU=
+SHA256-Digest: 6RRsp8DV8g7u3majB5LXV/HNNz9wltPP3/drftJO+t0=
+
+Name: _locales/el/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: cDgo3bT3QsyvgW6sNV1v7VhD+c0=
+SHA256-Digest: oBZLruNBa+ryEI2AaAM1IuFsmVxF73+deXjq7P6lunM=
+
+Name: _locales/en/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/en_GB/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/en_US/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/eo/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: cTvPwrTLEg/CLQ7vP936VGhWMBA=
+SHA256-Digest: 6Tb3+j9lXyFMz+bKnJ+MnaIRIAaOIgFGgGFeLUWIHB0=
+
+Name: _locales/es/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: wdTXKRaKo3+lt2F/WAfhHECWQ0Q=
+SHA256-Digest: 6LOKxRvSfOFCftbixNJLi3ILtnXblwVUdYoxy0KkUKE=
+
+Name: _locales/es_AR/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: jNe5tt2sg9FYb/CklhOA/EfCNso=
+SHA256-Digest: ejlUkVhdh38l0SQqB2iuiCGTJgg/HnUZ6YB1BIowEUI=
+
+Name: _locales/es_MX/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 8r5iYER0e+Z9xsXkisoWpgiV6wY=
+SHA256-Digest: nNkWHeZ9eKPmXKJTHyKHmuqMNO9w7KdMoCpNtykVJSo=
+
+Name: _locales/et/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: RuKFi2LDlh1aZ/sgjAQHk9Dr0aU=
+SHA256-Digest: kEGCDq7xq97+kttCcjDTrhV+IRBdvTdokVw5x4MjUrg=
+
+Name: _locales/eu/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: CfUVBO8uVqaEVg2rfNiEzhOOIxs=
+SHA256-Digest: U4RrQUCTj9jzxLMjadoUZlclwDWv7StaWVTd+VfnN2I=
+
+Name: _locales/fa/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: Zi0T7F3MTegvevGxycGERaO+y+k=
+SHA256-Digest: FppLjcJVwKmgWnEVG8DUj/OfX/mPJaRmMHYdzdQ4Qk4=
+
+Name: _locales/fi/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: Ijd1g6JcPeStcajdi2p49GxtL/s=
+SHA256-Digest: XtP/3kb3g9EEZXkGRsQh5oEGWm5XdCCVHsY4eBWi2Lo=
+
+Name: _locales/fr/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 4Kl28lQ4AxcFKuI1qPanfKBIO1I=
+SHA256-Digest: JR6Ytgifw1eNfP5eEY9DW2+NyBy5t5m8jcfG1eElpos=
+
+Name: _locales/fr_FR/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: /siGONOTKZIcZRCh3Gjklyi6FpA=
+SHA256-Digest: JOAxkWbsFpRl+/JTJ9Ii5P0ixY1UOkuZHRAjMb86eWI=
+
+Name: _locales/fy/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: qYt2G1hP0Cs203jLvxdBLgv4MGQ=
+SHA256-Digest: cNu7cS359ufs/B5EXOMBJIvVbfB8V9sQpFxorgrRxxg=
+
+Name: _locales/ga/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: oNZb00MUZHcEuMm1CKosXijaWgw=
+SHA256-Digest: knCNuU+/o1k+pt0GMADpt3nuzqz17npT4Olsoj8EL7o=
+
+Name: _locales/gd/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/gl/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: WBkm2qWTCShjdj+kFKqzxnZIoFg=
+SHA256-Digest: Y3K9ZWg9+2pL1r34SJhQYu26Viki5wqVlJmLmVfhQdo=
+
+Name: _locales/gu/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: cxaffBOuU3Z+D/AJ6TQAXNFki3M=
+SHA256-Digest: pTrp2BlrTKilZg+sRGpeuYQVSrInYg7QtVBMrLANj4Q=
+
+Name: _locales/he/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: zshsgYzIwWg+jtvY4ingp8vw64c=
+SHA256-Digest: BxJrAMOZ4VuFbXDVimpAN0xMEQBNZZkrmFWnTAXibks=
+
+Name: _locales/hi/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: QRpvL2rosEDoTdx6BxxGGJpSVmo=
+SHA256-Digest: liYeP2q1gkXphKzxxJNsqTh7+T1gzKsee+6vReQMdhs=
+
+Name: _locales/hr/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: x/3lhb7z7CVqZZdn3midgSjn5tY=
+SHA256-Digest: HHx+VP0HB42dWTZ38cR004DWeQpFRgaF5TULrZkatwI=
+
+Name: _locales/hu/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 4eKsxvmbG58FfD5yjfm4b3cr+g4=
+SHA256-Digest: i9dh17H4Ruxjb3oxA4GPRJvRPecXQf3U+qaBlGj2qps=
+
+Name: _locales/hy/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: QzXAZ5katx2Ye+1QFyFHLcMJROM=
+SHA256-Digest: HSYKniubHesccfXGMZYre5wJva2MRztMYAhMHMA2+Z4=
+
+Name: _locales/ia/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: Mm0o9mYuk3kCk5WbKuPCFU7zpqo=
+SHA256-Digest: 6ORLVTr02qalRUcK63Ir1GXjw/p+v6nrK9/zI66QL6o=
+
+Name: _locales/id/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 9QctIupOryS8eWp04EJHAWNYj7c=
+SHA256-Digest: NfVmJxGSWj5onjEn4//gX5P8n3QnqBXXP5Z9Lf+578M=
+
+Name: _locales/is/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: /P9T+vTThdd7i1pmGcYD6nOkY44=
+SHA256-Digest: L1OQmFHZBhJHVvNqOh3610u1MS+SLQd9NHvYu2FkRVE=
+
+Name: _locales/it/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: QfqJFvpr/CghH/0gsO9h+sYKy1Y=
+SHA256-Digest: vtdELbvnbICfJVOrxFLjaJq656uK7EK2pTcecgf4dNc=
+
+Name: _locales/ja/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 7zImT7HvkvCQpdObYY520peFtDs=
+SHA256-Digest: mjSxBaiB+SkXyspN3wi6aodH4rYgcp6da2exdiEcGU4=
+
+Name: _locales/ka/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: fHsD070Q4aHyxYhCNfQIYT3MKS0=
+SHA256-Digest: yeIbx8SP8Wa4kvXo6Lzx9wrRj1LynhWFd2nbPUqZEsk=
+
+Name: _locales/kab/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/kk/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 8Sdjq0KMj4ANwq94weNnUQYtI+s=
+SHA256-Digest: bTKB9CkWNhqawbJDhs1/GX4/z4j0Vg4cx31zKw44f5Y=
+
+Name: _locales/km/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: w5qIgDP+885pZJMl8FyA2yGUt1A=
+SHA256-Digest: sjEA2JwKdlS1D1hQxKQedb9DYCwOSDhyxusv/cUTkvE=
+
+Name: _locales/kn/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: MdvnoS3SrWGvRWSyvuRqoWvRiWc=
+SHA256-Digest: TaiiWa/PbBrRxhqRBYvFWtGmyyy/ovdu/yhHq/w9jk4=
+
+Name: _locales/ko/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: GqRtNAUwxrLDluWtx2LqjXzg+50=
+SHA256-Digest: McBNqK4HaGAS0dEAMzOD8lrwecj6CFapkKhRgZpR2qU=
+
+Name: _locales/lt/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: cBHtxCIgs0M0vuawqYXF7qBAPZo=
+SHA256-Digest: RvNH3JOZbIBt6KKPOdP91hxzpQQLbYxJxWeg36ncftU=
+
+Name: _locales/lv/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ljoDEg01zL32eJF/+OECLuPZkoY=
+SHA256-Digest: +pRZCbp3zfzTbM0UqTpiJd23dSymtKZxiZlqD9zNZEw=
+
+Name: _locales/mk/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: dHL1X/r5TNAy5AXujh48jmaBZMY=
+SHA256-Digest: Fs8OnAZZqmqEZHAoYINC1qjLdniDuxjboibfVPvcxek=
+
+Name: _locales/ml/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: yjvR4hUOwBfI4/NLchJglHMznUY=
+SHA256-Digest: /LzzQ1QQeGqOJGuwyf7hF1ynGzYojAJy8SjnfpqP8nU=
+
+Name: _locales/mr/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: VqbEpeDWqRRSDXueR7OXzV5Zi0c=
+SHA256-Digest: DXWyMnlhjkPGEZgaBzsqFEU88IvmcrerTATrEqY+fqY=
+
+Name: _locales/ms_MY/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: pNrnIUMZ1KSdavj7IpvgaXtMW1Y=
+SHA256-Digest: WjOfy4w9K1h+lN9Ld1JdzPwXrpU3TYqIpcQLVhzSsKM=
+
+Name: _locales/my/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: kPgWIxR2rynJkEykmF/T0clmLcU=
+SHA256-Digest: pVtnX3UxISFA90i1ivkuL01oGhoah2AqzAJosnkZMCw=
+
+Name: _locales/nb/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: xCCz+aU59J3pUBQrTu8Sookw3Xc=
+SHA256-Digest: aHFiDv13/G909I851CrVRUPMSAyxLABNIT5TkFPWolw=
+
+Name: _locales/ne/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/nl/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: uHnFt32GmeGIWlUhV2oc0YwDBoQ=
+SHA256-Digest: EPKDxQlVhuigsi6at+OnLBBaPbqbNuYdbHu3nEx6Lv8=
+
+Name: _locales/nl_BE/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: vpN/Tt8RJNjNrjzQhvaCLnu818Y=
+SHA256-Digest: UMIycHh4OpfT6XEX5IkOJbBhBEmykK3QzilVLqxXbas=
+
+Name: _locales/nn/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: /uRXmVZ2hcY4LDKBmhSwYPb+v9A=
+SHA256-Digest: /VRfKB4L2T8XMwAUR9UCXed+uPckbOsicnTGYCRT62U=
+
+Name: _locales/oc/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: LEIoVVmbjin2D0Bj5PimJENOmCQ=
+SHA256-Digest: smQMMM7KSF/9lT0ryK07dEWxGtf3tYjF58E/kOIlNKY=
+
+Name: _locales/or/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: Ps0uvWBAvc6crMC3f7ztPoWLYHI=
+SHA256-Digest: sX3swrX1p95cHWLBMrKDJ8mCOM/k+g3kR6+vKtjUlIY=
+
+Name: _locales/pa/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: +P2o0dGSh7jJUtVjUFU70dqtxiI=
+SHA256-Digest: sHFd6kvNEbfWPpbLyIutoZkkEm0A9yWhjdbsXZ5YH5s=
+
+Name: _locales/pl/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: w97eXym45Cju4UUq2hDgfYZEivM=
+SHA256-Digest: 8dpWSVyqOkrMcQs4Ub98uEHMtAkwdtuag9kfv31TnwY=
+
+Name: _locales/pt_BR/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: B9dLWSgVB9XeiQqqE9ceVH+KFqw=
+SHA256-Digest: bkAA6J0bp9u83YD/Cea1ggdTUpXBl47Pb/RAgW/QO9c=
+
+Name: _locales/pt_PT/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: MFTtI6bvZgIBNjfsrsEes5SZWWM=
+SHA256-Digest: 6Oe7CSTsLlbxPCEcuVYO5tqvl3/TLquitxYnh40167c=
+
+Name: _locales/ro/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: iZA4eB6bVN8w8JNfUaLiB04ZeEU=
+SHA256-Digest: esk4A/1PXdU5yjo/Y/f3zS1fzrVQUIhGPFyAS1eSw+k=
+
+Name: _locales/ro_RO/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: iCzvlQJKPogorBRk1ZaRc1PHSzk=
+SHA256-Digest: f6sPhnOcfaNWIONa4Ow+YtnAM3GXnWIG1WXDRHOtves=
+
+Name: _locales/ru/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 7icD6gFZZYuaRFlZHpM3v4S4rbw=
+SHA256-Digest: PsIJMB4ploNqnBAmnqfFHDXH+zFdu4P6BNZMnIwT0ok=
+
+Name: _locales/si/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: KM47GTd9GQqAik45v3TwGKzhUqI=
+SHA256-Digest: 3PvBqbX4qA1rQB4l+mrxTb6mwA7ssWzrxjn1VJn5peA=
+
+Name: _locales/si_LK/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: /XRTG3mjOsamcRjwWbYUqmyS+jw=
+SHA256-Digest: XbC317Ovdr7RhMsUfhfXDV1yDh+4pz86mQMG1PFGLdY=
+
+Name: _locales/sk/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 8g2uM/IilbLetxLlpS1+hm+gb2w=
+SHA256-Digest: bnqVDCFodbSbseUbLOrdCwprRMxbpCYHMvVbz/3KP/o=
+
+Name: _locales/sl/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: MdQaZFkibS04O78qFlB6kmwhF9c=
+SHA256-Digest: 9pLwtRZfEy2la4LfIgkbDR/M+nNotJAA5wzEgT+AfyI=
+
+Name: _locales/sl_SI/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: wFhFU0upAYqmmQI/nRnGEnqP30Y=
+SHA256-Digest: qx/D6APKUhcKmNWwCHD/baIjzMFQNTR4/Rt6LvOTQ4Q=
+
+Name: _locales/son/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/sq/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 87nTmcsWpoEAsJTN4/ZFf+01I8A=
+SHA256-Digest: POGPrXKN5GuJ59k227ozXns25ogQdzOOgA3azEA1f94=
+
+Name: _locales/sr/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: zJI0kCSZIB/4rfhaGxg0aUGrbtQ=
+SHA256-Digest: tfKdrL6vsCYxRU/QeEvAZC58y6qDuEKkhNi17r1e/8o=
+
+Name: _locales/sv/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: UI6tx0CmaOkUsjASOmQvxNRkX+c=
+SHA256-Digest: WnBcBaT7T7yKHUvac2bn2q5alrsbfEiLOQUXPIQLurQ=
+
+Name: _locales/sw/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: JSf0a8gCwILGBI0T4d/FfWfIGDc=
+SHA256-Digest: Z+oQpHb/T+I2XZ+JVJZW1KMeAP6yK/x9Quts8n64AlQ=
+
+Name: _locales/ta/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: CW5Q8ok59gE/ZC8A4uPqW4cIfhI=
+SHA256-Digest: vOG/RBohVZklUTu6y6cjUWg5RyNIbwaB33kUr5Ko2PI=
+
+Name: _locales/te/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: N/QOkBiJYvqsksR5+NWuHA0/fxk=
+SHA256-Digest: jZC8UbVBsT2RvDZ1uebHtr76/oRaNdlmxLKWLnDaI3A=
+
+Name: _locales/templates/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/th/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: QaLDEcDBj6HdEh+eAhQ02DWS81c=
+SHA256-Digest: ucjQxKDoCEwzTat3hNNjtMRJ/u85+QK47Rw93C4J8Sk=
+
+Name: _locales/tr/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: MDXJjWJjdDGjeYfHHa2+LsPj2tM=
+SHA256-Digest: vdziBTOIPyWhvyfApPrN8jZMww3lePVgo4zDkwcv9og=
+
+Name: _locales/uk/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: TargN1mxonMdbvos0GBcCxU0+dI=
+SHA256-Digest: 6ZRhyVruPhNEb5UPYCrb/EFcy6ArHSNqxBy4KNEhq/c=
+
+Name: _locales/ur/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: kUEeTx9OeiESvvWjprUjqluEhZk=
+SHA256-Digest: ADAHAHlOUIGXLO2Aj5/it+lavjH4WkbjLV43yI6CO4s=
+
+Name: _locales/uz/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: bmGV4U+3LA14ZwC5RcRdN5RB+tk=
+SHA256-Digest: SPoiBWn8W+vyUJHKfocitJ5y6RjXedgta0HxflAFB9Y=
+
+Name: _locales/vi/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: GMY5uzc6vq9pP9hqFNGlOgVYZ8k=
+SHA256-Digest: OidbjDj9CBSxmM5oW3RagDo6ZNvA+5P9CGN8C0cbgms=
+
+Name: _locales/zh-Hant/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: NXT6rNViMHWrKSlecajyj80CeIg=
+SHA256-Digest: 3zXYNMBhIcIsuhQRzfIAFhV3GdeGZXgyc+h5bFXMZtk=
+
+Name: _locales/zh/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: Vu5rZrqGhcESvjluy4x3EcMPi4o=
+SHA256-Digest: karIDiNHSaijMuQkVkG71+StamzOq9ZeGiQhzwJjTAw=
+
+Name: _locales/zh_CN/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: HWK9jni02GGBk/XOVpL/R1rs0NI=
+SHA256-Digest: Hl+NW/IGzS73WJhUVgY9cPJvMyb0ZomG7k64dzoJ1wc=
+
+Name: _locales/zh_HK/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: oZ9Ht83pERBafXR1h2mucibzUUo=
+SHA256-Digest: Vq5s6nfmwfxvTVQlmjFCHCYlzvJanl+4I8J2h8F0hjs=
+
+Name: _locales/zh_TW/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: yfJJJg+Uan6mqiwEm4W0l5tT+nU=
+SHA256-Digest: Xj6MJjfhW3liYqF0UIY6flSaOxnNyr4Urgu2gffF99I=
+
+Name: background-scripts/background.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: GMCKwYZnhsRm4ExhG1q6wY+DQno=
+SHA256-Digest: D4ogTIq+ze3hPGkcxzkc2jFho2hACQn3iYc2oaw4egE=
+
+Name: background-scripts/bootstrap.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: TSwjfTzojZXN1Iul+mBttRl/MAg=
+SHA256-Digest: WcKbJ0zQK8948MJzbMTTCf807jEGH7Bj8k7CuWCx0aM=
+
+Name: background-scripts/incognito.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: JXSvrJhaxqSgUtXqlm0r21VqSlo=
+SHA256-Digest: AnGJOJ4CKWmdFZaWNzvm7NWZjbzCKkdawPc8RZCH4d0=
+
+Name: background-scripts/ip_utils.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 8RyxTy1FNW0wvKPs+DqKNNZYvV0=
+SHA256-Digest: F9Ij1ZyfnpmmCM0W3+WXfaBO/rnUAFZtXc2N305Qod8=
+
+Name: background-scripts/rules.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 2dd1eq7Y16RvpmADSFGYSFdRvNc=
+SHA256-Digest: 9Qw9Xoky6/2DvBn5nza/xBXbjaWkEBI9hPaaqAdQDqU=
+
+Name: background-scripts/store.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: IdAI+nj6uuahTeT28Xx1QJwLveM=
+SHA256-Digest: lyCBwe6g79MMTtU1xyGBiIJidhqUsW/9YUXX158t6z8=
+
+Name: background-scripts/update.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: Z/kkBlC2HeS/G5zlAbeiFwLpgIQ=
+SHA256-Digest: R1y7pQHEB8w7mNOn0zxEL20mys/8sOZxy5238BzhNoI=
+
+Name: background-scripts/update_channels.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: kA9YO0yjVOE6vw2mpWPePkWyt/I=
+SHA256-Digest: L966QoT5hiVg5mzQq9dACJ5o8OVsROxhNRd+LebsAQQ=
+
+Name: background-scripts/util.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: pjJWekzg0QW6/0qYNf1pISXO14s=
+SHA256-Digest: 1Cykm0yxo5EZs0+fZWtUPzHa38B6ZalDAOojqu5awgo=
+
+Name: background-scripts/wasm.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 7pQTqvYA4el8WRX7FjQNUUcMUwg=
+SHA256-Digest: TMk4CQYN4lxkG/ZBq+wp4erwwo8knS0H5HHBCa7LW08=
+
+Name: background-scripts/modules/ssl_codes.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: t5DE+asvCaL1VaVhVXbJDQXQaHw=
+SHA256-Digest: hGKfRGrQWsXH8+9OfHcHM4I45d6DIIxClYqMSH1oBCA=
+
+Name: external/README.md
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: DgCQOA7tYbKkLcJ92flagYsm0nI=
+SHA256-Digest: So9vbyA/ExcM/wEms+bwz/YVVa2ayDCNnJ5sYJk40tk=
+
+Name: external/codemirror/codemirror-5.31.0.min.css
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 6L9PQ9XeTmwE+7WJ29O7oelFX7Y=
+SHA256-Digest: fIaQYYF933S7mhBn4vqsgaawzXI4iELVCrvv83rZ5ic=
+
+Name: external/codemirror/codemirror-5.31.0.min.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: iJyQEWjgaJ3IVz2bsX+RSnjLzGw=
+SHA256-Digest: yTU67I79B7rqtdoOdsJHDDK/92GDEeGj4+93U41HPgE=
+
+Name: external/codemirror/codemirror-5.31.0.xml.min.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: DMaXXHyF/jzGu8wJN2a1yHxkNHU=
+SHA256-Digest: d+N19fPYNZkqDuOxqLM8MHSxTiGDF/j5WLdynJ2D8/k=
+
+Name: external/pako-1.0.5/pako_inflate.min.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: V7Fd/JcXF6Ar68Oa5X3/rO7giNs=
+SHA256-Digest: h8L84MNiYQCe/szpOr1i5Cge5x/8EsvaaTlcdG9vOnE=
+
+Name: images/HTTPS-Everywhere-Logo.png
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: E0ESMX+oJaAutg08/RPfpc3Ix5E=
+SHA256-Digest: PKyVOZS7bg8UVeQDG3npTYLKtnB5FgmmdfoW/NC02bQ=
+
+Name: images/banner-red.svg
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ZnApE5t/iqGaVc0fdm7I0Rpvdsk=
+SHA256-Digest: obGxFfdgfzgg0jj59ThEpLQwowcJCioxsVS/+X7Mtvg=
+
+Name: images/eff-logo-monogram-red.png
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 5sbYS58Ze3MdPgDNas/ZnFn128Q=
+SHA256-Digest: aPdsjK4CCl3M8HBgqCLA5vu5n+w9cCs75gs0j5x/0Ak=
+
+Name: images/remove.png
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: Pn9f97i3AIFlAMf420qZNzvA7DY=
+SHA256-Digest: 7TrWr2ZkK0faWgDYUz9WtV3voVjEwqjLq0ROGvkU6y0=
+
+Name: images/icons/icon-active-128.png
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: p71skXMtghXylXMvFLnYW/jPos0=
+SHA256-Digest: 1DbMnWBmqaIRzzkUyRpdRzxz8z1HtUGq6RzRKcINuEA=
+
+Name: images/icons/icon-active-38.png
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: EleX4C/tgOj+W71fueie7ZoXAAY=
+SHA256-Digest: YgkTENwvpAo6Bb9WsTrUr+CfKY+gsQfq6uPoGdMw6kI=
+
+Name: images/icons/icon-active-48.png
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: VVqz4q4/4awX6PXZhnQmGFkAiqc=
+SHA256-Digest: pfkIfbdzORmTjUTLb2SsmaLv4oafijkSttiU3lUcKmM=
+
+Name: images/icons/icon-blocking-38.png
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: IebllmIP/cUmB0piMroSEA7HnHc=
+SHA256-Digest: 9oP7jvbkH3KM4VG+kAnItkvsT00o9/KKHvhexTJHCD4=
+
+Name: images/icons/icon-disabled-38.png
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: PJqzR54BFgNofExLbYn8DMEyvzE=
+SHA256-Digest: 2PzhLQJedFJa+ZOnE/j8r+XELaoYAn5ptQCSyNbmDcE=
+
+Name: images/onboarding/httpseverywhere-logo.png
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: XYvqYHk+Ebepsvq4U3bo9rYMqQI=
+SHA256-Digest: 292a2wZxJ/ltXI+/9OdCzMX2YZnJDWMYUoVOOnU+sUs=
+
+Name: pages/base.css
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: Yk+MDy/I88Qd0VMzEBIbf0fBo0s=
+SHA256-Digest: D7uZfk1BrCzx3HFnEBtdaN0E6rC6pErEZAd1X85xgCo=
+
+Name: pages/main.css
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: UN8/2mEQ6JZ7MTJiWQN8f77AgP8=
+SHA256-Digest: QhiZj5JKVR1gPvtg6EaZxI735GiFeZglzuSkTJpZvpE=
+
+Name: pages/translation.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: QMAZVa3usW8vcXwN2WP4lvIQQxQ=
+SHA256-Digest: +qWz2YZH5C1UqzTixYwsS3185+wd+q8Dhlm5czDI54w=
+
+Name: pages/util.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: XzUESMiqZDZv/WRcv+j8f/R/7uw=
+SHA256-Digest: tSZjbu7zilv5pujsEyp/+6HCfr7iu+KfoXNiftpAKAY=
+
+Name: pages/cancel/index.html
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: h94rEtsYrj+TsIBk2x+UqRhOHDM=
+SHA256-Digest: Fgv98mLYPbIiOUi3HAw4YktUVkkt+7clLW2IgxTD9us=
+
+Name: pages/cancel/style.css
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 0L/xbmBq8hCu58P61j4htTOA4Wk=
+SHA256-Digest: ejF/rMWvajSbZFxp0hRT6SzhobQ3aILcf5pN1BTOGEE=
+
+Name: pages/cancel/ux.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: UtFAiW+HLmKUFMV/v2hPR5haiAI=
+SHA256-Digest: i3Vc/dqv2XS12us9g1J5f6iMIZC0gI36g5N/FEKX1pw=
+
+Name: pages/debugging-rulesets/index.html
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: DuBJ5S+QY5nztsCAqOuTgKmu4no=
+SHA256-Digest: J4l9PsxyBqZKSYfqo5Zp80vXBJ7mqRVKNS2KoVU9F5o=
+
+Name: pages/debugging-rulesets/style.css
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 1DuOcKAihj5zxJ0CIgam4iq8YXc=
+SHA256-Digest: 9H1UQpqT3UDDSt2ao6Zgr4iT5o/iQ62HolhTDqNHHCE=
+
+Name: pages/debugging-rulesets/ux.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: IyqmSEBIenfSG4Mk++ciVOvpQvI=
+SHA256-Digest: OVzkDGtCe3pg65opGnboDfrFsqFsLJxa5CQxBPA9gi0=
+
+Name: pages/options/index.html
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: cXwoesX+lTfZgizRwhLvV5iFNDQ=
+SHA256-Digest: OzLgxg/tYfU/fSAIHLxBZ/++9W6FgznEEGHflPJ9aq8=
+
+Name: pages/options/style.css
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: m7GC//67J6ErvL9Wp1FvAUMLk/8=
+SHA256-Digest: O5CikoWfyy2E2v3es6BJGltQ+OKfeD/uIYp9xsrqsF4=
+
+Name: pages/options/ux.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: bUAAi8jBxAk5YiNWqSyiXxkSPs4=
+SHA256-Digest: WzJSEmMXT7Qi7rKftAFtuD6oRK0bfaLtzqCvtgwJ+/c=
+
+Name: pages/popup/index.html
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 5vBn8FGlSOjp7z4UozcN+hnm3iI=
+SHA256-Digest: JoShZlQiKjzRj2JxRHXHW4Df2LsKWf568UU/oKVePpQ=
+
+Name: pages/popup/style.css
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: aPvKt4RXG/BofewRf4CE4mBg1lg=
+SHA256-Digest: H6iKtXGZJ/o2chDo+KZtB8VNYdaadxE8+143tDhl3/U=
+
+Name: pages/popup/ux.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 68pu62q/sp5slQO9MUxCOv+ofU0=
+SHA256-Digest: 6VKXwWx0rQ6KoTh0OQ4KpscxkgcW433VAazICjc3bCM=
+
+Name: rules/default.rulesets
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: hqWsDDcf2fp+r/dTBZqGw2eaqb0=
+SHA256-Digest: hnQbXIa2D+1lFh6i13HSkXQyYa/TxpKrPlx3QzgnnX0=
+
+Name: wasm/https_everywhere_lib_wasm.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ELfS13+0aPyRX67301qNv6fm3pk=
+SHA256-Digest: 519ILW7r7LqFtGI6M22GuXDA6xYikE6EngbvlT9//Lw=
+
+Name: wasm/https_everywhere_lib_wasm_bg.wasm
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: SBxLOV763w4ke4LOL1574PW9hCs=
+SHA256-Digest: 7JqJ7u/5t5yGxh8p2+YCmgl+LeoRWQRlDJY9cLxWqA4=
+
diff --git a/src/META-INF/cose.sig b/src/META-INF/cose.sig
new file mode 100644
index 000000000000..c124769c1e40
Binary files /dev/null and b/src/META-INF/cose.sig differ
diff --git a/src/META-INF/manifest.mf b/src/META-INF/manifest.mf
new file mode 100644
index 000000000000..35f49ce809b8
--- /dev/null
+++ b/src/META-INF/manifest.mf
@@ -0,0 +1,742 @@
+Manifest-Version: 1.0
+
+Name: manifest.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: X0hd0tplhCo2R8s3OE27fLAZFD8=
+SHA256-Digest: iKk69TG3OJJNjjAJPTe72S+qXa4k/xL8yKmPzAGmaxg=
+
+Name: package.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: HQyF0Be9Z+C72YzyWk6LqTSCxkU=
+SHA256-Digest: 1v7I/u/oNho1Z8rtRLepk7VY9i0r8EktoXSvvy92SsE=
+
+Name: _locales/ace/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/ach/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/af/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: iOMFMT97+EoNCW6DRomntg8GSHk=
+SHA256-Digest: cw+OPqn11qIyL1P5cFnPmxrYTVKQ0oPX10+1KjXtNoc=
+
+Name: _locales/af_ZA/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/ar/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: pxQQhQSkkjd9EAlMdZmvk+qmXhg=
+SHA256-Digest: MORqa6PigyGRYrjsjuUVk80TAKErKzIZy9G5UnPV20U=
+
+Name: _locales/ar_EG/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/ast/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: VdPNPPiC8Ro2JsmoBFkdW3TAy2c=
+SHA256-Digest: 4zrpaArMxcBnUHIyLdenD/CDBXFXDgnSki4HzzEB0J8=
+
+Name: _locales/az/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 3+BLldWYu7TK8cGkwWGVp8z0EUk=
+SHA256-Digest: hfU635JcDvcEJzmbg2zkxSrfMEe0SVNvq8U9wj1SvNg=
+
+Name: _locales/be/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: /7FQnv3lG2OqZFTdc3/fmuOznX8=
+SHA256-Digest: OrCo5OOtp9o91snpAQUrgUG1KbmJ7ScDZ3tncnnV2po=
+
+Name: _locales/bg/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: uvPzsM24ej+LdWMNASNfYE1+tBs=
+SHA256-Digest: Z0AMZvlkzgDfeSMbZQ+AdhZryI8kmsdpYpvOz8lM9TI=
+
+Name: _locales/bn/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: dVoXHkj2UXzj4ctLQ7g2+cQu/o8=
+SHA256-Digest: hTaM5b35bOJhTSV38ajtBg58bV5TdC47xttlYiZM/aU=
+
+Name: _locales/br/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ZW6ty00kj6yNkgcEnnvyQjjgrWg=
+SHA256-Digest: sTBK8ujpW+kR/M9mXe2ShZUChO9Ytu7gKVYQkaOwrZU=
+
+Name: _locales/bs/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: Vg2wDGtsbEZthKbRz9yUjj7Q8YA=
+SHA256-Digest: vQgF2n0ktL3LZ1rqMaiZvCxRRt41I6PLvVHRJYvHb8o=
+
+Name: _locales/ca/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: /COeM2de5nZc7h2xYUdMcQqMeJw=
+SHA256-Digest: otyh6c/nvuTuTZfmLv2FfYlbI6fkf9ibQ4zZYWll2Bk=
+
+Name: _locales/cmn/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/cs/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: PSPcBF4f2cciaztX/tDK489gG6w=
+SHA256-Digest: nhqVZbEdeQLOEfTuC4WQZqq4nVX6TLgsumEei+NDJjo=
+
+Name: _locales/cy/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: A9MVuoq+YeTB4AJ7qXIW2t/2reU=
+SHA256-Digest: MMpP51GLMadXFrMHt8O5C2q5x9ipotM+rbjBCSAIa0k=
+
+Name: _locales/da/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 6EA7b3gcz67OK5/NhNpqiv8JsRw=
+SHA256-Digest: XvGrh0Pr/cIN0+h7dYRhsWrE2sbpvCGejLUk5g2cb+M=
+
+Name: _locales/de/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 5DxSzfj3HAO19N93skW8074DacU=
+SHA256-Digest: 6RRsp8DV8g7u3majB5LXV/HNNz9wltPP3/drftJO+t0=
+
+Name: _locales/el/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: cDgo3bT3QsyvgW6sNV1v7VhD+c0=
+SHA256-Digest: oBZLruNBa+ryEI2AaAM1IuFsmVxF73+deXjq7P6lunM=
+
+Name: _locales/en/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/en_GB/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/en_US/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/eo/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: cTvPwrTLEg/CLQ7vP936VGhWMBA=
+SHA256-Digest: 6Tb3+j9lXyFMz+bKnJ+MnaIRIAaOIgFGgGFeLUWIHB0=
+
+Name: _locales/es/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: wdTXKRaKo3+lt2F/WAfhHECWQ0Q=
+SHA256-Digest: 6LOKxRvSfOFCftbixNJLi3ILtnXblwVUdYoxy0KkUKE=
+
+Name: _locales/es_AR/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: jNe5tt2sg9FYb/CklhOA/EfCNso=
+SHA256-Digest: ejlUkVhdh38l0SQqB2iuiCGTJgg/HnUZ6YB1BIowEUI=
+
+Name: _locales/es_MX/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 8r5iYER0e+Z9xsXkisoWpgiV6wY=
+SHA256-Digest: nNkWHeZ9eKPmXKJTHyKHmuqMNO9w7KdMoCpNtykVJSo=
+
+Name: _locales/et/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: RuKFi2LDlh1aZ/sgjAQHk9Dr0aU=
+SHA256-Digest: kEGCDq7xq97+kttCcjDTrhV+IRBdvTdokVw5x4MjUrg=
+
+Name: _locales/eu/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: CfUVBO8uVqaEVg2rfNiEzhOOIxs=
+SHA256-Digest: U4RrQUCTj9jzxLMjadoUZlclwDWv7StaWVTd+VfnN2I=
+
+Name: _locales/fa/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: Zi0T7F3MTegvevGxycGERaO+y+k=
+SHA256-Digest: FppLjcJVwKmgWnEVG8DUj/OfX/mPJaRmMHYdzdQ4Qk4=
+
+Name: _locales/fi/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: Ijd1g6JcPeStcajdi2p49GxtL/s=
+SHA256-Digest: XtP/3kb3g9EEZXkGRsQh5oEGWm5XdCCVHsY4eBWi2Lo=
+
+Name: _locales/fr/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 4Kl28lQ4AxcFKuI1qPanfKBIO1I=
+SHA256-Digest: JR6Ytgifw1eNfP5eEY9DW2+NyBy5t5m8jcfG1eElpos=
+
+Name: _locales/fr_FR/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: /siGONOTKZIcZRCh3Gjklyi6FpA=
+SHA256-Digest: JOAxkWbsFpRl+/JTJ9Ii5P0ixY1UOkuZHRAjMb86eWI=
+
+Name: _locales/fy/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: qYt2G1hP0Cs203jLvxdBLgv4MGQ=
+SHA256-Digest: cNu7cS359ufs/B5EXOMBJIvVbfB8V9sQpFxorgrRxxg=
+
+Name: _locales/ga/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: oNZb00MUZHcEuMm1CKosXijaWgw=
+SHA256-Digest: knCNuU+/o1k+pt0GMADpt3nuzqz17npT4Olsoj8EL7o=
+
+Name: _locales/gd/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/gl/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: WBkm2qWTCShjdj+kFKqzxnZIoFg=
+SHA256-Digest: Y3K9ZWg9+2pL1r34SJhQYu26Viki5wqVlJmLmVfhQdo=
+
+Name: _locales/gu/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: cxaffBOuU3Z+D/AJ6TQAXNFki3M=
+SHA256-Digest: pTrp2BlrTKilZg+sRGpeuYQVSrInYg7QtVBMrLANj4Q=
+
+Name: _locales/he/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: zshsgYzIwWg+jtvY4ingp8vw64c=
+SHA256-Digest: BxJrAMOZ4VuFbXDVimpAN0xMEQBNZZkrmFWnTAXibks=
+
+Name: _locales/hi/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: QRpvL2rosEDoTdx6BxxGGJpSVmo=
+SHA256-Digest: liYeP2q1gkXphKzxxJNsqTh7+T1gzKsee+6vReQMdhs=
+
+Name: _locales/hr/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: x/3lhb7z7CVqZZdn3midgSjn5tY=
+SHA256-Digest: HHx+VP0HB42dWTZ38cR004DWeQpFRgaF5TULrZkatwI=
+
+Name: _locales/hu/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 4eKsxvmbG58FfD5yjfm4b3cr+g4=
+SHA256-Digest: i9dh17H4Ruxjb3oxA4GPRJvRPecXQf3U+qaBlGj2qps=
+
+Name: _locales/hy/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: QzXAZ5katx2Ye+1QFyFHLcMJROM=
+SHA256-Digest: HSYKniubHesccfXGMZYre5wJva2MRztMYAhMHMA2+Z4=
+
+Name: _locales/ia/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: Mm0o9mYuk3kCk5WbKuPCFU7zpqo=
+SHA256-Digest: 6ORLVTr02qalRUcK63Ir1GXjw/p+v6nrK9/zI66QL6o=
+
+Name: _locales/id/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 9QctIupOryS8eWp04EJHAWNYj7c=
+SHA256-Digest: NfVmJxGSWj5onjEn4//gX5P8n3QnqBXXP5Z9Lf+578M=
+
+Name: _locales/is/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: /P9T+vTThdd7i1pmGcYD6nOkY44=
+SHA256-Digest: L1OQmFHZBhJHVvNqOh3610u1MS+SLQd9NHvYu2FkRVE=
+
+Name: _locales/it/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: QfqJFvpr/CghH/0gsO9h+sYKy1Y=
+SHA256-Digest: vtdELbvnbICfJVOrxFLjaJq656uK7EK2pTcecgf4dNc=
+
+Name: _locales/ja/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 7zImT7HvkvCQpdObYY520peFtDs=
+SHA256-Digest: mjSxBaiB+SkXyspN3wi6aodH4rYgcp6da2exdiEcGU4=
+
+Name: _locales/ka/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: fHsD070Q4aHyxYhCNfQIYT3MKS0=
+SHA256-Digest: yeIbx8SP8Wa4kvXo6Lzx9wrRj1LynhWFd2nbPUqZEsk=
+
+Name: _locales/kab/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/kk/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 8Sdjq0KMj4ANwq94weNnUQYtI+s=
+SHA256-Digest: bTKB9CkWNhqawbJDhs1/GX4/z4j0Vg4cx31zKw44f5Y=
+
+Name: _locales/km/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: w5qIgDP+885pZJMl8FyA2yGUt1A=
+SHA256-Digest: sjEA2JwKdlS1D1hQxKQedb9DYCwOSDhyxusv/cUTkvE=
+
+Name: _locales/kn/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: MdvnoS3SrWGvRWSyvuRqoWvRiWc=
+SHA256-Digest: TaiiWa/PbBrRxhqRBYvFWtGmyyy/ovdu/yhHq/w9jk4=
+
+Name: _locales/ko/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: GqRtNAUwxrLDluWtx2LqjXzg+50=
+SHA256-Digest: McBNqK4HaGAS0dEAMzOD8lrwecj6CFapkKhRgZpR2qU=
+
+Name: _locales/lt/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: cBHtxCIgs0M0vuawqYXF7qBAPZo=
+SHA256-Digest: RvNH3JOZbIBt6KKPOdP91hxzpQQLbYxJxWeg36ncftU=
+
+Name: _locales/lv/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ljoDEg01zL32eJF/+OECLuPZkoY=
+SHA256-Digest: +pRZCbp3zfzTbM0UqTpiJd23dSymtKZxiZlqD9zNZEw=
+
+Name: _locales/mk/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: dHL1X/r5TNAy5AXujh48jmaBZMY=
+SHA256-Digest: Fs8OnAZZqmqEZHAoYINC1qjLdniDuxjboibfVPvcxek=
+
+Name: _locales/ml/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: yjvR4hUOwBfI4/NLchJglHMznUY=
+SHA256-Digest: /LzzQ1QQeGqOJGuwyf7hF1ynGzYojAJy8SjnfpqP8nU=
+
+Name: _locales/mr/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: VqbEpeDWqRRSDXueR7OXzV5Zi0c=
+SHA256-Digest: DXWyMnlhjkPGEZgaBzsqFEU88IvmcrerTATrEqY+fqY=
+
+Name: _locales/ms_MY/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: pNrnIUMZ1KSdavj7IpvgaXtMW1Y=
+SHA256-Digest: WjOfy4w9K1h+lN9Ld1JdzPwXrpU3TYqIpcQLVhzSsKM=
+
+Name: _locales/my/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: kPgWIxR2rynJkEykmF/T0clmLcU=
+SHA256-Digest: pVtnX3UxISFA90i1ivkuL01oGhoah2AqzAJosnkZMCw=
+
+Name: _locales/nb/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: xCCz+aU59J3pUBQrTu8Sookw3Xc=
+SHA256-Digest: aHFiDv13/G909I851CrVRUPMSAyxLABNIT5TkFPWolw=
+
+Name: _locales/ne/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/nl/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: uHnFt32GmeGIWlUhV2oc0YwDBoQ=
+SHA256-Digest: EPKDxQlVhuigsi6at+OnLBBaPbqbNuYdbHu3nEx6Lv8=
+
+Name: _locales/nl_BE/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: vpN/Tt8RJNjNrjzQhvaCLnu818Y=
+SHA256-Digest: UMIycHh4OpfT6XEX5IkOJbBhBEmykK3QzilVLqxXbas=
+
+Name: _locales/nn/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: /uRXmVZ2hcY4LDKBmhSwYPb+v9A=
+SHA256-Digest: /VRfKB4L2T8XMwAUR9UCXed+uPckbOsicnTGYCRT62U=
+
+Name: _locales/oc/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: LEIoVVmbjin2D0Bj5PimJENOmCQ=
+SHA256-Digest: smQMMM7KSF/9lT0ryK07dEWxGtf3tYjF58E/kOIlNKY=
+
+Name: _locales/or/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: Ps0uvWBAvc6crMC3f7ztPoWLYHI=
+SHA256-Digest: sX3swrX1p95cHWLBMrKDJ8mCOM/k+g3kR6+vKtjUlIY=
+
+Name: _locales/pa/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: +P2o0dGSh7jJUtVjUFU70dqtxiI=
+SHA256-Digest: sHFd6kvNEbfWPpbLyIutoZkkEm0A9yWhjdbsXZ5YH5s=
+
+Name: _locales/pl/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: w97eXym45Cju4UUq2hDgfYZEivM=
+SHA256-Digest: 8dpWSVyqOkrMcQs4Ub98uEHMtAkwdtuag9kfv31TnwY=
+
+Name: _locales/pt_BR/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: B9dLWSgVB9XeiQqqE9ceVH+KFqw=
+SHA256-Digest: bkAA6J0bp9u83YD/Cea1ggdTUpXBl47Pb/RAgW/QO9c=
+
+Name: _locales/pt_PT/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: MFTtI6bvZgIBNjfsrsEes5SZWWM=
+SHA256-Digest: 6Oe7CSTsLlbxPCEcuVYO5tqvl3/TLquitxYnh40167c=
+
+Name: _locales/ro/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: iZA4eB6bVN8w8JNfUaLiB04ZeEU=
+SHA256-Digest: esk4A/1PXdU5yjo/Y/f3zS1fzrVQUIhGPFyAS1eSw+k=
+
+Name: _locales/ro_RO/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: iCzvlQJKPogorBRk1ZaRc1PHSzk=
+SHA256-Digest: f6sPhnOcfaNWIONa4Ow+YtnAM3GXnWIG1WXDRHOtves=
+
+Name: _locales/ru/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 7icD6gFZZYuaRFlZHpM3v4S4rbw=
+SHA256-Digest: PsIJMB4ploNqnBAmnqfFHDXH+zFdu4P6BNZMnIwT0ok=
+
+Name: _locales/si/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: KM47GTd9GQqAik45v3TwGKzhUqI=
+SHA256-Digest: 3PvBqbX4qA1rQB4l+mrxTb6mwA7ssWzrxjn1VJn5peA=
+
+Name: _locales/si_LK/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: /XRTG3mjOsamcRjwWbYUqmyS+jw=
+SHA256-Digest: XbC317Ovdr7RhMsUfhfXDV1yDh+4pz86mQMG1PFGLdY=
+
+Name: _locales/sk/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 8g2uM/IilbLetxLlpS1+hm+gb2w=
+SHA256-Digest: bnqVDCFodbSbseUbLOrdCwprRMxbpCYHMvVbz/3KP/o=
+
+Name: _locales/sl/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: MdQaZFkibS04O78qFlB6kmwhF9c=
+SHA256-Digest: 9pLwtRZfEy2la4LfIgkbDR/M+nNotJAA5wzEgT+AfyI=
+
+Name: _locales/sl_SI/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: wFhFU0upAYqmmQI/nRnGEnqP30Y=
+SHA256-Digest: qx/D6APKUhcKmNWwCHD/baIjzMFQNTR4/Rt6LvOTQ4Q=
+
+Name: _locales/son/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/sq/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 87nTmcsWpoEAsJTN4/ZFf+01I8A=
+SHA256-Digest: POGPrXKN5GuJ59k227ozXns25ogQdzOOgA3azEA1f94=
+
+Name: _locales/sr/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: zJI0kCSZIB/4rfhaGxg0aUGrbtQ=
+SHA256-Digest: tfKdrL6vsCYxRU/QeEvAZC58y6qDuEKkhNi17r1e/8o=
+
+Name: _locales/sv/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: UI6tx0CmaOkUsjASOmQvxNRkX+c=
+SHA256-Digest: WnBcBaT7T7yKHUvac2bn2q5alrsbfEiLOQUXPIQLurQ=
+
+Name: _locales/sw/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: JSf0a8gCwILGBI0T4d/FfWfIGDc=
+SHA256-Digest: Z+oQpHb/T+I2XZ+JVJZW1KMeAP6yK/x9Quts8n64AlQ=
+
+Name: _locales/ta/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: CW5Q8ok59gE/ZC8A4uPqW4cIfhI=
+SHA256-Digest: vOG/RBohVZklUTu6y6cjUWg5RyNIbwaB33kUr5Ko2PI=
+
+Name: _locales/te/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: N/QOkBiJYvqsksR5+NWuHA0/fxk=
+SHA256-Digest: jZC8UbVBsT2RvDZ1uebHtr76/oRaNdlmxLKWLnDaI3A=
+
+Name: _locales/templates/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ofcr0jXThFpy+75hHp2/Q7a13Iw=
+SHA256-Digest: fzhILeKwf6EXocFvocLJMDTVFY7948hKtI6L6UG8GFU=
+
+Name: _locales/th/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: QaLDEcDBj6HdEh+eAhQ02DWS81c=
+SHA256-Digest: ucjQxKDoCEwzTat3hNNjtMRJ/u85+QK47Rw93C4J8Sk=
+
+Name: _locales/tr/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: MDXJjWJjdDGjeYfHHa2+LsPj2tM=
+SHA256-Digest: vdziBTOIPyWhvyfApPrN8jZMww3lePVgo4zDkwcv9og=
+
+Name: _locales/uk/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: TargN1mxonMdbvos0GBcCxU0+dI=
+SHA256-Digest: 6ZRhyVruPhNEb5UPYCrb/EFcy6ArHSNqxBy4KNEhq/c=
+
+Name: _locales/ur/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: kUEeTx9OeiESvvWjprUjqluEhZk=
+SHA256-Digest: ADAHAHlOUIGXLO2Aj5/it+lavjH4WkbjLV43yI6CO4s=
+
+Name: _locales/uz/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: bmGV4U+3LA14ZwC5RcRdN5RB+tk=
+SHA256-Digest: SPoiBWn8W+vyUJHKfocitJ5y6RjXedgta0HxflAFB9Y=
+
+Name: _locales/vi/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: GMY5uzc6vq9pP9hqFNGlOgVYZ8k=
+SHA256-Digest: OidbjDj9CBSxmM5oW3RagDo6ZNvA+5P9CGN8C0cbgms=
+
+Name: _locales/zh-Hant/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: NXT6rNViMHWrKSlecajyj80CeIg=
+SHA256-Digest: 3zXYNMBhIcIsuhQRzfIAFhV3GdeGZXgyc+h5bFXMZtk=
+
+Name: _locales/zh/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: Vu5rZrqGhcESvjluy4x3EcMPi4o=
+SHA256-Digest: karIDiNHSaijMuQkVkG71+StamzOq9ZeGiQhzwJjTAw=
+
+Name: _locales/zh_CN/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: HWK9jni02GGBk/XOVpL/R1rs0NI=
+SHA256-Digest: Hl+NW/IGzS73WJhUVgY9cPJvMyb0ZomG7k64dzoJ1wc=
+
+Name: _locales/zh_HK/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: oZ9Ht83pERBafXR1h2mucibzUUo=
+SHA256-Digest: Vq5s6nfmwfxvTVQlmjFCHCYlzvJanl+4I8J2h8F0hjs=
+
+Name: _locales/zh_TW/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: yfJJJg+Uan6mqiwEm4W0l5tT+nU=
+SHA256-Digest: Xj6MJjfhW3liYqF0UIY6flSaOxnNyr4Urgu2gffF99I=
+
+Name: background-scripts/background.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: GMCKwYZnhsRm4ExhG1q6wY+DQno=
+SHA256-Digest: D4ogTIq+ze3hPGkcxzkc2jFho2hACQn3iYc2oaw4egE=
+
+Name: background-scripts/bootstrap.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: TSwjfTzojZXN1Iul+mBttRl/MAg=
+SHA256-Digest: WcKbJ0zQK8948MJzbMTTCf807jEGH7Bj8k7CuWCx0aM=
+
+Name: background-scripts/incognito.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: JXSvrJhaxqSgUtXqlm0r21VqSlo=
+SHA256-Digest: AnGJOJ4CKWmdFZaWNzvm7NWZjbzCKkdawPc8RZCH4d0=
+
+Name: background-scripts/ip_utils.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 8RyxTy1FNW0wvKPs+DqKNNZYvV0=
+SHA256-Digest: F9Ij1ZyfnpmmCM0W3+WXfaBO/rnUAFZtXc2N305Qod8=
+
+Name: background-scripts/rules.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 2dd1eq7Y16RvpmADSFGYSFdRvNc=
+SHA256-Digest: 9Qw9Xoky6/2DvBn5nza/xBXbjaWkEBI9hPaaqAdQDqU=
+
+Name: background-scripts/store.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: IdAI+nj6uuahTeT28Xx1QJwLveM=
+SHA256-Digest: lyCBwe6g79MMTtU1xyGBiIJidhqUsW/9YUXX158t6z8=
+
+Name: background-scripts/update.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: Z/kkBlC2HeS/G5zlAbeiFwLpgIQ=
+SHA256-Digest: R1y7pQHEB8w7mNOn0zxEL20mys/8sOZxy5238BzhNoI=
+
+Name: background-scripts/update_channels.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: kA9YO0yjVOE6vw2mpWPePkWyt/I=
+SHA256-Digest: L966QoT5hiVg5mzQq9dACJ5o8OVsROxhNRd+LebsAQQ=
+
+Name: background-scripts/util.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: pjJWekzg0QW6/0qYNf1pISXO14s=
+SHA256-Digest: 1Cykm0yxo5EZs0+fZWtUPzHa38B6ZalDAOojqu5awgo=
+
+Name: background-scripts/wasm.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 7pQTqvYA4el8WRX7FjQNUUcMUwg=
+SHA256-Digest: TMk4CQYN4lxkG/ZBq+wp4erwwo8knS0H5HHBCa7LW08=
+
+Name: background-scripts/modules/ssl_codes.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: t5DE+asvCaL1VaVhVXbJDQXQaHw=
+SHA256-Digest: hGKfRGrQWsXH8+9OfHcHM4I45d6DIIxClYqMSH1oBCA=
+
+Name: external/README.md
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: DgCQOA7tYbKkLcJ92flagYsm0nI=
+SHA256-Digest: So9vbyA/ExcM/wEms+bwz/YVVa2ayDCNnJ5sYJk40tk=
+
+Name: external/codemirror/codemirror-5.31.0.min.css
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 6L9PQ9XeTmwE+7WJ29O7oelFX7Y=
+SHA256-Digest: fIaQYYF933S7mhBn4vqsgaawzXI4iELVCrvv83rZ5ic=
+
+Name: external/codemirror/codemirror-5.31.0.min.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: iJyQEWjgaJ3IVz2bsX+RSnjLzGw=
+SHA256-Digest: yTU67I79B7rqtdoOdsJHDDK/92GDEeGj4+93U41HPgE=
+
+Name: external/codemirror/codemirror-5.31.0.xml.min.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: DMaXXHyF/jzGu8wJN2a1yHxkNHU=
+SHA256-Digest: d+N19fPYNZkqDuOxqLM8MHSxTiGDF/j5WLdynJ2D8/k=
+
+Name: external/pako-1.0.5/pako_inflate.min.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: V7Fd/JcXF6Ar68Oa5X3/rO7giNs=
+SHA256-Digest: h8L84MNiYQCe/szpOr1i5Cge5x/8EsvaaTlcdG9vOnE=
+
+Name: images/HTTPS-Everywhere-Logo.png
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: E0ESMX+oJaAutg08/RPfpc3Ix5E=
+SHA256-Digest: PKyVOZS7bg8UVeQDG3npTYLKtnB5FgmmdfoW/NC02bQ=
+
+Name: images/banner-red.svg
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ZnApE5t/iqGaVc0fdm7I0Rpvdsk=
+SHA256-Digest: obGxFfdgfzgg0jj59ThEpLQwowcJCioxsVS/+X7Mtvg=
+
+Name: images/eff-logo-monogram-red.png
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 5sbYS58Ze3MdPgDNas/ZnFn128Q=
+SHA256-Digest: aPdsjK4CCl3M8HBgqCLA5vu5n+w9cCs75gs0j5x/0Ak=
+
+Name: images/remove.png
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: Pn9f97i3AIFlAMf420qZNzvA7DY=
+SHA256-Digest: 7TrWr2ZkK0faWgDYUz9WtV3voVjEwqjLq0ROGvkU6y0=
+
+Name: images/icons/icon-active-128.png
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: p71skXMtghXylXMvFLnYW/jPos0=
+SHA256-Digest: 1DbMnWBmqaIRzzkUyRpdRzxz8z1HtUGq6RzRKcINuEA=
+
+Name: images/icons/icon-active-38.png
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: EleX4C/tgOj+W71fueie7ZoXAAY=
+SHA256-Digest: YgkTENwvpAo6Bb9WsTrUr+CfKY+gsQfq6uPoGdMw6kI=
+
+Name: images/icons/icon-active-48.png
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: VVqz4q4/4awX6PXZhnQmGFkAiqc=
+SHA256-Digest: pfkIfbdzORmTjUTLb2SsmaLv4oafijkSttiU3lUcKmM=
+
+Name: images/icons/icon-blocking-38.png
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: IebllmIP/cUmB0piMroSEA7HnHc=
+SHA256-Digest: 9oP7jvbkH3KM4VG+kAnItkvsT00o9/KKHvhexTJHCD4=
+
+Name: images/icons/icon-disabled-38.png
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: PJqzR54BFgNofExLbYn8DMEyvzE=
+SHA256-Digest: 2PzhLQJedFJa+ZOnE/j8r+XELaoYAn5ptQCSyNbmDcE=
+
+Name: images/onboarding/httpseverywhere-logo.png
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: XYvqYHk+Ebepsvq4U3bo9rYMqQI=
+SHA256-Digest: 292a2wZxJ/ltXI+/9OdCzMX2YZnJDWMYUoVOOnU+sUs=
+
+Name: pages/base.css
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: Yk+MDy/I88Qd0VMzEBIbf0fBo0s=
+SHA256-Digest: D7uZfk1BrCzx3HFnEBtdaN0E6rC6pErEZAd1X85xgCo=
+
+Name: pages/main.css
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: UN8/2mEQ6JZ7MTJiWQN8f77AgP8=
+SHA256-Digest: QhiZj5JKVR1gPvtg6EaZxI735GiFeZglzuSkTJpZvpE=
+
+Name: pages/translation.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: QMAZVa3usW8vcXwN2WP4lvIQQxQ=
+SHA256-Digest: +qWz2YZH5C1UqzTixYwsS3185+wd+q8Dhlm5czDI54w=
+
+Name: pages/util.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: XzUESMiqZDZv/WRcv+j8f/R/7uw=
+SHA256-Digest: tSZjbu7zilv5pujsEyp/+6HCfr7iu+KfoXNiftpAKAY=
+
+Name: pages/cancel/index.html
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: h94rEtsYrj+TsIBk2x+UqRhOHDM=
+SHA256-Digest: Fgv98mLYPbIiOUi3HAw4YktUVkkt+7clLW2IgxTD9us=
+
+Name: pages/cancel/style.css
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 0L/xbmBq8hCu58P61j4htTOA4Wk=
+SHA256-Digest: ejF/rMWvajSbZFxp0hRT6SzhobQ3aILcf5pN1BTOGEE=
+
+Name: pages/cancel/ux.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: UtFAiW+HLmKUFMV/v2hPR5haiAI=
+SHA256-Digest: i3Vc/dqv2XS12us9g1J5f6iMIZC0gI36g5N/FEKX1pw=
+
+Name: pages/debugging-rulesets/index.html
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: DuBJ5S+QY5nztsCAqOuTgKmu4no=
+SHA256-Digest: J4l9PsxyBqZKSYfqo5Zp80vXBJ7mqRVKNS2KoVU9F5o=
+
+Name: pages/debugging-rulesets/style.css
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 1DuOcKAihj5zxJ0CIgam4iq8YXc=
+SHA256-Digest: 9H1UQpqT3UDDSt2ao6Zgr4iT5o/iQ62HolhTDqNHHCE=
+
+Name: pages/debugging-rulesets/ux.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: IyqmSEBIenfSG4Mk++ciVOvpQvI=
+SHA256-Digest: OVzkDGtCe3pg65opGnboDfrFsqFsLJxa5CQxBPA9gi0=
+
+Name: pages/options/index.html
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: cXwoesX+lTfZgizRwhLvV5iFNDQ=
+SHA256-Digest: OzLgxg/tYfU/fSAIHLxBZ/++9W6FgznEEGHflPJ9aq8=
+
+Name: pages/options/style.css
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: m7GC//67J6ErvL9Wp1FvAUMLk/8=
+SHA256-Digest: O5CikoWfyy2E2v3es6BJGltQ+OKfeD/uIYp9xsrqsF4=
+
+Name: pages/options/ux.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: bUAAi8jBxAk5YiNWqSyiXxkSPs4=
+SHA256-Digest: WzJSEmMXT7Qi7rKftAFtuD6oRK0bfaLtzqCvtgwJ+/c=
+
+Name: pages/popup/index.html
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 5vBn8FGlSOjp7z4UozcN+hnm3iI=
+SHA256-Digest: JoShZlQiKjzRj2JxRHXHW4Df2LsKWf568UU/oKVePpQ=
+
+Name: pages/popup/style.css
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: aPvKt4RXG/BofewRf4CE4mBg1lg=
+SHA256-Digest: H6iKtXGZJ/o2chDo+KZtB8VNYdaadxE8+143tDhl3/U=
+
+Name: pages/popup/ux.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: 68pu62q/sp5slQO9MUxCOv+ofU0=
+SHA256-Digest: 6VKXwWx0rQ6KoTh0OQ4KpscxkgcW433VAazICjc3bCM=
+
+Name: rules/default.rulesets
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: hqWsDDcf2fp+r/dTBZqGw2eaqb0=
+SHA256-Digest: hnQbXIa2D+1lFh6i13HSkXQyYa/TxpKrPlx3QzgnnX0=
+
+Name: wasm/https_everywhere_lib_wasm.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: ELfS13+0aPyRX67301qNv6fm3pk=
+SHA256-Digest: 519ILW7r7LqFtGI6M22GuXDA6xYikE6EngbvlT9//Lw=
+
+Name: wasm/https_everywhere_lib_wasm_bg.wasm
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: SBxLOV763w4ke4LOL1574PW9hCs=
+SHA256-Digest: 7JqJ7u/5t5yGxh8p2+YCmgl+LeoRWQRlDJY9cLxWqA4=
+
+Name: META-INF/cose.manifest
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: +bvUG+miP05322u9llsWujjkaHA=
+SHA256-Digest: 0Rlv88HrG62MD20B3q/kRBPi9i8RxxgbxR5fKNHkV+Q=
+
+Name: META-INF/cose.sig
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: AusKfF2Hd6KpGJFyy+AgY3k6fvA=
+SHA256-Digest: fk2cPQJETV0QGzKdhH6cQytV8e2iU8Y7jIZoDBzOT7U=
+
diff --git a/src/META-INF/mozilla.rsa b/src/META-INF/mozilla.rsa
new file mode 100644
index 000000000000..d9e0388cc60c
Binary files /dev/null and b/src/META-INF/mozilla.rsa differ
diff --git a/src/META-INF/mozilla.sf b/src/META-INF/mozilla.sf
new file mode 100644
index 000000000000..98f503350eae
--- /dev/null
+++ b/src/META-INF/mozilla.sf
@@ -0,0 +1,4 @@
+Signature-Version: 1.0
+SHA1-Digest-Manifest: L31wgRQGJBOG3iJjSeLF4dXsod8=
+SHA256-Digest-Manifest: S3HRAq2xWZ+ssLk+lltuxaJGsOPVGY0M8JJuWG6J2us=
+
diff --git a/src/chrome.manifest b/src/chrome.manifest
deleted file mode 100644
index 50892c20a9d6..000000000000
--- a/src/chrome.manifest
+++ /dev/null
@@ -1,52 +0,0 @@
-content https-everywhere chrome/content/
-
-locale https-everywhere en chrome/locale/en/
-locale https-everywhere lt chrome/locale/lt/
-locale https-everywhere lv chrome/locale/lv/
-locale https-everywhere pt chrome/locale/pt/
-locale https-everywhere sv chrome/locale/sv/
-locale https-everywhere de chrome/locale/de/
-locale https-everywhere ru chrome/locale/ru/
-locale https-everywhere zh-CN chrome/locale/zh-CN/
-locale https-everywhere zh-TW chrome/locale/zh-TW/
-locale https-everywhere es chrome/locale/es/
-locale https-everywhere nl chrome/locale/nl/
-locale https-everywhere ar chrome/locale/ar/
-locale https-everywhere fa chrome/locale/fa/
-locale https-everywhere eu chrome/locale/eu/
-locale https-everywhere fr chrome/locale/fr/
-locale https-everywhere pl chrome/locale/pl/
-locale https-everywhere sk chrome/locale/sk/
-locale https-everywhere ms chrome/locale/ms/
-locale https-everywhere da chrome/locale/da/
-locale https-everywhere el chrome/locale/el/
-locale https-everywhere hu chrome/locale/hu/
-locale https-everywhere it chrome/locale/it/
-locale https-everywhere tr chrome/locale/tr/
-locale https-everywhere ko chrome/locale/ko/
-locale https-everywhere cs chrome/locale/cs/
-locale https-everywhere hr chrome/locale/hr/
-locale https-everywhere he chrome/locale/he/
-locale https-everywhere fi chrome/locale/fi/
-locale https-everywhere nb chrome/locale/nb/
-locale https-everywhere sl chrome/locale/sl/
-locale https-everywhere bg chrome/locale/bg/
-locale https-everywhere ja chrome/locale/ja/
-locale https-everywhere si chrome/locale/si/
-
-skin https-everywhere classic/1.0 chrome/skin/
-
-component {32c165b4-fe5e-4964-9250-603c410631b4} components/https-everywhere.js
-contract @eff.org/https-everywhere;1 {32c165b4-fe5e-4964-9250-603c410631b4}
-
-category profile-after-change HTTPSEverywhere @eff.org/https-everywhere;1
-category content-policy HTTPSEverywhere @eff.org/https-everywhere;1
-
-overlay chrome://browser/content/browser.xul chrome://https-everywhere/content/toolbar_button.xul
-overlay chrome://navigator/content/navigator.xul chrome://https-everywhere/content/toolbar_button.xul
-
-style chrome://global/content/customizeToolbar.xul chrome://https-everywhere/skin/https-everywhere.css
-component {0f9ab521-986d-4ad8-9c1f-6934e195c15c} components/ssl-observatory.js
-contract @eff.org/ssl-observatory;1 {0f9ab521-986d-4ad8-9c1f-6934e195c15c}
-
-category profile-after-change SSLObservatory @eff.org/ssl-observatory;1
diff --git a/src/chrome/content/about.xul b/src/chrome/content/about.xul
deleted file mode 100644
index 304071b96b9a..000000000000
--- a/src/chrome/content/about.xul
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/chrome/content/code/ApplicableList.js b/src/chrome/content/code/ApplicableList.js
deleted file mode 100644
index 6949167f6aa8..000000000000
--- a/src/chrome/content/code/ApplicableList.js
+++ /dev/null
@@ -1,266 +0,0 @@
-// An ApplicableList is a structure used to keep track of which rulesets
-// were applied, and which ones weren't but might have been, to the contents
-// of a given page (top level nsIDOMWindow)
-
-serial_number = 0;
-
-function ApplicableList(logger, doc, domWin) {
- this.domWin = domWin;
- this.uri = doc.baseURIObject.clone();
- if (!this.uri) {
- this.log(WARN,"NULL CLONING URI " + doc);
- if (doc)
- this.log(WARN,"NULL CLONING URI " + doc.baseURIObject);
- if (doc.baseURIObject)
- this.log(WARN,"NULL CLONING URI " + doc.baseURIObject.spec);
- }
- this.home = doc.baseURIObject.spec; // what doc we're housekeeping for
- this.log = logger;
- this.active = {};
- this.breaking = {}; // rulesets with redirection loops
- this.inactive = {};
- this.moot={}; // rulesets that might be applicable but uris are already https
- this.all={}; // active + breaking + inactive + moot
- serial_number += 1;
- this.serial = serial_number;
- this.log(DBUG,"Alist serial #" + this.serial + " for " + this.home);
-}
-
-ApplicableList.prototype = {
-
- empty: function() {
- // Empty everything, used when toggles occur in order to ensure that if
- // the reload fails, the resulting list is not eroneous
- this.active = {};
- this.breaking = {};
- this.inactive = {};
- this.moot={};
- this.all={};
- },
-
- active_rule: function(ruleset) {
- this.log(INFO,"active rule " + ruleset.name +" in "+ this.home +" -> " +
- this.domWin.document.baseURIObject.spec+ " serial " + this.serial);
- this.active[ruleset.name] = ruleset;
- this.all[ruleset.name] = ruleset;
- },
-
- breaking_rule: function(ruleset) {
- this.log(NOTE,"breaking rule " + ruleset.name +" in "+ this.home +" -> " +
- this.domWin.document.baseURIObject.spec+ " serial " + this.serial);
- this.breaking[ruleset.name] = ruleset;
- this.all[ruleset.name] = ruleset;
- },
-
- inactive_rule: function(ruleset) {
-
- this.log(INFO,"inactive rule " + ruleset.name +" in "+ this.home +" -> " +
- this.domWin.document.baseURIObject.spec+ " serial " + this.serial);
- this.inactive[ruleset.name] = ruleset;
- this.all[ruleset.name] = ruleset;
- },
-
- moot_rule: function(ruleset) {
- this.log(INFO,"moot rule " + ruleset.name +" in "+ this.home + " serial " + this.serial);
- this.moot[ruleset.name] = ruleset;
- this.all[ruleset.name] = ruleset;
- },
-
- dom_handler: function(operation,key,data,src,dst) {
- // See https://developer.mozilla.org/En/DOM/UserDataHandler
- if (src && dst)
- dst.setUserData(key, data, this.dom_handler);
- },
-
- populate_list: function() {
- // The base URI of the dom tends to be loaded from some /other/
- // ApplicableList, so pretend we're loading it from here.
- HTTPSEverywhere.instance.https_rules.rewrittenURI(this, this.uri);
- this.log(DBUG, "populating using alist #" + this.serial);
- },
-
- populate_menu: function(document, menupopup, weird) {
- this.populate_list();
- this.document = document;
-
- var https_everywhere = CC["@eff.org/https-everywhere;1"].getService(Components.interfaces.nsISupports).wrappedJSObject;
-
- // get the menu popup
- this.menupopup = menupopup;
-
- // empty it all of its menuitems
- while(this.menupopup.firstChild.tagName != "menuseparator") {
- this.menupopup.removeChild(this.menupopup.firstChild);
- }
-
- // add global enable/disable toggle button
- var strings = document.getElementById("HttpsEverywhereStrings");
-
- var enableLabel = document.createElement('menuitem');
- var text = strings.getString("https-everywhere.menu.globalDisable");
- if(!https_everywhere.prefs.getBoolPref("globalEnabled"))
- text = strings.getString("https-everywhere.menu.globalEnable");
-
- enableLabel.setAttribute('label', text);
- enableLabel.setAttribute('command', 'https-everywhere-menuitem-globalEnableToggle');
- this.prepend_child(enableLabel);
-
- // add the label at the top
- var any_rules = false;
- for(var x in this.all) {
- any_rules = true; // how did JavaScript get this ugly?
- break;
- }
- var label = document.createElement('menuitem');
- label.setAttribute('label', strings.getString('https-everywhere.menu.enableDisable'));
- label.setAttribute('command', 'https-everywhere-menuitem-preferences');
- var label2 = false;
- if (!any_rules) {
- label2 = document.createElement('menuitem');
- if (!weird) text = strings.getString('https-everywhere.menu.noRules');
- else text = strings.getString('https-everywhere.menu.unknownRules');
- label2.setAttribute('label', text);
- label2.setAttribute('command', 'https-everywhere-menuitem-preferences');
- label2.setAttribute('style', 'color:#909090;');
- }
-
- // create a commandset if it doesn't already exist
- this.commandset = document.getElementById('https-everywhere-commandset');
- if(!this.commandset) {
- this.commandset = document.createElement('commandset');
- this.commandset.setAttribute('id', 'https-everywhere-commandset');
- var win = document.getElementById('main-window');
- win.appendChild(this.commandset);
- } else {
- // empty commandset
- while(this.commandset.firstChild)
- this.commandset.removeChild(this.commandset.firstChild);
- }
-
- var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
- .getService(Components.interfaces.nsIWindowMediator);
-
- var domWin = wm.getMostRecentWindow("navigator:browser").content.document.defaultView.top;
- var location = domWin.document.baseURIObject.asciiSpec; //full url, including about:certerror details
-
- if(location.substr(0, 6) == "about:"){
- //"From" portion of the rule is retrieved from the location bar via document.getElementById("urlbar").value
-
- var fromHost = document.getElementById("urlbar").value;
-
- //scheme must be trimmed out to check for applicable rulesets
- if(fromHost.indexOf("://") != -1)
- fromHost = fromHost.substr(fromHost.indexOf("://") + 3, fromHost.length);
-
- //trim off any page locations - we only want the host - e.g. domain.com
- if(fromHost.indexOf("/") != -1)
- fromHost = fromHost.substr(0, fromHost.indexOf("/"));
-
- // Search for applicable rulesets for the host listed in the location bar
- var plist = HTTPSRules.potentiallyApplicableRulesets(fromHost);
- for (var i = 0 ; i < plist.length ; i++){
- //For each applicable rulset, determine active/inactive, and append to proper list.
- var ruleOn = false;
- try {
- if(https_everywhere.rule_toggle_prefs.getBoolPref(plist[i].name))
- ruleOn = true;
- } catch(e) {
- if(https_everywhere.https_rules.rulesetsByName[plist[i].name].active)
- ruleOn = true;
- }
- if(ruleOn)
- this.active_rule(plist[i]);
- else
- this.inactive_rule(plist[i]);
- }
- }
-
- // add all applicable commands
- for(var x in this.breaking)
- this.add_command(this.breaking[x]);
- for(var x in this.active)
- this.add_command(this.active[x]);
- for(var x in this.moot)
- this.add_command(this.moot[x]);
- for(var x in this.inactive)
- this.add_command(this.inactive[x]);
-
- if(https_everywhere.prefs.getBoolPref("globalEnabled")){
- // add all the menu items
- for (var x in this.inactive)
- this.add_menuitem(this.inactive[x], 'inactive');
- // rules that are active for some uris are not really moot
- for (var x in this.moot)
- if (!(x in this.active))
- this.add_menuitem(this.moot[x], 'moot');
- // break once break everywhere
- for (var x in this.active)
- if (!(x in this.breaking))
- this.add_menuitem(this.active[x], 'active');
- for (var x in this.breaking)
- this.add_menuitem(this.breaking[x], 'breaking');
-
- if (label2) this.prepend_child(label2);
- this.prepend_child(label);
- }
-
- },
-
- prepend_child: function(node) {
- this.menupopup.insertBefore(node, this.menupopup.firstChild);
- },
-
- add_command: function(rule) {
- var command = this.document.createElement("command");
- command.setAttribute('id', rule.id+'-command');
- command.setAttribute('label', rule.name);
- command.setAttribute('oncommand', 'toggle_rule("'+rule.id+'")');
- this.commandset.appendChild(command);
- },
-
- // add a menu item for a rule -- type is "active", "inactive", "moot",
- // or "breaking"
-
- add_menuitem: function(rule, type) {
- // create the menuitem
- var item = this.document.createElement('menuitem');
- item.setAttribute('command', rule.id+'-command');
- item.setAttribute('class', type+'-item menuitem-iconic');
- item.setAttribute('label', rule.name);
-
- // we can get confused if rulesets have their state changed after the
- // ApplicableList was constructed
- if (!rule.active && (type == 'active' || type == 'moot'))
- type = 'inactive';
- if (rule.active && type == 'inactive')
- type = 'moot';
-
- // set the icon
- var image_src;
- if (type == 'active') image_src = 'tick.png';
- else if (type == 'inactive') image_src = 'cross.png';
- else if (type == 'moot') image_src = 'tick-moot.png';
- else if (type == 'breaking') image_src = 'loop.png';
- item.setAttribute('image', 'chrome://https-everywhere/skin/'+image_src);
-
- // all done
- this.prepend_child(item);
- },
-
- show_applicable: function() {
- this.log(WARN, "Applicable list number " + this.serial);
- for (var x in this.active)
- this.log(WARN,"Active: " + this.active[x].name);
-
- for (var x in this.breaking)
- this.log(WARN,"Breaking: " + this.breaking[x].name);
-
- for (x in this.inactive)
- this.log(WARN,"Inactive: " + this.inactive[x].name);
-
- for (x in this.moot)
- this.log(WARN,"Moot: " + this.moot[x].name);
-
- }
-};
-
diff --git a/src/chrome/content/code/ChannelReplacement.js b/src/chrome/content/code/ChannelReplacement.js
deleted file mode 100644
index 328c0f9dc4db..000000000000
--- a/src/chrome/content/code/ChannelReplacement.js
+++ /dev/null
@@ -1,387 +0,0 @@
-function CtxCapturingListener(tracingChannel, captureObserver) {
- this.originalListener = tracingChannel.setNewListener(this);
- this.captureObserver = captureObserver;
-}
-CtxCapturingListener.prototype = {
- originalListener: null,
- originalCtx: null,
- onStartRequest: function(request, ctx) {
- this.originalCtx = ctx;
- if (this.captureObserver) {
- this.captureObserver.observeCapture(request, this);
- }
- },
- onDataAvailable: function(request, ctx, inputStream, offset, count) {},
- onStopRequest: function(request, ctx, statusCode) {},
- QueryInterface: xpcom_generateQI([Ci.nsIStreamListener])
-};
-
-function ChannelReplacement(chan, newURI, newMethod) {
- return this._init(chan, newURI, newMethod);
-}
-
-ChannelReplacement.supported = "nsITraceableChannel" in Ci;
-
-ChannelReplacement.runWhenPending = function(channel, callback) {
- if (channel.isPending()) {
- callback();
- return false;
- } else {
- new LoadGroupWrapper(channel, callback);
- return true;
- }
-};
-
-
-ChannelReplacement.prototype = {
- listener: null,
- context: null,
- oldChannel: null,
- channel: null,
- window: null,
- suspended: false,
-
- get _unsupportedError() {
- return new Error("Can't replace channels without nsITraceableChannel!");
- },
-
- get _classifierClass() {
- delete this.__proto__._classifierClass;
- return this.__proto__._classifierClass = Cc["@mozilla.org/channelclassifier"];
- },
-
- _autoHeadersRx: /^(?:Host|Cookie|Authorization)$|Cache|^If-/,
- visitHeader: function(key, val) {
- try {
- // we skip authorization and cache-related fields which should be automatically set
- if (!this._autoHeadersRx.test(key)) this.channel.setRequestHeader(key, val, false);
- } catch (e) {
- dump(e + "\n");
- }
- },
-
- _init: function(chan, newURI, newMethod) {
- if (!(ChannelReplacement.supported && chan instanceof Ci.nsITraceableChannel))
- throw this._unsupportedError;
-
- newURI = newURI || chan.URI;
-
- var newChan = IOS.newChannelFromURI(newURI);
-
- this.oldChannel = chan;
- this.channel = newChan;
-
- // porting of http://mxr.mozilla.org/mozilla-central/source/netwerk/protocol/http/src/nsHttpChannel.cpp#2750
-
- var loadFlags = chan.loadFlags;
-
- if (chan.URI.schemeIs("https"))
- loadFlags &= ~chan.INHIBIT_PERSISTENT_CACHING;
-
-
- newChan.loadGroup = chan.loadGroup;
- newChan.notificationCallbacks = chan.notificationCallbacks;
- newChan.loadFlags = loadFlags | newChan.LOAD_REPLACE;
-
- if (!(newChan instanceof Ci.nsIHttpChannel))
- return this;
-
- // copy headers
- chan.visitRequestHeaders(this);
-
- if (!newMethod || newMethod === chan.requestMethod) {
- if (newChan instanceof Ci.nsIUploadChannel && chan instanceof Ci.nsIUploadChannel && chan.uploadStream ) {
- var stream = chan.uploadStream;
- if (stream instanceof Ci.nsISeekableStream) {
- stream.seek(stream.NS_SEEK_SET, 0);
- }
-
- try {
- let ctype = chan.getRequestHeader("Content-type");
- let clen = chan.getRequestHeader("Content-length");
- if (ctype && clen) {
- newChan.setUploadStream(stream, ctype, parseInt(clen, 10));
- }
- } catch(e) {
- newChan.setUploadStream(stream, '', -1);
- }
-
- newChan.requestMethod = chan.requestMethod;
- }
- } else {
- newChan.requestMethod = newMethod;
- }
-
- if (chan.referrer) newChan.referrer = chan.referrer;
- newChan.allowPipelining = chan.allowPipelining;
- newChan.redirectionLimit = chan.redirectionLimit - 1;
- if (chan instanceof Ci.nsIHttpChannelInternal && newChan instanceof Ci.nsIHttpChannelInternal) {
- if (chan.URI == chan.documentURI) {
- newChan.documentURI = newURI;
- } else {
- newChan.documentURI = chan.documentURI;
- }
- }
-
- if (chan instanceof Ci.nsIEncodedChannel && newChan instanceof Ci.nsIEncodedChannel) {
- newChan.applyConversion = chan.applyConversion;
- }
-
- // we can't transfer resume information because we can't access mStartPos and mEntityID :(
- // http://mxr.mozilla.org/mozilla-central/source/netwerk/protocol/http/src/nsHttpChannel.cpp#2826
-
- if ("nsIApplicationCacheChannel" in Ci &&
- chan instanceof Ci.nsIApplicationCacheChannel && newChan instanceof Ci.nsIApplicationCacheChannel) {
- newChan.applicationCache = chan.applicationCache;
- newChan.inheritApplicationCache = chan.inheritApplicationCache;
- }
-
- if (chan instanceof Ci.nsIPropertyBag && newChan instanceof Ci.nsIWritablePropertyBag)
- for (var properties = chan.enumerator, p; properties.hasMoreElements();)
- if ((p = properties.getNext()) instanceof Ci.nsIProperty)
- newChan.setProperty(p.name, p.value);
-
- if (chan.loadFlags & chan.LOAD_DOCUMENT_URI) {
- this.window = IOUtil.findWindow(chan);
- if (this.window) this.window._replacedChannel = chan;
- }
-
- return this;
- },
-
- _onChannelRedirect: function() {
- var oldChan = this.oldChannel;
- var newChan = this.channel;
-
- if (this.realRedirect) {
- if (oldChan.redirectionLimit === 0) {
- oldChan.cancel(NS_ERROR_REDIRECT_LOOP);
- throw NS_ERROR_REDIRECT_LOOP;
- }
- } else newChan.redirectionLimit += 1;
-
-
-
- // nsHttpHandler::OnChannelRedirect()
-
- const CES = Ci.nsIChannelEventSink;
- const flags = CES.REDIRECT_INTERNAL;
- this._callSink(
- Cc["@mozilla.org/netwerk/global-channel-event-sink;1"].getService(CES),
- oldChan, newChan, flags);
- var sink;
-
- for (let cess = Cc['@mozilla.org/categorymanager;1'].getService(CI.nsICategoryManager)
- .enumerateCategory("net-channel-event-sinks");
- cess.hasMoreElements();
- ) {
- sink = cess.getNext();
- if (sink instanceof CES)
- this._callSink(sink, oldChan, newChan, flags);
- }
- sink = IOUtil.queryNotificationCallbacks(oldChan, CES);
- if (sink) this._callSink(sink, oldChan, newChan, flags);
-
- // ----------------------------------
-
- newChan.originalURI = oldChan.originalURI;
-
- sink = IOUtil.queryNotificationCallbacks(oldChan, Ci.nsIHttpEventSink);
- if (sink) sink.onRedirect(oldChan, newChan);
- },
-
- _callSink: function(sink, oldChan, newChan, flags) {
- try {
- if ("onChannelRedirect" in sink) sink.onChannelRedirect(oldChan, newChan, flags);
- else sink.asyncOnChannelRedirect(oldChan, newChan, flags, this._redirectCallback);
- } catch(e) {
- if (e.toString().indexOf("(NS_ERROR_DOM_BAD_URI)") !== -1 && oldChan.URI.spec !== newChan.URI.spec) {
- let oldURL = oldChan.URI.spec;
- try {
- oldChan.URI.spec = newChan.URI.spec;
- this._callSink(sink, oldChan, newChan, flags);
- } catch(e1) {
- throw e;
- } finally {
- oldChan.URI.spec = oldURL;
- }
- } else if (e.message.indexOf("(NS_ERROR_NOT_AVAILABLE)") === -1) throw e;
- }
- },
-
- _redirectCallback: ("nsIAsyncVerifyRedirectCallback" in Ci)
- ? {
- QueryInterface: xpcom_generateQI([Ci.nsIAsyncVerifyRedirectCallback]),
- onRedirectVerifyCallback: function(result) {}
- }
- : null
- ,
-
- replace: function(realRedirect, callback) {
- let self = this;
- let oldChan = this.oldChannel;
- this.realRedirect = !!realRedirect;
- if (typeof(callback) !== "function") {
- callback = this._defaultCallback;
- }
- ChannelReplacement.runWhenPending(oldChan, function() {
- if (oldChan.status) return; // channel's doom had been already defined
-
- let ccl = new CtxCapturingListener(oldChan, self);
- self.loadGroup = oldChan.loadGroup;
-
- oldChan.loadGroup = null; // prevents the wheel from stopping spinning
-
-
- if (self._redirectCallback) { // Gecko >= 2
- // this calls asyncAbort, which calls onStartRequest on our listener
- oldChan.cancel(NS_BINDING_REDIRECTED);
- self.suspend(); // believe it or not, this will defer asyncAbort() notifications until resume()
- callback(self);
- } else {
- // legacy (Gecko < 2)
- self.observeCapture = function(req, ccl) {
- self.open = function() { self._redirect(ccl); };
- callback(self);
- };
- oldChan.cancel(NS_BINDING_REDIRECTED);
- }
-
-
- });
- },
-
- observeCapture: function(req, ccl) {
- this._redirect(ccl);
- },
-
- _defaultCallback: function(replacement) {
- replacement.open();
- },
-
- open: function() {
- this.resume(); // this triggers asyncAbort and the listeners in cascade
- },
- _redirect: function(ccl) {
- let oldChan = this.oldChannel,
- newChan = this.channel,
- overlap;
-
- if (!(this.window && (overlap = this.window._replacedChannel) !== oldChan)) {
- try {
- if (ABE.consoleDump && this.window) {
- ABE.log("Opening delayed channel: " + oldChan.name + " - (current loading channel for this window " + (overlap && overlap.name) + ")");
- }
-
- oldChan.loadGroup = this.loadGroup;
-
- this._onChannelRedirect();
- newChan.asyncOpen(ccl.originalListener, ccl.originalCtx);
-
- if (this.window && this.window != IOUtil.findWindow(newChan)) {
- // late diverted load, unwanted artifact, abort
- IOUtil.abort(newChan);
- } else {
- // safe browsing hook
- if (this._classifierClass)
- this._classifierClass.createInstance(Ci.nsIChannelClassifier).start(newChan, true);
- }
- } catch (e) {
- ABE.log(e);
- }
- } else {
- if (ABE.consoleDump) {
- ABE.log("Detected double load on the same window: " + oldChan.name + " - " + (overlap && overlap.name));
- }
- }
-
- this.dispose();
- },
-
- suspend: function() {
- if (!this.suspended) {
- this.oldChannel.suspend();
- this.suspended = true;
- }
- },
- resume: function() {
- if (this.suspended) {
- this.suspended = false;
- try {
- this.oldChannel.resume();
- } catch (e) {}
- }
- },
-
- dispose: function() {
- this.resume();
- if (this.loadGroup) {
- try {
- this.loadGroup.removeRequest(this.oldChannel, null, NS_BINDING_REDIRECTED);
- } catch (e) {}
- this.loadGroup = null;
- }
-
- }
-};
-
-function LoadGroupWrapper(channel, callback) {
- this._channel = channel;
- this._inner = channel.loadGroup;
- this._callback = callback;
- channel.loadGroup = this;
-}
-LoadGroupWrapper.prototype = {
- QueryInterface: xpcom_generateQI([Ci.nsILoadGroup]),
-
- get activeCount() {
- return this._inner ? this._inner.activeCount : 0;
- },
- set defaultLoadRequest(v) {
- return this._inner ? this._inner.defaultLoadRequest = v : v;
- },
- get defaultLoadRequest() {
- return this._inner ? this._inner.defaultLoadRequest : null;
- },
- set groupObserver(v) {
- return this._inner ? this._inner.groupObserver = v : v;
- },
- get groupObserver() {
- return this._inner ? this._inner.groupObserver : null;
- },
- set notificationCallbacks(v) {
- return this._inner ? this._inner.notificationCallbacks = v : v;
- },
- get notificationCallbacks() {
- return this._inner ? this._inner.notificationCallbacks : null;
- },
- get requests() {
- return this._inner ? this._inner.requests : this._emptyEnum;
- },
-
- addRequest: function(r, ctx) {
- this.detach();
- if (this._inner) try {
- this._inner.addRequest(r, ctx);
- } catch(e) {
- // addRequest may have not been implemented
- }
- if (r === this._channel)
- try {
- this._callback(r, ctx);
- } catch (e) {}
- },
- removeRequest: function(r, ctx, status) {
- this.detach();
- if (this._inner) this._inner.removeRequest(r, ctx, status);
- },
-
- detach: function() {
- if (this._channel.loadGroup) this._channel.loadGroup = this._inner;
- },
- _emptyEnum: {
- QueryInterface: xpcom_generateQI([Ci.nsISimpleEnumerator]),
- getNext: function() { return null; },
- hasMoreElements: function() { return false; }
- }
-};
diff --git a/src/chrome/content/code/Cookie.js b/src/chrome/content/code/Cookie.js
deleted file mode 100644
index 9afe0a87ce6c..000000000000
--- a/src/chrome/content/code/Cookie.js
+++ /dev/null
@@ -1,148 +0,0 @@
-function Cookie(s, host) {
- this.parse(s, host);
-}
-Cookie.computeId = function(c) {
- return c.name + ";" + c.host + "/" + c.path;
-};
-Cookie.find = function(f) {
- var cc = Cookie.prototype.cookieManager.enumerator;
- var c;
- while (cc.hasMoreElements()) {
- if (f(c = cc.getNext())) return c;
- }
- return null;
-};
-
-Cookie.attributes = { host: 'domain', path: 'path', expires: 'expires', isHttpOnly: 'HttpOnly', isSecure: 'Secure' };
-Cookie.prototype = {
-
- name: '',
- value: '',
- source: '',
- domain: '',
- host: '',
- rawHost: '',
- path: '',
- secure: false,
- httponly: false,
- session: true,
- expires: 0,
-
- id: '',
-
-
- toString: function() {
- var c = [this['name'] + "=" + this.value];
- var v;
- const aa = Cookie.attributes;
- for (var k in aa) {
- var p = aa[k];
- v = this[k];
- switch(typeof(v)) {
- case "string":
- if (v) c.push(p + "=" + v);
- break;
- case "boolean":
- if (v) c.push(p);
- break;
- case "number":
- if (!this.isSession) c.push(p + "=" + new Date(v * 1000).toUTCString());
- break;
- }
- }
- return c.join("; ");
- },
- parse: function(s, host) {
- var p;
- if (this.source) {
- // cleanup for recycle
- for (p in this) {
- if (typeof (p) != "function") delete this[p];
- }
- }
- this.source = s;
- this.host = host;
-
- var parts = s.split(/;\s*/);
- var nv = parts.shift().split("=");
-
- this.name = nv.shift() || '';
- this.value = nv.join('=') || '';
-
- var n, v;
- for each (p in parts) {
- nv = p.split("=");
- switch (n = nv[0].toLowerCase()) {
- case 'expires':
- v = Math.round(Date.parse((nv[1] || '').replace(/\-/g, ' ')) / 1000);
- break;
- case 'domain':
- case 'path':
- v = nv[1] || '';
- break;
- case 'secure':
- case 'httponly':
- v = true;
- break;
- default:
- n = 'unknown';
- }
- this[n] = v;
- }
- if (!this.expires) {
- this.session = true;
- this.expires = Math.round(new Date() / 1000) + 31536000;
- }
- if (this.domain) {
- if (!this.isDomain) this.domain = "." + this.domain;
- this.host = this.domain;
- }
- this.rawHost = this.host.replace(/^\./, '');
-
- this.id = Cookie.computeId(this);
- },
-
-
- get cookieManager() {
- delete Cookie.prototype.cookieManager;
- var cman = Cc["@mozilla.org/cookiemanager;1"]
- .getService(Ci.nsICookieManager2).QueryInterface(Ci.nsICookieManager);
- return Cookie.prototype.cookieManager = cman;
- },
- belongsTo: function(host, path) {
- if (path && this.path && path.indexOf(this.path) != 0) return false;
- if (host == this.rawHost) return true;
- var d = this.domain;
- return d && (host == d || this.isDomain && host.slice(-d.length) == d);
- },
- save: function() {
- this.save = ("cookieExists" in this.cookieManager)
- ? function() { this.cookieManager.add(this.host, this.path, this.name, this.value, this.secure, this.httponly, this.session, this.expires); }
- : function() { this.cookieManager.add(this.host, this.path, this.name, this.value, this.secure, this.session, this.expires);}
- ;
- return this.save();
- },
- exists: function() {
- var cc = this.cookieManager.enumerator;
- while(cc.hasMoreElements()) {
- if (this.sameAs(cc.getNext())) return true;
- }
- return false;
- },
-
- sameAs: function(c) {
- (c instanceof Ci.nsICookie) && (c instanceof Ci.nsICookie2);
- return Cookie.computeId(c) == this.id;
- },
-
- // nsICookie2 interface extras
- get isSecure() { return this.secure; },
- get expiry() { return this.expires; },
- get isSession() { return this.session; },
- get isHttpOnly() { return this.httponly; },
- get isDomain() { return this.domain && this.domain[0] == '.'; },
- policy: 0,
- status: 0,
- QueryInterface: xpcom_generateQI([Ci.nsICookie, Ci.nsICookie2])
-
-};
diff --git a/src/chrome/content/code/HTTPS.js b/src/chrome/content/code/HTTPS.js
deleted file mode 100644
index c39a0ef18949..000000000000
--- a/src/chrome/content/code/HTTPS.js
+++ /dev/null
@@ -1,296 +0,0 @@
-INCLUDE('Cookie');
-// XXX: Disable STS for now.
-var STS = {
- isSTSURI : function(uri) {
- return false;
- }
-};
-
-// Hack. We only need the part of the policystate that tracks content
-// policy loading.
-const PolicyState = {
- attach: function(channel) {
- IOUtil.attachToChannel(channel, "httpseverywhere.policyLoaded", true);
- },
-
- extract: function(channel) {
- var res = IOUtil.extractFromChannel(channel,
- "httpseverywhere.policyLoaded", true);
- return res;
- },
-};
-
-const HTTPS = {
- ready: false,
-
- secureCookies: true,
- secureCookiesExceptions: null,
- secureCookiesForced: null,
- httpsForced: null,
- httpsForcedExceptions: null,
- httpsRewrite: null,
-
- replaceChannel: function(applicable_list, channel) {
- var blob = HTTPSRules.rewrittenURI(applicable_list, channel.URI.clone());
- if (null == blob) return false; // no rewrite
- var uri = blob.newuri;
- if (!uri) this.log(WARN, "OH NO BAD ARGH\nARGH");
-
- var c2 = channel.QueryInterface(CI.nsIHttpChannel);
- this.log(DBUG, channel.URI.spec+": Redirection limit is " + c2.redirectionLimit);
- // XXX This used to be (c2.redirectionLimit == 1), but that's very
- // inefficient in a case (eg amazon) where this may happen A LOT.
- // Rather than number like 10, we should use the starting value
- // in network.http.redirection-limit minus some counter
- if (c2.redirectionLimit < 10) {
- this.log(WARN, "Redirection loop trying to set HTTPS on:\n " +
- channel.URI.spec +"\n(falling back to HTTP)");
- if (!blob.applied_ruleset) {
- this.log(WARN,"Blacklisting rule for: " + channel.URI.spec);
- https_everywhere_blacklist[channel.URI.spec] = true;
- }
- https_everywhere_blacklist[channel.URI.spec] = blob.applied_ruleset;
- var domain = null;
- try { domain = channel.URI.host; } catch (e) {}
- if (domain) https_blacklist_domains[domain] = true;
- return false;
- }
-
- // Check for the new internal redirect API. If it exists, use it.
- if (!"redirectTo" in channel) {
- this.log(WARN, "nsIHTTPChannel.redirectTo API is missing. This version of HTTPS Everywhere is useless!!!!\n!!!\n");
- return false;
- }
-
- this.log(INFO, "Using nsIHttpChannel.redirectTo: " + channel.URI.spec + " -> " + uri.spec);
- try {
- channel.redirectTo(uri);
- return true;
- } catch(e) {
- // This should not happen. We should only get exceptions if
- // the channel was already open.
- this.log(WARN, "Exception on nsIHttpChannel.redirectTo: "+e);
-
- // Don't return: Fallback to NoScript ChannelReplacement.js
- }
- this.log(WARN,"Aborting redirection " + channel.name + ", should be HTTPS!");
- IOUtil.abort(channel);
- return false;
- },
-
- // getApplicableListForContext was remove along with the nsIContentPolicy
- // bindings and the and forceURI path that used them.
-
- onCrossSiteRequest: function(channel, origin, browser, rw) {
- try {
- this.handleCrossSiteCookies(channel, origin, browser);
- } catch(e) {
- this.log(WARN, e + " --- " + e.stack);
- }
- },
-
- registered: false,
- handleSecureCookies: function(req) {
-
- try {
- req = req.QueryInterface(CI.nsIHttpChannel);
- } catch(e) {
- this.log(WARN, "Request is not an nsIHttpChannel: " + req);
- return;
- }
- if (!this.secureCookies) return;
- var uri = req.URI;
- if (!uri) {
- this.log(WARN,"No URI inside request " +req);
- return;
- }
- //this.log(DBUG, "Cookie hunting in " + uri.spec);
- var alist = HTTPSEverywhere.instance.getApplicableListForChannel(req);
- if (!alist)
- this.log(INFO, "No alist for cookies for "+(req.URI) ? req.URI.spec : "???");
-
- if (uri.schemeIs("https")) {
- var host = uri.host;
- try {
- var cookies = req.getResponseHeader("Set-Cookie");
- } catch(mayHappen) {
- //this.log(VERB,"Exception hunting Set-Cookie in headers: " + mayHappen);
- return;
- }
- if (!cookies) return;
- var c;
- for each (var cs in cookies.split("\n")) {
- this.log(DBUG, "Examining cookie: ");
- c = new Cookie(cs, host);
- if (!c.secure && HTTPSRules.shouldSecureCookie(alist, c, true)) {
- this.log(INFO, "Securing cookie: " + c.domain + " " + c.name);
- c.secure = true;
- req.setResponseHeader("Set-Cookie", c.source + ";Secure", true);
- }
- }
-
- }
- },
-
- handleInsecureCookie: function(c) {
- if (HTTPSRules.shouldSecureCookie(null, c, false)) {
- this.log(INFO, "Securing cookie from event: " + c.domain + " " + c.name);
- var cookieManager = Components.classes["@mozilla.org/cookiemanager;1"]
- .getService(Components.interfaces.nsICookieManager2);
- //some braindead cookies apparently use umghzabilliontrabilions
- var expiry = Math.min(c.expiry, Math.pow(2,31));
- cookieManager.remove(c.host, c.name, c.path, false);
- cookieManager.add(c.host, c.path, c.name, c.value, true, c.isHTTPOnly, c.isSession, expiry);
- }
- },
-
- handleCrossSiteCookies: function(req, origin, browser) {
-
- var unsafeCookies = this.getUnsafeCookies(browser);
- if (!unsafeCookies) return;
-
- var uri = req.URI;
- var dscheme = uri.scheme;
-
- var oparts = origin && origin.match(/^(https?):\/\/([^\/:]+).*?(\/.*)/);
- if (!(oparts && /https?/.test(dscheme))) return;
-
- var oscheme = oparts[1];
- if (oscheme == dscheme) return; // we want to check only cross-scheme requests
-
- var dsecure = dscheme == "https";
-
- if (dsecure && !ns.getPref("secureCookies.recycle", false)) return;
-
- var dhost = uri.host;
- var dpath = uri.path;
-
- var ohost = oparts[2];
- var opath = oparts[3];
-
- var ocookieCount = 0, totCount = 0;
- var dcookies = [];
- var c;
-
- for (var k in unsafeCookies) {
- c = unsafeCookies[k];
- if (!c.exists()) {
- delete unsafeCookies[k];
- } else {
- totCount++;
- if (c.belongsTo(dhost, dpath) && c.secure != dsecure) { // either secure on http or not secure on https
- dcookies.push(c);
- }
- if (c.belongsTo(ohost, opath)) {
- ocookieCount++;
- }
- }
- }
-
- if (!totCount) {
- this.setUnsafeCookies(browser, null);
- return;
- }
-
- // We want to "desecurify" cookies only if cross-navigation to unsafe
- // destination originates from a site sharing some secured cookies
-
- if (ocookieCount == 0 && !dsecure || !dcookies.length) return;
-
- if (dsecure) {
- this.log(WARN,"Detected cross-site navigation with secured cookies: " + origin + " -> " + uri.spec);
-
- } else {
- this.log(WARN,"Detected unsafe navigation with NoScript-secured cookies: " + origin + " -> " + uri.spec);
- this.log(WARN,uri.prePath + " cannot support secure cookies because it does not use HTTPS. Consider forcing HTTPS for " + uri.host + " in NoScript's Advanced HTTPS options panel.");
- }
-
- var cs = CC['@mozilla.org/cookieService;1'].getService(CI.nsICookieService).getCookieString(uri, req);
-
- for each (c in dcookies) {
- c.secure = dsecure;
- c.save();
- this.log(WARN,"Toggled secure flag on " + c);
- }
-
- if (cs) {
- dcookies.push.apply(
- dcookies, cs.split(/\s*;\s*/).map(function(cs) { var nv = cs.split("="); return { name: nv.shift(), value: nv.join("=") }; })
- .filter(function(c) { return dcookies.every(function(x) { return x.name != c.name; }); })
- );
- }
-
- cs = dcookies.map(function(c) { return c.name + "=" + c.value; }).join("; ");
-
- this.log(WARN,"Sending Cookie for " + dhost + ": " + cs);
- req.setRequestHeader("Cookie", cs, false); // "false" because merge syntax breaks Cookie header
- },
-
-
- cookiesCleanup: function(refCookie) {
- var downgraded = [];
-
- var ignored = this.secureCookiesExceptions;
- var disabled = !this.secureCookies;
- var bi = DOM.createBrowserIterator();
- var unsafe, k, c, total, deleted;
- for (var browser; browser = bi.next();) {
- unsafe = this.getUnsafeCookies(browser);
- if (!unsafe) continue;
- total = deleted = 0;
- for (k in unsafe) {
- c = unsafe[k];
- total++;
- if (disabled || (refCookie ? c.belongsTo(refCookie.host) : ignored && ignored.test(c.rawHost))) {
- if (c.exists()) {
- this.log(WARN,"Cleaning Secure flag from " + c);
- c.secure = false;
- c.save();
- }
- delete unsafe[k];
- deleted++;
- }
- }
- if (total == deleted) this.setUnsafeCookies(browser, null);
- if (!this.cookiesPerTab) break;
- }
- },
-
- get cookiesPerTab() {
- return ns.getPref("secureCookies.perTab", false);
- },
-
- _globalUnsafeCookies: {},
- getUnsafeCookies: function(browser) {
- return this.cookiesPerTab
- ? browser && ns.getExpando(browser, "unsafeCookies")
- : this._globalUnsafeCookies;
- },
- setUnsafeCookies: function(browser, value) {
- return this.cookiesPerTab
- ? browser && ns.setExpando(browser, "unsafeCookies", value)
- : this._globalUnsafeCookies = value;
- },
-
- _getParent: function(req, w) {
- return w && w.frameElement || DOM.findBrowserForNode(w || IOUtil.findWindow(req));
- }
-
-};
-
-(function () {
- ["secureCookies", "secureCookiesExceptions", "secureCookiesForced"].forEach(function(p) {
- var v = HTTPS[p];
- delete HTTPS[p];
- HTTPS.__defineGetter__(p, function() {
- return v;
- });
- HTTPS.__defineSetter__(p, function(n) {
- v = n;
- if (HTTPS.ready) HTTPS.cookiesCleanup();
- return v;
- });
- });
-})();
-
-HTTPS.ready = true;
diff --git a/src/chrome/content/code/HTTPSRules.js b/src/chrome/content/code/HTTPSRules.js
deleted file mode 100644
index 23bc2332244c..000000000000
--- a/src/chrome/content/code/HTTPSRules.js
+++ /dev/null
@@ -1,709 +0,0 @@
-// Compilation of RegExps is now delayed until they are first used...
-
-function Rule(from, to) {
- this.to = to;
- this.from_c = from; // This will become a RegExp after compilation
-}
-
-function Exclusion(pattern) {
- this.pattern_c = pattern; // Will become a RegExp after compilation
-}
-
-function CookieRule(host, cookiename) {
- this.host = host;
- this.name = cookiename;
-
- // These will be made during compilation:
-
- //this.host_c = new RegExp(host);
- //this.name_c = new RegExp(cookiename);
-}
-
-ruleset_counter = 0;
-function RuleSet(name, xmlName, match_rule, default_off, platform) {
- if(xmlName == "WordPress.xml" || xmlName == "Github.xml") {
- this.log(NOTE, "RuleSet( name="+name+", xmlName="+xmlName+", match_rule="+match_rule+", default_off="+default_off+", platform="+platform+" )");
- }
-
- this.id="httpseR" + ruleset_counter;
- ruleset_counter += 1;
- this.on_by_default = true;
- this.compiled = false;
- this.name = name;
- this.xmlName = xmlName;
- //this.ruleset_match = match_rule;
- this.notes = "";
- if (match_rule) this.ruleset_match_c = new RegExp(match_rule);
- else this.ruleset_match_c = null;
- if (default_off) {
- // Perhaps problematically, this currently ignores the actual content of
- // the default_off XML attribute. Ideally we'd like this attribute to be
- // "valueless"
- this.notes = default_off;
- this.on_by_default = false;
- }
- if (platform)
- if (platform.search(HTTPSRules.localPlatformRegexp) == -1) {
- this.on_by_default = false;
- this.notes = "Only for " + platform;
- }
-
- this.rules = [];
- this.exclusions = [];
- this.cookierules = [];
-
- this.rule_toggle_prefs = HTTPSEverywhere.instance.rule_toggle_prefs;
-
- try {
- // if this pref exists, use it
- this.active = this.rule_toggle_prefs.getBoolPref(name);
- } catch(e) {
- // if not, use the default
- this.active = this.on_by_default;
- }
-}
-
-var dom_parser = Cc["@mozilla.org/xmlextras/domparser;1"].createInstance(Ci.nsIDOMParser);
-
-RuleSet.prototype = {
-
- ensureCompiled: function() {
- // Postpone compilation of exclusions, rules and cookies until now, to accelerate
- // browser load time.
- if (this.compiled) return;
- var i;
-
- for (i = 0; i < this.exclusions.length; ++i) {
- this.exclusions[i].pattern_c = new RegExp(this.exclusions[i].pattern_c);
- }
- for (i = 0; i < this.rules.length; ++i) {
- this.rules[i].from_c = new RegExp(this.rules[i].from_c);
- }
-
- for (i = 0; i < this.cookierules.length; i++) {
- var cr = this.cookierules[i];
- cr.host_c = new RegExp(cr.host);
- cr.name_c = new RegExp(cr.name);
- }
-
- this.compiled = true;
- },
-
- apply: function(urispec) {
- // return null if it does not apply
- // and the new url if it does apply
- var i;
- var returl = null;
- this.ensureCompiled();
- // If a rulset has a match_rule and it fails, go no further
- if (this.ruleset_match_c && !this.ruleset_match_c.test(urispec)) {
- this.log(VERB, "ruleset_match_c excluded " + urispec);
- return null;
- }
- // Even so, if we're covered by an exclusion, go home
- for (i = 0; i < this.exclusions.length; ++i) {
- if (this.exclusions[i].pattern_c.test(urispec)) {
- this.log(DBUG,"excluded uri " + urispec);
- return null;
- }
- }
- // Okay, now find the first rule that triggers
- for (i = 0; i < this.rules.length; ++i) {
- // This is just for displaying inactive rules
- returl = urispec.replace(this.rules[i].from_c, this.rules[i].to);
- if (returl != urispec) return returl;
- }
-
- return null;
- },
- log: function(level, msg) {
- https_everywhereLog(level, msg);
- },
-
- wouldMatch: function(hypothetical_uri, alist) {
- // return true if this ruleset would match the uri, assuming it were http
- // used for judging moot / inactive rulesets
- // alist is optional
-
- // if the ruleset is already somewhere in this applicable list, we don't
- // care about hypothetical wouldMatch questions
- if (alist && (this.name in alist.all)) return false;
-
- this.log(DBUG,"Would " +this.name + " match " +hypothetical_uri.spec +
- "? serial " + (alist && alist.serial));
-
- var uri = hypothetical_uri.clone();
- if (uri.scheme == "https") uri.scheme = "http";
- var urispec = uri.spec;
-
- this.ensureCompiled();
-
- if (this.ruleset_match_c && !this.ruleset_match_c.test(urispec))
- return false;
-
- for (var i = 0; i < this.exclusions.length; ++i)
- if (this.exclusions[i].pattern_c.test(urispec)) return false;
-
- for (var i = 0; i < this.rules.length; ++i)
- if (this.rules[i].from_c.test(urispec)) return true;
- return false;
- },
-
- transformURI: function(uri) {
- // If no rule applies, return null; if a rule would have applied but was
- // inactive, return 0; otherwise, return a fresh uri instance
- // for the target
- var newurl = this.apply(uri.spec);
- if (null == newurl)
- return null;
- var newuri = Components.classes["@mozilla.org/network/standard-url;1"].
- createInstance(CI.nsIStandardURL);
- newuri.init(CI.nsIStandardURL.URLTYPE_STANDARD, 80,
- newurl, uri.originCharset, null);
- newuri = newuri.QueryInterface(CI.nsIURI);
- return newuri;
- },
-
- enable: function() {
- // Enable us.
- this.rule_toggle_prefs.setBoolPref(this.name, true);
- this.active = true;
- },
-
- disable: function() {
- // Disable us.
- this.rule_toggle_prefs.setBoolPref(this.name, false);
- this.active = false;
- },
-
- toggle: function() {
- this.active = !this.active;
- this.rule_toggle_prefs.setBoolPref(this.name, this.active);
- },
-
- clear: function() {
- try {
- this.rule_toggle_prefs.clearUserPref(this.name);
- } catch(e) {
- // this ruleset has never been toggled
- }
- this.active = this.on_by_default;
- }
-};
-
-const RuleWriter = {
-
- getCustomRuleDir: function() {
- var loc = "ProfD"; // profile directory
- var file =
- CC["@mozilla.org/file/directory_service;1"]
- .getService(CI.nsIProperties)
- .get(loc, CI.nsILocalFile)
- .clone();
- file.append("HTTPSEverywhereUserRules");
- // Check for existence, if not, create.
- if (!file.exists()) {
- file.create(CI.nsIFile.DIRECTORY_TYPE, 0700);
- }
- if (!file.isDirectory()) {
- // XXX: Arg, death!
- }
- return file;
- },
-
- chromeToPath: function (aPath) {
- if (!aPath || !(/^chrome:/.test(aPath)))
- return; //not a chrome url
-
- var ios =
- CC['@mozilla.org/network/io-service;1']
- .getService(CI.nsIIOService);
- var uri = ios.newURI(aPath, "UTF-8", null);
- var cr =
- CC['@mozilla.org/chrome/chrome-registry;1']
- .getService(CI.nsIChromeRegistry);
- var rv = cr.convertChromeURL(uri).spec;
-
- if (/^file:/.test(rv))
- rv = this.urlToPath(rv);
- else
- rv = this.urlToPath("file://"+rv);
-
- return rv;
- },
-
- urlToPath: function (aPath) {
- if (!aPath || !/^file:/.test(aPath))
- return ;
-
- var ph =
- CC["@mozilla.org/network/protocol;1?name=file"]
- .createInstance(CI.nsIFileProtocolHandler);
- var rv = ph.getFileFromURLSpec(aPath).path;
-
- return rv;
- },
-
- getRuleDir: function() {
- var loc = "chrome://https-everywhere/content/rules/";
-
- var file =
- CC["@mozilla.org/file/local;1"]
- .createInstance(CI.nsILocalFile);
- file.initWithPath(this.chromeToPath(loc));
-
- if (!file.isDirectory()) {
- // XXX: Arg, death!
- this.log(WARN,"Catastrophic failure: extension directory is not a directory");
- }
- return file;
- },
-
- read: function(file, rule_store) {
- if (!file.exists())
- return null;
- if ((rule_store.targets == null) && (rule_store.targets != {}))
- this.log(WARN, "TARGETS IS NULL");
- var data = "";
- var fstream = CC["@mozilla.org/network/file-input-stream;1"]
- .createInstance(CI.nsIFileInputStream);
- var sstream = CC["@mozilla.org/scriptableinputstream;1"]
- .createInstance(CI.nsIScriptableInputStream);
- fstream.init(file, -1, 0, 0);
- sstream.init(fstream);
-
- var str = sstream.read(4096);
- while (str.length > 0) {
- data += str;
- str = sstream.read(4096);
- }
-
- sstream.close();
- fstream.close();
- // XXX: With DOMParser, we probably do not need to throw away the XML
- // declaration anymore nowadays.
- data = data.replace(/<\?xml[^>]*\?>/, "");
- try {
- var xmlrulesets = dom_parser.parseFromString(data, "text/xml");
- } catch(e) { // file has been corrupted; XXX: handle error differently
- this.log(WARN,"Error in XML file: " + file.path + "\n" + e);
- return null;
- }
- this.parseXmlRulesets(xmlrulesets, rule_store, file);
- },
-
- parseXmlRulesets: function(xmldom, rule_store, file) {
- // XML input files can either be a in a file, or a
- // with many inside it (the latter form exists
- // because ZIP does a much better job of compressing it).
- if (xmldom.documentElement.nodeName == "ruleset") {
- // This is a single ruleset.
- this.parseOneRuleset(xmldom.documentElement, rule_store, file);
- } else {
- // The root of the XML tree is assumed to look like a
- if (!xmldom.documentElement.getAttribute("gitcommitid")) {
- // The gitcommitid is a tricky hack to let us display the true full
- // source code of a ruleset, even though we strip out comments at build
- // time, by having the UI fetch the ruleset from the public https git repo.
- this.log(DBUG, "gitcommitid tag not found in ");
- rule_store.GITCommitID = "HEAD";
- } else {
- rule_store.GITCommitID = xmldom.documentElement.getAttribute("gitcommitid");
- }
-
- var rulesets = xmldom.documentElement.getElementsByTagName("ruleset");
- if (rulesets.length == 0 && (file.path.search("00README") == -1))
- this.log(WARN, "Probable with no in "
- + file.path + "\n" + xmldom);
- for (var j = 0; j < rulesets.length; j++)
- this.parseOneRuleset(rulesets[j], rule_store, file);
- }
- },
-
- parseOneRuleset: function(xmlruleset, rule_store, file) {
- // Extract an xmlruleset into the rulestore
- if (!xmlruleset.getAttribute("name")) {
- this.log(WARN, "This blob: '" + xmlruleset + "' is not a ruleset\n");
- return null;
- }
-
- this.log(DBUG, "Parsing " + xmlruleset.getAttribute("name") + " from " + file.path);
-
- var match_rl = xmlruleset.getAttribute("match_rule");
- var dflt_off = xmlruleset.getAttribute("default_off");
- var platform = xmlruleset.getAttribute("platform");
- var rs = new RuleSet(xmlruleset.getAttribute("name"), xmlruleset.getAttribute("f"), match_rl, dflt_off, platform);
-
- var targets = xmlruleset.getElementsByTagName("target");
- if (targets.length == 0) {
- var msg = "Error: As of v0.3.0, XML rulesets require a target domain entry,";
- msg = msg + "\nbut " + file.path + " is missing one.";
- this.log(WARN, msg);
- return null;
- }
-
- // see if this ruleset has the same name as an existing ruleset;
- // if so, this ruleset is ignored; DON'T add or return it.
- if (rs.name in rule_store.rulesetsByName) {
- this.log(WARN, "Error: found duplicate rule name " + rs.name + " in file " + file.path);
- return null;
- }
-
- // add this ruleset into HTTPSRules.targets with all of the applicable
- // target host indexes
- for (var i = 0; i < targets.length; i++) {
- var host = targets[i].getAttribute("host");
- if (!host) {
- this.log(WARN, " missing host in " + file.path);
- return null;
- }
- if (! rule_store.targets[host])
- rule_store.targets[host] = [];
- rule_store.targets[host].push(rs);
- }
-
- var exclusions = xmlruleset.getElementsByTagName("exclusion");
- for (var i = 0; i < exclusions.length; i++) {
- var exclusion = new Exclusion(exclusions[i].getAttribute("pattern"));
- rs.exclusions.push(exclusion);
- }
-
- var rules = xmlruleset.getElementsByTagName("rule");
- for (var i = 0; i < rules.length; i++) {
- var rule = new Rule(rules[i].getAttribute("from"),
- rules[i].getAttribute("to"));
- rs.rules.push(rule);
- }
-
- var securecookies = xmlruleset.getElementsByTagName("securecookie");
- for (var i = 0; i < securecookies.length; i++) {
- var c_rule = new CookieRule(securecookies[i].getAttribute("host"),
- securecookies[i].getAttribute("name"));
- rs.cookierules.push(c_rule);
- this.log(DBUG,"Cookie rule "+ c_rule.host+ " " +c_rule.name);
- }
-
- rule_store.rulesets.push(rs);
- rule_store.rulesetsByID[rs.id] = rs;
- rule_store.rulesetsByName[rs.name] = rs;
-
- },
-
- enumerate: function(dir) {
- // file is the given directory (nsIFile)
- var entries = dir.directoryEntries;
- var ret = [];
- while(entries.hasMoreElements()) {
- var entry = entries.getNext();
- entry.QueryInterface(Components.interfaces.nsIFile);
- ret.push(entry);
- }
- return ret;
- },
-};
-
-
-
-const HTTPSRules = {
- init: function() {
- try {
- this.rulesets = [];
- this.targets = {}; // dict mapping target host patterns -> lists of
- // applicable rules
- this.rulesetsByID = {};
- this.rulesetsByName = {};
- var t1 = new Date().getTime();
- this.checkMixedContentHandling();
- var rulefiles = RuleWriter.enumerate(RuleWriter.getCustomRuleDir());
- this.scanRulefiles(rulefiles);
- rulefiles = RuleWriter.enumerate(RuleWriter.getRuleDir());
- this.scanRulefiles(rulefiles);
- var t,i;
- for (t in this.targets) {
- for (i = 0 ; i < this.targets[t].length ; i++) {
- this.log(INFO, t + " -> " + this.targets[t][i].name);
- }
- }
-
- // for any rulesets with
- // every URI needs to be checked against these rulesets
- // (though currently we don't ship any)
- this.global_rulesets = this.targets["*"] ? this.targets["*"] : [];
-
- this.rulesets.sort(
- function(r1,r2) {
- if (r1.name.toLowerCase() < r2.name.toLowerCase()) return -1;
- else return 1;
- }
- );
- } catch(e) {
- this.log(WARN,"Rules Failed: "+e);
- }
- var t2 = new Date().getTime();
- this.log(NOTE,"Loading rulesets took " + (t2 - t1) / 1000.0 + " seconds");
- return;
- },
-
- checkMixedContentHandling: function() {
- // Firefox 23+ blocks mixed content by default, so rulesets that create
- // mixed content situations should be disabled there
- var appInfo = CC["@mozilla.org/xre/app-info;1"].getService(CI.nsIXULAppInfo);
- var platformVer = appInfo.platformVersion;
- var versionChecker = CC["@mozilla.org/xpcom/version-comparator;1"]
- .getService(CI.nsIVersionComparator);
- var prefs = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefService).getBranch("");
-
-
- // If mixed content is present and enabled, and the user hasn't opted to enable
- // mixed content triggering rules, leave them out. Otherwise add them in.
- if(versionChecker.compare(appInfo.version, "23.0a1") >= 0
- && prefs.getBoolPref("security.mixed_content.block_active_content")
- && !prefs.getBoolPref("extensions.https_everywhere.enable_mixed_rulesets")) {
- this.log(INFO, "Not activating rules that trigger mixed content errors.");
- this.localPlatformRegexp = new RegExp("firefox");
- } else {
- this.log(INFO, "Activating rules that would normally trigger mixed content");
- this.localPlatformRegexp = new RegExp("(firefox|mixedcontent)");
- }
- },
-
- scanRulefiles: function(rulefiles) {
- var i = 0;
- var r = null;
- for(i = 0; i < rulefiles.length; ++i) {
- try {
- this.log(DBUG,"Loading ruleset file: "+rulefiles[i].path);
- RuleWriter.read(rulefiles[i], this);
- } catch(e) {
- this.log(WARN, "Error in ruleset file: " + e);
- if (e.lineNumber)
- this.log(WARN, "(line number: " + e.lineNumber + ")");
- }
- }
- },
-
- resetRulesetsToDefaults: function() {
- // Callable from within the prefs UI and also for cleaning up buggy
- // configurations...
- for (var i in this.rulesets) {
- this.rulesets[i].clear();
- }
- },
-
- rewrittenURI: function(alist, input_uri) {
- // This function oversees the task of working out if a uri should be
- // rewritten, what it should be rewritten to, and recordkeeping of which
- // applicable rulesets are and aren't active. Previously this returned
- // the new uri if there was a rewrite. Now it returns a JS object with a
- // newuri attribute and an applied_ruleset attribute (or null if there's
- // no rewrite).
- var i = 0;
- userpass_present = false; // Global so that sanitiseURI can tweak it.
- // Why does JS have no tuples, again?
- var blob = {}; blob.newuri = null;
- if (!alist) this.log(DBUG, "No applicable list rewriting " + input_uri.spec);
- this.log(NOTE, "Processing " + input_uri.spec);
-
- var uri = this.sanitiseURI(input_uri);
-
- // Get the list of rulesets that target this host
- try {
- var rs = this.potentiallyApplicableRulesets(uri.host);
- } catch(e) {
- this.log(WARN, 'Could not check applicable rules for '+uri.spec);
- return null;
- }
-
- // ponder each potentially applicable ruleset, working out if it applies
- // and recording it as active/inactive/moot/breaking in the applicable list
- for (i = 0; i < rs.length; ++i) {
- if (!rs[i].active) {
- if (alist && rs[i].wouldMatch(uri, alist))
- alist.inactive_rule(rs[i]);
- continue;
- }
- blob.newuri = rs[i].transformURI(uri);
- if (blob.newuri) {
- // we rewrote the uri
- this.log(DBUG, "Rewrote "+input_uri.spec);
- if (alist) {
- if (uri.spec in https_everywhere_blacklist)
- alist.breaking_rule(rs[i]);
- else
- alist.active_rule(rs[i]);
- }
- if (userpass_present) blob.newuri.userPass = input_uri.userPass;
- blob.applied_ruleset = rs[i];
- return blob;
- }
- if (uri.scheme == "https" && alist) {
- // we didn't rewrite but the rule applies to this domain and the
- // requests are going over https
- if (rs[i].wouldMatch(uri, alist)) alist.moot_rule(rs[i]);
- continue;
- }
- }
- return null;
- },
-
- sanitiseURI: function(input_uri) {
- // Rulesets shouldn't try to parse usernames and passwords. If we find
- // those, apply the ruleset without them (and then add them back later).
- // When .userPass is absent, sometimes it is false and sometimes trying
- // to read it raises an exception (probably depending on the URI type).
- var uri = input_uri;
- try {
- if (input_uri.userPass) {
- uri = input_uri.clone();
- userpass_present = true; // tweaking a global in our caller :(
- uri.userPass = null;
- }
- } catch(e) {}
-
- // example.com. is equivalent to example.com
- // example.com.. is invalid, but firefox would load it anyway
- try {
- if (uri.host)
- try {
- var h = uri.host;
- if (h.charAt(h.length - 1) == ".") {
- while (h.charAt(h.length - 1) == ".")
- h = h.slice(0,-1);
- uri = uri.clone();
- uri.host = h;
- }
- } catch(e) {
- this.log(WARN, "Failed to normalise domain: ");
- try {this.log(WARN, input_uri.host);}
- catch(e2) {this.log(WARN, "bang" + e + " & " + e2 + " & "+ input_uri);}
- }
- } catch(e3) {
- this.log(INFO, "uri.host is explosive!");
- try { this.log(INFO, "(" + uri.spec + ")"); } // happens for about: uris and soforth
- catch(e4) { this.log(WARN, "(and unprintable!!!!!!)"); }
- }
- return uri;
- },
-
- setInsert: function(intoList, fromList) {
- // Insert any elements from fromList into intoList, if they are not
- // already there. fromList may be null.
- if (!fromList) return;
- for (var i = 0; i < fromList.length; i++)
- if (intoList.indexOf(fromList[i]) == -1)
- intoList.push(fromList[i]);
- },
-
- potentiallyApplicableRulesets: function(host) {
- // Return a list of rulesets that declare targets matching this host
- var i, tmp, t;
- var results = this.global_rulesets.slice(0); // copy global_rulesets
- try {
- if (this.targets[host])
- results = results.concat(this.targets[host]);
- } catch(e) {
- this.log(DBUG,"Couldn't check for ApplicableRulesets: " + e);
- return [];
- }
- // replace each portion of the domain with a * in turn
- var segmented = host.split(".");
- for (i = 0; i < segmented.length; ++i) {
- tmp = segmented[i];
- segmented[i] = "*";
- t = segmented.join(".");
- segmented[i] = tmp;
- this.setInsert(results, this.targets[t]);
- }
- // now eat away from the left, with *, so that for x.y.z.google.com we
- // check *.z.google.com and *.google.com (we did *.y.z.google.com above)
- for (i = 1; i <= segmented.length - 2; ++i) {
- t = "*." + segmented.slice(i,segmented.length).join(".");
- this.setInsert(results, this.targets[t]);
- }
- this.log(DBUG,"Potentially applicable rules for " + host + ":");
- for (i = 0; i < results.length; ++i)
- this.log(DBUG, " " + results[i].name);
- return results;
- },
-
- shouldSecureCookie: function(applicable_list, c, known_https) {
- // Check to see if the Cookie object c meets any of our cookierule citeria
- // for being marked as secure.
- // @applicable_list : an ApplicableList or record keeping
- // @c : an nsICookie2
- // @known_https : true if we know the page setting the cookie is https
-
- this.log(DBUG," rawhost: " + c.rawHost + "\n name: " + c.name + "\n host" + c.host);
- var i,j;
- var rs = this.potentiallyApplicableRulesets(c.host);
- for (i = 0; i < rs.length; ++i) {
- var ruleset = rs[i];
- if (ruleset.active) {
- ruleset.ensureCompiled();
- // Never secure a cookie if this page might be HTTP
- if (!known_https && !this.safeToSecureCookie(c.rawHost))
- continue;
- for (j = 0; j < ruleset.cookierules.length; j++) {
- var cr = ruleset.cookierules[j];
- if (cr.host_c.test(c.host) && cr.name_c.test(c.name)) {
- if (applicable_list) applicable_list.active_rule(ruleset);
- this.log(INFO,"Active cookie rule " + ruleset.name);
- return true;
- }
- }
- if (ruleset.cookierules.length > 0)
- if (applicable_list) applicable_list.moot_rule(ruleset);
- } else if (ruleset.cookierules.length > 0) {
- if (applicable_list) applicable_list.inactive_rule(ruleset);
- this.log(INFO,"Inactive cookie rule " + ruleset.name);
- }
- }
- return false;
- },
-
- safeToSecureCookie: function(domain) {
- // Check if the domain might be being served over HTTP. If so, it isn't
- // safe to secure a cookie! We can't always know this for sure because
- // observing cookie-changed doesn't give us enough context to know the
- // full origin URI.
-
- // First, if there are any redirect loops on this domain, don't secure
- // cookies. XXX This is not a very satisfactory heuristic. Sometimes we
- // would want to secure the cookie anyway, because the URLs that loop are
- // not authenticated or not important. Also by the time the loop has been
- // observed and the domain blacklisted, a cookie might already have been
- // flagged as secure.
-
- if (domain in https_blacklist_domains) {
- this.log(INFO, "cookies for " + domain + "blacklisted");
- return false;
- }
-
- // If we passed that test, make up a random URL on the domain, and see if
- // we would HTTPSify that.
-
- try {
- var nonce_path = "/" + Math.random().toString();
- nonce_path = nonce_path + nonce_path;
- var test_uri = "http://" + domain + nonce_path;
- } catch (e) {
- this.log(WARN, "explosion in safeToSecureCookie for " + domain + "\n"
- + "(" + e + ")");
- return false;
- }
-
- this.log(INFO, "Testing securecookie applicability with " + test_uri);
- var rs = this.potentiallyApplicableRulesets(domain);
- for (var i = 0; i < rs.length; ++i) {
- if (!rs[i].active) continue;
- var rewrite = rs[i].apply(test_uri);
- if (rewrite) {
- this.log(INFO, "Yes: " + rewrite);
- return true;
- }
- }
- this.log(INFO, "(NO)");
- return false;
- }
-};
diff --git a/src/chrome/content/code/IOUtil.js b/src/chrome/content/code/IOUtil.js
deleted file mode 100644
index 96c25004a7e0..000000000000
--- a/src/chrome/content/code/IOUtil.js
+++ /dev/null
@@ -1,263 +0,0 @@
-const IO = {
- readFile: function(file, charset) {
- var res;
-
- const is = Cc["@mozilla.org/network/file-input-stream;1"]
- .createInstance(Ci.nsIFileInputStream );
- is.init(file ,0x01, 256 /*0400*/, null);
- const sis = Cc["@mozilla.org/scriptableinputstream;1"]
- .createInstance(Ci.nsIScriptableInputStream);
- sis.init(is);
-
- res = sis.read(sis.available());
- is.close();
-
- if (charset !== null) { // use "null" if you want uncoverted data...
- const unicodeConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]
- .createInstance(Ci.nsIScriptableUnicodeConverter);
- try {
- unicodeConverter.charset = charset || "UTF-8";
- } catch(ex) {
- unicodeConverter.charset = "UTF-8";
- }
- res = unicodeConverter.ConvertToUnicode(res);
- }
-
- return res;
- },
- writeFile: function(file, content, charset) {
- const unicodeConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]
- .createInstance(Ci.nsIScriptableUnicodeConverter);
- try {
- unicodeConverter.charset = charset || "UTF-8";
- } catch(ex) {
- unicodeConverter.charset = "UTF-8";
- }
-
- content = unicodeConverter.ConvertFromUnicode(content);
- const os = Cc["@mozilla.org/network/file-output-stream;1"]
- .createInstance(Ci.nsIFileOutputStream);
- os.init(file, 0x02 | 0x08 | 0x20, 448 /*0700*/, 0);
- os.write(content, content.length);
- os.close();
- },
-
- safeWriteFile: function(file, content, charset) {
- var tmp = file.clone();
- var name = file.leafName;
- tmp.leafName = name + ".tmp";
- tmp.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, file.exists() ? file.permissions : 384 /*0600*/);
- this.writeFile(tmp, content, charset);
- tmp.moveTo(file.parent, name);
- }
-};
-
-
-function nsISupportsWrapper(wrapped) {
- this.wrappedJSObject = wrapped;
-}
-nsISupportsWrapper.prototype = {
- QueryInterface: xpcom_generateQI([])
-};
-
-const IOUtil = {
- asyncNetworking: true,
- proxiedDNS: 0,
-
- attachToChannel: function(channel, key, requestInfo) {
- if (channel instanceof Ci.nsIWritablePropertyBag2)
- channel.setPropertyAsInterface(key, requestInfo);
- },
- extractFromChannel: function(channel, key, preserve) {
- if (channel instanceof Ci.nsIPropertyBag2) {
- let p = channel.get(key);
- if (p) {
- if (!preserve && (channel instanceof Ci.nsIWritablePropertyBag)) channel.deleteProperty(key);
- if (p.wrappedJSObject) return p.wrappedJSObject;
- p instanceof Ci.nsIURL || p instanceof Ci.nsIURL;
- return p;
- }
- }
- return null;
- },
-
- extractInternalReferrer: function(channel) {
- if (channel instanceof Ci.nsIPropertyBag2) {
- const key = "docshell.internalReferrer";
- if (channel.hasKey(key))
- try {
- return channel.getPropertyAsInterface(key, Ci.nsIURL);
- } catch(e) {}
- }
- return null;
- },
- extractInternalReferrerSpec: function(channel) {
- var ref = this.extractInternalReferrer(channel);
- return ref && ref.spec || null;
- },
-
- getProxyInfo: function(channel) {
- return Ci.nsIProxiedChannel && (channel instanceof Ci.nsIProxiedChannel)
- ? channel.proxyInfo
- : Components.classes["@mozilla.org/network/protocol-proxy-service;1"]
- .getService(Components.interfaces.nsIProtocolProxyService)
- .resolve(channel.URI, 0);
- },
-
-
- canDoDNS: function(channel) {
- if (!channel || IOS.offline) return false;
-
- var proxyInfo = this.getProxyInfo(channel);
- switch(this.proxiedDNS) {
- case 1:
- return !(proxyInfo && (proxyInfo.flags & Ci.nsIProxyInfo.TRANSPARENT_PROXY_RESOLVES_HOST));
- case 2:
- return true;
- default:
- return !proxyInfo || proxyInfo.type == "direct";
- }
-
- },
-
- abort: function(channel, noNetwork) {
- channel.cancel(Cr.NS_ERROR_ABORT);
- },
-
- findWindow: function(channel) {
- for each(var cb in [channel.notificationCallbacks,
- channel.loadGroup && channel.loadGroup.notificationCallbacks]) {
- if (cb instanceof Ci.nsIInterfaceRequestor) {
- if (Ci.nsILoadContext) try {
- // For Gecko 1.9.1
- return cb.getInterface(Ci.nsILoadContext).associatedWindow;
- } catch(e) {}
-
- try {
- // For Gecko 1.9.0
- return cb.getInterface(Ci.nsIDOMWindow);
- } catch(e) {}
- }
- }
- return null;
- },
-
- readFile: IO.readFile,
- writeFile: IO.writeFile,
- safeWriteFIle: IO.safeWriteFile,
-
- _protocols: {}, // caching them we gain a 33% speed boost in URI creation :)
- newURI: function(url) {
- try {
- let scheme = url.substring(0, url.indexOf(':'));
- return (this._protocols[scheme] ||
- (this._protocols[scheme] =
- Cc["@mozilla.org/network/protocol;1?name=" + scheme]
- .getService(Ci.nsIProtocolHandler)))
- .newURI(url, null, null);
- } catch(e) {
- return IOS.newURI(url, null, null);
- }
- },
-
- unwrapURL: function(url) {
- try {
- if (!(url instanceof Ci.nsIURI))
- url = this.newURI(url);
-
- switch (url.scheme) {
- case "view-source":
- return this.unwrapURL(url.path);
- case "feed":
- let u = url.spec.substring(5);
- if (u.substring(0, 2) == '//') u = "http:" + u;
- return this.unwrapURL(u);
- case "wyciwyg":
- return this.unwrapURL(url.path.replace(/^\/\/\d+\//, ""));
- case "jar":
- if (url instanceof Ci.nsIJARURI)
- return this.unwrapURL(url.JARFile);
- }
- }
- catch (e) {}
-
- return url;
- },
-
-
- get _channelFlags() {
- delete this._channelFlags;
- const constRx = /^[A-Z_]+$/;
- const ff = {};
- [Ci.nsIHttpChannel, Ci.nsICachingChannel].forEach(function(c) {
- for (var p in c) {
- if (constRx.test(p)) ff[p] = c[p];
- }
- });
- return this._channelFlags = ff;
- },
- humanFlags: function(loadFlags) {
- var hf = [];
- var c = this._channelFlags;
- for (var p in c) {
- if (loadFlags & c[p]) hf.push(p + "=" + c[p]);
- }
- return hf.join("\n");
- },
-
- queryNotificationCallbacks: function(chan, iid) {
- var cb;
- try {
- cb = chan.notificationCallbacks.getInterface(iid);
- if (cb) return cb;
- } catch(e) {}
-
- try {
- return chan.loadGroup && chan.loadGroup.notificationCallbacks.getInterface(iid);
- } catch(e) {}
-
- return null;
- },
-
-
- anonymizeURI: function(uri, cookie) {
- if (uri instanceof Ci.nsIURL) {
- uri.query = this.anonymizeQS(uri.query, cookie);
- } else return this.anonymizeURL(uri, cookie);
- return uri;
- },
- anonymizeURL: function(url, cookie) {
- var parts = url.split("?");
- if (parts.length < 2) return url;
- parts[1] = this.anonymizeQS(parts[1], cookie);
- return parts.join("?");
- },
-
- _splitName: function(nv) nv.split("=")[0],
- _qsRx: /[&=]/,
- _anonRx: /(?:auth|s\w+(?:id|key)$)/,
- anonymizeQS: function(qs, cookie) {
- if (!qs) return qs;
- if (!this._qsRx.test(qs)) return '';
-
- var cookieNames, hasCookies;
- if ((hasCookies = !!cookie)) cookieNames = cookie.split(/\s*;\s*/).map(this._splitName);
-
- let parms = qs.split("&");
- for (j = parms.length; j-- > 0;) {
- let nv = parms[j].split("=");
- let name = nv[0];
- if (this._anonRx.test(name) || cookie && cookieNames.indexOf(name) > -1)
- parms.splice(j, 1);
- }
- return parms.join("&");
- },
-
- get TLDService() {
- delete this.TLDService;
- return this.TLDService = Cc["@mozilla.org/network/effective-tld-service;1"].getService(Ci.nsIEffectiveTLDService);
- }
-
-};
-
-
diff --git a/src/chrome/content/code/NSS.js b/src/chrome/content/code/NSS.js
deleted file mode 100644
index 97a7e78a5c07..000000000000
--- a/src/chrome/content/code/NSS.js
+++ /dev/null
@@ -1,491 +0,0 @@
-// Copyright (c) 2011 Moxie Marlinspike
-// 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, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-// USA
-
-
-/**
- * This class manages the ctypes bridge to the NSS (crypto) libraries
- * distributed with Mozilla.
- *
- **/
-
-function NSS() {
-
-}
-
-NSS.initialize = function(nssPath) {
- var sharedLib;
-
- try {
- sharedLib = ctypes.open(nssPath);
- } catch (e) {
- dump("Failed to find nss3 in installed directory, checking system paths.\n");
- sharedLib = ctypes.open(ctypes.libraryName("nss3"));
- }
-
- NSS.types = new Object();
-
- NSS.types.CERTDistNames = ctypes.StructType("CERTDistNames");
-
- NSS.types.SECItem = ctypes.StructType("SECItem",
- [{'type' : ctypes.int},
- {'data' : ctypes.unsigned_char.ptr},
- {'len' : ctypes.uint32_t}]);
-
- NSS.types.PLArenaPool = ctypes.StructType("PLArenaPool");
-
- NSS.types.CERTCertificateList = ctypes.StructType("CERTCertificateList",
- [{'certs' : NSS.types.SECItem.ptr},
- {'len' : ctypes.int},
- {'arena' : NSS.types.PLArenaPool.ptr}]),
-
- NSS.types.CERTAVA = ctypes.StructType("CERTAVA",
- [{'type' : NSS.types.SECItem},
- {'value' : NSS.types.SECItem}]);
-
- NSS.types.CERTRDN = ctypes.StructType("CERTRDN",
- [{'avas' : NSS.types.CERTAVA.ptr.ptr}]);
-
- NSS.types.SECAlgorithmID = ctypes.StructType("SECAlgorithmID",
- [{'algorithm' : NSS.types.SECItem},
- {'parameters' : NSS.types.SECItem}]);
-
- NSS.types.CERTSignedData = ctypes.StructType("CERTSignedData",
- [{'data' : NSS.types.SECItem},
- {'signatureAlgorithm' : NSS.types.SECAlgorithmID},
- {'signature' : NSS.types.SECItem}]);
-
- NSS.types.CERTOKDomainName = ctypes.StructType("CERTOKDomainName");
-
- NSS.types.NSSCertificateStr = ctypes.StructType("NSSCertificateStr");
-
- NSS.types.CERTAuthKeyID = ctypes.StructType("CERTAuthKeyID");
-
- NSS.types.CERTName = ctypes.StructType("CERTName",
- [{'arena' : ctypes.voidptr_t},
- {'rdns' : NSS.types.CERTRDN.ptr.ptr}]);
-
- NSS.types.CERTValidity = ctypes.StructType("CERTValidity",
- [{'arena' : ctypes.voidptr_t},
- {'notBefore' : NSS.types.SECItem},
- {'notAfter' : NSS.types.SECItem}]);
-
- NSS.types.CERTCertExtension = ctypes.StructType("CERTCertExtension",
- [{'id' : NSS.types.SECItem},
- {'critical' : NSS.types.SECItem},
- {'value' : NSS.types.SECItem}]);
-
- NSS.types.CERTCertDBHandle = ctypes.StructType("CERTCertDBHandle");
-
- NSS.types.PK11SlotInfo = ctypes.StructType("PK11SlotInfo");
-
- NSS.types.PK11SlotListElement = ctypes.StructType("PK11SlotListElement",
- [{'next' : ctypes.StructType("PK11SlotListElement").ptr},
- {'prev' : ctypes.StructType("PK11SlotListElement").ptr},
- {'slot' : NSS.types.PK11SlotInfo.ptr},
- {'refCount' : ctypes.int}]),
-
- NSS.types.PK11SlotList = ctypes.StructType("PK11SlotList",
- [{'head' : NSS.types.PK11SlotListElement.ptr},
- {'tail' : NSS.types.PK11SlotListElement.ptr},
- {'lock' : ctypes.StructType("PZLock").ptr}]),
-
- NSS.types.SECKEYPrivateKey = ctypes.StructType("SECKEYPrivateKey",
- [{'arena' : NSS.types.PLArenaPool.ptr},
- {'keyType' : ctypes.int},
- {'pkcs11Slot' : NSS.types.PK11SlotInfo.ptr},
- {'pkcs11ID' : ctypes.unsigned_long},
- {'pkcs11IsTemp' : ctypes.int},
- {'wincx' : ctypes.voidptr_t},
- {'staticflags' : ctypes.int32_t}]);
-
- NSS.types.SECKEYPublicKey = ctypes.StructType("SECKEYPublicKey");
-
- NSS.types.CERTSubjectPublicKeyInfo = ctypes.StructType("CERTSubjectPublicKeyInfo",
- [{'arena' : NSS.types.PLArenaPool.ptr},
- {'algorithm' : NSS.types.SECAlgorithmID},
- {'subjectPublicKey' : NSS.types.SECItem}]);
-
- NSS.types.CERTCertificateRequest = ctypes.StructType("CERTCertificateRequest");
-
- NSS.types.SEC_ASN1Template = ctypes.StructType("SEC_ASN1Template",
- [{'kind' : ctypes.unsigned_long},
- {'offset' : ctypes.unsigned_long},
- {'sub' : ctypes.voidptr_t},
- {'size' : ctypes.unsigned_int}]);
-
- NSS.types.PK11RSAGenParams = ctypes.StructType("PK11RSAGenParams",
- [{'keySizeInBits' : ctypes.int},
- {'pe' : ctypes.unsigned_long}]);
-
- NSS.types.CERTCertTrust = ctypes.StructType("CERTCertTrust",
- [{'sslFlags' : ctypes.uint32_t},
- {'emailFlags' : ctypes.uint32_t},
- {'objectSigningFlags' : ctypes.uint32_t}]);
-
- NSS.types.CERTSubjectList = ctypes.StructType("CERTSubjectList");
-
- NSS.types.CERTGeneralName = ctypes.StructType("CERTGeneralName");
-
- NSS.types.CERTCertificate = ctypes.StructType("CERTCertificate",
- [{'arena' : NSS.types.PLArenaPool.ptr},
- {'subjectName' : ctypes.char.ptr},
- {'issuerName' : ctypes.char.ptr},
- {'signatureWrap' : NSS.types.CERTSignedData},
- {'derCert' : NSS.types.SECItem},
- {'derIssuer' : NSS.types.SECItem},
- {'derSubject' : NSS.types.SECItem},
- {'derPublicKey' : NSS.types.SECItem},
- {'certKey' : NSS.types.SECItem},
- {'version' : NSS.types.SECItem},
- {'serialNumber' : NSS.types.SECItem},
- {'signature' : NSS.types.SECAlgorithmID},
- {'issuer' : NSS.types.CERTName},
- {'validity' : NSS.types.CERTValidity},
- {'subject' : NSS.types.CERTName},
- {'subjectPublicKeyInfo' : NSS.types.CERTSubjectPublicKeyInfo},
- {'issuerID' : NSS.types.SECItem},
- {'subjectID' : NSS.types.SECItem},
- {'extensions' : NSS.types.CERTCertExtension.ptr.ptr},
- {'emailAddr' : ctypes.char.ptr},
- {'dbhandle' : NSS.types.CERTCertDBHandle.ptr},
- {'subjectKeyID' : NSS.types.SECItem},
- {'keyIDGenerated' : ctypes.int},
- {'keyUsage' : ctypes.unsigned_int},
- {'rawKeyUsage' : ctypes.unsigned_int},
- {'keyUsagePresent' : ctypes.int},
- {'nsCertType' : ctypes.uint32_t},
- {'keepSession' : ctypes.int},
- {'timeOK' : ctypes.int},
- {'domainOK' : NSS.types.CERTOKDomainName.ptr},
- {'isperm' : ctypes.int},
- {'istemp' : ctypes.int},
- {'nickname' : ctypes.char.ptr},
- {'dbnickname' : ctypes.char.ptr},
- {'nssCertificate' : NSS.types.NSSCertificateStr.ptr},
- {'trust' : NSS.types.CERTCertTrust.ptr},
- {'referenceCount' : ctypes.int},
- {'subjectList' : NSS.types.CERTSubjectList.ptr},
- {'authKeyID' : NSS.types.CERTAuthKeyID.ptr},
- {'isRoot' : ctypes.int},
- {'options' : ctypes.voidptr_t},
- {'series' : ctypes.int},
- {'slot' : NSS.types.PK11SlotInfo.ptr},
- {'pkcs11ID' : ctypes.unsigned_long},
- {'ownSlot' : ctypes.int}]);
-
- NSS.types.CERTBasicConstraints = ctypes.StructType("CERTBasicConstraints",
- [{'isCA': ctypes.int},
- {'pathLenConstraint' : ctypes.int}]);
-
-
- NSS.lib = {
- SEC_OID_MD5 : 3,
- SEC_OID_SHA1 : 4,
- SEC_OID_X509_KEY_USAGE : 81,
- SEC_OID_NS_CERT_EXT_COMMENT : 75,
- CKM_RSA_PKCS_KEY_PAIR_GEN : 0,
- buffer : ctypes.ArrayType(ctypes.char),
- ubuffer : ctypes.ArrayType(ctypes.unsigned_char),
-
- // CERT_CertificateTemplate : sharedLib.declare("CERT_CertificateTemplate",
- // NSS.types.SEC_ASN1Template),
-
- NSS_Get_CERT_CertificateTemplate : sharedLib.declare("NSS_Get_CERT_CertificateTemplate",
- ctypes.default_abi,
- NSS.types.SEC_ASN1Template.ptr),
-
- PK11_HashBuf : sharedLib.declare("PK11_HashBuf",
- ctypes.default_abi,
- ctypes.int,
- ctypes.int,
- ctypes.unsigned_char.ptr,
- ctypes.unsigned_char.ptr,
- ctypes.int32_t),
-
- CERT_GetDefaultCertDB : sharedLib.declare("CERT_GetDefaultCertDB",
- ctypes.default_abi,
- NSS.types.CERTCertDBHandle.ptr),
-
- CERT_ChangeCertTrust : sharedLib.declare("CERT_ChangeCertTrust",
- ctypes.default_abi,
- ctypes.int32_t,
- NSS.types.CERTCertDBHandle.ptr,
- NSS.types.CERTCertificate.ptr,
- NSS.types.CERTCertTrust.ptr),
-
- CERT_FindCertByNickname : sharedLib.declare("CERT_FindCertByNickname",
- ctypes.default_abi,
- NSS.types.CERTCertificate.ptr,
- NSS.types.CERTCertDBHandle.ptr,
- ctypes.char.ptr),
-
- CERT_FindCertByDERCert : sharedLib.declare("CERT_FindCertByDERCert",
- ctypes.default_abi,
- NSS.types.CERTCertificate.ptr,
- NSS.types.CERTCertDBHandle.ptr,
- NSS.types.SECItem.ptr),
-
- CERT_VerifyCertNow : sharedLib.declare("CERT_VerifyCertNow",
- ctypes.default_abi,
- ctypes.int,
- NSS.types.CERTCertDBHandle.ptr,
- NSS.types.CERTCertificate.ptr,
- ctypes.int,
- ctypes.int,
- ctypes.voidptr_t),
-
- CERT_CertChainFromCert : sharedLib.declare("CERT_CertChainFromCert",
- ctypes.default_abi,
- NSS.types.CERTCertificateList.ptr,
- NSS.types.CERTCertificate.ptr,
- ctypes.int,
- ctypes.int),
-
- PK11_FindKeyByAnyCert : sharedLib.declare("PK11_FindKeyByAnyCert",
- ctypes.default_abi,
- NSS.types.SECKEYPrivateKey.ptr,
- NSS.types.CERTCertificate.ptr,
- ctypes.voidptr_t),
-
- PK11_GetInternalKeySlot : sharedLib.declare("PK11_GetInternalKeySlot",
- ctypes.default_abi,
- NSS.types.PK11SlotInfo.ptr),
-
- PK11_GetAllSlotsForCert : sharedLib.declare("PK11_GetAllSlotsForCert",
- ctypes.default_abi,
- NSS.types.PK11SlotList.ptr,
- NSS.types.CERTCertificate.ptr,
- ctypes.voidptr_t),
-
- PK11_GetTokenName : sharedLib.declare("PK11_GetTokenName",
- ctypes.default_abi,
- ctypes.char.ptr,
- NSS.types.PK11SlotInfo.ptr),
-
- PK11_GenerateKeyPair : sharedLib.declare("PK11_GenerateKeyPair",
- ctypes.default_abi,
- NSS.types.SECKEYPrivateKey.ptr,
- NSS.types.PK11SlotInfo.ptr,
- ctypes.int,
- NSS.types.PK11RSAGenParams.ptr,
- NSS.types.SECKEYPublicKey.ptr.ptr,
- ctypes.int,
- ctypes.int,
- ctypes.voidptr_t),
-
- PK11_SetPrivateKeyNickname : sharedLib.declare("PK11_SetPrivateKeyNickname",
- ctypes.default_abi,
- ctypes.int,
- NSS.types.SECKEYPrivateKey.ptr,
- ctypes.char.ptr),
-
- SEC_ASN1EncodeItem : sharedLib.declare("SEC_ASN1EncodeItem",
- ctypes.default_abi,
- NSS.types.SECItem.ptr,
- NSS.types.PLArenaPool.ptr,
- NSS.types.SECItem.ptr,
- ctypes.voidptr_t,
- NSS.types.SEC_ASN1Template.ptr),
-
- SEC_DerSignData : sharedLib.declare("SEC_DerSignData",
- ctypes.default_abi,
- ctypes.int,
- NSS.types.PLArenaPool.ptr,
- NSS.types.SECItem.ptr,
- ctypes.unsigned_char.ptr,
- ctypes.int,
- NSS.types.SECKEYPrivateKey.ptr,
- ctypes.int),
-
- SEC_GetSignatureAlgorithmOidTag : sharedLib.declare("SEC_GetSignatureAlgorithmOidTag",
- ctypes.default_abi,
- ctypes.int,
- ctypes.int,
- ctypes.int),
-
- SECOID_SetAlgorithmID : sharedLib.declare("SECOID_SetAlgorithmID",
- ctypes.default_abi,
- ctypes.int,
- NSS.types.PLArenaPool.ptr,
- NSS.types.SECAlgorithmID.ptr,
- ctypes.int,
- NSS.types.SECItem.ptr),
-
-
- CERT_Hexify : sharedLib.declare("CERT_Hexify",
- ctypes.default_abi,
- ctypes.char.ptr,
- NSS.types.SECItem.ptr,
- ctypes.int),
-
- CERT_AsciiToName : sharedLib.declare("CERT_AsciiToName",
- ctypes.default_abi,
- NSS.types.CERTName.ptr,
- ctypes.char.ptr),
-
- SECKEY_CreateSubjectPublicKeyInfo : sharedLib.declare("SECKEY_CreateSubjectPublicKeyInfo",
- ctypes.default_abi,
- NSS.types.CERTSubjectPublicKeyInfo.ptr,
- NSS.types.SECKEYPublicKey.ptr),
-
- CERT_CreateCertificateRequest : sharedLib.declare("CERT_CreateCertificateRequest",
- ctypes.default_abi,
- NSS.types.CERTCertificateRequest.ptr,
- NSS.types.CERTName.ptr,
- NSS.types.CERTSubjectPublicKeyInfo.ptr,
- NSS.types.SECItem.ptr.ptr),
-
- CERT_CreateCertificate : sharedLib.declare("CERT_CreateCertificate",
- ctypes.default_abi,
- NSS.types.CERTCertificate.ptr,
- ctypes.uint32_t,
- NSS.types.CERTName.ptr,
- NSS.types.CERTValidity.ptr,
- NSS.types.CERTCertificateRequest.ptr),
-
- CERT_DestroyCertificate : sharedLib.declare("CERT_DestroyCertificate",
- ctypes.default_abi,
- ctypes.int,
- NSS.types.CERTCertificate.ptr),
-
- CERT_DestroyCertificateList : sharedLib.declare("CERT_DestroyCertificateList",
- ctypes.default_abi,
- ctypes.int,
- NSS.types.CERTCertificateList.ptr),
-
- CERT_NewTempCertificate : sharedLib.declare("CERT_NewTempCertificate",
- ctypes.default_abi,
- NSS.types.CERTCertificate.ptr,
- NSS.types.CERTCertDBHandle.ptr,
- NSS.types.SECItem.ptr,
- ctypes.char.ptr,
- ctypes.int,
- ctypes.int),
-
- CERT_CreateValidity : sharedLib.declare("CERT_CreateValidity",
- ctypes.default_abi,
- NSS.types.CERTValidity.ptr,
- ctypes.int64_t,
- ctypes.int64_t),
-
- CERT_CertListFromCert : sharedLib.declare("CERT_CertListFromCert",
- ctypes.default_abi,
- NSS.types.CERTCertificateList.ptr,
- NSS.types.CERTCertificate.ptr),
-
- CERT_StartCertExtensions : sharedLib.declare("CERT_StartCertExtensions",
- ctypes.default_abi,
- ctypes.voidptr_t,
- NSS.types.CERTCertificate.ptr),
-
- CERT_AddExtension : sharedLib.declare("CERT_AddExtension",
- ctypes.default_abi,
- ctypes.int,
- ctypes.voidptr_t,
- ctypes.int,
- NSS.types.SECItem.ptr,
- ctypes.int,
- ctypes.int),
-
-
- CERT_EncodeBasicConstraintValue : sharedLib.declare("CERT_EncodeBasicConstraintValue",
- ctypes.default_abi,
- ctypes.int,
- NSS.types.PLArenaPool.ptr,
- NSS.types.CERTBasicConstraints.ptr,
- NSS.types.SECItem.ptr),
-
- CERT_EncodeAndAddBitStrExtension : sharedLib.declare("CERT_EncodeAndAddBitStrExtension",
- ctypes.default_abi,
- ctypes.int,
- ctypes.voidptr_t,
- ctypes.int,
- NSS.types.SECItem.ptr,
- ctypes.int),
-
- CERT_EncodeAltNameExtension : sharedLib.declare("CERT_EncodeAltNameExtension",
- ctypes.default_abi,
- ctypes.int,
- NSS.types.PLArenaPool.ptr,
- NSS.types.CERTGeneralName.ptr,
- NSS.types.SECItem.ptr),
-
- CERT_FinishExtensions : sharedLib.declare("CERT_FinishExtensions",
- ctypes.default_abi,
- ctypes.int,
- ctypes.voidptr_t),
-
- CERT_ImportCerts : sharedLib.declare("CERT_ImportCerts",
- ctypes.default_abi,
- ctypes.int,
- NSS.types.CERTCertDBHandle.ptr,
- ctypes.int,
- ctypes.int,
- NSS.types.SECItem.ptr.ptr,
- NSS.types.CERTCertificate.ptr.ptr.ptr,
- ctypes.int,
- ctypes.int,
- ctypes.char.ptr),
-
- PORT_NewArena : sharedLib.declare("PORT_NewArena",
- ctypes.default_abi,
- NSS.types.PLArenaPool.ptr,
- ctypes.uint32_t),
-
- PORT_ArenaZAlloc : sharedLib.declare("PORT_ArenaZAlloc",
- ctypes.default_abi,
- ctypes.voidptr_t,
- NSS.types.PLArenaPool.ptr,
- ctypes.int),
-
- PORT_FreeArena : sharedLib.declare("PORT_FreeArena",
- ctypes.default_abi,
- ctypes.void_t,
- NSS.types.PLArenaPool.ptr,
- ctypes.int),
-
- CERT_GetCommonName : sharedLib.declare("CERT_GetCommonName",
- ctypes.default_abi,
- ctypes.char.ptr,
- NSS.types.CERTName.ptr),
-
- CERT_GetOrgUnitName : sharedLib.declare("CERT_GetOrgUnitName",
- ctypes.default_abi,
- ctypes.char.ptr,
- NSS.types.CERTName.ptr),
-
- CERT_GetCertificateNames : sharedLib.declare("CERT_GetCertificateNames",
- ctypes.default_abi,
- NSS.types.CERTGeneralName.ptr,
- NSS.types.CERTCertificate.ptr,
- NSS.types.PLArenaPool.ptr),
-
- CERT_DecodeDERCertificate : sharedLib.declare("__CERT_DecodeDERCertificate",
- ctypes.default_abi,
- NSS.types.CERTCertificate.ptr,
- NSS.types.SECItem.ptr,
- ctypes.int,
- ctypes.char.ptr),
-
- CERT_FindCertExtension : sharedLib.declare("CERT_FindCertExtension",
- ctypes.default_abi,
- ctypes.int,
- NSS.types.CERTCertificate.ptr,
- ctypes.int,
- NSS.types.SECItem.ptr),
- };
-
-};
diff --git a/src/chrome/content/code/Root-CAs.js b/src/chrome/content/code/Root-CAs.js
deleted file mode 100644
index 49777faca435..000000000000
--- a/src/chrome/content/code/Root-CAs.js
+++ /dev/null
@@ -1,348 +0,0 @@
-// These are concatenated md5 and sha1 fingerprints for the Firefox and
-// Microsoft root CAs as of Aug 2010
-
-root_ca_hashes = {
- '00531D1D7201D423C820D00B6088C5D143DDB1FFF3B49B73831407F6BC8B975023D07C50' : true,
- '015A99C3D64FA94B3C3BB1A3AB274CBFFC219A76112F76C1C508833C9A2FA2BA84AC087A' : true,
- '019408DE857F8D806CE602CA89522848750251B2C632536F9D917279543C137CD721C6E0' : true,
- '0208EE8CAAB8387A6824DCB4E26A52337E206939CC5FA883635F64C750EBF5FDA9AEE653' : true,
- '0226C3015E08303743A9D07DCF37E6BF323C118E1BF7B8B65254E2E2100DD6029037F096' : true,
- '034287D7C1167D18AFA4703CB8312C3E4EF2E6670AC9B5091FE06BE0E5483EAAD6BA32D9' : true,
- '03DC08EEC4703FFA20E5E179E81AE7C59ED18028FB1E8A9701480A7890A59ACD73DFF871' : true,
- '044BFDC96CDA2A32857C598461468A64BEB5A995746B9EDF738B56E6DF437A77BE106B81' : true,
- '0468E9247E41CED76C441630703DDDB9AB16DD144ECDC0FC4BAAB62ECF0408896FDE52B7' : true,
- '068690F2195471FDDD3DE6EEA161CAFF7030AABF8432A800666CCCC42A887E42B7553E2B' : true,
- '069F6979166690021B8C8CA2C3076F3A627F8D7827656399D27D7F9044C9FEB3F33EFA9A' : true,
- '06F0171EB1E961ED7A363CA594A1374AFAAA27B8CAF5FDF5CDA98AC3378572E04CE8F2E0' : true,
- '06F9EBECCC569D88BA90F5BAB01AE00216D424FE9610E17519AF232BB68774E24144BE6E' : true,
- '076192047EA6B9CD5E6B007AE3BF1D0434D499426F9FC2BB27B075BAB682AAE5EFFCBA74' : true,
- '087C581F522B44B43B79CD01F8C5C3C995E6ADF8D77146024DD56A21B2E73FCDF23B35FF' : true,
- '0B092C1CD721866F94376FE6A7F3224D0409565B77DA582E6495AC0060A72354E64B0192' : true,
- '0C412F135BA054F596662D7ECD0E03F4DA79C1711150C23439AA2B0B0C62FD55B2F9F580' : true,
- '0C5ADD5AAE29F7A77679FA4151FEF035B865130BEDCA38D27F69929420770BED86EFBC10' : true,
- '0C7FDD6AF42AB9C89BBD207EA9DB5C3760D68974B5C2659E8A0FC1887C88D246691B182C' : true,
- '0CF89E17FCD403BDE68D9B3C0587FE8433A335C23CE8034B04E13DE5C48E791AEB8C3204' : true,
- '0E40A76CDE035D8FD10FE4D18DF96CA9A9E9780814375888F20519B06D2B0D2B6016907D' : true,
- '0EFA4BF7D760CD65F7A7068857986239D29F6C98BEFC6D986521543EE8BE56CEBC288CF3' : true,
- '0FA01300C3558AB7D37E2D04739EDE3C8B1A1106B8E26B232980FD652E6181376441FD11' : true,
- '100EADF35C841D8E035F2DC93937F552742CDF1594049CBF17A2046CC639BB3888E02E33' : true,
- '10FC635DF6263E0DF325BE5F79CD6767742C3192E607E424EB4549542BE1BBC53E6174E2' : true,
- '119279403CB18340E5AB664A679280DFA9628F4B98A91B4835BAD2C1463286BB66646A8C' : true,
- '14F108AD9DFA64E289E71CCFA8AD7D5E3921C115C15D0ECA5CCB5BC4F07D21D8050B566A' : true,
- '155EF5117AA2C1150E927E66FE3B84C3B38FECEC0B148AA686C3D00F01ECC8848E8085EB' : true,
- '15ACA5C2922D79BCE87FCB67ED02CF36E7B4F69D61EC9069DB7E90A7401A3CF47D4FE8EE' : true,
- '15B298A354704048703A375582C45AFA0048F8D37B153F6EA2798C323EF4F318A5624A9E' : true,
- '15EE9F5AA08528DF6BDD34A3A056D8307F8A77836BDC6D068F8B0737FCC5725413068CA4' : true,
- '160A1613C17FF01D887EE3D9E71261CCF88015D3F98479E1DA553D24FD42BA3F43886AEF' : true,
- '173574AF7B611CEBF4F93CE2EE40F9A2925A8F8D2C6D04E0665F596AFF22D863E8256F3F' : true,
- '1802B00127036A191B323B83DE9AA985D6BF7994F42BE5FA29DA0BD7587B591F47A44F22' : true,
- '1898C0D6E93AFCF9B0F50CF74B014417FAB7EE36972662FB2DB02AF6BF03FDE87C4B2F9B' : true,
- '18AE695D15CAB917673267D597B260C04BA7B9DDD68788E12FF852E1A024204BF286A8F6' : true,
- '1AD00CB9A6E68A3B6E95860C5B8CD8195A4D0E8B5FDCFDF64E7299A36C060DB222CA78E4' : true,
- '1B2E00CA2606903DADFE6F1568D36BB367650DF17E8E7E5B8240A4F4564BCFE23D69C6F0' : true,
- '1BD75F76734CC0DC98CA442BCC0F78DD31E2C52CE1089BEFFDDADB26DD7C782EBC4037BD' : true,
- '1C4BE2C62DB9AC3114F4400769CB1F4011C5B5F75552B011669C2E9717DE6D9BFF5FA810' : true,
- '1D3554048578B03F42424DBF20730A3F02FAF3E291435468607857694DF5E45B68851868' : true,
- '1D6496AF2D821A300BA0620D76BC53AA7FBB6ACD7E0AB438DAAF6FD50210D007C6C0829C' : true,
- '1E240EA0F876D785A3F5F8A1493D2EBAFD1ED1E2021B0B9F73E8EB75CE23436BBCC746EB' : true,
- '1E42950233926BB95FC07FDAD6B24BFCCCAB0EA04C2301D6697BDD379FCD12EB24E3949D' : true,
- '1E74C3863C0C35C53EC27FEF3CAA3CD9209900B63D955728140CD13622D8C687A4EB0085' : true,
- '200B4A7A88A7A942868A5F74567B880593E6AB220303B52328DCDA569EBAE4D1D1CCFB65' : true,
- '206BD68B4A8F48ABE488090DE5651A500CFD83DBAE44B9A0C8F676F3B570650B94B69DBF' : true,
- '2124A681C1D8F219AF4998E39DFE0BF46A174570A916FBE84453EED3D070A1D8DA442829' : true,
- '21BC82AB49C4133B4BB22B5C6B909C198BAF4C9B1DF02A92F7DA128EB91BACF498604B6F' : true,
- '21D84C822B990933A2EB14248D8E5FE84054DA6F1C3F4074ACED0FECCDDB79D153FB901D' : true,
- '21EFB85040393F756F27FEE3EA5870EBA59C9B10EC7357515ABB660C4D94F73B9E6E9272' : true,
- '222DA601EA7C0AF7F06C56433F7776D3FEB8C432DCF9769ACEAE3DD8908FFD288665647D' : true,
- '224D8F8AFCF735C2BB5734907B8B22163E2BF7F2031B96F38CE6C4D8A85D3E2D58476A0F' : true,
- '246DABD2F2EA4A66AE5BBCAE50AD6E56F9DD19266B2043F1FE4B3DCB0190AFF11F31A69D' : true,
- '2477D9A891D13BFA882DC2FFF8CD3393D8C5388AB7301B1B6ED47AE645253A6F9F1A2761' : true,
- '252AC6C5896839F9557202165EA39ED23C71D70E35A5DAA8B2E3812DC3677417F5990DF3' : true,
- '255BA669B87BF8780DC18FA6EAE47063FA0882595F9CA6A11ECCBEAF65C764C0CCC311D0' : true,
- '257ABA832EB6A20BDAFEF5020F08D7AD81968B3AEF1CDC70F5FA3269C292A3635BD123D3' : true,
- '259DCF5EB3259D95B93F00865F47943D43F9B110D5BAFD48225231B0D0082B372FEF9A54' : true,
- '266D2C1998B6706838505419EC9034600B77BEBBCB7AA24705DECC0FBD6A02FC7ABD9B52' : true,
- '27DE36FE72B70003009DF4F01E6C0424DE3F40BD5093D39B6C60F6DABC076201008976C9' : true,
- '27EC3947CDDA5AAFE29A016521A94CBB4D2378EC919539B5007F758F033B211EC54D8BCF' : true,
- '2A5D003739469475397B11A6F29341E13F85F2BB4A62B0B58BE1614ABB0D4631B4BEF8BA' : true,
- '2A954ECA79B2874573D92D90BAF99FB6A43489159A520F0D93D032CCAF37E7FE20A8B419' : true,
- '2B508718392D3BFFC3917F2D7DC08A97B19DD096DCD4E3E0FD676885505A672C438D4E9C' : true,
- '2B7020568682A018C807531228702172F17F6FB631DC99E3A3C87FFE1CF1811088D96033' : true,
- '2C20269DCB1A4A0085B5B75AAEC201378C96BAEBDD2B070748EE303266A0F3986E7CAE58' : true,
- '2C6F17A39562012065D2076EFCB83F6DB1EAC3E5B82476E9D50B1EC67D2CC11E12E0B491' : true,
- '2C8C175EB154AB9317B5365ADBD1C6F2A073E5C5BD43610D864C21130A855857CC9CEA46' : true,
- '2C8F9F661D1890B147269D8E86828CA96252DC40F71143A22FDE9EF7348E064251B18118' : true,
- '2CC2B0D5D622C52E901EF4633F0FBB324A058FDFD761DB21B0C2EE48579BE27F42A4DA1C' : true,
- '2DBBE525D3D165823AB70EFAE6EBE2E1B3EAC44776C9C81CEAF29D95B6CCA0081B67EC9D' : true,
- '2E03FDC5F5D72B9464C1BE8931F1169B96995C7711E8E52DF9E34BECEC67D3CBF1B6C4D2' : true,
- '30C908DDD73E63A4092814C74EB97E2CCFE4313DBA05B8A7C30063995A9EB7C247AD8FD5' : true,
- '30C9E71E6BE614EB65B216692031674D3BC0380B33C3F6A60C86152293D9DFF54B81C004' : true,
- '31853C62949763B9AAFD894EAF6FE0CF1F4914F7D874951DDDAE02C0BEFD3A2D82755185' : true,
- '324A4BBBC863699BBE749AC6DD1D4624AD7E1C28B064EF8F6003402014C3D0E3370EB58A' : true,
- '3327D16CFC9185FC8C7E98FA854EF305E70715F6F728365B5190E271DEE4C65EBEEACAF3' : true,
- '33B784F55F27D76827DE14DE122AED6F0747220199CE74B97CB03D79B264A2C855E933FF' : true,
- '343339FC6D033A8FA25385443270DEC45E5A168867BFFF00987D0B1DC2AB466C4264F956' : true,
- '34FCB8D036DB9E14B3C2F2DB8FE494C7379A197B418545350CA60369F33C2EAF474F2079' : true,
- '354895364A545A72968EE064CCEF2C8CC90D1BEA883DA7D117BE3B79F4210E1A5894A72D' : true,
- '370971C4AFEB7501AE636C3016BFD1E5A399F76F0CBF4C9DA55E4AC24E8960984B2905B6' : true,
- '3741491B18569A26F5ADC266FB40A54C4313BB96F1D5869BC14E6A92F6CFF63469878237' : true,
- '3785445332451F20F0F395E125C4434EF48B11BFDEABBE94542071E641DE6BBE882B40B9' : true,
- '37A56ED4B1258497B7FD56157AF9A200B435D4E1119D1C6690A749EBB394BD637BA782B7' : true,
- '3916AAB96A41E11469DF9E6C3B72DCB6879F4BEE05DF98583BE360D633E70D3FFE9871AF' : true,
- '3AB2DE229A209349F9EDC8D28AE7680D36863563FD5128C7BEA6F005CFE9B43668086CCE' : true,
- '3AE550B039BEC7463633A1FE823E8D943CBB5DE0FCD6397C0588E56697BD462ABDF95C76' : true,
- '3B0AE4BB416A84B39D2C575E6542BE478E1032E9245944F84791983EC9E829CB1059B4D3' : true,
- '3C4C25CC0A19CAEE6AEB55160086725F23E833233E7D0CC92B7C4279AC19C2F474D604CA' : true,
- '3D4129CB1EAA1174CD5DB062AFB0435BDDE1D2A901802E1D875E84B3807E4BB1FD994134' : true,
- '3E455215095192E1B75D379FB187298AB1BC968BD4F49D622AA89A81F2150152A41D829C' : true,
- '3E80175BADD77C104BF941B0CF1642B000EA522C8A9C06AA3ECCE0B4FA6CDC21D92E8099' : true,
- '3F459639E25087F7BBFE980C3C2098E62AC8D58B57CEBF2F49AFF2FC768F511462907A41' : true,
- '400125068D21436A0E43009CE743F3D5F9CD0E2CDA7624C18FBDF0F0ABB645B8F7FED57A' : true,
- '410352DC0FF7501B16F0028EBA6F45C5DAC9024F54D8F6DF94935FB1732638CA6AD77C13' : true,
- '41B807F7A8D109EEB49A8E704DFC1B787A74410FB0CD5C972A364B71BF031D88A6510E9E' : true,
- '4265CABE019A9A4CA98C4149CDC0D57F293621028B20ED02F566C532D1D6ED909F45002F' : true,
- '42769768CFA6B43824AAA11BF267DECA4178AB4CBFCE7B4102ACDAC4933E6FF50DCF715C' : true,
- '4281A0E21CE35510DE558942659622E6E0B4322EB2F6A568B654538448184A5036874384' : true,
- '429BD669C6D445AD2E81511D355A89624F555CE20DCD3364E0DC7C41EFDD40F50356C122' : true,
- '45E1A572C5A93664409EF5E45884678C6B2F34AD8958BE62FDB06B5CCEBB9DD94F4E39F3' : true,
- '45F750114EC5ADBD53688663EC7B6AE1C09AB0C8AD7114714ED5E21A5A276ADCD5E7EFCB' : true,
- '468C210EAB92214659DBA6DB0061DE265A5A4DAF7861267C4B1F1E67586BAE6ED4FEB93F' : true,
- '48D11E627801C26E4369A42CEE130AB564902AD7277AF3E32CD8CC1DC79DE1FD7F8069EA' : true,
- '4963AE27F4D5953DD8DB2486B89C0753D3C063F219ED073E34AD5D750B327629FFD59AF2' : true,
- '497904B0EB8719AC47B0BC11519B74D0D1EB23A46D17D68FD92564C2F1F1601764D8E349' : true,
- '49EFA6A1F0DE8EA76AEE5B7D1E5FC4463E42A18706BD0C9CCF594750D2E4D6AB0048FDC4' : true,
- '4B1C568CA0E8C79E1EF5EE32939965FE4C95A9902ABE0777CED18D6ACCC3372D2748381E' : true,
- '4B6771BE33B90DB64B3A400187F08B1F7AC5FFF8DCBC5583176877073BF751735E9BD358' : true,
- '4B798DD41D0392AA51EE04E5906F474954F9C163759F19045121A319F64C2D0555B7E073' : true,
- '4BE2C99196650CF40E5A9392A00AFEB28CF427FD790C3AD166068DE81E57EFBB932272D4' : true,
- '4C5641E50DBB2BE8CAA3ED1808AD43390483ED3399AC3608058722EDBC5E4600E3BEF9D7' : true,
- '4D56677ECCE6457259B74F511172E169C0DB578157E9EE82B5917DF0DD6D82EE9039C4E2' : true,
- '4FEBF1F070C280635D589FDA123CA9C4E392512F0ACFF505DFF6DE067F7537E165EA574B' : true,
- '50193E2FE8B6F4055449F3AEC98B3E1947AFB915CDA26D82467B97FA42914468726138DD' : true,
- '5186E81FBCB1C371B51810DB5FDCF62078E9DD0650624DB9CB36B50767F209B843BE15B3' : true,
- '556EBEF54C1D7C0360C43418BC9649C1245C97DF7514E7CF2DF8BE72AE957B9E04741E85' : true,
- '565FAA80611217F66721E62B6D61568E8025EFF46E70C8D472246584FE403B8A8D6ADBF5' : true,
- '58EB470764D62CBAE29B96552B9700B56A6F2A8B6E2615088DF59CD24C402418AE42A3F1' : true,
- '59736628512B98B410FF7D06FA22D6C8A0F8DB3F0BF417693B282EB74A6AD86DF9D448A3' : true,
- '5A11B922850289E1C3F22CE14EC101844B421F7515F6AE8A6ECEF97F6982A400A4D9224E' : true,
- '5B6F532CBB8188FA6C042C325DA56B967CA04FD8064C1CAA32A37AA94375038E8DF8DDC0' : true,
- '5B9EFD3B6035EA688E52FE1319144AA36B81446A5CDDF474A0F800FFBE69FD0DB6287516' : true,
- '5C48DCF74272EC56946D1CCC713580756631BF9EF74F9EB6C9D5A60CBA6ABED1F7BDEF7B' : true,
- '5E397BDDF8BAEC82E9AC62BA0C54002BCA3AFBCF1240364B44B216208880483919937CF7' : true,
- '5E809E845A0E650B1702F355182A3ED7786A74AC76AB147F9C6A3050BA9EA87EFE9ACE3C' : true,
- '5F944A7322B8F7D131EC5939F78EFE6E9FC796E8F8524F863AE1496D381242105F1B78F5' : true,
- '60847C5ACEDB0CD4CBA7E9FE02C6A9C0101DFA3FD50BCBBB9BB5600C1955A41AF4733A04' : true,
- '649CEF2E44FCC68F5207D051738FCB3DDA40188B9189A3EDEEAEDA97FE2F9DF5B7D18A41' : true,
- '65295911BB8F5166890D47824002C5AFC4674DDC6CE2967FF9C92E072EF8E8A7FBD6A131' : true,
- '6558AB15AD576C1EA8A7B569ACBFFFEBE5DF743CB601C49B9843DCAB8CE86A81109FE48E' : true,
- '67AC0D773011DED143AE7B737190BCA9ED8DC8386C4886AEEE079158AAC3BFE658E394B4' : true,
- '67CB9DC013248A829BB2171ED11BECD4D23209AD23D314232174E40D7F9D62139786633A' : true,
- '689B17C654E0E0E099551642F75A86D8027268293E5F5D17AAA4B3C3E6361E1F92575EAA' : true,
- '6960ECBE8C94D76E6F2EC4782F55F08397226AAE4A7A64A59BD16787F27F841C0A001FD0' : true,
- '6C397DA40E5559B23FD641B11250DE435F3B8CF2F810B37D78B4CEEC1919C37334B9C774' : true,
- '6CC9A76E47F10CE3533B784C4DC26AC5B72FFF92D2CE43DE0A8D4C548C503726A81E2B93' : true,
- '6D38C49B22244CA3A8B3A09345E157FA89C32E6B524E4D65388B9ECEDC637134ED4193A3' : true,
- '70B57C4881953E80DC289BBAEF1EE4854072BA31FEC351438480F62E6CB95508461EAB2F' : true,
- '711F0E21E7AAEA323A6623D3AB50D66996974CD6B663A7184526B1D648AD815CF51E801A' : true,
- '71AA6AAF1FA5C0D50E90D40BF6AADFCC55C86F7414AC8BDD6814F4D86AF15F3710E104D0' : true,
- '71E265FBCD7B0B845BE3BCD76320C598CFF810FB2C4FFC0156BFE1E1FABCB418C68D31C5' : true,
- '72E44A87E369408077EABCE3F4FFF0E15F43E5B1BFF8788CAC1CC7CA4A9AC6222BCC34C6' : true,
- '733A747AECBBA396A6C2E4E2C89BC0C3AEC5FB3FC8E1BFC4E54F03075A9AE800B7F7B6FA' : true,
- '739DD35FC63C95FEC6ED89E58208DD897FB9E2C995C97A939F9E81A07AEA9B4D70463496' : true,
- '74014A91B108C458CE47CDF0DD11530885A408C09C193E5D51587DCDD61330FD8CDE37BF' : true,
- '747B820343F0009E6BB3EC47BF85A5934463C531D7CCC1006794612BB656D3BF8257846F' : true,
- '74A82C81432B35609B78056B58F36582CFF360F524CB20F1FEAD89006F7F586A285B2D5B' : true,
- '770D19B121FD00429C3E0CA5DD0B028E25019019CFFBD9991CB76825748D945F30939542' : true,
- '774AF42C9DB027B747B515E4C762F0FCDF646DCB7B0FD3A96AEE88C64E2D676711FF9D5F' : true,
- '782A02DFDB2E14D5A75F0ADFB68E9C5D4F65566336DB6598581D584A596C87934D5F2AB4' : true,
- '78A5FB104BE4632ED26BFBF2B6C24B8EEC0C3716EA9EDFADD35DFBD55608E60A05D3CBF3' : true,
- '79E4A9840D7D3A96D7C04FE2434C892EA8985D3A65E5E5C4B2D7D66D40C6DD2FB19C5436' : true,
- '7A79544D07923B5BFF41F00EC739A298C060ED44CBD881BD0EF86C0BA287DDCF8167478C' : true,
- '7BB508999A8C18BF85277D0EAEDAB2AB24BA6D6C8A5B5837A48DB5FAE919EA675C94D217' : true,
- '7C62FF749D31535E684AD578AA1EBF239F744E9F2B4DBAEC0F312C50B6563B8E2D93C311' : true,
- '7CA50FF85B9A7D6D30AE545AE342A28A59AF82799186C7B47507CBCF035746EB04DDB716' : true,
- '7D86908F5BF1F240C0F73D62B5A4A93B72997913EC9B0DAE65D1B6D7B24A76A3AEC2EE16' : true,
- '7E234E5BA7A5B425E90007741162AED67F8AB0CFD051876A66F3360F47C88D8CD335FC74' : true,
- '7F667A71D3EB6978209A51149D83DA20BE36A4562FB2EE05DBB3D32323ADF445084ED656' : true,
- '803ABC22C1E6FB8D9B3B274A321B9A0147BEABC922EAE80E78783462A79F45C254FDE68B' : true,
- '8135B9FBFB12CA186936EBAE6978A1F1DCBB9EB7194BC47205C111752986835B53CAE4F8' : true,
- '81D6ED354F1F26D031D040DD8AE5810DE0925E18C7765E22DABD9427529DA6AF4E066428' : true,
- '8212F789E10B9160A4B6229F9468119268ED18B309CD5291C0D3357C1D1141BF883866B1' : true,
- '824AD493004D66B6A32CA77B3536CF0B687EC17E0602E3CD3F7DFBD7E28D57A0199A3F44' : true,
- '8292BA5BEFCD8A6FA63D55F984F6D6B7F9B5B632455F9CBEEC575F80DCE96E2CC7B278B7' : true,
- '84901D95304956FC4181F045D776C46B439E525F5A6A47C32CEBC45C63ED39317CE5F4DF' : true,
- '852FF4764CD5426CCB5E7DF717E835BD4EFCED9C6BDD0C985CA3C7D253063C5BE6FC620C' : true,
- '85CA765A1BD16822DCA22312CAC680345BCDCDCC66F6DCE4441FE37D5CC3134C46F47038' : true,
- '86386D5E49636C855CDB6DDC94B7D0F7ACED5F6553FD25CE015F1F7A483B6A749F6178C6' : true,
- '86420509BCA79DEC1DF32E0EBAD81DD01D8259CA2127C3CBC16CD932F62C65298CA88712' : true,
- '86ACDE2BC56DC3D98C2888D38D16131ECE6A64A309E42FBBD9851C453E6409EAE87D60F1' : true,
- '86EF8E319D9F8569A2A41A127168BA1B90DECE77F8C825340E62EBD635E1BE20CF7327DD' : true,
- '8714AB83C4041BF193C750E2D721EBEF30779E9315022E94856A3FF8BCF815B082F9AEFD' : true,
- '879055F2CE31153C33D927C876E37DE13070F8833E4AA6803E09A646AE3F7D8AE1FD1654' : true,
- '87CE0B7B2A0E4900E158719B37A893720563B8630D62D75ABBC8AB1E4BDFB5A899B24D43' : true,
- '882C8C52B8A23CF3F7BB03EAAEAC420B74207441729CDD92EC7931D823108DC28192E2BB' : true,
- '8949548CC8689A8329ECDC067321AB97A60F34C8626C81F68BF77DA9F667588A903F7D36' : true,
- '8956AA4D441E59D805A1886DEAC828B26372C49DA9FFF051B8B5C7D4E5AAE30384024B9C' : true,
- '8BCA525F7553D02C6F630D8F882E1CD78EB03FC3CF7BB292866268B751223DB5103405CB' : true,
- '8CCADC0B22CEF5BE72AC411A11A8D81291C6D6EE3E8AC86384E548C299295C756C817B81' : true,
- '8CD79FEBC7B8144C5478A7903BA935671F55E8839BAC30728BE7108EDE7B0BB0D3298224' : true,
- '8D26FF2F316D5929DDE636A7E2CE6425720FC15DDC27D456D098FABF3CDD78D31EF5A8DA' : true,
- '8D639B56C114E4EE9A128586119082A3D2441AA8C203AECAA96E501F124D52B68FE4C375' : true,
- '8D7251DBA03ACF2077DFF265065EDFEFC8C25F169EF85074D5BEE8CDA2D43CAEE75FD257' : true,
- '8EADB501AA4D81E48C1DD1E1140095193679CA35668772304D30A5FB873B0FA77BB70D54' : true,
- '8F5D770627C4983C5B9378E7D77D9BCC7E784A101C8265CC2DE1F16D47B440CAD90A1945' : true,
- '8F91E7EEE3FCDA86CAFCDC70EDB7B70C8250BED5A214433A66377CBC10EF83F669DA3A67' : true,
- '911B3F6ECD9EABEE07FE1F71D2B36127E19FE30E8B84609E809B170D72A8C5BA6E1409BD' : true,
- '91DE0625ABDAFD32170CBB25172A84672796BAE63F1801E277261BA0D77770028F20EEE4' : true,
- '91F4035520A1F8632C62DEACFB611C8E21FCBD8E7F6CAF051BD1B343ECA8E76147F20F8A' : true,
- '9265588BA21A317273685CB4A57A0748E621F3354379059A4B68309D8A2F74221587EC79' : true,
- '932A3EF6FD23690D7120D42B47992BA6CBA1C5F8B0E35EB8B94512D3F934A2E90610D336' : true,
- '937F901CED846717A4655F9BCB3002978781C25A96BDC2FB4C65064FF9390B26048A0E01' : true,
- '93C28E117BD4F30319BD2875134A454AAB48F333DB04ABB9C072DA5B0CC1D057F0369B46' : true,
- '93EB36130BC154F13E7505E5E01CD4375F4E1FCF31B7913B850B54F6E5FF501A2B6FC6CF' : true,
- '93F1AD340B2BE7A85460E2738CA49431705D2B4565C7047A540694A79AF7ABB842BDC161' : true,
- '9414777E3E5EFD8F30BD41B0CFE7D03075E0ABB6138512271C04F85FDDDE38E4B7242EFE' : true,
- '96897D61D1552B27E25A39B42A6C446F8EFDCABC93E61E925D4D1DED181A4320A467A139' : true,
- '9760E8575FD35047E5430C94368AB06290AEA26985FF14804C434952ECE9608477AF556F' : true,
- '978FC66B3B3E40857724750B76BB55F8B5D303BF8682E152919D83F184ED05F1DCE5370C' : true,
- '9A771918ED96CFDF1BB70EF58DB9882ECF74BFFF9B86815B08335440363E87B6B6F0BF73' : true,
- '9AAEF722F533FB4EEC0A249DC63D7D255E997CA5945AAB75FFD14804A974BF2AE1DFE7E1' : true,
- '9B340D1A315B97462698BCA6136A71969E6CEB179185A29EC6060CA53E1974AF94AF59D4' : true,
- '9D666ACCFFD5F543B4BF8C16D12BA8998939576E178DF705780FCC5EC84F84F6253A4893' : true,
- '9DFBF9ACED893322F428488325235BE0A69A91FD057F136A42630BB1760D2D51120C1650' : true,
- '9E80FF78010C2EC136BDFE96906E08F34ABDEEEC950D359C89AEC752A12C5B29F6D6AA0C' : true,
- '9F6C1F0F07AC1921F915BBD5C72CD82AF5C27CF5FFF3029ACF1A1A4BEC7EE1964C77D784' : true,
- '9FDDDBABFF8EFF45215FF06C9D8FFE2B9656CD7B57969895D0E141466806FBB8C6110687' : true,
- 'A10B44B3CA10D8006E9D0FD80F920AD1B80186D1EB9C86A54104CF3054F34C52B7E558C6' : true,
- 'A208E4B33EEFDE084B60D0BF7952498D8CC4307BC60755E7B22DD9F7FEA245936C7CF288' : true,
- 'A2339B4C747873D46CE7C1F38DCB5CE985371CA6E550143DCE2803471BDE3A09E8F8770F' : true,
- 'A26F53B7EE40DB4A68E7FA18D9104B7269BD8CF49CD300FB592E1793CA556AF3ECAA35FB' : true,
- 'A33D88FE161BDDF95C9F1A7FD8C89008A3E31E20B2E46A328520472D0CDE9523E7260C6D' : true,
- 'A37D2C27E4A7F3AA5F75D4C49264026AB6AF5BE5F878A00114C3D7FEF8C775C34CCD17B6' : true,
- 'A3EC750F2E88DFFA48014E0B5C486FFB37F76DE6077C90C5B13E931AB74110B4F2E49A27' : true,
- 'A66B6090239B3F2DBB986FD6A7190D46E0AB059420725493056062023670F7CD2EFC6666' : true,
- 'A771FD26FC3CE540F19906EBC1936DE9E619D25B380B7B13FDA33E8A58CD82D8A88E0515' : true,
- 'A7F2E41606411150306B9CE3B49CB0C9E12DFB4B41D7D9C32B30514BAC1D81D8385E2D46' : true,
- 'A80D6F3978B9436D77426D985ACC23CAD6DAA8208D09D2154D24B52FCB346EB258B28A58' : true,
- 'A8EDDEEB938866D82FC3BD1DBE45BE4D7639C71847E151B5C7EA01C758FBF12ABA298F7A' : true,
- 'A923759BBA49366E31C2DBF2E766BA87317A2AD07F2B335EF5A1C34E4B57E8B7D8F1FCA6' : true,
- 'A981C0B73A9250BC91A521FF3D47879FCB658264EA8CDA186E1752FB52C397367EA387BE' : true,
- 'AA088FF6F97BB7F2B1A71E9BEAEABD79CF9E876DD3EBFC422697A3B5A37AA076A9062348' : true,
- 'AA8E5DD9F8DB0A58B78D26876C823555409D4BD917B55C27B69B64CB9822440DCD09B889' : true,
- 'AABFBF6497DA981D6FC6083A957033CA394FF6850B06BE52E51856CC10E180E882B385CC' : true,
- 'AB57A65B7D428219B5D85826285EFDFFB12E13634586A46F1AB2606837582DC4ACFD9497' : true,
- 'ABAB8D2DB740E5973D2FF2A63BDA6A05C18211328A92B3B23809B9B5E2740A07FB12EB5E' : true,
- 'ABBFEAE36B29A6CCA6783599EFAD2B802F173F7DE99667AFA57AF80AA2D1B12FAC830338' : true,
- 'ACB694A59C17E0D791529BB19706A6E4D4DE20D05E66FC53FE1A50882C78DB2852CAE474' : true,
- 'AD8E0F9E016BA0C574D50CD368654F1ECFDEFE102FDA05BBE4C78D2E4423589005B2571D' : true,
- 'AFB8336E7CDDC60264AD58FC0D4F7BCFBC7B3C6FEF26B9F7AB10D7A1F6B67C5ED2A12D3D' : true,
- 'B001EE14D9AF291894768EF169332A846E3A55A4190C195C93843CC0DB722E313061F0B1' : true,
- 'B147BC1857D118A0782DEC71E82A9573204285DCF7EB764195578E136BD4B7D1E98E46A5' : true,
- 'B39C25B1C32E32538015309D4D02773E6782AAE0EDEEE21A5839D3C0CD14680A4F60142A' : true,
- 'B3A53E77216DAC4AC0C9FBD5413DCA0658119F0E128287EA50FDD987456F4F78DCFAD6D4' : true,
- 'B44ADBE85916461E5AD86EDA064352622964B686135B5DFDDD3253A89BBC24D74B08C64D' : true,
- 'B465220A7CADDF41B7D544D5ADFA9A75BC9219DDC98E14BF1A781F6E280B04C27F902712' : true,
- 'B4819E89AC1724FD2A4285271D0C2B5D20CB594FB4EDD895763FD5254E959A6674C6EEB2' : true,
- 'B5E83436C910445848706D2E83D4B805039EEDB80BE7A03C6953893B20D2D9323A4C2AFD' : true,
- 'B75274E292B48093F275E4CCD7F2EA263BC49F48F8F373A09C1EBDF85BB1C365C7D811B3' : true,
- 'B774CD487C5F9A0D3BF3FE66F41B3DFA5B4E0EC28EBD8292A51782241281AD9FEEDD4E4C' : true,
- 'B7B0D1EC1A033ECEA91511CCB16FB2AEE3D73606996CDFEF61FA04C335E98EA96104264A' : true,
- 'B8089AF003CC1B0DC86C0B76A1756423A0A1AB90C9FC847B3B1261E8977D5FD32261D3CC' : true,
- 'B816334C4C4CF2D8D34D06B4A65B4003838E30F77FDD14AA385ED145009C0E2236494FAA' : true,
- 'B8D312034E8C0C5A47C9B6C59E5B97FD0560A2C738FF98D1172A94FE45FB8A47D665371E' : true,
- 'BA21EA20D6DDDB8FC1578B40ADA1FCFC801D62D07B449D5C5C035C98EA61FA443C2A58FE' : true,
- 'BA926442161FCBA116481AF6405C59870456F23D1E9C43AECB0D807F1C0647551A05F456' : true,
- 'BC6C5133A7E9D366635415721B2192935922A1E15AEA163521F898396A4646B0441B0FA9' : true,
- 'BD8ACE34A8AE6148E85EC87A1CE8CCBFD2EDF88B41B6FE01461D6E2834EC7C8F6C77721E' : true,
- 'BDD6F58A7C3CC4A6F934CCC38961F6B2CABB51672400588E6419F1D40878D0403AA20264' : true,
- 'BE395ABE078AB1121725CC1D46343CB2DE990CED99E0431F60EDC3937E7CD5BF0ED9E5FA' : true,
- 'BF6059A35BBAF6A77642DA6F1A7B50CF5D989CDB159611365165641B560FDBEA2AC23EF1' : true,
- 'BFB5E77D3DEA6F1DF08A50BC8C1CFA1DE4554333CA390E128B8BF81D90B70F4002D1D6E9' : true,
- 'C1623E23C582739C03594B2BE977497F2AB628485E78FBF3AD9E7910DD6BDF99722C96E5' : true,
- 'C1D43E07AEEBECFD7589E67EA84CEBCD76B76096DD145629AC7585D37063C1BC47861C8B' : true,
- 'C1D951C084B86A75E82FD7D65F7EAC460B972C9EA6E7CC58D93B20BF71EC412E7209FABF' : true,
- 'C22A59ABCF152F4CF7E631A316AE840C9158C5EF987301A8903CFDAB03D72DA1D88909C9' : true,
- 'C2DBAB8E9652C5EEAEF25500896D55953913853E45C439A2DA718CDFB6F3E033E04FEE71' : true,
- 'C45D0E48B6AC28304E0ABCF938168757D8A6332CE0036FB185F6634F7D6A066526322827' : true,
- 'C463AB44201C36E437C05F279D0F6F6E97E2E99636A547554F838FBA38B82E74F89A830A' : true,
- 'C4D7F0B2A3C57D6167F004CD43D3BA5890DEDE9E4C4E9F6FD88617579DD391BC65A68964' : true,
- 'C570C4A2ED53780CC810538164CBD01D23E594945195F2414803B4D564D2A3A3F5D88B8C' : true,
- 'C5A1B7FF73DDD6D7343218DFFC3CAD8806083F593F15A104A069A46BA903D006B7970991' : true,
- 'C5DFB849CA051355EE2DBA1AC33EB028D69B561148F01C77C54578C10926DF5B856976AD' : true,
- 'C5E67BBF06D04F43EDC47A658AFB6B19339B6B1450249B557A01877284D9E02FC3D2D8E9' : true,
- 'C69F6D5CB379B00389CBF03FA4C09F8AEF2DACCBEABB682D32CE4ABD6CB90025236C07BC' : true,
- 'C7BD11D6918A3582C53666017C6F4779634C3B0230CF1B78B4569FECF2C04A8652EFEF0E' : true,
- 'C86E97F335A729144782892391A6BEC84A3F8D6BDC0E1ECFCD72E377DEF2D7FF92C19BC7' : true,
- 'C91962D0DA7E1020FCA4CD0380872DF551A44C28F313E3F9CB5E7C0A1E0E0DD2843758AE' : true,
- 'C9982777281E3D0E153C8400B88503E656E0FAC03B8F18235518E5D311CAE8C24331AB66' : true,
- 'CA3DD368F1035CD032FAB82B59E85ADB97817950D81C9670CC34D809CF794431367EF474' : true,
- 'CB17E431673EE209FE455793F30AFA1C4EB6D578499B1CCF5F581EAD56BE3D9B6744A5E5' : true,
- 'CBBDC3682DB3CB1859D32952E8C66489C9321DE6B5A82666CF6971A18A56F2D3A8675602' : true,
- 'CC4DAEFB306BD838FE50EB86614BD2269C615C4D4D85103A5326C24DBAEAE4A2D2D5CC97' : true,
- 'CD3B3D625B09B80936879E122F7164BA67EB337B684CEB0EC2B0760AB488278CDD9597DD' : true,
- 'CD68B6A7C7C4CE75E01D4F5744619209132D0D45534B6997CDB2D5C339E25576609B5CC6' : true,
- 'CD996CDB2AC296155ABF879EAEA5EE93EE29D6EA98E632C6E527E0906F0280688BDF44DC' : true,
- 'CDF439F3B51850D73EA4C591A03E214BE1A45B141A21DA1A79F41A42A961D669CD0634C1' : true,
- 'CE78335C5978016E18EAB936A0B92E23AE5083ED7CF45CBC8F61C621FE685D794221156E' : true,
- 'CF8F3B62A3CACA711BA3E1CB4857351F5D003860F002ED829DEAA41868F788186D62127F' : true,
- 'CFF4270DD4EDDC6516496D3DDABF6EDE3A44735AE581901F248661461E3B9CC45FF53A1B' : true,
- 'D2EDEE7992F78272180BFED98BEC13D8A7F8390BA57705096FD36941D42E7198C6D4D9D5' : true,
- 'D35376E3CE58C5B0F29FF42A05F0A1F2211165CA379FBB5ED801E31C430A62AAC109BCB4' : true,
- 'D3D9BDAE9FAC6724B3C81B52E1B9A9BD4A65D5F41DEF39B8B8904A4AD3648133CFC7A1D1' : true,
- 'D3F3A616C0FA6B1D59B12D964D0E112E74F8A3C3EFE7B390064B83903C21646020E5DFCE' : true,
- 'D474DE575C39B2D39C8583C5C065498A5FB7EE0633E259DBAD0C4C9AE6D38F1A61C7DC25' : true,
- 'D480656824F9892228DBF5A49A178F14016897E1A0B8F2C3B134665C20A727B7A158E28F' : true,
- 'D59788DA6416E71D664AA6EA37FC7ADCEC93DE083C93D933A986B3D5CDE25ACB2FEECF8E' : true,
- 'D5BEFFB5EE826CF0E2578EA7E5346F03D904080A4929C838E9F185ECF7A22DEF99342407' : true,
- 'D5E98140C51869FC462C8975620FAA7807E032E020B72C3F192F0628A2593A19A70F069E' : true,
- 'D63981C6527E9669FCFCCA66ED05F296B51C067CEE2B0C3DF855AB2D92F4FE39D4E70F0E' : true,
- 'D6A5C3ED5DDD3E00C13D87921F1D3FE4B31EB1B740E36C8402DADC37D44DF5D4674952F9' : true,
- 'D6ED3CCAE2660FAF10430D779B0409BF85B5FF679B0C79961FC86E4422004613DB179284' : true,
- 'D7343DEF1D270928E131025B132BDDF7B172B1A56D95F91FE50287E14D37EA6A4463768A' : true,
- 'D87E32EF69F8BF72031D4082E8A775AF42EFDDE6BFF35ED0BAE6ACDD204C50AE86C4F4FA' : true,
- 'DA26B6E6C7C2F7B79E4659B3577718653E84D3BCC544C0F6FA19435C851F3F2FCBA8E814' : true,
- 'DB233DF969FA4BB9958044735E7D4183273EE12457FDC4F90C55E82B56167F62F532E547' : true,
- 'DBC8F2272EB1EA6A29235DFE563E33DFC8EC8C879269CB4BAB39E98D7E5767F31495739D' : true,
- 'DC32C3A76D2557C768099DEA2DA9A2D18782C6C304353BCFD29692D2593E7D44D934FF11' : true,
- 'DC6D6FAF897CDD17332FB5BA9035E9CE7F88CD7223F3C813818C994614A89C99FA3B5247' : true,
- 'DD753F56BFBBC5A17A1553C690F9FBCC24A40A1F573643A67F0A4B0749F6A22BF28ABB6B' : true,
- 'DF0DBC7CC836B77699A1ABF0D20F896A342CD9D3062DA48C346965297F081EBC2EF68FDC' : true,
- 'DF168A83EA83845DB96501C6A65D193EDBAC3C7AA4254DA1AA5CAAD68468CB88EEDDEEA8' : true,
- 'DF3C735981E7395081044C34A2CBB37B61573A11DF0ED87ED5926522EAD056D744B32371' : true,
- 'DFF28073CCF1E66173FCF542E9C57CEE99A69BE61AFE886B4D2B82007CB854FC317E1539' : true,
- 'E006A1C97DCFC9FC0DC0567596D862139BAAE59F56EE21CB435ABE2593DFA7F040D11DCB' : true,
- 'E14B5273D71BDB9330E5BDE4096EBEFB216B2A29E62A00CE820146D8244141B92511B279' : true,
- 'E1C07EA0AABBD4B77B84C228117808A7CDD4EEAE6000AC7F40C3802C171E30148030C072' : true,
- 'E2D52023ECEEB872E12B5D296FFA43DA9BACF3B664EAC5A17BED08437C72E4ACDA12F7E7' : true,
- 'E2D8F867F4509435FC5E05FC822295C30446C8BB9A6983C95C8A2E5464687C1115AAB74A' : true,
- 'E2F8E080D0083F1EC1E9D23F8069AE06C73026E325FE21916B55C4B53A56B13DCAF3D625' : true,
- 'E60BD2C9CA2D88DB1A710E4B78EB024140E78C1D523D1CD9954FAC1A1AB3BD3CBAA15BFC' : true,
- 'E77ADCB11F6E061F746C591627C34BC07454535C24A3A758207E3E3ED324F816FB211649' : true,
- 'E8CC9FB09B40C51F4FBA7421F952857A688B6EB807E8EDA5C7B17C4393D0795F0FAE155F' : true,
- 'EBB04F1D3A2E372F1DDA6E27D6B680FA18F7C1FCC3090203FD5BAA2F861A754976C8DD25' : true,
- 'EBF59D290D61F9421F7CC2BA6DE3150928903A635B5280FAE6774C0B6DA7D6BAA64AF2E8' : true,
- 'EC407D2B765267052CEAF23A4F65F0D8A5EC73D48C34FCBEF1005AEB85843524BBFAB727' : true,
- 'ED41F58C50C52B9C73E6EE6CEBC2A8261B4B396126276B6491A2686DD70243212D1F1D96' : true,
- 'EE2931BC327E9AE6E8B5F751B4347190503006091D97D4F5AE39F7CBE7927D7D652D3431' : true,
- 'EE7A41E0CF757D889280A21A9A7BA157679A4F81FC705DDEC419778DD2EBD875F4C242C6' : true,
- 'EEFE6169656EF89CC62AF4D72B63EFA29FAD91A6CE6AC6C50047C44EC9D4A50D92D84979' : true,
- 'EF5AF133EFF1CDBB5102EE12144B96C4A1DB6393916F17E4185509400415C70240B0AE6B' : true,
- 'F058C503826717AB8FDA0310278E19C2CB44A097857C45FA187ED952086CB9841F2D51B5' : true,
- 'F096B62FC510D5678E832532E85E2EE52388C9D371CC9E963DFF7D3CA7CEFCD625EC190D' : true,
- 'F09E639376A595BC1861F19BFBD364DD80BF3DE9A41D768D194B293C85632CDBC8EA8CF7' : true,
- 'F16A2218C9CDDFCE821D1DB7785CA9A57998A308E14D6585E6C21E153A719FBA5AD34AD9' : true,
- 'F1BC636A54E0B527F5CDE71AE34D6E4A36B12B49F9819ED74C9EBC380FC6568F5DACB2F7' : true,
- 'F20598E5964BBE5D55181B55B388E3929078C5A28F9A4325C2A7C73813CDFE13C20F934E' : true,
- 'F27DE954E4A3220D769FE70BBBB3242B049811056AFE9FD0F5BE01685AACE6A5D1C4454C' : true,
- 'F37E3A13DC746306741A3C38328CFBA9253F775B0E7797AB645F15915597C39E263631D1' : true,
- 'F3D752A875FD18ECE17D35B1706EA59C968338F113E36A7BABDD08F7776391A68736582E' : true,
- 'F4FF97428070FE66168BBED35315819BF44095C238AC73FC4F77BF8F98DF70F8F091BC52' : true,
- 'F520DA5203862B92768D5CB72D8B93ADA65CB4733D94A5C865A864647C2C01272C89B143' : true,
- 'F775AB29FB514EB7775EFF053C998EF5DE28F4A4FFE5B92FA3C503D1A349A7F9962A8212' : true,
- 'F7B661AB03C25C463E2D2CF4A124D854FAA7D9FB31B746F200A85E65797613D816E063B5' : true,
- 'F8387C7788DF2C16682EC2E2524BB8F95F3AFC0A8B64F686673474DF7EA9A2FEF9FA7A51' : true,
- 'F8BEC46322C9A846748BB81D1E4A2BF661EF43D77FCAD46151BC98E0C35912AF9FEB6311' : true,
- 'FB1B5D438A94CD44C676F2434B47E731F18B538D1BE903B6A6F056435B171589CAF36BF2' : true,
- 'FC11B8D8089330006D23F97EEB521E0270179B868C00A4FA609152223F9F3E32BDE00562' : true,
- 'FD49BE5B185A25ECF9C354851040E8D4086418E906CEE89C2353B6E27FBD9E7439F76316' : true
-};
diff --git a/src/chrome/content/code/STS.js b/src/chrome/content/code/STS.js
deleted file mode 100644
index 17999aaeda3a..000000000000
--- a/src/chrome/content/code/STS.js
+++ /dev/null
@@ -1,228 +0,0 @@
-// http://lists.w3.org/Archives/Public/www-archive/2009Sep/att-0051/draft-hodges-strict-transport-sec-05.plain.html
-
-const STS = {
-
- enabled: false,
-
- get db() {
- delete this.db;
- return this.initPersistentDB();
- },
-
- initPersistentDB: function() {
- return this.db = new STSDB(STSPersistence);
- },
-
- processRequest: function(chan) {
- if (this.enabled) {
- var uri = chan.URI;
- if (uri.schemeIs("https")) {
- try {
- this.db.processHeader(uri.asciiHost, chan.getResponseHeader("Strict-Transport-Security"));
- } catch (e) {}
- }
- }
- },
-
- isSTSURI: function(uri) {
- return this.enabled && this.db.matches(uri.asciiHost);
- },
-
- enterPrivateBrowsing: function() {
- try {
- this.db.save();
- } catch(e) {}
-
- this.db = new STSDB(this.db);
- },
-
- exitPrivateBrowsing: function() {
- this.initPersistentDB();
- },
-
- eraseDB: function() {
- this.db.reset();
- STSPersistence.save(this.db);
- },
-
- patchErrorPage: function(docShell, errorURI) {
- // see #errors-in-secure-transport-establishment
- if (!this.enabled) return;
-
- if (!(/^about:certerror?/.test(errorURI.spec) &&
- this.isSTSURI(docShell.currentURI))
- ) return;
-
- Thread.delay(function() {
- docShell.document.getElementById("expertContent").style.display = "none";
- }, 100);
- },
-
- dispose: function() {
- this.db.save();
- }
-};
-
-function STSDB(source) {
- this._entries = {};
- if (source && source._entries) { // clone
- var entries = source._entries;
- for (var p in entries) {
- this._entries[p] = entries[p];
- }
- } else {
- if (source && source.load) {
- this._persistence = source;
- this.load();
- }
- }
-}
-
-STSDB.prototype = {
- _persistence: null,
- _dirty: false,
- _saveTimer: null,
-
- processHeader: function(host, header) {
- if (DNS.isIP(host)) return;
-
- var m = header.match(/^\s*max-age\s*=\s*(\d+)\s*(;\s*includeSubDomains)?/i);
- if (!m) return;
- var maxAge = parseInt(m[1]);
- var includeSubDomains = !!m[2];
- var expiration = Math.round(Date.now() / 1000) + maxAge;
- if (host in this._entries) {
- var e = this._entries[host];
- if (e.expiration == expiration && e.includeSubDomains == includeSubDomains)
- return;
-
- e.expiration = expiration;
- e.includeSubDomains = includeSubDomains;
- } else {
- this.add(new STSEntry(host, expiration, includeSubDomains));
- }
- this.saveDeferred();
- },
-
- add: function(entry) {
- this._entries[entry.host] = entry;
- },
-
- matches: function(host, asSuperDomain) {
- if (host in this._entries) {
- var e = this._entries[host];
-
- if (e.expiration >= Date.now() / 1000) {
- if ((!asSuperDomain || e.includeSubDomains))
- return true;
- } else {
- delete this._entries[host];
- }
- }
-
- var dotPos = host.indexOf(".");
- var lastDotPos = host.lastIndexOf(".");
-
- if (dotPos == lastDotPos)
- return false;
-
- return this.matches(host.substring(dotPos + 1), true);
- },
-
- serialize: function() {
- var lines = [], ee = this._entries;
- var e;
- for (var h in ee) {
- e = ee[h];
- lines.push([e.host, e.expiration, e.includeSubDomains ? "*" : ""].join(";"));
- }
- return lines.join("\n");
- },
- restore: function(s) {
- s.split(/\s+/).forEach(function(line) {
- if (line) {
- var args = line.split(";");
- if (args.length > 1)
- this.add(new STSEntry(args[0], parseInt(args[1]), !!args[2]));
- }
- }, this);
- },
-
- load: function() {
- if (this._persistence) {
- this._persistence.load(this);
- this.purgeExpired();
- }
- },
-
- save: function() {
- if (this._dirty && this._persistence) {
- this.purgeExpired();
- this._persistence.save(this);
- this._dirty = false;
- }
- },
-
- saveDeferred: function() {
- if (this._dirty || !this._persistence) return;
- this._dirty = true;
- if (!this._timer) this._timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
- this._timer.initWithCallback(this, 10000, Ci.nsITimer.TYPE_ONE_SHOT);
- },
- notify: function(timer) {
- this.save();
- },
-
- purgeExpired: function() {
- var now = Math.round(Date.now() / 1000);
- for (var h in this._entries) {
- if (this._entries[h].expiration < now) delete this._entries[h];
- }
- },
-
- reset: function() {
- this._entries = {};
- this._dirty = false;
- }
-};
-
-function STSEntry(host, expiration, includeSubDomains) {
- this.host = host;
- this.expiration = expiration;
- if (includeSubDomains) this.includeSubDomains = includeSubDomains;
-}
-
-STSEntry.prototype = {
- includeSubDomains: false
-};
-
-
-const STSPersistence = {
- get _file() {
- delete this._file;
- var f = Cc["@mozilla.org/file/directory_service;1"].getService(
- Ci.nsIProperties).get("ProfD", Ci.nsIFile);
- f.append("NoScriptSTS.db");
- return this._file = f;
- },
- load: function(db) {
- var f = this._file;
- try {
- if (f.exists()) db.restore(IO.readFile(f));
- } catch (e) {
- dump("STS: Error loading db from " + f.path + "!" + e + "\n");
- return false;
- }
- return true;
- },
- save: function(db) {
- var f = this._file;
- try {
- IO.safeWriteFile(f, db.serialize());
- } catch(e) {
- dump("STS: Error saving db to " + f.path + "!" + e + "\n");
- return false;
- }
- return true;
- }
-};
diff --git a/src/chrome/content/code/Thread.js b/src/chrome/content/code/Thread.js
deleted file mode 100644
index 8c9daf643007..000000000000
--- a/src/chrome/content/code/Thread.js
+++ /dev/null
@@ -1,100 +0,0 @@
-
-var Thread = {
-
- hostRunning: true,
- activeLoops: 0,
- _timers: [],
-
- spin: function(ctrl) {
- ctrl.startTime = ctrl.startTime || Date.now();
- ctrl.timeout = false;
- this.activeLoops++;
- this._spinInternal(ctrl);
- this.activeLoops--;
- ctrl.elapsed = Date.now() - ctrl.startTime;
- return ctrl.timeout;
- },
-
- _spinInternal: function(ctrl) {
- var t = ctrl.startTime;
- var maxTime = parseInt(ctrl.maxTime);
- if (maxTime) {
- while(ctrl.running && this.hostRunning) {
- this.yield();
- if (Date.now() - t > maxTime) {
- ctrl.timeout = true;
- ctrl.running = false;
- break;
- }
- }
- } else while(ctrl.running && this.hostRunning) this.yield();
- },
-
- yield: function() {
- this.current.processNextEvent(true);
- },
-
- yieldAll: function() {
- var t = this.current;
- while(t.hasPendingEvents()) t.processNextEvent(false);
- },
-
- get current() {
- delete this.current;
- var obj = "@mozilla.org/thread-manager;1" in Cc
- ? Cc["@mozilla.org/thread-manager;1"].getService()
- : Cc["@mozilla.org/thread;1"].createInstance(Ci.nsIThread);
- this.__defineGetter__("current", function() { return obj.currentThread; });
- return this.current;
- },
-
- get currentQueue() {
- delete this.currentQueue;
- var eqs = null;
- const CTRID = "@mozilla.org/event-queue-service;1";
- if (CTRID in Cc) {
- const IFace = Ci.nsIEventQueueService;
- eqs = Cc[CTRID].getService(IFace);
- }
- this.__defineGetter__("currentQueue", eqs
- ? function() { return eqs.getSpecialEventQueue(IFace.CURRENT_THREAD_EVENT_QUEUE); }
- : this.__lookupGetter__("current")
- );
- return this.currentQueue;
- },
-
- delay: function(callback, time, self, args) {
- var timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
- this._timers.push(timer);
- timer.initWithCallback({
- notify: this._delayRunner,
- context: { callback: callback, args: args || DUMMY_ARRAY, self: self || null }
- }, time || 1, 0);
- },
-
- dispatch: function(runnable) {
- this.current.dispatch(runnable, Ci.nsIEventTarget.DISPATCH_NORMAL);
- },
-
- asap: function(callback, self, args) {
- this.current.dispatch({
- run: function() {
- callback.apply(self, args || DUMMY_ARRAY);
- }
- }, Ci.nsIEventTarget.DISPATCH_NORMAL);
- },
-
- _delayRunner: function(timer) {
- var ctx = this.context;
- try {
- ctx.callback.apply(ctx.self, ctx.args);
- } finally {
- this.context = null;
- var tt = Thread._timers;
- var pos = tt.indexOf(timer);
- if (pos > -1) tt.splice(pos, 1);
- timer.cancel();
- }
- }
-
-};
diff --git a/src/chrome/content/code/X509ChainWhitelist.js b/src/chrome/content/code/X509ChainWhitelist.js
deleted file mode 100644
index 4cfe810ec739..000000000000
--- a/src/chrome/content/code/X509ChainWhitelist.js
+++ /dev/null
@@ -1,1007 +0,0 @@
-
-// These are SHA256 fingerprints for the most common chains observed by the
-// Decentralized SSL Observatory. These should not be resubmitted.
-// This file is automatically generated by utils/mk_client_whitelist.py
-
-const X509ChainWhitelist = {
- '0032C41D066AF46D88A5662C4F2D4195C7764C23CE71558318C90514B1F50E67' : true,
- '0077DFC8E3CFE0E4398F208CDCB1BC5A7A78BEEF101ED256315FCB9833283B58' : true,
- '012AAE6B27B392684695FA22F87C8DD3F60CDAB564EE4D4D58DF98575D99153B' : true,
- '01FC275FB7BB83082EA2C546876545030D74F68355AF2B0CCB1972993B393E58' : true,
- '0261C3970364E15EC2BB646934FE28F8FCE6E1D5E0B99C7539DF636ED03A9DF0' : true,
- '027017BAD8EC764424A5DB3B647AD769E78F1653A92F800FAF21212C4DB6CEF8' : true,
- '034AA8D4F147FC9E93CC18EB5BC06F28FE3DF4923CA61A9CAE92F4E3E078C5F3' : true,
- '03985CA59706D4A023A5CE0B2E4F870EA465A8E3803CEB2AD859FC86D3569852' : true,
- '04376F22DBF0B17201EB6871797B1D31FC00EBC4743317793B9C5A5BEA8CECF4' : true,
- '046C78CE6601C4D88EAC305EE65068225CED3988A6BEC42E50B57B1979742245' : true,
- '04AEEFBC8685B2668E25C23D77C6D63B95C7C0BA1B8ABBF434F5EAA66BC3E7F4' : true,
- '052592AA10AFA8D750861F47C540D3A0653A87138ED7427BFD02C9D197D3EF8B' : true,
- '0544DC1E0D529429A1C86E848D1C78B8511CC1A2128405D276FD864B452890EF' : true,
- '055C88BD28194042771FF813973E086A30710231DB219FF377B79FA075E7F2AD' : true,
- '05CB56F00C8DA64EEF10F2305EF696AF839CF8DD541910D760772AC86811FDAB' : true,
- '05CE45708C3882B0DB81A4504FBE064C1ACD7DABDD071A7F263744FAAF040CF5' : true,
- '05F70EA23C890F1C382FB250E40DFFD3488C271006DB6B10DC96BF34B6F74420' : true,
- '06183C90C1DCDC3E9340477D37DC231361321A9960C1948E92D1A175A1500A08' : true,
- '06808645F29D708E4C31AC40FA00000733238E10A56D2067AA62803C9736E923' : true,
- '068C472FA1DE23C2C06DF499AC772804828ED3ED93A07C489B14D31E232E7A91' : true,
- '0699966F623E746BF97DB3B6BBBEB83BCF2E8CAE89D907A49A731951B158216A' : true,
- '06B35EEE47D7E55F278C5DB13FF137B269B6EF91B58FEB4B2E70E7CC1DB757D2' : true,
- '07CF2A06F1718D6E476B98C2B42E370A35FAFE4C1F41CF7A1DE115CDB6222FAC' : true,
- '07E7123B20A807889C384460FFCE4A7F53593A5C872B0E8FD45795D71CD0F9FE' : true,
- '07FC57E4C188422B53059AD4839F467B9269E4EABBF902C99B30E25DEC5EB1B7' : true,
- '0834241C7C2B598E20698047C331B173BCA189B96E528FA1993AFAAE3F7D51F6' : true,
- '087FAD2F33E4D28A13CCFDE11F270188E01AE0EED615D2F433DA4EF05CA6BD4C' : true,
- '089979504BECAC25640130E65E562AA3E3B5D49EE148FEF6A2B77A2A1CF5FC06' : true,
- '08BD4BE042F6DA7D627143ED6B2BACE65615683C3C272123AC55105DE4BD723A' : true,
- '08E5080C1D69F2C11524050C9C0EFDAEBFE68A27FD30EC04AAF4DE2D590F22EB' : true,
- '09250AF23BC74D92973DD48812D5ED28CE1F5C110EE5F7CA791D9CFDE04A131C' : true,
- '096800FDAFA82029B3B5E3947E0EAB6FB1F1D6958DE04E9256969F99F7518C57' : true,
- '0A122B87C038CAEA46E8944009B11C2168E47F4DACAA9D3BBFB92CB5F5E1BCDE' : true,
- '0A36586C8EEE28E5ECA1F542691D12B3CE7815CDCF722CDF7074AA71413C2550' : true,
- '0A6A1FECBADAF7F1B473305A71E454F6AA8C1B0F40941FF4660B814BFF4984B3' : true,
- '0A903D7CCFBB18FFEC8E3AB05FC7E592C1E7509D0EC2DBD9A2C05236BA9FD7C9' : true,
- '0A91A9CAC951DA1739ABB2F29D16A6F5FAA9F49AC87516AB59CA77150D282528' : true,
- '0AA5730256323B66DBE88E3056AA3F45E52BE5E2B87C1C9DBC1986CEAF97B5D9' : true,
- '0B2D2C539D3D922820B6D08E159E6763D22AE797B2C32F8202B632BB93588588' : true,
- '0B39ADF22CBA98C15754A7A899C5B96871337D2178EB3EBF0B5D5F88332EA971' : true,
- '0B901F548AE4E0F25EF38010E311945FB198E497F203A88FE7C44970F7ECDC40' : true,
- '0BF7910DA18465ED0EE5A83D531EFF4705834682795E242E0F35FBCDCF21FDA3' : true,
- '0C114EDF67FB7C09C532297D79A5743EE5F8576A8EBE3DF69A728B8CFC0A167C' : true,
- '0C7E90EF8BCD379CB001FD07530718DCC0A33E9D7D1D333F505F0143BC6A8FD6' : true,
- '0CA932C2E0929B9B6C0A8822D3F094F671522419835049CAEAC51755D1F44777' : true,
- '0D4F42B386775FF404B84D58859BC5AB029F1F9CC6B7AFFF32B838F8B8C71F3E' : true,
- '0D8FC5F202A5668F7F3EA7F6A73521E0C7FEB5DBF6E58BA68AB7C7E01F4C532C' : true,
- '0D91DE20988EA155526570498A1A6289FEC55994A5BA888C9134765F2A0B0580' : true,
- '0E3AE0C9BEDFCFB38239DC4214A3AF3E6386720E2E5F8A85EEB52BD152E4DF09' : true,
- '0E97955E2A050E4AE9D033E8DBEEC9D34D301FDE6174F525C2F6A492E93E2172' : true,
- '0EEAAD4FE6818F1D723A5567CD0A6569D45E346E2DA2896222A7F3367F4AE8C7' : true,
- '0F39AF5CA9615B05CBC12DE3C94A8C4FBA71CA8CEF541952315A9D0658DB5B28' : true,
- '0F7B49A4A4B17C65D828A95173215C75C64F4C64FA8A2041933EA6A90C717B96' : true,
- '0F7DE9806919EBD5EE47188428BF7FE13495E4684ADBB5BA980BB15D4D0B0C22' : true,
- '0F8F66953B0F42560CDD573A013D3FB809D9747210E58F28F4878CDA5A8B8AD2' : true,
- '0F97235268233245499D6C1319DF1BCA3AAAFB13CF9B06EB294FCA328022E82C' : true,
- '0F9E066578F4AFB0ACBDC408CB25B7D7200BC5CB7FC4DA6D32532D827EA5B232' : true,
- '0FA392F6EABCE0F4DA14C7B5237B21BEEE6BDA55832A8A6090CAEBB53AC8D77B' : true,
- '1018C4740F917B815B388C816AA2EBD87E927EEC11DE7B83AE3CFF0D20796EDD' : true,
- '10552D044AD79FBF1AF5357998DAB9B1FFD66D7B53C8107FC2280148D66475E3' : true,
- '10E574517F12195DB38221953D8A8781DB6AA50B7225DCD374AEBF88FEAE8FDC' : true,
- '10E82776E55D0C2D58F6598E615CF38AA14161D1EAD97C4A09182FE1D44E695B' : true,
- '10FD669D6DA882678AEAFB35A5F8A0963C2E2B3084883EA515C8956FEC4207ED' : true,
- '114ED15D4B557A16DDE1D01CB4074215CE6773C180FEF60F08267CEAFB670D5E' : true,
- '116A5D5F3E99CFE5F72A4AFAC8699CC225C130F4B8520CDB350A1262D9585973' : true,
- '118FF53B6BEB35CBFE6592D45BE082BA1228D1817E46B2CC14B8855FCC5C9D59' : true,
- '11EC553AB76EED159FE553B52E7475FA71A0FF3F4B3038CF91BC7138F50B0A7E' : true,
- '11F7A939F33BDF6270E16C747C0B0918902CD4501AF1843D9EA4445A2E708C58' : true,
- '1243C75D0F805DA54E780D0D9C55247B1ABB31FC09EB65A7017695945F2A0D4A' : true,
- '124E430E0E0B103B580A0436D7CF436F6ECE55908279FA8EBDF475AED08A9CE9' : true,
- '12826065A034136FFC2258AA1A65F9E550A582B4017E396077917C775D42E553' : true,
- '12FBC8655188921E5E00AE292584CF23DB7EDBD9BE05332444C6AE10CD03091C' : true,
- '1363B86EDA0BFAF10F1141CBE7569647F2FFB370F539694288101128A38261B8' : true,
- '137E64BF679E2CD24F034125EC926D48F34C7404CFD6B61B23BA9E91E55D3560' : true,
- '13ECB3394571030912CDF82DDAFA05B242398929BD3ACE1598B79DBF28B701F8' : true,
- '142A33AB96C13ED7C7B8782D764F374B5A8F9C4E33B4DFE9B7750E878E7C5D0D' : true,
- '14587E25D8BF0150F429924144E88AC551C1F77CB5DC84F6CDDE7079014ED2EE' : true,
- '14E443C709A20C11205371C5BC54C20CCD53AC434750EBC91C45B30DD0D8B53A' : true,
- '14F5D6BA3842E708E3AADC26B8A9CD89FE9CF2BEF46398369521839733A4504F' : true,
- '150B877BB614A98F2186C3B0978D190C77A605146A6A569036728F544520CDC8' : true,
- '150F5BC3D839579BD7DD1254A6C3C3AFE3485D7DED21C3B8123BA6875886A91A' : true,
- '156E0FA080CB12C484CBF15800B18C902C42519F13E564BDE3481C96B1CE3E32' : true,
- '15F46CDF488A5BAD54DBA0F2E2F825F956F8ECF9E3AF294551E88F62A8A0CECD' : true,
- '15F5D5A051BD14E9D3D3BD0D612CCF5BC72317FFF1542EC8E63D6E1C94ACD9F1' : true,
- '17A0318A02B4E7EB14792644E1E28966257748F8162A53AF4E49697A4707C9F7' : true,
- '17D0A909CE750C728FBD0F33589A3EBFDA452D00C757A18557DB4697289287B6' : true,
- '17E110287D04C595DAE0C73090051A1F30F165A37429CD78C1F8FC1754549D41' : true,
- '17EC9E8F98C207F4CA7FD0680193A54DC33BC97CB364669442F5B7492D36839E' : true,
- '17FD21D68D53F369EEC1E22EFCC3B79B255EB8E1031D147F6461291C4D980037' : true,
- '183AE55CFEE1CAC5CCBC1C58D813DED429DF750E023362FB8BEDCB27A9F94559' : true,
- '186DC5DF9C693C311857A94BF9B2810BDD02F22DAD527D2BFBC0CDF24BCE26FD' : true,
- '188F5D081FD0D98429D1747FFBFEAB39733EA7C2B61C8BF6B0ED62F71264C619' : true,
- '1913F87916E843C9D9FBE3B9F37371780126AC502523358D0FA869E6662A377A' : true,
- '19AD483D37D656F9D7844F14C53281FDD56683C0C8FB2A8F3F77DE7C810C1CFC' : true,
- '19C76F18839C90F94AB9E4CD3ABC4C15E0A8DA9B8705E7DD872962CF8409DAF2' : true,
- '1A5C89F300E3A9835759D6588CE3361993E336D76EF4B2F64F1DFC4D913BC6F3' : true,
- '1AA7EB7CB182FF1BA09FCDFD088DE1F25F8551DAE53CE2C16D4D72D1B6091CA5' : true,
- '1ABB4EB733CA30BD3AD3DB1870871CA2BDBCC01EB4655341404C1B498135CB8C' : true,
- '1ADFE710199AE62734EAD27EEE6D6A4EC4D6FF19D6978A7CFBDCABA69C1617E1' : true,
- '1B5827F9E4B66B4895AB47A0395BB1E135D15F7A23712147C5D382C1AD805ED5' : true,
- '1B8AC4A31C75996D44252AED8CCF639282DF3A180900C660804483597238D8BF' : true,
- '1BAF1A75711BC2EF2C4EB8C2BEA4B5B1B183E95ACCB247DB89B3098C324870C2' : true,
- '1C1BD271327C7721AFDE3C5BE6FA98B132F2EE1911BDF05F0649121349A4537F' : true,
- '1C363FBCE719D6567E55DE267E6662A454494FA085180F23FE84139E9E83527C' : true,
- '1C573E491ECF04E3240144B2A63D8DDB457367055B90F5947CEFB55174A6B959' : true,
- '1C923C0DC4E99E8F807E44A5499EAC4BC48022C63A3EB4CE819D556349FB57BA' : true,
- '1D602FC8C0A6E38288593AF300D73F04B3A5AF89F5B08A0DAC3D935A9B69D7B9' : true,
- '1E13ACD673838FB06999924BF38A93EA57D0E39CD20A98F3CA1AEFEA620D9405' : true,
- '1E15FDE9774DDD452B000A3FD8118DAE63D16F8EAC19D26806BB08A70677F42F' : true,
- '1E294231C72B07AAA6E2FE3B18BA14F1095F82718B42AF1DEE071D011740550E' : true,
- '1E5D810BCB8DA3AF393761C59CC88D22669ECB7D4F926760BE1EC6CD83E60765' : true,
- '1E5DD6CDAA3AAB8BB891B8D7B4E99AF2EBB7F08719F1D3B3C7B8694962EE8668' : true,
- '1E84A8F15A3EB4B7921D7462C1FFF8DDC182E4E0682EB48C42FB3645BA43A6E2' : true,
- '1EC6CF08000A6583160FEDE1C117794E75CA5533B666D04FAB138D8F12A4ABC1' : true,
- '1F1A125828C6F4A21A9D035C28E5493FACE0F4D7DE6B6F2DD5B9FD5D426B6FC7' : true,
- '1F33C56DBB422BB63D87AA52A9520103450E8F9F4C8EA024680E9ECF88AD80F6' : true,
- '1F3C2A7060F08521E70C9B4ABB1FA63A1AF7E7EFB70C0D55F2F1DC91C4E616ED' : true,
- '1F3C4550EEA0B9B8F4608632610548B64126E8929450D285DBF906752241CEF3' : true,
- '1F4C963A9BA39CE44E46F135EFEAD5B30D6A0A3A43545E18CBE59DE452A6468B' : true,
- '1F975043938278B18288C59F00F964BAAAA378535F68747EE2A11A4B3AD0B368' : true,
- '1FB6F7F8DD4B392D4BEAA5E707AAF882D2AA83C5E9720C58B616F8DDDFFA6F77' : true,
- '206A33714BD518CEFF68A6904E19B0837230BCADEADEA6E056EE3745774BE3EB' : true,
- '20BE732FDB6D751C0991700E7C9D401093135652D25B1A29D3387E21D60B776B' : true,
- '20F2E0109442ED3DB805D939B1FCC9F4C8E17414F748FDE98883C9EFA504397E' : true,
- '215C6D97B01A9EA11CDCB7D4D62EF74D31231F99CA59F3D21104097AD5D52868' : true,
- '22A3ABF61E77DD8AFD2C7A5EC2AA2CD4D928ABA0A3ACA37D6849F86025257C94' : true,
- '22BA6A5C28A505A68F7C025447822720E4772BC380FD9EA58EA71C32682CF0FC' : true,
- '22DD516BE482B2A7F3C5EE268E8110EB9814E86E4102654C3CF5705743BCF870' : true,
- '22E6BB3D9964F458D462BAF404323775B20EEF02F174CDBB442D4381DB98C61D' : true,
- '23223C3601CC5682B21E4D4C236BB85C9098082EE3942070E33CC791CDFAD31A' : true,
- '243D9193A5D38C9F2C21409EA470757D3903F8C418709E12C47F01C4EC08E5D5' : true,
- '24540FC5876A301AF83E2494013ED0B4F7B1312D7238EDDFA1DB0E7736082856' : true,
- '24789DF7D8F1D393F224621E436675778CAFD595AF6988D2995F28553F28B629' : true,
- '258296CAC41A779D819E37CB4B120D2270F55AD8BDA24747C572165BE31849D2' : true,
- '25B87ACDCD18628D9B64EB9F6366C970B2FE922B39EBB7E3DD1354899260B180' : true,
- '2601092E7F1A7841A9E65C6D24D0BBC0CFE986404E6DAFF628E2C2D70667EB59' : true,
- '2635178113FBBCC75EABC09C497D411C994AD0170CF9DF999A4FF5C16872CDBB' : true,
- '2643995B1EC6D06457AB936E18B5A5721CEDDCC82F4E116C36EEC5096BB04DC4' : true,
- '2677470F2FBD067904B7014B88988BB94F72403C014240B9843AE5A5FA21661D' : true,
- '26B163AB60042EB690FF4549F6086019E19A99A3B69332AD1FE85D9C46491AA9' : true,
- '26D184F574A19836878B10B209825413B48BB1C92195AB69F6B01D359FD4D07E' : true,
- '2710EBB98F6790081E34A1961D7716533511A1746616DDBAB9A3D64ED32B1875' : true,
- '271B4C5B8689BD69CCA837BC080C554DBEE0B20C5B1C505F68544AEC29588277' : true,
- '2774F85336B9446490224280339F361F69E44891C5D8F078F03FEC5BC7C37437' : true,
- '27C6EFE085FD0EF2DD467630B0A650BD3624BB4065F811F5F99CA976B4C0B871' : true,
- '28002E2FB259DA7341B69C144F4EC6B5B12CB9A981C34387044926957CF9152C' : true,
- '28082C3B3FB30995C3ED4D971AF00E3114C75B9FA47540DEA79E120E01C03562' : true,
- '28445F7C648AB6025EB469E9C5FD10C6C8D0D21B6A20F078854EFF406C55D3F7' : true,
- '287821696D43B83F1EA4A3AF5F6E5695F86D770148341106757B98DACB5C979F' : true,
- '287AC69E23A84ED6C79668FD778A1C5F89D93D9E85B1F84110731B3EF007852D' : true,
- '2895D775D2F7F4D7BFF504B3C204939766B2C2734BC607B154CB1B2E52D76012' : true,
- '28B0AB9576CCA12912B70D6D20A9E12BA6A497B458B381A5013451A3360F2C33' : true,
- '28B2F8B5E2ED8681AE3D47EBB733718E32FF81FD736E97EEE68E12A6CFD3C9D6' : true,
- '29AE4E3FA75E6A40E5C2D8BB9446BC39D672780F4CD6334CA2527FFEC0FBBFD3' : true,
- '2A227A780950EC49D49437E4FBD2306EC1D213A25343B752F116B3C4203C641A' : true,
- '2A2EE56590084C2B144125731B45BDF927C357840E997888F52EF90AD6361EA5' : true,
- '2AE917E3AB4B867883088BCFFED53EBEF9F87988C77AE47FE325547B181931A1' : true,
- '2AF0C30A27A1E4A3B2E8E8556B98EA6A79142C2634E443880969E9DBEE9B78A5' : true,
- '2B372D2A09743CB535C71949D24612C108A95D542D5235B443C116426F4EC740' : true,
- '2B5FC256FE24DB51001FBB200C80DEDE29EF2CCA290DEDA0EA7FA5627A8400E6' : true,
- '2B96B9494AB9EF09B7D4ACC0F7C7C8B27BB23772D8203F98A635285335B476FA' : true,
- '2BB158B54FA26B5A7FDA92096D214B5AB548D13D4CD0D275B967703750B03097' : true,
- '2C27A3FBE2D833ED7FA00DE8A00EB1E16F40043D68C21C6FAA72A34DD839A5EB' : true,
- '2C8BB8B502656B0E304D21A47C906224AE5003A8FFB106C518000F6A1D582D8A' : true,
- '2D75CD1232720CFFABA233953EB8CFD860C23034BD9CF969E8D104485B251ECE' : true,
- '2D978BE3F44F069B366DB5D8E3B1FE4B02775498DE8D17EA68B423259B681FDD' : true,
- '2DBAF94C053FCCFA1EC09CBB22F54DAFF2DB4ABE1B3C61CFF1BEBC31260F4821' : true,
- '2E23B68E6E803E74BA36D9C9006F96D8BAC39DB4CAEEBF1C12C6CC01CFDFAD6D' : true,
- '2E50DDF50FA4B9220202816F9B79405227BA4F803E61FD96D6BC95A0263E49EC' : true,
- '2E726E5D6C08B18944773DECBBBA88F95E25D586248B145354596BA8DB31DDC1' : true,
- '2F0D2656CFB3D34F4775E89AD96E2AA7D3A1FCDE399BCB2E03AA2BA0A035946B' : true,
- '2FE442C9741D5351A016B9796E3021A01BAC6867A567ABBD1C7EB08DD359DF94' : true,
- '304039981650BCAEA6BAC7B1FF2E03A9BFBC8AF4C37F37E66D59D327776EAE77' : true,
- '305B4CDDF744AA543DA713E7E60C19ED5537D49ED2252330B46B7E664C4E588C' : true,
- '30AF2F588C872B174436F3B68ED432C0495D651C84A04787CC8C13D6D61DF63B' : true,
- '3102A33CF44D88924253BC149D22198D046E6571E79D0C6CFE106F8A725364FC' : true,
- '3141118408E436FF8489E07BACF80B260A33E842C5BEC83C763B6AE73701A76A' : true,
- '317E74D56E70386FE26D5E404EBCE6E6AB5A7C2E013C3D64A4AF8778C6B9A1C5' : true,
- '31844B7A093AEF79DB45553A062C20D2201654BED09D99BCFD7C39A953060F6E' : true,
- '31C4E7F6630486BF42150967E951D3DA5ED8D382AA596FD571231CA96E0F352E' : true,
- '32CFE4F78C2B8737E9A31F4E0A2513535FE242D02F1DD83C04ADA77839CC4442' : true,
- '32D398E73D053561EC78257EB01F0945C2A38D9F80674F6F2B4B10BA35A2B4E4' : true,
- '32FA61C84B195BCADA9A65448CD3C8CA66B1DFE252CF97D46567ACEB59BD2D83' : true,
- '330457913F88C2037F663003C36F0B6B2B3071AD972C9A4DA54998A7CEB8B148' : true,
- '3379517964657D6F875971C1ED6218D9F890BEFC7390CA654C79A666D1989A18' : true,
- '3386FCF2133229E0BB6481DD2149E9D87540B5277E3FC3C3DFAE50A8D81D0653' : true,
- '339C59871E132711D25988F0DDB86E0EE5D34B119972C0A5E3C3B556BC293D74' : true,
- '33AECA70BE35D3CEA266552D0CEE341A93FF6149ACEE33194A297CEB28FE913F' : true,
- '34CADA62CE9D32857D65E868355E258447C0111D3F78CDCF4360F5B7B9F7E3E4' : true,
- '34F904FEE6E8CF59E4FFE90F627D688210910D0176C9B5ACF7DAE8CABA722B63' : true,
- '357E325CD50420D15B1E6779D32E62FB6029A9710017B14CC23AD41DE08A400B' : true,
- '359D692646482C906B77BC217B7C262E81B6D80441DAC6FC2E317C5A0C1A72DF' : true,
- '35A88292416784CF9D883274B422DDA092B8692CB98FCC788C9B926987854291' : true,
- '35C8C522026971801A41CE23438829BBA27D3902953FE183E2E3B84415F6ECEC' : true,
- '35F3DED6881EAE44BE937AB5C8E0261DF6B6910FF34334B85CC1A2DDF787F491' : true,
- '362BF6E353729E4F8FDA7D87DD726C825E2661DA801BB75B857F4DA622BB9704' : true,
- '366B123FA1EA2FF7FDBCA0422E504C8E0AB62334AC8941D307060F5ACDFB58AA' : true,
- '36DBF748A16ED7C4957E59BAAE4B899BAA3385424426C4AB71B6361F995F66A5' : true,
- '3761FB4C3FDF80BD66FB31A506612BE2B98FAC57691A6125227B4787C35C32F6' : true,
- '379F1BE4B67E89183FCD2AB1C0A3B930DE70D33CAE2C8629819DB4951600A398' : true,
- '37A8C0FE01BCC73FA73F8A161566E23F12C22BAD0461D7CB9D9386EB7DD63800' : true,
- '383BB79AFA098696BE4D3605F26A60FDD7C455D31FB03BE8553C3EA348F479F2' : true,
- '386702317DA5549A08139017D14AC498D7DD4837E0E16F91BCAD37684AA6EB97' : true,
- '388AF939697463B651AFF01141B625DC877D0FB31CBC5E234A5526BAAB68E660' : true,
- '38A9FBB87006750C01301166855A09680E7FA128AC7FCF0B1E09FE2AD21B5F6C' : true,
- '39C0063F00BE8D1DFB29EC620AF39C157B0BDA8102CFC95AB39D95DF3FF89CCA' : true,
- '39EC99D4093CF0A60A947685856F20DBF85966FBCAB4033890361A650294A8A8' : true,
- '3A9480EEDF0D65938DD92A7FE7E9BE4D797CEB0662CADDA2321D47C04818A57D' : true,
- '3AFA38F8367A45AAFBA949076A38537CBAE4A0774FC4CC40BE52F944F29F7F19' : true,
- '3B00662EE3F01FFE2C40842F0F3B76C039ABB785962E371767E89E2AFA311A74' : true,
- '3B3A1C7A8131E1E6A66039972C1AEF65797E783ACC2C645CF10EEAA5F20BD297' : true,
- '3C40EF3135CB1E82D0E6518EF75EAEDAC43DE347CB74E2A09CBC0C5A56DB2636' : true,
- '3C49B9DC9307C6B33E0DBE135836504ACB9F6204B7172A412C28E797E56CA02A' : true,
- '3C91A39CC52452FB91463E511257D3BFCDCA3A149EBF39978F39E55F20FB061E' : true,
- '3C96B0CE3855D125998B8DDA63F2A37AA1FC5967949393D7428C1FA97D2542B4' : true,
- '3CFD92A9ACFC3B9D7BF81B2994D398500413E7B57C711D711F98DB009FD142D4' : true,
- '3D04D60DD221BA390696E262A7B522815BAD5A03B79D1176931F2AD5435D494F' : true,
- '3D2A0A501279ED2F57D7535646A273B98256C81AE69CEF8A626263164BA87953' : true,
- '3D7A71BB494A12E1F21A1EB9033CBEFCD1FE81F358B131016DAF92C1C06F1A38' : true,
- '3D81B541D1B04B15AFEF518152CF8DDDB9300EE0A1BADC916FB366FA034120ED' : true,
- '3D9910368BB2A01AF8277EA5E26F9CFCB045DC63CEC7397EEB2827B16C0344AE' : true,
- '3DE5855D87575043D52CE7496F7486CBD8177FCB9F8C686B55F5F0EE761B2DFF' : true,
- '3E09F448ED5A72584FA305F82A25706D2AE756083530B4E18665DA2AE46C1410' : true,
- '3E18B028DAFB97BD9A036F1743316C8EC963C17066E362328FEA24D6FF8B2A7C' : true,
- '3E486CEF660870234BD56B008730D8B318B7FBD047B55939D74545B98D8176DC' : true,
- '3E5558CB92AEDC7E01DB0FBCD0825CC0F51AA7B683ABFD01D1E5E04C8A4D716B' : true,
- '3E7FC707C590EECFA7E9DBBD270452366C0E2F0ABA7768B3F18E7DE34B3E15BD' : true,
- '3EA82DE5DF72699D567B865AACE54C72AFF800647415E5E49D4260F422C26DA7' : true,
- '3EFD44B1F0C8400130C35FE003FA304C2E47FD20612A4D1C83F88723B885CE66' : true,
- '3FC8022D0C28EBFD45DC1D07E14F9E83F0CAD2E7ECEDBFDB991E01EBF2400F54' : true,
- '3FC92874F07DB0DEE11CCB2CA7BDF187641DC78ECE4C76E71B2253FBBC17E3FE' : true,
- '3FCBCC65096D7D731244167CCEAA21757E56D6EFC05A632AB3E062643E5B380F' : true,
- '402FA5AD0E7932A07356FB849DCC1AEF11649D516ED1C5617C48F3E7F9B02356' : true,
- '4035FE636CD5B6B9B97E597368C85B8D5B201A62D95B42AECB72ADF2A647C468' : true,
- '40E66AA57071722F0B8E8B59A74998F82E8D5020BDDBB35D0E941851ED11921D' : true,
- '41249205D1CD375DC40BB7214702FB08623ADDE494E8607E201EA47C02B22EFA' : true,
- '4147C9CD6ECA16D7C6A8939E15E419220C822956FE754DCB2F08F2C78A99C3DC' : true,
- '414CB8A3E4E86E2B4E03EB2FE71312CFE17B78945B41597F8E03AF04CFFAECC9' : true,
- '4247E57738776992C6640ACA48156C9DE580F0A739CAF0A353CDDFE3417F7C46' : true,
- '4248F09AC0B07BCF41B413A2D8FF50AC42C6943D6F6D20F9C37502FDD2315171' : true,
- '426334353C51D4E625F2DE937D9AD9FE6769E0F4E1425AF23D7802385103B583' : true,
- '4290EB1B22721BD2C297723FA6ACA6B3059F1E75C930FDC7075F14B3C5EB13E3' : true,
- '429DA945C771332087229D2822684175DC050F832EB9F0ED90F868E99B6FBFC1' : true,
- '42AB217D03120F24939F11A773F14973D937C6B96A8E23F5DA4F74F531428872' : true,
- '42D6DFA920BABBF7876416C3F5B30598040F6A748F22E3C3E0E2D32DEF098AD1' : true,
- '4321F690235447D71149C54E13896C885D07524C80CBA133428E1BD235123234' : true,
- '4334AFEA82522F90599907B65AE5B3EDB85D23E2D5B879971D6360BDB5033E49' : true,
- '43352809E8EA719091F911EE699352E82DC4AAC79764F38FFDBD7ADFF3FE2AEF' : true,
- '43555C20820B179886354E63251A21247292B3B7BA46D8BEE860A0313258136A' : true,
- '4373B2B85D4FEFE97E79B4C7935AD1762380D97FAE2C64FD61E58593F8BC8C4A' : true,
- '43CFA30A34E75D16640693DF32B691B40219631AFFFC6A09DA97006AFD2811FC' : true,
- '44338B3B7D1302BEC14439BFF723B5AF93DC549A7E1E417112C76C1455108EB3' : true,
- '44CE10B295D3908C5CB40661F3F07EA13B27A31F32041B79D12AB7F5250B4227' : true,
- '44CE6D5CE40E8F7BE79569A66792B181CA71DF0C80D3CEDA59A151F2E7CD32E3' : true,
- '45CFA75EF370F3B3C2271E4AA0F99106B3339B6FEFDA5B335CC863F0C6F66323' : true,
- '4603C35A8304F6057C253381D39404E8B40AE0958B4EB2CEAB7777CD85802C0C' : true,
- '4603EDD34802888675698FD6276601F0E390FB7464310509FD94F3C1B86CD7E8' : true,
- '46236B9468DB40FAF467AFB0C35B517E514251530785695F54440E6730AAE44A' : true,
- '46584E2D9BFE069862BC6449C85E904AF29A71887DCAEB14C191D75ED0AC1FCF' : true,
- '46853D3090658137B446AC75E481E4593CFF61E22115C348521D70EF398C05F8' : true,
- '46C05D7E95263B17CE368AAED872817DB0517CD9F388396CF42568DF88C96C67' : true,
- '46E74AF8240C97D2E91E118761CA4F74371BF7D2266601BAF6084BB1924B62D6' : true,
- '46F2EDF5EE08FF676C44475ED70EB54353EC88DD1BD4F19EDACCE938640B6D82' : true,
- '4751468F539356E881C8D97F27D067DF4F609F94EE9CAEDBA009C15066858113' : true,
- '475971EE29368BC1FB6B66D497096A1ABA32C66A30C7D554CB11FE848345B46D' : true,
- '47828F3C65E9FB0113793E5B60E19A44BC9775611C44ACB65481842FEE2FA819' : true,
- '478D230215F850914D64BD43327923DEC9E52B4F14EF5E7E9122B16F40B2733D' : true,
- '47A1BDC994354BC3EB242FFC12768EA8633719084BB5A159E30FC4388BED59B7' : true,
- '47BE050E9E76AE62AED5EFF6EA9F2E0DF1FF0E7A3EE2B6B68D60B3C849E070EA' : true,
- '47CBAB00A23A2771A5C885CD974879F84F93D3299B74586E7AAE3729A8A80573' : true,
- '47E134C83737EE674C6AC46306C325701EFF7B0A4C887B968593CC1F5FCAAF0D' : true,
- '480ABF7202B5437D84FC1F475A30A19C18C7F598BDA1375E8AB84829B966D596' : true,
- '486F62E8D5F6323416CF210DDBD26A256AF9AD33F70A2C1CF8915866F74C149D' : true,
- '48DF42F374FDCD58EB650256F421F6C1A73F663DCB8DE0972DF9421205509F8C' : true,
- '49AC28CE0DDCDA953E64E7D131DEA9EF57169FF3280EC9FC6DAA88C943EA9E76' : true,
- '49B7DA13E82D9DEB867193B30E48CD1279A66A6FB44236E1B93AAF62F58EE077' : true,
- '49BCA8ED8D5E4808E64C3E4B576CC4A4F7EE095C4CB95D4AACCFDFAF974FEA1B' : true,
- '4AE41D7B98B74E61B0D6EED291348B881E5531B4ECEB9940631835EF6A8CC60F' : true,
- '4AF1D354BDAA3AB076BB6A02BAA3E1BAA2503D21ABE54B54001BCF62C0982721' : true,
- '4B2851A38CCC082ED3A24F9DCB8C917F572D9F064CEF218D2E07ECBAAF6EDAAB' : true,
- '4B6B616E1EE80E17D1BB037A2831C3AAD7E6CDE3D89A205D1F7D6E0854F3C21A' : true,
- '4BF10AC1958BCBEFA06944AC7866E3458EA70E6ED97DBDDF01A84A360C3B71CA' : true,
- '4BF81FD80AEED9A5AE7EFFEAC15933FCE004FC0145069E50D41F8F4D822052CC' : true,
- '4C1A5506EA02230980E66C1CA936B268A3C453E997733E44074640CF4653594C' : true,
- '4C3F647343026A15ADA9E047A8B4527FF88F9D01A2B7AB7241947443F75D5E96' : true,
- '4C6FC9852280F11829BD4066C38BE6C1FE4E4C053F6126EE03D15EC3D0BD5B15' : true,
- '4CE6DB77F8EF355DF6EC2ABA7A5989DD0F2D0BB228DB5DE69BE7C83E3603C69E' : true,
- '4CE78AB01352DC6AD84A195DD333207A43CBA0372546FEDEC9E6803DA6375403' : true,
- '4D26A014A4C4007564C743D9BBF9C2DC9A5A881C05E549DFFDAFCD3814F3966C' : true,
- '4DD59EC33898319B54EE610C9A4DA78A87504FB8631FCA5783223F306529FABF' : true,
- '4DDCB0EAA387111F7C2E0355AFF2C3325514BD9D9A3812295F7506999838B7ED' : true,
- '4DE2D3AE998C8EAFC56C652F7A8A7DFBFEEA1D012A1BE1EBB62DB2C9CEC19E03' : true,
- '4E0E281DBED708FB0AF032A0233F134D3BD309224DD8BE9894E749D1AE9BA37D' : true,
- '4E5AD8D52C37A505176F9BA95BAF43CB5FD5A7FC4654DC71178ABEA8188E7ED6' : true,
- '4E88949F1AA84802EB493CA5C6CDA9C6DED49A4DBA0C8453139C89A9CEC2E041' : true,
- '4ED3C78D58943651EDB04EDDCB696F91F7B33450831CB18ACE714720AF4523EA' : true,
- '4EEEAECB87A65C57EA7F90995CE9E6AACEF61FB0DB07AF5DFD0AE369E9E022EA' : true,
- '4F212E4C3A8E4EA8F7D258A988D5930F05A8E61E78D86DBF9478DA2DE8F01B54' : true,
- '4FF633B1CDAE0781F9C3859CBA1E9F4097C78BEA0293DDC184FBBC3926907070' : true,
- '505051896DAF9F9BF23DF6C153230A8AF128200E65B17CF64439162D8E56E4EA' : true,
- '509A3662D987A2D5D9CE7943D1878A36DFC4A786CC185CC9DE1D58E15E2EE02A' : true,
- '50C1358C5AA5556E967E2CCC1397BEA364DE2E7C6704B6950E423AD5D5BBE798' : true,
- '50D5DCC8D0668D34E90722924EB28C37C803E34156DE8E61DAB296DBD37F5993' : true,
- '5112E6A8D06852BA07669C1DF31EFA1BA2BE7894C3F0F7B7282FEEBB698F7F4F' : true,
- '511780070F7743BC9707B9E746C0B7876B108196DA39D1D70CCBF23D968EBEE1' : true,
- '512EFAAE67E525C0DC3D7AF491ABA9FFA1B7439031207D293622E9286F0BB562' : true,
- '5184A3AD148B610511D8D02CFBCD2993AFC3BBD576721B617FE7CB1DF53C070D' : true,
- '51ABE9BEDE2D96CA84110007FD6626F0ADF9881A3C74870C119CEDBFF2B4CE54' : true,
- '51EE14CDF007AFBCE34D598602831B21661F6FD7B6C04B0D34817757B4D007D7' : true,
- '52B8E665B8191D828F946C041ABC28AC6A5719A4AA21B1C403F7611F11A84F31' : true,
- '52C584E4DA8D3FD6FD63E83B2EA0FD6D98DB0413776C26122FF0420A3F0F91A0' : true,
- '52F208427F03726C6DE3F5308C776D690F580EA39DDB01595DFB54364C48377D' : true,
- '5376577409E17E8F37B2CC6FD486FBD356FF2AD0B5EF520DB7CDAD06C6A6F3E0' : true,
- '538735DC5CF27D0DACB0FBC4FC24E0598D8838682CBE3DA8C37CDA60F60BE64C' : true,
- '53C57169154423529775809598828294B218B2D2AFBCD3F2561FD072376CA188' : true,
- '5428A68F388AB23F6D08D0038E82867CF77D261F3D5D627882D0D29C9EF00E34' : true,
- '545F534AEBB8B23A836876732FB56320F4137854B74E284380CDCC41055EF874' : true,
- '552771717F5948A7FBF93067CF25E5D1D67A63C8A3DD09EF98603165874E3281' : true,
- '56B5B8AD95FC9A853F180196FAF9BF2896A8D2E053474ECA3A19295B1D214AD1' : true,
- '56CC8586CAB1C99C3EA4C1D35E91FAA568DED02AA74364D08F480A0EEE4E4FF7' : true,
- '57383F2DCB3A5959514A8C0CB208205EEF70D3A899BEA2AA7D1B6FD13BB23BD8' : true,
- '57A0B57635F2D75EBC9C3B166E68E35E1CF91BD074AA9D5CBCB3359D93F02859' : true,
- '585CCB444BDE628F6778320DE64727701AABA22F826C31063082CFC5835742BB' : true,
- '597C180F976AF183984FD9B1D015D000C55AF0B873FE4A4F8E782D191285BAC1' : true,
- '5999169B7C3C7ED6E94A194BF0DFF7D07EB7581BE8C82E77B83DE42263F6A673' : true,
- '59E0DDB8377B568DA0FC1E2B7C482CC6331DA441F85E7F52FA8AE280DA90D051' : true,
- '59FF0CC641EA56CD3670E81E4BD76A487163C70CCA729E0710D49AD1EAD70634' : true,
- '5AA16CEF791C27E12F900F07D5FC9D0B3386A1FCCF2F547D08E94AD34BABB775' : true,
- '5AA7341552FF047164227AEFB41437582F7116D76B854F54920A5D6A9B72271C' : true,
- '5AEDDAC786E11B696A37E5506BF5CB702A3B803BC8506BBFF720788401D595A2' : true,
- '5AFD1775AD2CAA741FCF1201AE206C4A1286C0DBF751AC035BAADE571F002927' : true,
- '5B11479053C46A16C629C58DD5EB40529814B75A6BBDCD6BD6FC6BA9483D9669' : true,
- '5B1D47E25C53FAFDB2894D342FB536794A99B4D0F4C0BB994DAC22CF9247F166' : true,
- '5B67A7FC34D1885F7351DC949794160E0DB6E6C193286145DF8E483F21E90B80' : true,
- '5B9259C486A3F9A7E48E59EC36147DCAB3D0505CFB76FC0266B8C9759221B10D' : true,
- '5B9F8603E75E06129C216E4A2DF6FB4EC184CE685F6C229BB85233DFFD2335A6' : true,
- '5BBFBD3CF817F597EDAB4A876B265CCC8FEBB25134D832A9E715AB5ED5F2AC5E' : true,
- '5C07B9D0BC6C5C3634102DAF631A330FC02BF579A3421E1B8483E076953FCDF5' : true,
- '5C2484F4DCA59EC5D77C5935BF71EC473995A9F7D39B0F26D2264A279C6DEC96' : true,
- '5C25116119EA6FCA1D13D54D4870475E5B3D34B060605E02F9C7521D3EC47441' : true,
- '5C34509E57E6B30A28891841EFB2A5F0D051493059DD80157C19B2822A97EAF4' : true,
- '5C95EA9F41391B1D2609E3CBFEDDC0B9B865326B4526176D5305DF2EEF5AED52' : true,
- '5CDF3C4C27BB3B1BBE8C6AB81EFF3FA995BBDFE662A0BCDED869E462BE748486' : true,
- '5CE0E2F94DE7BFC370B5C429E1CE1A0635E4F38D55BAF122748D4307F1709DE9' : true,
- '5D5F5FC12AC675264FB7F2783EF62458304D84B09BF62E19EC1B91243E3E5487' : true,
- '5D77443F3FFBBAEAB8C88714A8EEE37196F7D9CE89517806EDBF897DE0215763' : true,
- '5D9AEF41CDAC53CC5890CD0A09FF600E0EC254B03E07417DEC94B07F4EC3E206' : true,
- '5DB16AA171CA274D753222AA4EC17827814F5A69CFE72D092397F048CEEB2370' : true,
- '5DB5C9ED032EA5E502322A5D46B033BFC4E96092682F2F83A278372610EBC923' : true,
- '5DFF17B36C6CED5E5607FC2A8B6559964A23AB8B08181E1CAC94E3B213767A1B' : true,
- '5E579D296D274F9A01D1E1A7410A24029948FFA01595E64BD2E492EEFDD1F702' : true,
- '5EC75158F235F80BBFC25F40D96AB89CC35D8578BAD11410B5D32CC33428A00E' : true,
- '5EE2DD9AF59060324E5B80A3772B61F524827A27499AE7DCAF9B9BEA9D467241' : true,
- '5F05ACF54EAA38008B650AAA2DBB3722805C793616B1A21B43E1879107254E38' : true,
- '5F621EBDEDBFAA6E3C614EDA42B67A3BFF7199D8B89B7D816AF5C2D7C74E3C76' : true,
- '5F6795C104B707429A3E966D32F847FF1B18497C73A45F6EA5E47378EF1D3823' : true,
- '5F98F1AC11CB74885CCC871AB7CB1B95989E9E3E7482BDFC32895A65A783AFE9' : true,
- '5FB819ACDB4D470232F59DBE853A5BC55C3713062ED6F75AD35982304E14B32A' : true,
- '5FCCA125301032F32C5C915A1AF5191FB7E0ADB6E36AB4210099490CF54C2C27' : true,
- '5FEFA4F01BA5AA16F36E2A4125C2E0F808B9503355BF09B3189A623B8EA42E69' : true,
- '60234A884EF08293BDFED2AA0F7A12164317F1453966758A66FEA4AA422E9A14' : true,
- '6085325DD4C19C14024B66E50D6FB600D161AE12B569A70B9C1EFFECBE9C2A3D' : true,
- '60B1AE233D6CEE231FA2D0B3D5888FC9842087D2ABB3CBCC6E9C230D974F5D7E' : true,
- '60B7233177358390EAA910658D1D063B57CC3D5B76F70E521CB81E39DB9AD50C' : true,
- '613E70A1BE3CA6314EDB7C00B2477990271E0C8DE8210EED56ACD391E8CFF28F' : true,
- '61F83ABFF7740C9144959145660E563D682A8D21E20B92AF581237F621A5187C' : true,
- '623760585A2256D234ACE51A98E31B982EB5E5BA2D3CBD673C747FC832529F60' : true,
- '624A2686ED8B75686FCCC3FD9DB8284E94981BF30BDD2453817BD653F3BD9CF2' : true,
- '626042CAC6DE8C95C77C0E732144FCBD63418D72ED04CCB42FCBF260B38B21D5' : true,
- '62C06D5EC111BEA1222B57F5BF5FA974B5025C3554BCFC2677048DF4A2EC0170' : true,
- '62C4876E637B0361493822910A5FEBD70113B70407AEE4FDEBF249585FC4A069' : true,
- '62C9A052080F8EBA5E8FEB9615B5CDDFFF1D74F8467653030CB1BA12337EB5D7' : true,
- '63448627F20BDD4F11B278941D82DE56AD3A689CC06064D867FF060FCFE29A49' : true,
- '634783AC64589BF61818D6D57D8C3628FBECF3354AE91725CC1CC3A6B62E4E0E' : true,
- '63591FA550D322410D6B2617A3B70A23046032A8CB2F96F2CFFF9111D46489BB' : true,
- '635B65E10638CE83AC12795BB42A235C6DF75DCE35AB6901255D4A3B0DE05FA0' : true,
- '63DBD2E32AFC1025D4AC5CABF8E6E61ED4DF6D0DE50533BFBD6E3918F40E6EEB' : true,
- '63E6A22E453B17B4EA3E35C6E39EB315DBB77A237B1BBA9BFB2B3BCF675A63B9' : true,
- '63F85020290FCD168DD6D88948CF6113CDB05F3FB8E20507A4E35D92F6FDCA0E' : true,
- '64261C63D988D7AD86D209177AEF7DB6EE3E62151B54C6FADF8F100C2750D0CB' : true,
- '644E41BA23C44182CD1D12265833CF5D62553B2192496B051118DE945E0B5BBC' : true,
- '64831454483CA9CA55859BBD324F492638DA8179EAAED19EA3CC8E16FCE7A83B' : true,
- '64DF22A2854303C139C648D34EA8FC45F3ECF9D4762CC9E1FEAD8662BB512DA7' : true,
- '64E0CC1B77A48D0233F2F1CB7995C3894B828D8650D191ADB6A8940C6BBA3E74' : true,
- '6554B0046B4C5D2310B49B72D6494BF22F8A95C958DA38A11973C9370DF8857C' : true,
- '65B9EA850436692D74A1A350E112A63BB4F2B9E4B10A602707ADBEFE76B247F2' : true,
- '65E435C88F831D080BA50F37D0668230281DB9A679D705FBA84820A44D822540' : true,
- '668B926F5EAA59F351B7ABFCBBE5FA17B547B01C5A7D4AE385736CE8FD13359E' : true,
- '66E9E8A83F938165FE2D1F3E6669FD46132CFF7A2F99E5D23CC3CEEE0A07EFDA' : true,
- '66F68579A292313FF975514DFBE38463C59215775C62323FD02302F539E3B252' : true,
- '671DBED9969959A1ADA0F9DBAAFB7DD35CB71FB06D0337DB178E34BB5CAFA9C1' : true,
- '676EC356B302BAC4392ABCD0702056E398C3092F6F3C66B61CA17171FB8196A5' : true,
- '67DD1BFA9359B189710510FA166B93B9759B97BC0C9C3DBC5CB07434D09AC0F7' : true,
- '67E6D8DB673E4B9ADC12C134F94EFEBC055068A7B255AC721582D7AE3FCD3D6C' : true,
- '68EE7C99FB1E2B8F0DA74C5339E58C6A1F7C2697CDE363B2A8A6D8E012D2C773' : true,
- '692C08B2A888E8B373FCCDB491C531D58002CAC55188368BB037DDA1F2C829F5' : true,
- '6981222723F6C1FB0E7C14D8181D0799F0657E123C470C759F70A78D995B7102' : true,
- '69A828B3AAE09B3F1EFBC53DB56353AF2444809A08F188668225B2A0EB520FC3' : true,
- '69C135C5854B93D0B081254262DAFDB0FB3C0603D45EE6F5E91BD6678CF5A6E9' : true,
- '69D7A817007EC6958CDE66700AE1372870F1AE4710026D3F93EE1A15E024C880' : true,
- '69EEB2BDE9BE075A2C6927DCF5DB9E9427FBD153953D3843BE5151A6ECC3D560' : true,
- '6A14524124841DA5A7C0A27539973C88C77C79EE8C190068EAAA9218CC35AE76' : true,
- '6A4EA066674FCE8426B600E54B3FEB0A0328BC0E3DEAA77432CC047B2743D7DD' : true,
- '6A525C84FBFEF83BEA806634766F1530D9C5964DFAE49BD2F678984AF29FB474' : true,
- '6AC112C1828538894A1FAC7CECE0ACFEE75658118041513498E880274BD2B7C9' : true,
- '6B02CD14A3675354A800006220E94D8D4D5F9774D60EC984955FF720D927E529' : true,
- '6B59DAD53B5D9FAD67626890D678177BE94BBD7C8E7815986BB28C09BD60E9D2' : true,
- '6BF07AE522AE438A1736D449CDFF0D8F72F7690C120CD9F51FA2CF88160E8980' : true,
- '6C4ECAB94915E0D601B65DB60AC587D133DE63561C2D915347FFA5D69C1115F7' : true,
- '6C636B0095B2D2ADC0DA3BEA01B82A14130410220A5692C3FA2F374E07EC03AA' : true,
- '6CC97CE9EB4776E7E4EE831B97F15D992FDDE766B9AA2233B41770271C0BDD88' : true,
- '6D13CD353D7F6723CC79620F59D5ADC6FF6FD185B9482C0D3044B69E8B60434B' : true,
- '6D3BBB6612DF6B07FDB7630F79AE3C8B7609A853AC5E95FA5061E4248BE9CE97' : true,
- '6D49AF2004D322236E0A30C695F776C09D980BF6D6060B571815BDF6104FC503' : true,
- '6DDA1CB95F5505512C2759E9F6ACB12B2F66CDEA160527EFA91D2F1CE057079F' : true,
- '6DF2BF0E57C2A025F1FFACF32B574A50464D613CA9873BD8DF692B62CB1DFD74' : true,
- '6E61AF6B9F05C441F3AE6B3FE2D5A6ECF9885A2B223703D1C9660D14E6102F7F' : true,
- '6E7E91E395DCD00520BAB2D41630963493456B73BF32E23ACBF4C2BBD5F0A703' : true,
- '6E8D6125A9037938869D2D9C291AC9A2AC3731A6E7429D9E2037970069B7659C' : true,
- '6E95E8980B03A9FF276C6A4F68B46DE8D29410A9FCF4285633DA91647BE7E10C' : true,
- '6F6CA3B04E355CFF85B89EEB861EDD2D91CC874EEFE99A2D9B0A3095653D9E97' : true,
- '6F8652847DB9289EECB5A58CA15FA522DA5F26A60E0BAFAA1BAAA37B32FBF465' : true,
- '6FBABED892623FA77A93005871EF0A6374050AE9F3D3A346A8BD4558EE3959C1' : true,
- '6FCE4CF77E254C2920BE515857DAB1929ECE7638DD8C370C1AF6A374F36517A6' : true,
- '701E5C167D1D2A47E29F6E0EF64D59D978CA3287D20E3590ABF531EEFDDD885F' : true,
- '70202315E3423BCD73E6A3CE51D0F541A78350111E683D8BA64AE9271A9C6369' : true,
- '7066B709F68AFBA83E93FC497B97DAEE440AA3B27F8E6E32DFBB1365C3F2EE68' : true,
- '70751440BEBC64501417A81F17FDB0FD31052D19DC361383EDE63E647ED1D8DA' : true,
- '7081C7813097A8602BE2DFE4BF202EF4574BCD4DDF51FE8C7A2F872F93481E83' : true,
- '709A501B0835742664FB4C650498359C1576F74186B0D12129A6E96A5C09080F' : true,
- '70EE22590F5CFBBC659A9EA9BCFA0C876694116323562076D6FA6471E79907E9' : true,
- '71168AF1899C2122E92CE1FAFCB2EE64B9CDE6D14069E7412F492C9078704F26' : true,
- '7135F96275D82CA824EEB5D7B0510569C6D97E802BC20606615FFDA96E7CB514' : true,
- '713C52C05CB8B1EA3B27FBBE33649956A33D8E1AC4F222EC3B90428E52C28E00' : true,
- '714F1E26865618BA75AD738AD3B843B14D776EC9B7D617CA4E7C2DBC98C8E7D2' : true,
- '716028AB05239B1018C6E2ED3F2EE6237F04BCA21C395AF1044D92AF5911EDAC' : true,
- '7180F1CD379E01A81DB181F3A839C48E64734FD493D1013367A7287181C4A7DA' : true,
- '722A1EF7AE81ED686799C56B96F9A9350898562924E260DB15ED49F00D20DECC' : true,
- '72FB0C9D7767CD725184EC22406246CC4E130E49E4630E2D5BF248187EA583D0' : true,
- '72FC451177A264EC01165ACC89684C137EB92467BB44EE64962C5D1AED5F8409' : true,
- '731D2388EDB673DEAA419BD26B43D6AE7D27EFDFB47B6A1124EB20D30F90965F' : true,
- '7356E86E8C181E623D168491A780BA7011327CF716B416619FED3C3878A425B5' : true,
- '736C0DB075FFF94C2B0FF4741A10BB5F750370AADE4649446A75CC6F3B129F5F' : true,
- '73B26EBA4831AC03380E60772E12BE78303E9A6816058678BC432BA8D640B3F6' : true,
- '745D3184B509466217C4305CF4082681DA91C917D7C176D5C8FB8C9810C1EFF0' : true,
- '7464C196FA42968ABF359C05DE1A029FA4CC551380CBBE661CCBFBB1C7865E70' : true,
- '74711F9774C66CEC41DE4FD32197132B13A40A6758A106DC95BCADB9298A6241' : true,
- '747E80C10894375B82C313C81766E6757B1B28E5BAE75AAB0BDE87A9242E8655' : true,
- '7498564F1A708C3B6B69B90307F879BF79019344A9CBB308B89265989F87FCCE' : true,
- '74C7149B1B6739C22FC0102A7EA2DBCA770432A85F2095812DC7961831F73EC2' : true,
- '74D4CF230B19F9B9E3C674DB1B1754DEBA59A837534135CEA2A9DA3496876FD2' : true,
- '74E0485AFE164965FF9F982F0999B980CF05DE73016EB7F6B38B105A5E07564D' : true,
- '752DA9AD5E2DBF688A910E1BDF91CC22027100A8B2FF44B98F92D39D38833A27' : true,
- '7567AE3D698B690FB2349D4468F155CEFE64ED1975B768E791D934332970791B' : true,
- '75B0A587771EFCF6AD7AF92EFBDEFF0F4E5CAF9883AF521B9B13C78D247B5A4E' : true,
- '75B50B0EBC80D619AC5A04DBDF5C622B1FBEE1F299594B0E4CD6B6363BEFF8CB' : true,
- '75F12E7E7FEE1F0AE3C22D1B94D33E4A31EC9C3B0B30338AF4EAD52856A11D26' : true,
- '7607259BFE14402887557E6AC9BB570FD9D3927DA048FF9C7926758ECE32B824' : true,
- '767EB0B508322CA5B9E37A4A1CE1CC43F5AFEB557D509AD50261F25DA73ED0DE' : true,
- '76A266265F7454F38CBC307C9FECDBE80081097444B97BCA9C722D93219EA358' : true,
- '76B1A25306D53B410FE5318EF1D077B29081025ADDD40CA55ED4A0A1EF557E65' : true,
- '76EBE04192726D45EAEF654FC3DFE992E2297DFDEE303BBE89C8F425269F41E7' : true,
- '770784FC2B1A52F110194800E972006E868F055C52A8BE467F3AD7BCD7E441CC' : true,
- '77C5EFEDC19C242BDC746C5EF4A1DF4117918CBE078CF6DD65FC274DB64CFBAD' : true,
- '77CDA7C1BAC564BA322B350C6CEC0B9E813104332905F2D556603B8F661AC19A' : true,
- '79244B0AFBB3B26770A470A4F23555757DC25D3856F56D0096D9F06EB47D5889' : true,
- '792EE0B202E6A45AAA85E918497D9C9F16FEAC99500A7940C0FC812ECC42120C' : true,
- '79B0B3A8D1BDB11D40FE8B93868460B339CEE667DE3E94C880AD9BB14E50CBFD' : true,
- '79B893E3487215CD87BE3BB3CD5CE1359CF8385BEA49A5E45BD03624A0DB3D08' : true,
- '79F9792935CFEB56CBCCF76F92C17E93606B2774C0F3618F2DE9BFE9506AA04F' : true,
- '7A0F440C38F18E15DE15BBD496D670B48571AC7A71EE56F0F696E26FE1C06C92' : true,
- '7A898AD8A9DC791DD00EC4F1C6CA3F1AFBF711D2A26E99E6D0740B1B5FCEFA49' : true,
- '7A938A727247270556F67BCA523A333A2F22573331A6D696E6C559302C9C1912' : true,
- '7B3234A53D173A266510B9777DBDA7F372E40651E07B910899A0C1063A560787' : true,
- '7B40E5E9E8A2F63FFF19CE2F4EFEC73C902CD146E75DF866ED274651288DEC80' : true,
- '7B45E99CAD17290A002ED52128572713BDD96FC1544094FE297EDF28E4D40063' : true,
- '7B6DCA23E77F3424FAA26C0DB800ACB6E3BBC3DC13A11EE4679049EE3DF03A02' : true,
- '7C6BB49D3E96F1125169FEB59751BE733ABD4F0D2860EA0A8F1A5C9B14A62968' : true,
- '7CE1119D84CDCA99D2C1040485C894E22A02106EEEAB39FD20650BFBF7CC5948' : true,
- '7CEE465792A72473B5B70A88F140AA27C5DAFC6C876AD88D2E45423D9CDC6C06' : true,
- '7D04DEF71359ED7240B0765708F00B4B9C7C1A6420DF2B4FE659A6D48F387FD8' : true,
- '7D100CF85EE12F47C6C9755F00CEDCEBBFA513CEC80993AE5E7FAF6F68289C23' : true,
- '7D3EF8DEBFDDD39FA7CA90EAC62E660639521686926488A315B10FB2A0005F6A' : true,
- '7D7753734C01837BEC44A0E459A049D96683FF8D0DB78878C3BEC4C9574B412A' : true,
- '7D817F280F1D664E0C9E717287D6AADB1132D4F3A3E2001B94009119733C9434' : true,
- '7D886B62A526E2B996C9F715AC5B23D07EDA09AD69D18E8F54F5210166AE0C8D' : true,
- '7DAB96077DBBA3345EB176EDF7919AF6889938AFD1D9BD32105BD82B0D1CBCA1' : true,
- '7DB5C89914B78FB51870985C529CF7646F6B1B6673143FC3667AC4090BA8F846' : true,
- '7DBF7C36818F0BBE711267E6192080F75CE8908B48C9E6EB9626DD9B05308A7D' : true,
- '7DD3D12A632F35EA7FABE8E0A7B4D74528157400F78278A31D305E315E8F5B47' : true,
- '7DE8C95508E4933243E3EC7D7C222F82A250E1B71C5619C547FCDA51146392FD' : true,
- '7E0CD7D375698FDB4C4FFDA33ECBEEDCC86ECE5ED8942F85B216B022812A3504' : true,
- '7E91DE057AE630D8BAF8520E0BBD1636505E50F0651B64E9B6F70F20EC3432EA' : true,
- '7F0F7FB9B5975CD10469ECD29F69E5C11CDE9EC561684535E8A36CBC514D3DBC' : true,
- '7F3B3BE589085EF5F314845A6F850F9411F0594FAFDDF725D3AD3BB189BBBE99' : true,
- '7FCD0B25EEE0A63FA151354DC39D42CA58AC10D8ED9EB4E0B215C652C07D4E28' : true,
- '7FFE32EE5C6B026FC31E44AEF01ABB7908A9742C88B8D04F499C797E232A0D2E' : true,
- '8035EB81467C64D22C3624A58022AF1B5D0D4047328109CABB74CE6B580A9A8E' : true,
- '813CF894750BE7FE8A0C8B5003B362D62D400F6F08BC1FCABF247172A63B17E7' : true,
- '814461D429FB2539D44E02913E03F0698FC1ECFF7894260AD3AA9C2716B99E0B' : true,
- '81A524F4768E8D164B51E023E9FDC90DFBD9EB3D6111C0DA5328B8743253BE8A' : true,
- '81C82F1726447A63776BE2F5E36CC6DEDF0C62F3B11C7C8B7CE17E10309C4569' : true,
- '81F32F8C3E868A588E5F34A64C6FBDB483891716BABC5C59D75391A58D8C6146' : true,
- '8239A7375F6155AE043178439B42195367B40AC6D182FCCEA2502DB0C81132EB' : true,
- '8249977B7E0D31F533255488A5416349A1C6AAA59C330D6274C82364324C3870' : true,
- '8256476D83180014AF0D76C02D405990926003E2052E205DD66B158E69DAD7AC' : true,
- '82668C1629CB39A7B5D9DF6BC94349FA113F915999799DDFE31FF1862FACD095' : true,
- '8287FD8ADF69D39EA5C6DF59EBDD2105CF3C56E44CF766C48F62A4822A6B3DD2' : true,
- '82C49DF2DF809141CB5FB30EAA8E41A3E510AC7F51CF203FAC2B16F20C96C2E4' : true,
- '82D1AEF2AFC46271D18C5FE50811DF9A5EAB812156C2FE6F531A34FD529E75A9' : true,
- '835314FDEDE174507DA3297069F68C0A7CD6E11DF5FF359F9C0CB4699B7AC0BC' : true,
- '83BBDAE22AE7CC2EEC0698B2435650633DEE4E0DCF849789C974976D4D641C33' : true,
- '83D8EB4CA6F5CC0B0805F4AE182E26EC5E4AB5D4332B082090918769A2C44FC9' : true,
- '83DD8D43E88B8D6ABAEA06F3A3A2455C8F6F79059923A08A8D2AF33233F5A63F' : true,
- '84F98B7850FF7A169D5642E9EF4401DDEBE465DFD5BE957C9EF18CE9988C11AD' : true,
- '851A8A0C89B1F8887979F884949755A99BEBC1B399E8913076EE7E48633A3C87' : true,
- '8524BF9691E1C2AB2BA091218096105A335A0315C8282E59B6E8346B11E36608' : true,
- '8583DD0B4F3B4EF42A66A8D6E369B1E2FCB8B7C64846B242384DF6B8FA0570BD' : true,
- '85C4AABFC4B38B9B5D0A4B854DC02527DEC6BA1761B28F5698141AE36ECB15D1' : true,
- '86154D1D0FD89E4E1FCF72511C74A8B2B0DDF4F38E675B649192ED0C9DAF84CE' : true,
- '867F174720FB353AA46DD3BB56074679C9BB46EAD5A6C152B3B1FAFCDC252474' : true,
- '8769B55BC6349F2874697988D13507CC28F9EC6630431A7A9D360046DCBB3190' : true,
- '87C002662AAAB5BE7B6A7CF4B1CE9036E3A2A70A0A3CD80F64005C889ECCDDBE' : true,
- '87D35135D0372CC692C261453242880BE00159B60C2450AC7D7B84DF963FCF8B' : true,
- '87D61B9AF0E0A2D9F836AC304E2F5A84C543275820BC4BABBE3B75A0D182DAA0' : true,
- '8858520A8D4E5C88D777C33963CC7F43E796B555E7FC573681B59DCFAFB43EFA' : true,
- '887A5D0381838CCC20D204BBCFFDD864AB71C20D2BA06842921BD96BB171A796' : true,
- '88EBF5BCAB2CF8C43095EC58E1BD0E375518B5C734CDC394BEB34F3A7B0480EC' : true,
- '8919E46CD5418E4CBC8FEA766240D5918B48BB28BAE25743EB276B996E6E7B73' : true,
- '89489486E767E3C410896A44B28109680C653391FA763E7A21ED1FEB13540DFE' : true,
- '8974A885ADD3112CB168E00C10557410A89955EDFA94CCC4EBA3F5A51759D8E5' : true,
- '899F08AAF5A4105B9B6CD106464D7634D5B27A444CDBC70264B8CFB56D290DEF' : true,
- '89CBF98E81A0F82966E19BF3BB997A2E0BCC7C90FB83A2D4627FB311B6FD1D58' : true,
- '89F5AB7CB2C9A8F6123C4D2F3F4FE378BEEE92B2EF506202BFE847DB058631E8' : true,
- '8AA9D88BBB0B312ECA960B865AC172C7DD593A9D7049A3032795C5FE7BA4BE77' : true,
- '8BB672CAE5B222514864A8E4FB8C89A774200D7773F2A56347C75D5094514C74' : true,
- '8BE5E1A7C8736600D204B7C20EDDA49E72107EDA9AA5E03F971FB24FA8F8C686' : true,
- '8C2DDBA5CA9E4CF79937A5A3AFCA79F371B6F235B37308EB53ADF12C319A7EC9' : true,
- '8C6DDA18A4CB339717E1321FBFDC9A3ACC52F2FEF6FB453EA389A2B43FFFC63C' : true,
- '8C7CFA7D4BB49D306857772722769DB1FB9CDC09F565F22A8EC082D956E93694' : true,
- '8C85C2F6E697880B740C96BF35FAA02B4B2F718DDBC4A8ED6ECF9EBD7FBEC1E4' : true,
- '8C8CB48F1D745276E13230C9BCB0B7ABBDEEC2B9F1FDC8B5C3A15612F5615100' : true,
- '8CB93E0ED93C6730B58CC0314B8158A7A92184312C53A7CDABF05B369CC7E730' : true,
- '8D0CF6F0B227BE9394DA0DADABAB81A44900D104A915645ABF030220F3AE187C' : true,
- '8D0EC1B68E24C1C390A7DCE081085A14CB27FE8B5CE652A60529E04825F289DC' : true,
- '8D7E00642EF079DCB1B9DE964075E3FD44C63D7DD6493AA3507D87D0E277CD25' : true,
- '8E6419A3781E9E9C262AFDF8318332504EEA56B39EF770B9882523D132B85AE9' : true,
- '8F8515B35B665B69D0DB9661EAE9FF0829B71CF4AFEB3BBF988BEE73985F5D3B' : true,
- '8F9CE539058EA5E0587C8E79E554DBFD1971FDE7C5A96DD1EF7277AFC2EF70D3' : true,
- '8FD4DF8A3A7C21CCBFCE204F35949C4CD5E2BA3B712FBE3AE290BFCFFB29CD78' : true,
- '8FDA31393381A23479C8BFCADEA59DA75A1C390693F72CB7B546C641BC698256' : true,
- '8FDDF56677555109B03ACCF8F39EAF657767096D71F1652125BBF487FC6BAEFC' : true,
- '903081B318092837E460229248FA67A70B01EC6DF9C9D279188ACED18F1E6BB8' : true,
- '905AF56BB5517C973A43C5B576B40C5EB69F00E615BEAA8538D294E40BBA836C' : true,
- '90859FF52A82829F7DC99392C6AAD9F346F54ED3D468426C26233AD5D189FBC7' : true,
- '90BDE9F4CB3DD673BDB6C641361BD8B076A985903DF004AF7E74DAD95EF82E50' : true,
- '90D6AE9953E31E3DA34A67533E444BC924E67CC2C610FA468DB31E59B1A35471' : true,
- '90F667D4F929D6F384FF63531B8C8AB3AEE3A92BEEA5D49A08E96E3415DE5B80' : true,
- '90FF35B27260290E94BE3E2FD6F62F412A3FF4303E38ACF6315E190A1980A095' : true,
- '91CD0D276921BD32F4C8616BF2676078C24E39AE1B30943C5263AE0377F41F21' : true,
- '91CE410FCEA8EC201D33AB8E7419BC60E8EC83509B51D10BBAD728E2B6EAFB1C' : true,
- '91EE28B14AB2C7571BE6CDE2D75FD4C05C960FB033DA819EDD463D5D3C494591' : true,
- '922F05FAE9BB025C1CD2627237E07A1062438513D00ED14895B5D5C22CC51620' : true,
- '927546232861B1DE9D105031E4A2502A170A06D65340705EE3D7ADDD34F9FE0A' : true,
- '936EC5E6437D79832DE6B015C38725C84A4638D73770965D82F3CBA4EC35C0BA' : true,
- '9389649C96CD20843B8AB8286EF61967AEB4D76DDDE1F91A109A78B62CAD3506' : true,
- '9394C03EA88D9DCD628AACC140CF1FAAEC364252F318F577380BF2623009DFFF' : true,
- '93953B68E8DD11D00ACD28501AB32FD3E41C24141813CFFA142BEC2B8D2665F5' : true,
- '93AFEA0BFBF153CA77357087301C0F31B095EF2D5A53F7E2D02F9B13DD6E7325' : true,
- '93D4086132C671C5A36C4BA995499EE03BF81259104468E2997198F83A5041D0' : true,
- '93DCEAA3D67BD8992097C446EECE4A6A02DCF89EAB0008EFAE7D0C9BE26B7C00' : true,
- '94C5E69A5644B4BBFF863312752633025D60B905984BC297D103F7B58F8F1CAA' : true,
- '94CE12FB5F69E4273C8F813ED37ECB954AD667BC81C4E37DD27A40C291DDB12E' : true,
- '951E14CC4823E3E83E2DD0CE75826B7BDBCD45CB16FCB70A1CFBE6C6BE1157D0' : true,
- '958B00B1147A749C680D423BF46EFD460CFD4DB811460C215480EEE933850D77' : true,
- '95EEDB5E6C8B8552E29D7FB0C607EC68AB3D3F88A3FF97F4C70D7BA9D69C8521' : true,
- '9658D54C28C27DD6E9B79098D7D86C1EA32215492E8AE9DB225E3410EEBC39CE' : true,
- '96735DA929F88A1A3292D120F963FF675FD13315DECAE2555139CCF71822F408' : true,
- '967D76F5FBCD8DA9E6FC6CF1F461D0BB63786D6467FB636F10628E36F95A9799' : true,
- '96B9BCDC21A4E9187BC7BB7B5BB052A1953140044A59ECFB2F1DB1C0FC648FE6' : true,
- '96BC0612871BA526E0F8AB96612077A50930AD430147A0BFD37E1BE21E0C64DD' : true,
- '96DC92A327E33DF81946BB760B8C22FD7F74A2C9592987BA110F7A9D211F47B8' : true,
- '974149DB587C53796C2752AE8D14C7F3E7C9A1002EECE93420AEDF52B1F48558' : true,
- '9787EFF64AF68F280E2778414020672F24C44010549900A5A0487F11CADF9A41' : true,
- '97907F0BB6A5CFB411D9975E742C8DD55AED77AA373C56DD74ABE6B7C9892A60' : true,
- '97B09B0E6CD2378FA7CED47F365C77266C94B867F8F87B01D8B667D0DB2F5DC8' : true,
- '984E447F3A932B79E9373A9EA9786E0637ADEE21B6EAA6B8127B05F26D7181FF' : true,
- '98AD6C8A91B962AFCC223C26F0026802B688AE55C204BA0A4ED5BFA5619D979C' : true,
- '98D9DCCD4C1EF004D7F000B29AC540E935ADC074DAB919F8ABBAC7507FC35EBF' : true,
- '990477B5471E1BFF7187E419CFAFEDE674FAF3E6325182F9F8C686A2BAB085B5' : true,
- '9978468023B41579748FCA17B03E24B0842A8CBC73F92BAB7152E6CD1E29769B' : true,
- '99E437DA5156E02DE52D0D95AFDE0FDBAF8F626F4D3BAD2FFFE7F4C75D76BD60' : true,
- '9A51003D55795044502ADD35C199B9E3D62A6C9B554030E2ADF9005C2296A326' : true,
- '9AE40265F51732A5A72BFE9B4C3CAA7106EE84D320F7C675C443C91550E5F701' : true,
- '9B28E0C477E934B2FB3DB6D3E6722112F316E95B0526CD1E270453B6FD2171AB' : true,
- '9B340670FFFA8B98B78247E2A470627E05F1AE05ADA505FDD049350B5A8521EC' : true,
- '9B573154350FBEDA3CAC21F90DC0E59C9EB0DED7F069650E099F62B0871F3615' : true,
- '9B80DD5C98B0F0A7AE343DBB896DBCE45DA52EB4E31BE057287A2A738D9CE3D6' : true,
- '9B98284571E5FBB2A2BE676AE24830A6F0048748FA38D1F11CBCB252505D2E62' : true,
- '9B9C56A1228EFF3D6520261D3CE06F38597A96199CEE7BFEE71D95F7EA6EB54D' : true,
- '9BD01B7914B81371F2FBF23E7A0876608CAC69218A0DDB78C2AE45909744E5BE' : true,
- '9BF6A4CE27AD782886988DB3FC3AF54CC857946C7C5E32A9A6AB13A9F7504DB1' : true,
- '9C102F918224790C649D916B43E1CC9EFC4C16ACD141E22E85F199C1C6BE7DA2' : true,
- '9C109FBEC4A2FC259F1C89666AFC54EC974EF4CC52C858B3C612689CC8A943FF' : true,
- '9C1C2898E71561BB2B87D8859A5066940BA97950DE95E12ED293822111EC3D35' : true,
- '9C7F9776163746C45FBC96E2985B57C6AF769E83428F910C3EEF0918BC5CE593' : true,
- '9CF455322FC12AA2FFE88CCC43388419F61C41ED1AEC560E11D627A009DA62EC' : true,
- '9D484D53782C2FC0798843979D991B84A180C1A833D717AE002E75F90E954EFB' : true,
- '9E2F5DDC11A878B6A7D27F9FECBF10861EF27BACAA208D8EC7ADBE2682FADE95' : true,
- '9E531CB7619C8C0D5C97E7ED9B20C3A269ACE189AFC5D80DF6D2034BFFD0E804' : true,
- '9E6937E5BD26C280FA683490204D1347BD8662325524F0BE4B25FC17381923E8' : true,
- '9E837E2CEACD82AEE4D2CCFDFCCDD0331D305E5B2D123B317E2F3C0376BAC850' : true,
- '9ED22741CDF43DC2AA238D354F0BD95C28F1B5557ECE9489AABA4CC37CBFC9AF' : true,
- '9EF5444454DA21B0B7D6110C9B040BDD005EA0BEA27788D00BB3F1C48D9D0F36' : true,
- '9F217FAF2B478315518373657A359FE713009BCF22F2F00BA4CD6D071EC7A962' : true,
- '9F7385E656F0E8237CE9A5E9C96A1B3CA17920EE75C112ABE9219C18F77E9E97' : true,
- '9F9E4DC55925D2944C0ADE2959EED5F6E55A14BC2F6109F8864A8AAD2E4A7997' : true,
- '9FC08812780624B21DB7596E278F22F0023D27DE99277E37CF07BBBD4B351590' : true,
- '9FC5DF8E8AECAEAA4939A5BD94A078371135107A7AAA15ED5728C9887FF4DD8B' : true,
- 'A00CE86F3B49E7F372B6456C9F2F8615F007D98D1D0423CC36791DA3051E2591' : true,
- 'A0142CE676C4FA2524F53E7626D21042BFD8A903AC54F8AB2FB977ABB760D6D5' : true,
- 'A03D7CE2FA040738CCFEF1F20872DDC1E321745B2C34095822A51B3BDC07D9F5' : true,
- 'A03DFE739C80E109658E0B3EB41D9EE1F03EEE48162C4EB97EBC3548760402AF' : true,
- 'A0E9635A0A993A3C15F0D7362D4D7C1EC21A50B04AFDEC18685B4A21F69E42B3' : true,
- 'A0EC72259E87A736E450456B144143E34EC71EB7B43540C03CC57D4DE4EA25FF' : true,
- 'A1453B09F39601124160389EC5CB0457C723CC520AA8EF56B59AFE8021AD04EE' : true,
- 'A1712F04B99848A73D978552028EB84039AB331DCFCE329E8A7A59F678139F28' : true,
- 'A19FF2AB5EBF26CADFE7E4CA78BE0F77C18AE821F71F1262D5D8BB598E99A89F' : true,
- 'A1B71E94B84076BBF29645578CA796F299D5FC07CA4C2049D41760F9B53035F2' : true,
- 'A2152E5BF42DA70683BFF5526B3F9B90045F74B82A034EDDDFD2F8674BD20D7F' : true,
- 'A21C3F2CE357822C64D1F9C26446235137559939DBE7C7C3E5CDA218376EC1EB' : true,
- 'A277B893194AE7687EBBCFA344178B3578AA6228D2B430BBE2FC8D5EAEE43135' : true,
- 'A2E6C7ED88E5F8103D95E02F792372AB66EEDA5AF35CE4884316493325F971E9' : true,
- 'A3554186EC7CFF6B11D03F042B490700287F9CCE71A4F581B0C5C13C2A0CE643' : true,
- 'A37B9444FE3BB0FB2EC43F2677926EF458D0ED4F0688FEA6443A5F243F10C2AB' : true,
- 'A44473407C78C1A951194CB7DBBFBD5010A60A0C82565E02AE1E372975C8D8E4' : true,
- 'A45C0F1FB81BDEAED2EF4302BD5AF171F31496B6A8D502B488BC8E3E22D5E992' : true,
- 'A45C8546DF176BCD32BD7D15FFE732DA2B73EDB38D387108ADABBE4B20066275' : true,
- 'A4C6A2F0F5175D6C5C1D87E61ECCECB368E6B5374F056F222FEDBD0857B83F2A' : true,
- 'A4D07A0F8A6A11935F63B66461D06DAFE3D8AAC0E0001B5E842A2232F327137F' : true,
- 'A5278398DC472DC37141AA3EFCF4953AD7B14AC25D3730D2E99020353CDEEA25' : true,
- 'A558DE705EC13AE6FF7DF6E6B1BFDB54A7CB7FFAC1499954FB109E6B884CFC03' : true,
- 'A5B9EDB84D5E06BB960BD23A73B0AFC8A0F35C95B782BB54004EEF2430CD3351' : true,
- 'A6584C2334B3B29B3F7DC858D65AC229F679D8134C75DBD5A6CC1A4B897ABB2D' : true,
- 'A68F08DECE7FAEC73E7F00AFE4C758B2742EA6BCB9FFC0F3D09C3D3E79E41EBF' : true,
- 'A6B6702113E87CFB26DA2066CE2151698C68EC71EA906F632FD65DD35B3E0094' : true,
- 'A6D113CA991875E854CB226297662EE3B083F5D4E15E03D1FBD96AF0FA6691DB' : true,
- 'A6D1CFE508A9E64AC65FDE0FB8EDB8A808D3083125E2BFA975B4A1F0373FE8B9' : true,
- 'A74DA51FDF285B66F86065496D236FADC4D44051DA6400B743DAB15A81FF3B13' : true,
- 'A7636BE0A08F56D7F05A8D69AF0B7199FA7C05AAC123DCE71AB57C538A4D910A' : true,
- 'A84DC1DB143EEE938A45743268683770BA0FB2EE69A4EB4B131841555CF1E124' : true,
- 'A8E146E7A32922CB9F5908D8FC85B2928D4BBAF44E8917F370E57C60EC479EBF' : true,
- 'A9266E0A665A00C7C4360A7CE3FE0B5ADBD6E7E20A32677E43BA30FCFE112E30' : true,
- 'A93B07A90F55AB3B6BDD56958FD69A808C8DEFA838DB35D323F080A4AB1E4B60' : true,
- 'A982473B3AABC66BDE83F206E260A07267088862EF71389082A98858BB12C3EB' : true,
- 'A99953DEB7EA51793C1A353F91A070E4702D42AECC9808E4F14805A755D1866C' : true,
- 'A9DAFB7E89AA7141CD52F08D5740F09F388419744351D889C96D2B4C3153A424' : true,
- 'AA1716CB8EAE12CAD75B01F3A4EC5516140813349BF4041369089A6063625EDB' : true,
- 'AA55A82D7DDFFAE695312FA5ADFE893D1430057D1D8ECCCD2A9E985CEBAE3989' : true,
- 'AA9F7FEBC74FE835504EE24501DB2D00409FC761AACAFA92DC8A696388AE843D' : true,
- 'AAA011E89B2581C1863FB1DA1E41A8FB8EF14ED0817976F16909C68E27F4E70B' : true,
- 'AAB01A25BB1EE114084DBA1E0B2B8E5C84936196D40CAAA26A16E58FC50E2B93' : true,
- 'AAD7DA6E17F164E00B0B63A6338330219F40EE683F8E0CA5F6B709F2E13FB3E5' : true,
- 'AADA8A48FB9966CCB61E4B8C97DB2DE50F0AF34422D74D1A770501AD00C40119' : true,
- 'AAFF2842E6847355FCBED741BCD82746847E413E1BDBD16B33E09984B1F1F743' : true,
- 'AB34CB23DF8A006DD182B01EBBD38DC13785C4DDD433564B5CA7579DEBF3B1AC' : true,
- 'AB47045D4B45B0821E851EEEF7EA9D6571F9759DAE4F3DB1EF92597BFD2B4FF9' : true,
- 'AB6C39D7868C1C094E5E5A5AEC1ACD07396F82BAEE33CDF2AEDBB4F02E899B90' : true,
- 'ABB5673AF0583FF328D23B1D4F35B33EF6B68DDCDD482BB3BC1DCB43D2A0367D' : true,
- 'ABB5D30080E3CFE6F83F249F3F8A22C731F318DDF1BAC4D4895B2B7F7A6287E4' : true,
- 'ABE9809D21AFE6E0FB253DCD55E10C31DBAB32A973EC52DFDA1C15068F89D333' : true,
- 'AC34CA02ED811B4D918A2C55C7FA396105BE68AAC3A23E762627583D4F11E8A6' : true,
- 'ACBD5C965EBDEE4D8D3EDEE2A5FC407A6A3A7AD5E6EC120EF1854C18118953B2' : true,
- 'AD046A8C4DE2A89F32973F0566452CFD38CE0586998717364C528F5995B5E2F2' : true,
- 'AD05645C0957254FE67FC48F7BFAFC24D30BEBE233B82D87DAFF3B44EF7314B4' : true,
- 'AD3FC05D383E384659DA700279CE3C48DAB804AC74DE2B3DD3687F6ED355F99B' : true,
- 'AD40C15657CEFAB57F6A71035796462F0184B0AAA489E601087DE329F35CD757' : true,
- 'AD679FC990B740191DF7F88D51947A1F23D79F862160E3C94A22BB1169A7567D' : true,
- 'AE03E5FDACD94805484DE44DB4BABB96D1D2EED4F0B9CB528CB30210C8005C6A' : true,
- 'AE7960061D5D4739E2A6C0BEC6BE8E98ECE3E97994940C9BF5AB2E1C2C0D9702' : true,
- 'AE7BAFD9FB7AB3D87D0D58774420B314E46538D2894DC58DF5F5614DFE7F0435' : true,
- 'AEF7E370874D2001D989B258853C1974A5E45676D3D7595F74662C0B650BFE8D' : true,
- 'AFEC41B1302FD09F03015FB573960516918EFAE30F68D97D027D45A51C4115B7' : true,
- 'B06CD6AF9B4156B4379FF3C6C1F8CA182A923527D0DD92905394DB3446A11D5C' : true,
- 'B0FD996D85E74BF51328181823707C4FE5E96C0028C2B3FAC104A96237B63EC6' : true,
- 'B0FF4F8A6FD3F8FBB19A188351CD4925C951DC2D64633B9E0446F026670A47D1' : true,
- 'B183D8E672345AABE24C849B4A13D0BD99C296AAB273ABE88C00CAA229A27154' : true,
- 'B1991ED1894F821B66AEF2E26E0834CC796FFB43971A79588A44CCBF7E8B3076' : true,
- 'B1C705F5D1E939E93139448EE3155EC4895C970CF31CEC997A9FAA547851626C' : true,
- 'B20BEB685F3FB617FC974C4C624ED894EB2F7FA61DE28104C7B9EDA1F52F46FE' : true,
- 'B295FDC9D7462488EBD4E5FA8E5B062FE5E2D0432C6A02B99F4CAD1F9BE6D0BB' : true,
- 'B319CB30FD80959806C6836129AF6E1A8A32B8B8D39AF65674532BBCAFA2CF8C' : true,
- 'B31C07387E56AA457F17CA3D3A4C485683253CF387E6DCE37469B6A8E51CBF29' : true,
- 'B3251BB9A1B4F219400E69789FB08CA2BBA396C6D2FD3C4B69F4B7E1C0DDB615' : true,
- 'B3381C627EFBEF5DF3BCC9DB71A9B6E4C0A4F3114F7E7408A356FB33FBA5D20B' : true,
- 'B36D72C8B1F436DA49520421FC0A2869A9952DA405DA5E29EC3A1919453DD6F5' : true,
- 'B38D0B1FCAFA3F435FECB2B3A25804FB004BF11DE5CD691C1461A4D76792A4B0' : true,
- 'B3B5299F5F09E54A0D4F2C11044D183F9D6E2CF036784243ACFE5F0449FD698D' : true,
- 'B4130785116E5A84BF7B191696B213BA8877228388B18C2DA38DCB9EE14AC8CA' : true,
- 'B440A043514252DA267A339059C789BB14D1339B7964B0945262D978D9AD021E' : true,
- 'B5008FE6CBE7E0EC5B158E8C9CE487FB6E5349F47007F3CDD2B1AAA69098FA40' : true,
- 'B51BFFBF094EBB26247D54321DE8F7CC10B24BE9EA6D9383BF908E765D5D9594' : true,
- 'B5453C09F38363BC702FCACE4B64A74538B1BE40617640C00150CA9129FCDF52' : true,
- 'B55BBD123C4262662BC144E0CF4BC9B47059C4BD0A136C075BB9B3E82830799D' : true,
- 'B56769F28FE8395FCD50E7552BFBC2AA549F30E1092A54921BE76B07A6A800F5' : true,
- 'B5A9BD7AB128FDCB0DE3C7EAE193904867BAC57822BE195F3060369520403D6A' : true,
- 'B5C58EAB37201F8A7F3C520FECBB3C016A30960C5931DD7C43ECA217A1E31774' : true,
- 'B5D38F895E2681F656FEE774C8677D29749C3E5ADD3DAF7A2A91043BF5A4DDA5' : true,
- 'B5F004A0997E3448A1ABE7DCE45D8BD263AC631D14B05A04CA195E98D665B679' : true,
- 'B61D7AEFD0BDF0DF2C8C8E68D4E3D92EF45CF9F79AFD9EDC4729D71375916019' : true,
- 'B663B6C8C60A5969BEE4F6844813AAB8945EE2CE2253CFBA67500B991CD8A07F' : true,
- 'B6CEE930054D71DEE1D167A566B9881B8971F7EB4BC4A34FCFD9DDB3DE311B9C' : true,
- 'B6D0C415C5ED7819171DE421C8A75C18297924B93FC2A95FBD8C4200CE36681D' : true,
- 'B6FAC01424B5C332C72B6B218DC93AEBE54318DDBFC5BD1277E262FA7831E5B1' : true,
- 'B745A72DD07E5FED73CFA723D6BC2E98FA62B6E03ED378804EBEF7DCD83725C0' : true,
- 'B76BD62A287E68C2CC8F8CA7FD5196938DF4C39E6F46DD81A3A37D22B761C158' : true,
- 'B771F979722EB52E544B543F7AEF720A930674556EE93691DC650C73DE8252C1' : true,
- 'B7E6A641053C86E17A4A328D98700AF4BA3BDD35E5208359AF120C2690F51E3E' : true,
- 'B7EC03174DAD602E897345B072749AA86CAF05151062989E183C3039DE25569D' : true,
- 'B839688B9303FEF8860B4FB2EDF19FF2A0BF5306DAC007E8CE074CBA13B39A03' : true,
- 'B86F85494700264E918D8706B711B9E8C3C12AA776E0B63AF35B73CE56B15BBA' : true,
- 'B8845702F28C3AF9B35D8B5F1DFFFA014CE411CF592B18395F700CD8B937F3B9' : true,
- 'B8F0936622984493F4B74D087ACA8438AABAB1111DA258806EA86C23C6F6617E' : true,
- 'B9772693C35DE8A4B6EDC9457AFC3B4B52ECAFDBF612CEF1A27AE7F7FAB8F79C' : true,
- 'B9B09CE521337B9A3632C7FD98DE926EEBE5AE5E8B50A098213EBA0590C387A1' : true,
- 'B9BCE346B63D3B6AA111483A98E02E437E3AD0B6D08FF142A31E0373DBAA3207' : true,
- 'B9D8E2EC3C47B6130DB45DE0741CDB790E36E4617986AAD5A2BA232B8BD8A85D' : true,
- 'BA4052C530EB5FDDBBFD98FA9EB99660BC084678009D5AFB2F9996BCA40C354B' : true,
- 'BAC88F443D9F2F03CC7ABFB27373EF9600AC918E084967BB77E80650B3724266' : true,
- 'BADED8CA137A9AFC4A0FE344F663C743D1A549D0A8DE663426B90E788868024C' : true,
- 'BB4C7B45E3310BD7015B76D34CF4308E778E6376EB4841B0BD513BE1A45DA11B' : true,
- 'BB7E9348A57593802F083CAA99351386DBDF348C83AB35E554BB7BA44FE1FA55' : true,
- 'BBAA50F752648522389B89EDD345BF8C41FE10D4593A8A1DF467B2FFA7BF870B' : true,
- 'BBB3260B0820E7ED72785BDEBCD876383243C325BE758BF025075F10A6D9035D' : true,
- 'BBB99D57C9ECE54B1634DB4BD6211C5167A5EB4DC310340BDE14B1BBCE275937' : true,
- 'BBEF78F8C05ED5A5C2142C3598696B0674FF3DADFC8156896025A13EC892ECC2' : true,
- 'BBF6A87639A5064024887CA082F69575298067744B14B8E0EDE61626949BC7A0' : true,
- 'BC0B758091A4613FE070BECD6CDC0BF1FE89727C3482DB4A2353CEC027E3AB11' : true,
- 'BC17CA376A3CA716F41BFA9D3A2CED2B1941431D70543BD600B7596F4EA2E440' : true,
- 'BC1FE50662610B7D575931031B1EE60479D9D9E3D94048DE6FBD44C88B9FDAF1' : true,
- 'BC447B8A11DA8F1DE19285AAFB97AF1A26A35157AB8FE1E4AF80AA70B11AB65B' : true,
- 'BC568DC8C01D8D7595FFCA2A7E000780F15EC24CD38AAF25EDDCE7BCD41E4FAE' : true,
- 'BC622EDE87E66E364218B38609D792F6906F7CF95EE5EDD1A76BE0C48B8533F3' : true,
- 'BCE02BE648B8A1EE092574F3D453388649082A1B72E7AFE7ADBA310EFBD38DE6' : true,
- 'BCEAEC2D8B8C18B58BD320D77850EC38285F419ACA8A9E939DAE7DFDF26696D0' : true,
- 'BDE511A7E1B38D779BD9E758B2EE8F7F2DD5A242D37CA573394808CB01B78FA1' : true,
- 'BEDF91AB2008A01DA4111518C8065D4BFD9ED614A29CF89A16E94CBCD5F5D17F' : true,
- 'BF38E5D5BE0CC67C1CFAC96B40DFD91DE065F2DAAE427AA54893FFC5ADC73707' : true,
- 'BF9B71E2C87C03CF421733610A1BDAB430C041EB20DB75ADBD9ECB3D342072CA' : true,
- 'BFA0CD61FEFB0FE90D0F9025E67C62A735DC730F13B5D5FBED9B54A3DB882F91' : true,
- 'BFA5B4A3751715409895D27F7C9F057F2C31EE560DB075008A3BAA21DE838FF3' : true,
- 'BFE49B659622D1011F4BB655CDA77638665D068FBCAF11C73829D2DE16E43BE4' : true,
- 'C0AF523C6E9B52801FCA62602022547B25D8A107CC7008C67C438E1A093FA69B' : true,
- 'C0DA5CBD6F39A5B707B0E7DD33004811FD6F925DE713C817F3E2719393163E9F' : true,
- 'C0EF2D9BA63006B0352A74B6052B7D66949376FBE5417A7E01D33219E5BF1765' : true,
- 'C1AF26C31745338DD2E13C1BA98A2E643AAA3271CF1FD5B878E93B1DDA2DB868' : true,
- 'C1AFF08543BBDC3D2D796884D099D8A7B8D40FBA1F37AA31CEC16EBE2AFF0D0A' : true,
- 'C248614B9F4FC353E82AA41DEB83CE57110D64C4B16E7A5A685CF4BC9621DFCD' : true,
- 'C27D64BA2F133417986FC42073BCD7DB4668A2FA7D2D217CDE215F25D2BD5E23' : true,
- 'C284387A9875E45662ACE976D665D6A33C36F3EF2B053AF26C0918DEECBE7CB6' : true,
- 'C2C65F50563C7E96AFE6602B9A0B68DE74F3C7AE5C00ECDB39B98960BDFE5B91' : true,
- 'C2CE30C7F0723F2D2B25A18FA209B1CBC66662624FA8CD1EBA96BF051D969625' : true,
- 'C2E60ADC4803F0F11F83C644D8DAF80DAD4B9D6A67FC108B3C2CE6F2576EB69C' : true,
- 'C2E75AAAEBF724A42960CEFD07F59CDE937840DB2BD1FCD538C609F7D1A1387A' : true,
- 'C32E558AC4FEACD1690C227683DFC38CD26FEF103953FCEC9CBE0FAB08C176DF' : true,
- 'C36F1E72492E2C250006C6F4E71CF086D2383B2F8C9BC14BA68BC666CF714049' : true,
- 'C3C07C187D95222D855EBFDFF827193F71C471BAA3A1B51242BFE963FD4A63F1' : true,
- 'C3DEDA7A5C280862654DD266D482AF59CD7CE5C09020F8F32EDA0D0FE2345B02' : true,
- 'C3F22AB27D51E4BD5A5258957DC812BED15D17FD4119517479FF9FE70E751B19' : true,
- 'C455EB4F7D91839F3CE4EC401AF21797377666D1EB395947421B7B6CA8CB06BE' : true,
- 'C46DC6888470BF64D41C297E1FA082ABB128D4D0EC44DAB62E05E4FF8496B18B' : true,
- 'C4D51A111115A7D06422BBB16B67ECFC73D636DB08551B27596FEB532D8CC2BA' : true,
- 'C4F8364FC0A36A73AA0BDA4074FF1490B3AE07A7BEA479385BF28078288F9C3E' : true,
- 'C520C3FFB5C5107BEF2E8DC44C74803713E13D9BCC99A57C6838BE15ADAAC04A' : true,
- 'C55B18B5DF187AE68174C086FA4E692C6443B01FF4A19DCA743EC1F6E1B7E332' : true,
- 'C58F0FF2DF810FAC8EA095F349A2E6D7E0D9C09D6FBE7D45895408530E1C75F4' : true,
- 'C5B2A636DE1FD6629B4BA41FD1693F261F50577130A05366D298F9CD282E4BA7' : true,
- 'C5E4575B4442687C80E6F9F290846CE80217AEE8892B9977C5F455BEBE285EDA' : true,
- 'C610F374CDA9036FCB01F526005ED8561D16A27790491AFB26D56A1BF0716007' : true,
- 'C6479E02F20A3596203FF184483F1F6A29EF9F95DAD258EF2A84BC6125B299DC' : true,
- 'C66BA6D7D5EE44E268D2DFE0A00284BA59F2FD86AE8F738E84718A1B4C5927D3' : true,
- 'C6983038573EE575734E531266D91772390BDF63A276B49E9360C81F8C813EA6' : true,
- 'C6A38936450B0D72D5C38EC5BE6FA683D25CBFE604C7415BC5E55E2DEB06A946' : true,
- 'C6DE49C8D85A8712EA1A7CCD38B89C74933A89B1512E11FE96EA844F6D6CD9EC' : true,
- 'C6E05D29FAED5903549692D81FC477129F2A3C408AE6C03785B40154A4E80B56' : true,
- 'C7DCCF394F89BCF1B8D78F0E6A558FE8328B360430CD055DC111E930491951C7' : true,
- 'C821C2140114FA7DDE92FA497EED3E4B9131919A9EF3D6750013C6CE7FEE0B72' : true,
- 'C86755D4C77305CCE06484D0BFAA6CD8A72B73B646130D27BB75C8121ED14288' : true,
- 'C86D8AEC465B23370C4D5086141E9C98935D91524E3CF68BBE62C0AB231EEEBD' : true,
- 'C8726499B7FA3B32022A21230BC27CC59901DF584C69F33232EE76FD7A554F3D' : true,
- 'C88BF2F611A7EE5307733DC2950EFF56A96BC832961FF595196EB88EFDDF4932' : true,
- 'C8B4AB5E690CF9E14D079125CBD13232EACD4FA3F15276D2D7BC48FB84BDC0C3' : true,
- 'C8C2433B0C173644E3208A07D4103D433119301B3E0887748EB73300E58C9BB1' : true,
- 'C950A2AC5B35DEC3F384099AD2E3BA7FDBE79E93362A132380CB5ADD1EC2E94D' : true,
- 'C9B128CF349E20FE9560F5AD10F77673AB1F8F69FC6F2BF312FFFDBD5746B116' : true,
- 'C9F2002F6542DA1BC5833AF9A11F6F5F144B76539CDB9E1738C7DB37097523D9' : true,
- 'CA157632863D3E7B499F141741724FA84DBA48AEB51B04A53A9D3DFEA7F70BF1' : true,
- 'CA46DA728E76E97AD214DBB6AC9CB1EA2DC87202C88C35E87CE574FC1F2E0438' : true,
- 'CA846077B68DCA99AE30BAC33929143E856784B64E70098CBC7FF5BBD85C824B' : true,
- 'CB6C703326037CB5C4456097438DF15387452C0CACD89D9DDAB1475A2111C197' : true,
- 'CBC3C62B44E2C35250AB62FB2C3993C55F251559259727D5F76A63002148F17A' : true,
- 'CC1A62E8FD6FCF9A3BE4BAAA64AE2FC0BDEA2C2F34BAEF8F9123D991262DB210' : true,
- 'CC815184FE74CDD53947DCC9733B1D5E9B9E8F31C8C96154355ABAF389BF7D63' : true,
- 'CCF6435DDA033106286D7A69A4C8DD727B59C4E334826CDBCF6F66C801580FF4' : true,
- 'CD7C028069F371EBE93537094CB57A51CA0CA421B9A7F8C1422D9C454F864FD3' : true,
- 'CDE7AA628678D4BCAEF4240A9D09B5BC7BC1A1757010006931949C83DA299B9E' : true,
- 'CE01F10B612255CCF31E03F308F45E0A091C0FC41A13280F575BAA7F4F7B4A58' : true,
- 'CE318D567E77FA3E2B87268B09B1FE99484916CDBC7A56B99900CE7BB7B4F967' : true,
- 'CE34361030AA71334FC8EAC253C91EDDDAD3E2AF0974931325384B9A445CD116' : true,
- 'CEA9DC1557689CC8AFBC740C095ABE8AA617C19AB92B761EA71F19AB2B3FBA4A' : true,
- 'CF099A3A9DBE3D79F3E420A47A8447A50A2F87ACF2874CA86D49F271B82A68C5' : true,
- 'CF19B1004488D5D9C882E2C4D0A47789618E0BCD6475F6D9C6B5591C2BF333C9' : true,
- 'CF3457D98980F7909742C974AE4EEABF2007967D9870705867C18A5B47CEB2B4' : true,
- 'D010B9708329342E43370125857DBFD443ABC95CF5778898A7343E5F1C61F4E9' : true,
- 'D0927B6D60E3441E11D75A8FD593A38665AA7D211F691BDA3D0E815EBE303C25' : true,
- 'D0ADA8B3F0D09BD13AE5877B5E448C18376D129F92DCF2D4F1BB182725A62D3D' : true,
- 'D18241A820196F4910694FBB37556273E54236F41FD53B3AF75B6C6430D93B15' : true,
- 'D1B116326075EB6F65C4F8F8E6742B639DB23B56CD8420F42F8219CE615303C7' : true,
- 'D1C4E4D1F014FB8F889F45AFA39485BE742F64268C662BB28494855E393ADE96' : true,
- 'D1C684802932EB8EBBFA0DBD55EFA5345AB3A928653CC222D548CD29D91EEBFE' : true,
- 'D249C8E95880A20CAEEFADA9A9B8E80386234DBCA6D990E78CE574B430C0E6A2' : true,
- 'D2D9C57B19EABF7A90BCB421283733EABE5ECC6311B1D05089D4F4251D157E3D' : true,
- 'D3525FAE9E537DD0A56F0311A27A603C422DB0376928C707A12A1E3785F2BEE7' : true,
- 'D387A162888C2556F1D3B9A73201A8608A57085E1115214BD2588F315B89776A' : true,
- 'D41844AFC9E00E17DC87F0ED1AE4A0559C418770A4FD7033E3D9A9997C5E204E' : true,
- 'D4374D2DC334055205B79A4327686F87379C4D610595EABB64DD0F0665051227' : true,
- 'D44D1A7D80BD2F9B4A62E11BFEBBB74A5780B0366CB6038CEC9FBC8C8E19439A' : true,
- 'D53C334638CE54CB75DAA15D1AAAAD70081C9A52A2393DFC79E9C3A92D54F4D6' : true,
- 'D5D9E3A7DAB437D5F8967A307F6BEDD3B2AEFCF59B229BA649C4E549F01668B5' : true,
- 'D5E62D9B8F9EB17D8BA84646BC72AE6271E24D0C7787D302965A92ABAEDEE2FB' : true,
- 'D6061064FEC9DF923123EDB3050700BE1532B68D9FC12FAECABB9FA82CE2B887' : true,
- 'D6200C1744EDDC3BA40857A1089A20F7E86EC3B29FF413CA2BE49C060A79D19C' : true,
- 'D63DF52A3A887D35ED58C64463BF73252738FDDFD73E0F8B378E318AD3057D36' : true,
- 'D646154250C7883E951B03FBBE9EF7D3D00E74D60281FC82876A913A23AACB1B' : true,
- 'D7266CBBD307F97B7284312CD4C2A5BADA7D4EB123237EFA43E55D8D2F5B16A6' : true,
- 'D7632272521683A38E88A18C2CC6AED79B2C5E854483BDB6EE83D82BF41B96CA' : true,
- 'D77C2904CEF8726B748EE36E43BE65BDBD12FC48E4A4ECA4885537745B0BFD15' : true,
- 'D77D31A02283F81A4E64F7512C59BD71FF603FED5EC57F24F0A240F04B846999' : true,
- 'D782121A27D3EFEBF791EFE34D5A81385358DA939F5DEB17530252BFBC8E2F02' : true,
- 'D78220C9BDCD563F71BD8139B40A495879DAE9FB1968AE3225BD0D04DAF294BF' : true,
- 'D796DA6F4413295EF05E79C798E92CF8A6AE172A091C862D7176384D520BA2FA' : true,
- 'D7AAAAD6062EBEE0C1932945FD7ABC017F7FCAFD842BB5346E987F38C33EA678' : true,
- 'D7D1D7F326D3DE85FC1DFA7F45F9D5A3C64473B37143EB09DA66CE56F6258FCE' : true,
- 'D82602A79F22AF46AD32D0AD123D30464371FFCB7A8AFB8C51A74841463A20FF' : true,
- 'D82D68EAF052A2FB2F9324E8333D055A0B91AB07E22F15A25D43259CB98EFF57' : true,
- 'D86562629BA86C435C0965C4AC302160729F27804FEBA36E211F96CDEFB5DF8E' : true,
- 'D86996C0C019AAD9DF5531836BC48F54427021AB8E24BA1AD073895574A143FA' : true,
- 'D86CF2095E0D6C3DE32E728124623D29F7D2CC28669AF2E1794255D675B3474B' : true,
- 'D89FF0FA7A1E02ADC96283A27F9A7D875AEF9592518B3369AC790236A51211CD' : true,
- 'D8AA8D8A7A48ACCB4C1B7E6C2228B7BFBC297EAFAB1315643744E3EE4DFA7E6C' : true,
- 'D9065B6D9F7F27507D51170FB465FA6250DF528EC38BB46DAD0311C1DF63ACA1' : true,
- 'D9259A35701E881FD41A9939C4AB82EDAA83A18D1ABCBBBF8329FC6850A0C6DD' : true,
- 'D94290750677E2B5ECE7C2DC41AD4618C6995F173EC44DF80B23CC0E333EA654' : true,
- 'D9FDB29EF83808BC82A97839FB2F22C2D20DAB2E6B67BF5862C8922BB1FA9068' : true,
- 'DA5D20F1A6CF6CEC3AA7028A6E17D8F2E1A60069E497758B0CC938C08F4E76BC' : true,
- 'DAA384D0D2A94A18A14E3DDF7A963E59BE41C06B978F3DC8862E1EE6C8E76DD0' : true,
- 'DACA572539398A22DF7049B23BA3E59DAD6F34A44ED7D5E275457D9F79B880A8' : true,
- 'DADD1B4DC65D1DE3D13B18DEA58D61BA3449CE45E1C5176509B8A3B197A09618' : true,
- 'DB54ABB14B79069CAA8BE0A4AF8F5C97B27B6E674E3CB8DA132C1EE2902DBDEC' : true,
- 'DB995D854C4EDEF4DB5CCF20B2B30719056F3EDAA0CCF4B9D9C5C898407C5C7A' : true,
- 'DBBF19EB75C47A8473F59CE4B2A318B493EEFEE4B6719BDF40FAB2E81D9DB2D9' : true,
- 'DC5FA206BA63F5157E68208A383EF3A2D56EED879713602BB364A5A2A243A722' : true,
- 'DC90A8BEF7B1C62F9E4B3D3345665DBB5D6CB46077F5E7ED0628A5C0E3DFB742' : true,
- 'DCBC478CD6F43B2AF0C5974AA7B183F3487EF756F79BF4138288C4C207CFDD4A' : true,
- 'DCC87ABAA2524536C43A280BC52710BF117E56EBB39444873F93AEF18519A502' : true,
- 'DCCFAA33D28DE7243AB2C1514FF36012E967B0C0C6E62E940325CFCE982BFC23' : true,
- 'DD5A1FC87107218C43D2C1C73075C5506D6901CE1289F86DC0162E6BBB80B84C' : true,
- 'DD79B321EF333A6C39D48DB57DC5A138F023A111D56851CD4CBC8EB1BD094893' : true,
- 'DD7B5992561C1F706A82F7D9318E45DCB1CF508A564263893350E2D3CBC41241' : true,
- 'DDB4149166CCAC259D826E4E6649B5F59DB8DE3A2ABE0D0CA88F192AC891B331' : true,
- 'DDCA271FAF2837CD14B62951B3CBCB5BEBC264BF6C813019BC1091D8CB425F2C' : true,
- 'DDCA648AB82DF2A942AAD4B384839255D5D98ABEAFB602B2BBA2F4B115072EDC' : true,
- 'DE65D592D65A64794CCF2911A10DB5DB27C28E6C88BBBF75B75FCBC2CAF5A02A' : true,
- 'DEEBA70EA985BD2637FA63B79F69B0EEE5D261E95E3699B97855296B23D82C3D' : true,
- 'DF32CD36F2BAE47DB4BDD2610D77629F44819723F9BA4FCFF6CC7F6E5709FFFD' : true,
- 'DF4482289B54CB444569A5436AEEBEBFB348D966D2FBC8C5115376F3E5496303' : true,
- 'DF464344337A60D78868FE886F92848BFF8713D641C9AC5EBA29524842656CCA' : true,
- 'E06707F7CA1E65B0B452A3D09CBB61FD055BD338F0A358B4D27403451B0E3B1B' : true,
- 'E0BD7FDC3544BBBF78F401148ADE378A4A85214C0469EDD5EC23C5246A6F5555' : true,
- 'E0EFCF7FC7033248F1933BE975F931485787F32928E47DABAC84FEC9D7365CFB' : true,
- 'E131F4E38AE499C92E90E6B52F2A2959C457039C00FFBEDC54F8E634718A2FBD' : true,
- 'E141FC9E4CCAD241F40BB3FBEC1A8EA8C8DFC56E32528EF68A9A33F6CFB844E3' : true,
- 'E18545BD6D070F0C6AFE93153C190792C4921FC90953FAA775E351B1FB1BCC44' : true,
- 'E26F4C34273553354334DC7A22DC56A781F2491181799287CC91F12871FEB50D' : true,
- 'E27966B8B9C67C751F9AB8315D0BD1CEE334D96A8C5F60C764070EF8B8FCE61A' : true,
- 'E2C0F7B8612401A2E50A7CC84DF8FFC78D54272CDB2CCD0376A4BAF9264940A3' : true,
- 'E2C42D4BD3807D802CE3B9EBC6FACC04E34EF327F4BBEC1C7A48618A1271F5E4' : true,
- 'E2FC1229FE0EDF06A3706DB8DBD2344B61A9364840A3E61E6B29CE49A966AC8F' : true,
- 'E315468836F77DF6AA146AF392C5DB7262A83AA83FD7CD75771C70D29C3F16CB' : true,
- 'E381DF6792973BFE322D23C6CF2A6C24A4ECFC77F43F03D2FC04EE39FAD7C683' : true,
- 'E3EADC69740DF00FD147B0718CB1063D7E90E172E196C96956920235CF9DB382' : true,
- 'E3FFE980C209BCBE10F594806CAA472BA2D4702F6E2549AEB86DC52B46DCF773' : true,
- 'E47E188C00A2D2AF624B01A1E52AD2618C0ED598EA643C1F0CE4C5297B3649DB' : true,
- 'E4A79C0CBC9966A44EC1185DD6E66371FF395D0FAC53C1FD2619B02F6ACC9C6D' : true,
- 'E4F069C24D7162E3C94AB295EA33C8926BDDF79934CA28D8982A35650EB60B05' : true,
- 'E50C2EC0BA6891F60BB325C0762AB06271161EFA9E0B2ADD50FF520128092FBF' : true,
- 'E556C54852E6E0E61097B2A34DDCB87F12EF74CA847CE07C4CAD2348FF41D3E5' : true,
- 'E5E046397DC23925AB8CAD7CB66E2A12EBD989350CE41F89EED455248A109098' : true,
- 'E5FB4DB1871BDADEE779D366E7BD007F7A963FBCB00B90EC14C8077477E436AD' : true,
- 'E62CB2C9DEDF84514D7B8F31C2388555F2B768116D1813EA97FC6C00F715AE02' : true,
- 'E68C4E54088AD4A308EC6053041A4A8B04A213347BAE2CE86D3F1587B1518981' : true,
- 'E692108B3683F3C6362DF92476D62BAE60687035B70B9119F962190C9C215B04' : true,
- 'E6A029856494D7FE48E048D60E7BDE80D2B6217FF084F64A929056E166F479C2' : true,
- 'E6A6EDA8D60BE3C0A5A19631D1BC3262EDABEBFCD0144F3D19513C8F6342CD12' : true,
- 'E6EB9DC7D407B4A2F308B4822E5BEA7428CD4520C59934214831D61E95F2BA34' : true,
- 'E70FC0431E5B6632A30C04F99A4E0E55C860187A04CCCDA4FDC08E926E94964D' : true,
- 'E7CF336F6E4E8CC153474F240D9238D41091EBA635F25CDAFCFCFC3AF2A6BA43' : true,
- 'E80FA3BD00D99AF27B013B520D3CEB1A8DF8BE355EC971F08B4AE44FFCE44147' : true,
- 'E827A539BF87598F48DFEE077DC7768D19E88426AD9E91375DF32F0F944F2010' : true,
- 'E83B3C3A3EAA32F6C60BE4D4DA918AA4A5432FF3380D4886C2844D69094EC571' : true,
- 'E893B898F708775C51A0A60748972C53C4B62787A591B96EFBF8CE28E29E87D8' : true,
- 'E8AD1B8DA833226A37C21D1608E0DBA8C758EED7A943EDF323ACBB779E227C86' : true,
- 'E9A176C583F8B5522A9A86B6A4409AFAF614D6A7650A5D6C32E4499319F5280B' : true,
- 'E9A1ED503AF06DB86725A61A05DA4E121443B85923A0830BEB83FE6973D6C1EE' : true,
- 'E9BB3A11B595B1D403FE21DF47A3A4EB4CF43ED49259DA83FB0FAAEC048422D7' : true,
- 'E9DDA8C162F91A7D746A5567060DD636491C8C1441697B600F56C00FE73AC594' : true,
- 'EA6973A28807C80D7558B7636F875574C9FAD887BACF23B0F686A61C26EDBFA7' : true,
- 'EA9369F9AEF701B1F9699363254A2AE007F47AA824AECE077B82F1C0B6A69197' : true,
- 'EB11019A7642C75F4DDC1DC9CF3B469BFB4C44B71C615693C73175F16DCA036C' : true,
- 'EB26A8A870A888295A366493B26917B9D9618E0FBC13CBB02CA8E180A5B7A8B7' : true,
- 'EB41E514913E175F693EEA9EE3202E59EB9C450769C55BAA30C121C2A9E468C4' : true,
- 'EB5F60FED8FCE35455A15B9A8E9E200FCF1B8B5B278D1511C8C5EE67BD99FB46' : true,
- 'EBB8403BAC78C842A81201893DC86184BE82BC2BFEC8A51748651F938F4051B0' : true,
- 'EBC9928117D91D999CC375930982E891C5DC4F9E02A3960FE692DAB13D96ADA5' : true,
- 'EC3097F047F40894368CA744A97CBB177C1122963AFF3D958DDBAC299F793E71' : true,
- 'EC4FC179A9A40EBCF5F9508C94C0209D9C28ABFB21EE932FE11BC87F2887C490' : true,
- 'EC869ABCCE3A1C036F1AFABE5ECD4FDA581D16C0E81E16A2734E6004A55896BC' : true,
- 'ECA27FBA9090EAD50CEE16362AB7462FBD060DF8B4BE27C107328E49214D6758' : true,
- 'ECA4B72D4C90C2889F21F4084AE4CB53F5B8EA5D147529B0CF72D3A9093532B4' : true,
- 'ED310E1BAEB1759D2AEC00BCDE6D9A86DFA33B17563EB5105585F15327831032' : true,
- 'ED4960F15A8193849C5C2AC2285D218C7FBF0697FF46A958341F2980137F6700' : true,
- 'EE82E118167C83EC466137DE867DF824A5063074FC61CD164D21F26976741A2E' : true,
- 'EF162B09A3D267BB7B8C79D44D06A7AF21EF260518D0EF3A8CFA1730D7B89231' : true,
- 'EF55226DCFD0FA606BFD3496633BFCBC146925B2D6685AB4875E142D79233600' : true,
- 'EFBA99859B7F905F7A48954F12D88494E408EA444CA3B4FAB5E5FF37EC395576' : true,
- 'F010781D39EBF1A76700CA71DB56877685A52CEC2E7250D2C5684AF659887AC8' : true,
- 'F055D488944F4779BE3F17FBEAD728843701CE6598D01286AA1D525F26AEDAAB' : true,
- 'F07E7F2A7106743D8C1FF2E201F944E3227363968C5A0AE31112473B93BACC7B' : true,
- 'F0A9E452CB90B0B6C50FB794AAE7ECBF5E56801A10124C95292B28592FA9B003' : true,
- 'F0FD8D8E64636B1A1CC2557C50DBADE7A1F0536B905F5FFC06AFEF630AB9A40B' : true,
- 'F1C66D3A1C4917A59AF8ADC68A0722F7193D345BD978BA00FF669E7948D44F29' : true,
- 'F205928C933AFF1F1A6411AB779CFAE3FAAF43754AB86735DB52F74DB1DA81D2' : true,
- 'F233DDE8F7165F2D7AA4E736E6FE1F913570FA7CA3E3C134EFD22D5F303075DE' : true,
- 'F239A3C63AD2FAF6C5962868BBA5925DE8A00C5FD43A83C783C0C5D1079A8BCE' : true,
- 'F2835EDF2E61A29F9E62FEF97476165D5FF40E553A2A4F955EDE30C0A5149E12' : true,
- 'F28F54684E233C9EEC646C6E1336E33684DA3732ECBEEDB2A606E09DD29801FA' : true,
- 'F2C91876EDB36EAD7E4821C2A6581144F1E5A67B2DEF4A5E4AFDF79F5E1CC4D7' : true,
- 'F2F7938B7E294F17565B2833CC2E0A657DA80A237814C24B5C0AAAF35C4608F8' : true,
- 'F3160DD030C118B5D5835743E78CCADD0620E5C08460E0CD1F5D9D437352105B' : true,
- 'F319741878D155ED3E5DD4955A82B842700A64D86AB782B511F0CB9B25C48AFA' : true,
- 'F3A6A1A957C3BC86EFB3772C6153D97C33B908124CA58480AD1F62C54CD89013' : true,
- 'F3D202454336E948C83BCA2342C4D1A0DBB4335E829229BEAE04B4125F0D508E' : true,
- 'F3F90821BD1454FC7AC92F768D2C9F75B5CD79FF4DD3251F4B9D647D34024F73' : true,
- 'F456775CCC8DEC02CF2F92A48101E18EBCC9C880D41FA87EBE5E2EAA0E24620D' : true,
- 'F460158348B017310570CAB302E33DD12FF72526698115EEE8D3DE318383ED9C' : true,
- 'F47CA7623AEE6A1849B4F3F90818A93AA937A0EFA65D6674EA769BD7EC113BF8' : true,
- 'F48CB2C1C2551290BA59502BBFCEC7BF137B5176967BB92B38E79D4EAA63B7E0' : true,
- 'F4AD6AEF9BCAC58CF21EA81D65C3B8C85CBC9BCF6A2807FB0C5CD332C5F9BF49' : true,
- 'F4C119D9DB2CD569E75B9B1F0884B990575EFD920E8C62177990AE650B7AA274' : true,
- 'F4DD9346FC095DED0E4014722A90868202F9241E983F680AD69205E77DCB01ED' : true,
- 'F4EDB536BE8520B583202E17C56768579613187741195347DDB9BCE3AE2D5150' : true,
- 'F5B52148D7155BEE637459A918CE58D22D4E024FB715325FC1B36DA4C6255357' : true,
- 'F5DBA16527D871BEFEEAE706C232AD0B76FA1384EFB86A844C7BA46B96917B9D' : true,
- 'F5EB7AFA398131FF3966EE221B9C8F332BEFCB634D42631E349AC0BCF367E920' : true,
- 'F5F8E7786E1F61643C7D2805D86031E5C4CC97AE93FC3785FE289FBC44C381E4' : true,
- 'F66ABF80914FBDBE53F794409F4E0DC895129066609E8B491506FCE246A2EEB8' : true,
- 'F6A08E63AF8E62D51930BCE0FA7CF25DD2944512652EFA275E150EDD9C11CF51' : true,
- 'F6A7FA219283E5B13E256B4E039E4CCD93CB72B84D84086E398D5534ECA42DFE' : true,
- 'F74D9E23F4CB53775CA60178347F2A029F77579000B21AA08EC62A1C2932348A' : true,
- 'F754352E819D0C33E6CFC06EECBB4356DB5D8BD1FD2591C7C817CCE662BE2BC4' : true,
- 'F77AF5088D4EB425ADC0997C059C641EFB5AE2CAC73669EBAEEA378EDA383186' : true,
- 'F7A57247F89F0C50879598293BB33B7AFF5FB74BCE37BF7B53F8955CEFBB9511' : true,
- 'F7B593D9277B72E9CF376EAC2BD5535F76CD9FA0FDA3793D7EA6B4D050602E85' : true,
- 'F7FC63254BF2472575C6D5DEC8DDF02B24B6F1BDCE03D807B159A69820262D4A' : true,
- 'F823D6220F702D0547375FC4451FE27A91F0CE2AF9DA31552235F96CBBA56326' : true,
- 'F82E01B697453BD37AD7012E267DC78395DF3DF4BFB0B1657F58256616F9B355' : true,
- 'F8434B1782EC41F184305BD75BB3C0206721BC6CAD62442377072C06101B70DE' : true,
- 'F88D1DF97289C9ED7E062D4E4B2B2463F90946DAC91785A6FA02F2599D7FE65C' : true,
- 'F8E68F837C3E9452994FD6BF08F02D12D087BF6D44137BA37F72E408620F558B' : true,
- 'F9971BA9EA322BB3FCB85111FED48B9CC1C9788D7BC6985E3CCE4BB7801B0DCC' : true,
- 'F9D5CC6DF4DA5D7B237C07578FD0C48108FFD5E5B21F24CD46FB8CCB8B960671' : true,
- 'FADEBB24D23CEE1E8B02430C31A939E14821E9567A25367303F20F74879AB51C' : true,
- 'FB674F1642EE443BBB827B29FD871CC110D77875884B1B050FC804D2884B2B3A' : true,
- 'FB6814C66D6DDA2F348BF759398AB81F7795CA223F8AE9C0D82CA295162F68AD' : true,
- 'FB7B1676A5C0FABF7EEFA6815A78647C0985AEAE4F6864E905D27059DE252BF7' : true,
- 'FB7EF701469F77B6412100BB2D6399B1A574BB9610186FFFCC0119E14CB2021F' : true,
- 'FBCC79E05CC135E183F4963C2A206F9DFDBC2DD0D379A743D5FB301741796921' : true,
- 'FC2DA5A38AD07685CC019C7C388A396159FBAEF9EA491588FC995DBDF52A0B9C' : true,
- 'FCF4BA663F0032118EADF9D327B65AB502C7A8B336462A397238884E9A28508E' : true,
- 'FD3D5A1DEF394401B5387159AECA13C43342505D4BFAF2DABBADE1E801890363' : true,
- 'FD87C175594ABB82818D5CFEE506105069ECE5D5A499CFAD2E6376A88BAEB15D' : true,
- 'FD8B1849A13BBD87D072F9D09506C90C0F29D7CCBD2B6446AD31335348AF9294' : true,
- 'FD9DD5B7112851DFAA9AB9B451E38BBBC86D3A2463DBE0E51297A691724DE75F' : true,
- 'FDEE85771EF592A9E5F47D08250AFCBC73DCE96A72418B2848AE400F3CF59341' : true,
- 'FE5DBE234A59B532A12BD552A36DB75AD21EF243C48C61849A0F93AF314C5896' : true,
- 'FEB92F19B7394B8BF0FF71AEFD233E262AB656BDD531AD89FBEB9228C5378301' : true,
- 'FEE181302E80BF6B40A6B3DFF5290C4A425134BE686480E7FD755E32BAD6B4F3' : true,
- 'FEFEF80071B0D8E2B57D6601BB353A435A425EAA701827370C3585CE09F2CE50' : true,
- 'FF19126728541443A82A9C9A0E9F773BABF83B6BFFB09F82E4D9B79F6E3C4EB4' : true,
- 'FF769AAD90F56FB48D6C6CFCC86E38F9CBC6DB23774342892AFD4680ED3560FB' : true,
-} ;
diff --git a/src/chrome/content/code/sha256.js b/src/chrome/content/code/sha256.js
deleted file mode 100644
index 7e15f1af10d0..000000000000
--- a/src/chrome/content/code/sha256.js
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * A JavaScript implementation of the SHA256 hash function.
- *
- * FILE:sha256.js
- * VERSION:0.8
- * AUTHOR:Christoph Bichlmeier
- *
- * NOTE: This version is not tested thoroughly!
- *
- * Copyright (c) 2003, Christoph Bichlmeier
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holder nor the names of contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * ======================================================================
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
- * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/* SHA256 logical functions */
-function rotateRight(n,x) {
- return ((x >>> n) | (x << (32 - n)));
-}
-function choice(x,y,z) {
- return ((x & y) ^ (~x & z));
-}
-function majority(x,y,z) {
- return ((x & y) ^ (x & z) ^ (y & z));
-}
-function sha256_Sigma0(x) {
- return (rotateRight(2, x) ^ rotateRight(13, x) ^ rotateRight(22, x));
-}
-function sha256_Sigma1(x) {
- return (rotateRight(6, x) ^ rotateRight(11, x) ^ rotateRight(25, x));
-}
-function sha256_sigma0(x) {
- return (rotateRight(7, x) ^ rotateRight(18, x) ^ (x >>> 3));
-}
-function sha256_sigma1(x) {
- return (rotateRight(17, x) ^ rotateRight(19, x) ^ (x >>> 10));
-}
-function sha256_expand(W, j) {
- return (W[j&0x0f] += sha256_sigma1(W[(j+14)&0x0f]) + W[(j+9)&0x0f] +
- sha256_sigma0(W[(j+1)&0x0f]));
-}
-
-/* Hash constant words K: */
-var K256 = new Array(
- 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
- 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
- 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
- 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
- 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
- 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
- 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
- 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
- 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
- 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
- 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
- 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
- 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
- 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
- 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
- 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
- );
-
-/* global arrays */
-var ihash, count, buffer;
-var sha256_hex_digits = "0123456789abcdef";
-
-/* Add 32-bit integers with 16-bit operations (bug in some JS-interpreters:
- overflow) */
-function safe_add(x, y)
-{
- var lsw = (x & 0xffff) + (y & 0xffff);
- var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
- return (msw << 16) | (lsw & 0xffff);
-}
-
-/* Initialise the SHA256 computation */
-function sha256_init() {
- ihash = new Array(8);
- count = new Array(2);
- buffer = new Array(64);
- count[0] = count[1] = 0;
- ihash[0] = 0x6a09e667;
- ihash[1] = 0xbb67ae85;
- ihash[2] = 0x3c6ef372;
- ihash[3] = 0xa54ff53a;
- ihash[4] = 0x510e527f;
- ihash[5] = 0x9b05688c;
- ihash[6] = 0x1f83d9ab;
- ihash[7] = 0x5be0cd19;
-}
-
-/* Transform a 512-bit message block */
-function sha256_transform() {
- var a, b, c, d, e, f, g, h, T1, T2;
- var W = new Array(16);
-
- /* Initialize registers with the previous intermediate value */
- a = ihash[0];
- b = ihash[1];
- c = ihash[2];
- d = ihash[3];
- e = ihash[4];
- f = ihash[5];
- g = ihash[6];
- h = ihash[7];
-
- /* make 32-bit words */
- for(var i=0; i<16; i++)
- W[i] = ((buffer[(i<<2)+3]) | (buffer[(i<<2)+2] << 8) | (buffer[(i<<2)+1]
- << 16) | (buffer[i<<2] << 24));
-
- for(var j=0; j<64; j++) {
- T1 = h + sha256_Sigma1(e) + choice(e, f, g) + K256[j];
- if(j < 16) T1 += W[j];
- else T1 += sha256_expand(W, j);
- T2 = sha256_Sigma0(a) + majority(a, b, c);
- h = g;
- g = f;
- f = e;
- e = safe_add(d, T1);
- d = c;
- c = b;
- b = a;
- a = safe_add(T1, T2);
- }
-
- /* Compute the current intermediate hash value */
- ihash[0] += a;
- ihash[1] += b;
- ihash[2] += c;
- ihash[3] += d;
- ihash[4] += e;
- ihash[5] += f;
- ihash[6] += g;
- ihash[7] += h;
-}
-
-/* Read the next chunk of data and update the SHA256 computation */
-function sha256_update(data, inputLen) {
- var i, index, curpos = 0;
- /* Compute number of bytes mod 64 */
- index = ((count[0] >> 3) & 0x3f);
- var remainder = (inputLen & 0x3f);
-
- /* Update number of bits */
- if ((count[0] += (inputLen << 3)) < (inputLen << 3)) count[1]++;
- count[1] += (inputLen >> 29);
-
- /* Transform as many times as possible */
- for(i=0; i+63> 3) & 0x3f);
- buffer[index++] = 0x80;
- if(index <= 56) {
- for(var i=index; i<56; i++)
- buffer[i] = 0;
- } else {
- for(var i=index; i<64; i++)
- buffer[i] = 0;
- sha256_transform();
- for(var i=0; i<56; i++)
- buffer[i] = 0;
- }
- buffer[56] = (count[1] >>> 24) & 0xff;
- buffer[57] = (count[1] >>> 16) & 0xff;
- buffer[58] = (count[1] >>> 8) & 0xff;
- buffer[59] = count[1] & 0xff;
- buffer[60] = (count[0] >>> 24) & 0xff;
- buffer[61] = (count[0] >>> 16) & 0xff;
- buffer[62] = (count[0] >>> 8) & 0xff;
- buffer[63] = count[0] & 0xff;
- sha256_transform();
-}
-
-/* Split the internal hash values into an array of bytes */
-function sha256_encode_bytes() {
- var j=0;
- var output = new Array(32);
- for(var i=0; i<8; i++) {
- output[j++] = ((ihash[i] >>> 24) & 0xff);
- output[j++] = ((ihash[i] >>> 16) & 0xff);
- output[j++] = ((ihash[i] >>> 8) & 0xff);
- output[j++] = (ihash[i] & 0xff);
- }
- return output;
-}
-
-/* Get the internal hash as a hex string */
-function sha256_encode_hex() {
- var output = new String();
- for(var i=0; i<8; i++) {
- for(var j=28; j>=0; j-=4)
- output += sha256_hex_digits.charAt((ihash[i] >>> j) & 0x0f);
- }
- return output;
-}
-
-/* Main function: returns a hex string representing the SHA256 value of the
- given data */
-function sha256_digest(data) {
- sha256_init();
- sha256_update(data, data.length);
- sha256_final();
- return sha256_encode_hex();
-}
-
-/* test if the JS-interpreter is working properly */
-function sha256_self_test()
-{
- return sha256_digest("message digest") ==
- "f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650";
-}
-
diff --git a/src/chrome/content/dev-popup.css b/src/chrome/content/dev-popup.css
deleted file mode 100644
index c5eb4a7f081d..000000000000
--- a/src/chrome/content/dev-popup.css
+++ /dev/null
@@ -1,19 +0,0 @@
-#dev-popup-dialog {
- padding: 20px;
-}
-#wrapper {
- background-color: #ffffff;
- margin: 0 auto;
- max-width: 700px;
- padding: 20px;
-}
-#paragraph1, #paragraph2 {
- font-size: 1.2em;
- text-align: center;
-}
-button {
- font-size: 1.2em;
-}
-button#revert-to-stable {
- font-weight: bold;
-}
diff --git a/src/chrome/content/dev-popup.js b/src/chrome/content/dev-popup.js
deleted file mode 100644
index eb3fb8f83e2a..000000000000
--- a/src/chrome/content/dev-popup.js
+++ /dev/null
@@ -1,36 +0,0 @@
-const CI = Components.interfaces;
-const CC = Components.classes;
-
-// LOG LEVELS ---
-VERB=1;
-DBUG=2;
-INFO=3;
-NOTE=4;
-WARN=5;
-
-HTTPSEverywhere = CC["@eff.org/https-everywhere;1"]
- .getService(Components.interfaces.nsISupports)
- .wrappedJSObject;
-
-function dev_popup_done() {
- HTTPSEverywhere.prefs.setBoolPref("dev_popup_shown", true);
- window.close();
-}
-
-function handle_dev_popup_error() {
- alert("OOPS! Automatic download failed; please go to https://www.eff.org/https-everywhere instead.");
-}
-
-function download_stable() {
- try {
- var tab = HTTPSEverywhere.tab_opener("https://www.eff.org/https-everywhere");
- setTimeout(function(){
- openUILinkIn("https://www.eff.org/files/https-everywhere-latest.xpi", 'current');
- window.close();
- }, 500);
- } catch(e) {
- handle_dev_popup_error();
- } finally {
- HTTPSEverywhere.prefs.setBoolPref("dev_popup_shown", true);
- }
-}
diff --git a/src/chrome/content/dev-popup.xul b/src/chrome/content/dev-popup.xul
deleted file mode 100644
index f8f21be4f323..000000000000
--- a/src/chrome/content/dev-popup.xul
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
-
diff --git a/src/chrome/content/fetch-source.js b/src/chrome/content/fetch-source.js
deleted file mode 100644
index a0220c82c3c2..000000000000
--- a/src/chrome/content/fetch-source.js
+++ /dev/null
@@ -1,161 +0,0 @@
-/* vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 foldmethod=marker: */
-
-/**
- * HTTPS Everywhere Firefox Extension: https://www.eff.org/https-everywhere/
- *
- * Licensed under the GPL v3+.
- *
- * @copyright Copyright (C) 2010-2013 Mike Perry
- * Peter Eckersley
- * and many others.
- */
-
-// Define https everywhere variable object that will act as a namespace, so that
-// global namespace pollution is avoided, although technically not required for
-// windows created by add-on.
-// See: https://developer.mozilla.org/en-US/docs/Security_best_practices_in_extensions#Code_wrapping
-if (!httpsEverywhere) { var httpsEverywhere = {}; }
-
-/**
- * JS Object for fetching the XML source of rulesets.
- *
- * @author Pavel Kazakov
- */
-httpsEverywhere.fetchSource = {
- // TODO: look into class constants
- CC: Components.classes,
- CI: Components.interfaces,
-
- // Constants for generating URL from which source will be fetched
- BASE_SITE: 'https://gitweb.torproject.org/https-everywhere.git/blob_plain/',
- DIRECTORY: '/src/chrome/content/rules/',
- HEAD_STRING: 'HEAD',
-
- /**
- * Initializes the window to view source.
- */
- init: function() {
- var fs = httpsEverywhere.fetchSource;
-
- if("arguments" in window && window.arguments.length > 0) {
- var filename = window.arguments[0].xmlName;
- var id = window.arguments[0].GITCommitID; //GIT commit ID
- var URL = fs.getURL(filename, id);
- var source = fs.getSource(URL, filename, false);
- } else {
- // Should never happen
- throw 'Invalid window arguments.';
- }
- },
-
- /**
- * Generates a URL that can be used for viewing the ruleset source.
- *
- * @param filename name of ruleset to view, such as EFF.xml
- * @param GITCommitID revision of ruleset
- *
- * @return string of URL
- */
- getURL: function(filename, GITCommitID) {
- var fs = httpsEverywhere.fetchSource;
- return fs.BASE_SITE + GITCommitID + ":" + fs.DIRECTORY + filename;
- },
-
- /**
- * Sends HTTP request to view ruleset source and updates the window with the
- * ruleset source.
- *
- * @param URL HTTP request will be sent to this URL
- * @param filename used for displaying ruleset source
- * @param useHead whether send request to latest revision of ruleset
- */
- getSource: function(URL, filename, useHead) {
- var fs = httpsEverywhere.fetchSource;
- fs.setFilenameText(filename);
- fs.setPathText(URL);
-
- var req = fs.CC["@mozilla.org/xmlextras/xmlhttprequest;1"]
- .createInstance(fs.CI.nsIXMLHttpRequest);
-
- // Use HTTP GET
- req.open("GET", URL);
-
- // Clear User-Agent so request is pseudo-anonymous
- req.setRequestHeader("User-Agent", "");
-
- // handle asynchronous request
- req.onreadystatechange = function(params) {
- if (req.readyState == 4) {
-
- // HTTP Request was successful
- if (req.status == 200) {
- fs.setSourceText(req.responseText);
- } else if (!useHead) {
- // HTTP request was not successful and the request wasn't sent to
- // get the latest revision. Therefore, if we can't fetch current
- // revision (this project's revision might newer than lastest, for
- // example), try to at least display the latest revision.
- var URL = fs.getURL(filename, fs.HEAD_STRING);
- fs.getSource(URL, filename, true);
- } else {
- // at least we tried...
- fs.downloadFailed();
- }
- }
- };
-
- req.send();
- },
-
- /**
- * Handle a download failure of ruleset.
- */
- downloadFailed: function() {
- document.getElementById("source-text").hidden = true;
- document.getElementById("failure-label").hidden = false;
- },
-
-
- /**
- * Convenience method for setting ruleset source text.
- *
- * @param text ruleset source
- */
- setSourceText: function(text) {
- var textBox = document.getElementById("source-text");
- textBox.value = text;
- },
-
- /**
- * Convenience method for setting filename text.
- *
- * @param text file name
- */
- setFilenameText: function (text) {
- var textLabel = document.getElementById("filename-text");
- textLabel.value = text;
- },
-
- /**
- * Convenience method for setting the path (URL) that was used to fetch
- * ruleset.
- *
- * @param text path text
- */
- setPathText: function(text) {
- var textLabel = document.getElementById("path-text");
- textLabel.value = text;
- }
-};
-
-// TODO: Test resizing on mulitple platforms
-// adjust window resizing
-window.onresize = function() {
- var textBox = document.getElementById("source-text");
- // TODO: Move to constants
- textBox.width = window.innerWidth - 100;
- textBox.height = window.innerHeight - 150;
-};
-
-// hook event for init
-window.addEventListener("load", httpsEverywhere.fetchSource.init, false);
diff --git a/src/chrome/content/fetch-source.xul b/src/chrome/content/fetch-source.xul
deleted file mode 100644
index caa004872df1..000000000000
--- a/src/chrome/content/fetch-source.xul
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
diff --git a/src/chrome/content/meta-preferences.xul b/src/chrome/content/meta-preferences.xul
deleted file mode 100644
index 3e48010c2cb7..000000000000
--- a/src/chrome/content/meta-preferences.xul
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/observatory-popup.xul b/src/chrome/content/observatory-popup.xul
deleted file mode 100644
index 60da68fdc620..000000000000
--- a/src/chrome/content/observatory-popup.xul
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/observatory-preferences.xul b/src/chrome/content/observatory-preferences.xul
deleted file mode 100644
index 96102d05bff7..000000000000
--- a/src/chrome/content/observatory-preferences.xul
+++ /dev/null
@@ -1,106 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/chrome/content/observatory-warning.xul b/src/chrome/content/observatory-warning.xul
deleted file mode 100644
index 1f64e128620e..000000000000
--- a/src/chrome/content/observatory-warning.xul
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/observatory-xul.js b/src/chrome/content/observatory-xul.js
deleted file mode 100644
index cc7ad8254c4d..000000000000
--- a/src/chrome/content/observatory-xul.js
+++ /dev/null
@@ -1,193 +0,0 @@
-const CC = Components.classes;
-const CI = Components.interfaces;
-VERB=1;
-DBUG=2;
-INFO=3;
-NOTE=4;
-WARN=5;
-
-var ssl_observatory = CC["@eff.org/ssl-observatory;1"]
- .getService(Components.interfaces.nsISupports)
- .wrappedJSObject;
-var obsprefs = ssl_observatory.prefs;
-
-const pref_prefix = "extensions.ssl_observatory.";
-
-function observatory_prefs_init(doc) {
- // Is the Observatory on?
- var enabled = obsprefs.getBoolPref("extensions.https_everywhere._observatory.enabled");
- document.getElementById("use-observatory").checked = enabled;
- set_observatory_configurability(enabled);
- // Other settings
- document.getElementById("alt-roots").checked =
- obsprefs.getBoolPref("extensions.https_everywhere._observatory.alt_roots");
- document.getElementById("priv-dns").checked =
- obsprefs.getBoolPref("extensions.https_everywhere._observatory.priv_dns");
- document.getElementById("self-signed").checked =
- obsprefs.getBoolPref("extensions.https_everywhere._observatory.self_signed");
- document.getElementById("send-asn").checked =
- obsprefs.getBoolPref("extensions.https_everywhere._observatory.send_asn");
-
- // More complicated: is it anonymised by Tor?
- var obs_how = doc.getElementById("ssl-obs-how");
- var anon_radio = document.getElementById("ssl-obs-anon");
- var nonanon_radio = document.getElementById("ssl-obs-nonanon");
- var anon = !obsprefs.getBoolPref(
- "extensions.https_everywhere._observatory.use_custom_proxy");
-
- // first set the radios to match the current settings variables
- obs_how.selectedItem = (anon) ? anon_radio : nonanon_radio;
-
- // But if the user hasn't turned the observatory on,
- // the default should be the maximally sensible one
- var torbutton_avail = ssl_observatory.proxy_test_successful;
- if (!enabled) {
- set_obs_anon(torbutton_avail);
- obs_how.selectedItem = (torbutton_avail) ? anon_radio : nonanon_radio;
- }
- //scale_title_logo();
-}
-
-// The user has responded to the popup in a final way; don't show it to them
-// again
-function popup_done() {
- obsprefs.setBoolPref("extensions.https_everywhere._observatory.popup_shown", true);
- window.close();
-}
-
-
-function scale_title_logo() {
- // The image is naturally 500x207, but if it's shrunk we don't want it
- // distorted
- var img = document.getElementById("obs-title-logo");
- alert("ch is " + img.height);
- if (img.height != "207")
- img.width = (500.0/207.0) * img.height;
-}
-
-// grey/ungrey UI elements that control observatory operation
-function set_observatory_configurability(enabled) {
- // the relevant widgets are tagged with class="ssl-obs-conf"
- var ui_elements = document.querySelectorAll(".ssl-obs-conf");
- for (var i =0; i < ui_elements.length; i++)
- ui_elements[i].disabled = !enabled;
- // the "use tor" option can't be ungreyed unless tor is available
- if (ssl_observatory.proxy_test_successful == false) {
- var tor_opt = document.getElementById("ssl-obs-anon")
- tor_opt.disabled = true;
- tor_opt.label = tor_opt.getAttribute("alt_label");
- }
- if (!enabled)
- hide_advanced();
-}
-
-// show/hide advanced options in the preferences dialog
-function show_advanced() {
- var enabled = obsprefs.getBoolPref("extensions.https_everywhere._observatory.enabled");
- if (enabled) {
- var adv_opts_box = document.getElementById("observatory-advanced-opts");
- recursive_set(adv_opts_box, "hidden", "false");
- document.getElementById("show-advanced-button").hidden = true;
- document.getElementById("hide-advanced-button").hidden = false;
- }
- //scale_title_logo();
-}
-function hide_advanced() {
- var adv_opts_box = document.getElementById("observatory-advanced-opts");
- recursive_set(adv_opts_box, "hidden", "true");
- document.getElementById("show-advanced-button").hidden = false;
- document.getElementById("hide-advanced-button").hidden = true;
-}
-
-function recursive_set(node, attrib, value) {
- node.setAttribute(attrib, value);
- for (var i=0; i < node.childNodes.length; i++)
- recursive_set(node.childNodes[i], attrib, value)
-}
-
-
-function set_obs_anon(val) {
- obsprefs.setBoolPref( "extensions.https_everywhere._observatory.use_custom_proxy", !val);
-}
-
-// called from the popup only
-function enable_observatory() {
- obsprefs.setBoolPref("extensions.https_everywhere._observatory.enabled", true);
- var torbutton_avail = ssl_observatory.proxy_test_successful;
- set_obs_anon(torbutton_avail);
-}
-
-function disable_observatory() {
- // default but be sure...
- obsprefs.setBoolPref("extensions.https_everywhere._observatory.enabled", false);
-}
-
-// called from within the prefs window, we have more work to do:
-function toggle_enabled() {
- var use_obs = document.getElementById("use-observatory").checked;
- obsprefs.setBoolPref("extensions.https_everywhere._observatory.enabled", use_obs);
- set_observatory_configurability(use_obs);
-}
-
-function toggle_send_asn() {
- var send_asn = document.getElementById("send-asn").checked;
- obsprefs.setBoolPref("extensions.https_everywhere._observatory.send_asn", send_asn);
- if (send_asn) ssl_observatory.setupASNWatcher()
- else ssl_observatory.stopASNWatcher();
-}
-
-function toggle_alt_roots() {
- var alt_roots = document.getElementById("alt-roots").checked;
- obsprefs.setBoolPref("extensions.https_everywhere._observatory.alt_roots", alt_roots);
-}
-
-function toggle_priv_dns() {
- var priv_dns = document.getElementById("priv-dns").checked;
- obsprefs.setBoolPref("extensions.https_everywhere._observatory.priv_dns", priv_dns);
-}
-
-function toggle_self_signed() {
- var self_signed = document.getElementById("self-signed").checked;
- obsprefs.setBoolPref("extensions.https_everywhere._observatory.self_signed", self_signed);
-}
-
-function observatory_prefs_accept() {
- // This is *horrid*, but
- // https://developer.mozilla.org/en/working_with_windows_in_chrome_code#Accessing_the_elements_of_the_top-level_document_from_a_child_window
- var outer = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
- .getInterface(Components.interfaces.nsIWebNavigation)
- .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
- .rootTreeItem
- .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
- .getInterface(Components.interfaces.nsIDOMWindow);
-
- if (outer) outer.close()
- else alert("no outer space");
-
- return true; // https://developer.mozilla.org/en/XUL/dialog#a-ondialogaccept
- // also close things if there is no out meta prefs window
-}
-
-function warning_populate(warningObj) {
- // Fill in the SSL Observatory Warning labels...
- var container = document.getElementById("warning-container");
- for (var hash in warningObj) {
- var label=document.createElement("label");
- label.setAttribute("style","padding:5px 25px 5px;");
- label.textContent = warningObj[hash].long_desc;
- container.appendChild(label);
- //var spacer=document.createElement("spacer");
- //separator.setAttribute("flex","1");
- //container.appendChild(spacer);
- }
-}
-
-function show_certs() {
- var parent_win = window.arguments[1];
- var cert = window.arguments[2];
- if (!parent_win)
- alert("no parent window trying to show certs");
- CC["@mozilla.org/nsCertificateDialogs;1"]
- .getService(CI.nsICertificateDialogs)
- .viewCert(parent_win, cert);
-}
diff --git a/src/chrome/content/preferences.css b/src/chrome/content/preferences.css
deleted file mode 100644
index 6b35c00f85eb..000000000000
--- a/src/chrome/content/preferences.css
+++ /dev/null
@@ -1,11 +0,0 @@
-treechildren::-moz-tree-checkbox { /* css for unchecked cells */
- list-style-image: url("chrome://https-everywhere/skin/cross.png");
-}
-
-treechildren::-moz-tree-checkbox(checked) { /* css for checked cells */
- list-style-image: url("chrome://https-everywhere/skin/tick.png");
-}
-
-treechildren::-moz-tree-checkbox(undefined) { /* css for empty cells */
- list-style-image: url("");
-}
diff --git a/src/chrome/content/preferences.js b/src/chrome/content/preferences.js
deleted file mode 100644
index 921ac477dbe6..000000000000
--- a/src/chrome/content/preferences.js
+++ /dev/null
@@ -1,267 +0,0 @@
-const CC = Components.classes;
-const CI = Components.interfaces;
-VERB=1;
-DBUG=2;
-INFO=3;
-NOTE=4;
-WARN=5;
-
-https_everywhere = CC["@eff.org/https-everywhere;1"]
- .getService(Components.interfaces.nsISupports)
- .wrappedJSObject;
-
-rulesets = Array.slice(https_everywhere.https_rules.rulesets);
-
-const id_prefix = "he_enable";
-const pref_prefix = "extensions.https_everywhere.";
-const GITID = https_everywhere.https_rules.GITCommitID;
-
-// Disable all rules.
-function disable_all() {
- for (var i in rulesets) {
- rulesets[i].disable();
- }
-
- treeView.treebox.invalidate();
-}
-
-// Reset all rules to their default state.
-function reset_defaults() {
- https_everywhere.https_rules.resetRulesetsToDefaults()
- treeView.treebox.invalidate();
-}
-
-function resetSelected() {
- var start = {};
- var end = {};
- var st = document.getElementById('sites_tree');
- var sel = st.view.selection;
- var numRanges = sel.getRangeCount();
-
- for (var t = 0; t < numRanges; t++){
- sel.getRangeAt(t, start, end);
- for (var v = start.value; v <= end.value; v++){
- var rs = treeView.rules[v];
- rs.clear();
- }
- }
-}
-
-function resetSelectedMenu() {
- var start = {};
- var end = {};
- var st = document.getElementById('sites_tree');
- var sel = st.view.selection;
- var numRanges = sel.getRangeCount();
- var menuitem = document.getElementById("revert_menuitem");
-
- for (var t = 0; t < numRanges; t++){
- sel.getRangeAt(t, start, end);
- for (var v = start.value; v <= end.value; v++){
- var rs = treeView.rules[v];
- if (rs.active !== rs.on_by_default) {
- menuitem.disabled = false;
- return;
- }
- }
- }
- menuitem.disabled = true;
-}
-
-function toggleSelected() {
- var start = {};
- var end = {};
- var st = document.getElementById('sites_tree');
- var sel = st.view.selection;
- var numRanges = sel.getRangeCount();
- var menuitem = document.getElementById("revert_menuitem");
-
- for (var t = 0; t < numRanges; t++){
- sel.getRangeAt(t, start, end);
- for (var v = start.value; v <= end.value; v++){
- var rs = treeView.rules[v];
- rs.toggle();
- treeView.treebox.invalidateRow(v);
- }
- }
-}
-
-
-function viewXMLSource() {
- var start = {};
- var end = {};
- var st = document.getElementById('sites_tree');
- var sel = st.view.selection;
- var numRanges = sel.getRangeCount();
- var menuitem = document.getElementById("revert_menuitem");
-
- for (var t = 0; t < numRanges; t++){
- sel.getRangeAt(t, start, end);
- for (var v = start.value; v <= end.value; v++){
- var rs = treeView.rules[v];
-
- //This *should* not violate TorButton's State Control, but someone should double check
- //this code just in case
- var aWin = CC['@mozilla.org/appshell/window-mediator;1']
- .getService(CI.nsIWindowMediator)
- .getMostRecentWindow('navigator:browser');
- aWin.openDialog("chrome://https-everywhere/content/fetch-source.xul",
- rs.xmlName, "chrome,centerscreen",
- {xmlName: rs.xmlName, GITCommitID: GITID} );
- }
- }
-}
-
-function getValue(row, col) {
- switch (col.id) {
- case "site_col":
- return row.name;
- case "note_col":
- return row.notes;
- case "enabled_col":
- return https_everywhere.https_rules.rulesetsByName[row.name].active;
- /*var ruleActive = false;
- try {
- if(https_everywhere.rule_toggle_prefs.getBoolPref(row.name))
- ruleActive = true;
- } catch(e) {
- ruleActive = https_everywhere.https_rules.rulesetsByName[row.name].active;
- }
- return ruleActive;*/
- default:
- return;
- }
-}
-
-function compareRules(a, b, col) {
- var aval = getValue(a, col).toLowerCase();
- var bval = getValue(b, col).toLowerCase();
- var ret = 0;
- if (aval < bval) {
- ret = -1;
- } else if (aval > bval) {
- ret = 1;
- } else {
- ret = 0;
- }
- return ret;
-}
-
-function https_prefs_init(doc) {
- var st = document.getElementById('sites_tree');
-
- // GLOBAL VARIABLE!
- treeView = {
- rules: rulesets,
- rowCount: rulesets.length,
- getCellValue: function(row, col) { // site names
- if (!this.rules[row]) return;
- return getValue(this.rules[row], col);
- },
- getCellText: function(row, col) { // activation indicator
- return this.getCellValue(row, col);
- },
- setCellValue: function(row, col, val) { // toggle a rule's activation
- var rule = this.rules[row];
-
- if (val == "true") {
- rule.enable();
- } else {
- rule.disable();
- }
-
- this.treebox.invalidateRow(row);
- },
- isEditable: function(row, col) {
- return (col.id == "enabled_col");
- },
- setTree: function(treebox) {
- this.treebox = treebox;
- },
- isContainer: function(row) { return false; },
- isSeparator: function(row) { return false; },
- isSorted: function() { return false; },
- getRowProperties: function(row, props) {},
- getColumnProperties: function(colid, col, props) {},
- getCellProperties: function(row, col, props) {
- if ( (col.id == "enabled_col") && !(this.rules[row]) ) {
- var atomS = CC["@mozilla.org/atom-service;1"];
- atomS = atomS.getService(CI.nsIAtomService);
- // Starting with 22.0a1 there is no |props| available anymore. See:
- // https://bugzilla.mozilla.org/show_bug.cgi?id=407956. Looking at the
- // patch the following seems to work, though.
- if (!props) {
- return "undefined";
- }
- props.AppendElement( atomS.getAtom("undefined") );
- }
- },
- getLevel: function(row) { return 0; },
- getImageSrc: function(row, col) { return null; },
- search: function(query) {
- var new_rules = [];
- query = query.value.toLowerCase().replace(/^\s+|\s+$/g, "");
-
- for (var i in rulesets) {
- var rule_name = rulesets[i].name.toLowerCase();
- if ( rule_name.indexOf(query) != -1 ) {
- new_rules.push(rulesets[i]);
- }
- }
-
- this.rules = new_rules;
- this.rowCount = new_rules.length;
- this.treebox.invalidate();
- this.treebox.scrollToRow(rulesets[0]);
- },
- cycleHeader: function (col) {
- var columnName;
- var order = (col.element.getAttribute("sortDirection") === "ascending" ? -1 : 1);
-
- var compare = function (a, b) {
- return compareRules(a, b, col) * order;
- };
- rulesets.sort(compare);
- this.rules.sort(compare);
-
- var cols = st.getElementsByTagName("treecol");
- for (var i = 0; i < cols.length; i++) {
- cols[i].removeAttribute("sortDirection");
- }
- col.element.setAttribute("sortDirection", order === 1 ? "ascending" : "descending");
- this.treebox.invalidate();
- }
- };
-
- st.view = treeView;
-}
-
-function window_opener(uri) {
- // we don't use window.open, because we need to work around TorButton's state control
- if(typeof gBrowser == "undefined"){
- var window = CC["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator);
- var browserWindow = window.getMostRecentWindow("navigator:browser").getBrowser();
- var newTab = browserWindow.addTab(uri, null, null);
- browserWindow.selectedTab = newTab;
-
- }
- else
- gBrowser.selectedTab = gBrowser.addTab(uri);
-}
-
-function https_prefs_accept() {
- // This is *horrid*, but
- // https://developer.mozilla.org/en/working_with_windows_in_chrome_code#Accessing_the_elements_of_the_top-level_document_from_a_child_window
- var outer = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
- .getInterface(Components.interfaces.nsIWebNavigation)
- .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
- .rootTreeItem
- .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
- .getInterface(Components.interfaces.nsIDOMWindow);
-
- if (outer) outer.close();
- else alert("no outer space");
-
- return true; // https://developer.mozilla.org/en/XUL/dialog#a-ondialogaccept
- // also close things if there is no out meta prefs window
-}
diff --git a/src/chrome/content/preferences.xul b/src/chrome/content/preferences.xul
deleted file mode 100644
index ebde85b2cc00..000000000000
--- a/src/chrome/content/preferences.xul
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/00f.net.xml b/src/chrome/content/rules/00f.net.xml
deleted file mode 100644
index 43f9e55d4ea5..000000000000
--- a/src/chrome/content/rules/00f.net.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/01.org.xml b/src/chrome/content/rules/01.org.xml
deleted file mode 100644
index 7c7eab97706d..000000000000
--- a/src/chrome/content/rules/01.org.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/02ch.su.xml b/src/chrome/content/rules/02ch.su.xml
new file mode 100644
index 000000000000..21b3eb364444
--- /dev/null
+++ b/src/chrome/content/rules/02ch.su.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/0bin.net.xml b/src/chrome/content/rules/0bin.net.xml
new file mode 100644
index 000000000000..59783a130616
--- /dev/null
+++ b/src/chrome/content/rules/0bin.net.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/0chan.one.xml b/src/chrome/content/rules/0chan.one.xml
new file mode 100644
index 000000000000..a5d94e8e6c65
--- /dev/null
+++ b/src/chrome/content/rules/0chan.one.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/0nl1ne.at.xml b/src/chrome/content/rules/0nl1ne.at.xml
new file mode 100644
index 000000000000..de2de8a6ac76
--- /dev/null
+++ b/src/chrome/content/rules/0nl1ne.at.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/0p.no.xml b/src/chrome/content/rules/0p.no.xml
new file mode 100644
index 000000000000..43ab4b74cb9e
--- /dev/null
+++ b/src/chrome/content/rules/0p.no.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/0x.co.xml b/src/chrome/content/rules/0x.co.xml
new file mode 100644
index 000000000000..6439a8e10fc2
--- /dev/null
+++ b/src/chrome/content/rules/0x.co.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/0x539-dev-group-mismatches.xml b/src/chrome/content/rules/0x539-dev-group-mismatches.xml
deleted file mode 100644
index 4ca45728958c..000000000000
--- a/src/chrome/content/rules/0x539-dev-group-mismatches.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/0x539-dev-group.xml b/src/chrome/content/rules/0x539-dev-group.xml
index e60589e682f2..a8a3538c5e62 100644
--- a/src/chrome/content/rules/0x539-dev-group.xml
+++ b/src/chrome/content/rules/0x539-dev-group.xml
@@ -1,16 +1,17 @@
@@ -18,11 +19,16 @@
+
+
+
-
+
+
-
+
diff --git a/src/chrome/content/rules/0xbadc0de.be.xml b/src/chrome/content/rules/0xbadc0de.be.xml
new file mode 100644
index 000000000000..c3d0f0f31151
--- /dev/null
+++ b/src/chrome/content/rules/0xbadc0de.be.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/0xdb.org.xml b/src/chrome/content/rules/0xdb.org.xml
new file mode 100644
index 000000000000..eeebfc8cfacd
--- /dev/null
+++ b/src/chrome/content/rules/0xdb.org.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1-800courier.com.xml b/src/chrome/content/rules/1-800courier.com.xml
new file mode 100644
index 000000000000..fb31b46e5001
--- /dev/null
+++ b/src/chrome/content/rules/1-800courier.com.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1.0.0.1.xml b/src/chrome/content/rules/1.0.0.1.xml
new file mode 100644
index 000000000000..1d46eeb11c6b
--- /dev/null
+++ b/src/chrome/content/rules/1.0.0.1.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1.1.1.1.xml b/src/chrome/content/rules/1.1.1.1.xml
new file mode 100644
index 000000000000..c6249f83c425
--- /dev/null
+++ b/src/chrome/content/rules/1.1.1.1.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/100-Gute-Gruende.de.xml b/src/chrome/content/rules/100-Gute-Gruende.de.xml
deleted file mode 100644
index d5e6dfe319be..000000000000
--- a/src/chrome/content/rules/100-Gute-Gruende.de.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/100R.org.xml b/src/chrome/content/rules/100R.org.xml
new file mode 100644
index 000000000000..f79f105d178d
--- /dev/null
+++ b/src/chrome/content/rules/100R.org.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/100_Fans.org.de.xml b/src/chrome/content/rules/100_Fans.org.de.xml
new file mode 100644
index 000000000000..be89dda2c8eb
--- /dev/null
+++ b/src/chrome/content/rules/100_Fans.org.de.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/101domain.com.xml b/src/chrome/content/rules/101domain.com.xml
new file mode 100644
index 000000000000..8fbcddd6549c
--- /dev/null
+++ b/src/chrome/content/rules/101domain.com.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/101domain.ru.xml b/src/chrome/content/rules/101domain.ru.xml
new file mode 100644
index 000000000000..dd0c68812fb9
--- /dev/null
+++ b/src/chrome/content/rules/101domain.ru.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/101weiqi.xml b/src/chrome/content/rules/101weiqi.xml
new file mode 100644
index 000000000000..5cad4e7cf343
--- /dev/null
+++ b/src/chrome/content/rules/101weiqi.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/104.com.tw.xml b/src/chrome/content/rules/104.com.tw.xml
new file mode 100644
index 000000000000..5133450c3139
--- /dev/null
+++ b/src/chrome/content/rules/104.com.tw.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/108-Heroes.xml b/src/chrome/content/rules/108-Heroes.xml
deleted file mode 100644
index 7e340de62be3..000000000000
--- a/src/chrome/content/rules/108-Heroes.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/10_Minute_Mail.com.xml b/src/chrome/content/rules/10_Minute_Mail.com.xml
index d7272427f2b4..6d86b1638451 100644
--- a/src/chrome/content/rules/10_Minute_Mail.com.xml
+++ b/src/chrome/content/rules/10_Minute_Mail.com.xml
@@ -1,29 +1,32 @@
-
+
-
+
+
+
+
+
-
+
diff --git a/src/chrome/content/rules/10antz.co.jp.xml b/src/chrome/content/rules/10antz.co.jp.xml
new file mode 100644
index 000000000000..8ccbde29823b
--- /dev/null
+++ b/src/chrome/content/rules/10antz.co.jp.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/10dollar.ca.xml b/src/chrome/content/rules/10dollar.ca.xml
new file mode 100644
index 000000000000..2e8209c3eea9
--- /dev/null
+++ b/src/chrome/content/rules/10dollar.ca.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/10gen.xml b/src/chrome/content/rules/10gen.xml
index 62b302a3f6e2..b44f671c38ee 100644
--- a/src/chrome/content/rules/10gen.xml
+++ b/src/chrome/content/rules/10gen.xml
@@ -1,23 +1,41 @@
-
+
+
-
-
+
+
+
+
-
+
+
-
+
+
+
+
-
+
diff --git a/src/chrome/content/rules/1105_Media.com.xml b/src/chrome/content/rules/1105_Media.com.xml
new file mode 100644
index 000000000000..4ff869a9a340
--- /dev/null
+++ b/src/chrome/content/rules/1105_Media.com.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/112-akersloot.nl.xml b/src/chrome/content/rules/112-akersloot.nl.xml
new file mode 100644
index 000000000000..6d7bb589b737
--- /dev/null
+++ b/src/chrome/content/rules/112-akersloot.nl.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/112-uitgeest.nl.xml b/src/chrome/content/rules/112-uitgeest.nl.xml
new file mode 100644
index 000000000000..17ba4c4f4589
--- /dev/null
+++ b/src/chrome/content/rules/112-uitgeest.nl.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/112_Cafe.com.xml b/src/chrome/content/rules/112_Cafe.com.xml
new file mode 100644
index 000000000000..816d6e62f06d
--- /dev/null
+++ b/src/chrome/content/rules/112_Cafe.com.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/115.com.xml b/src/chrome/content/rules/115.com.xml
new file mode 100644
index 000000000000..c714d24d7c2f
--- /dev/null
+++ b/src/chrome/content/rules/115.com.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1177.se.xml b/src/chrome/content/rules/1177.se.xml
index 8932d9a2b05c..bd41f6d2564f 100644
--- a/src/chrome/content/rules/1177.se.xml
+++ b/src/chrome/content/rules/1177.se.xml
@@ -1,14 +1,60 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/118-Information.xml b/src/chrome/content/rules/118-Information.xml
index 94bfaf0e8bd5..0db459913b72 100644
--- a/src/chrome/content/rules/118-Information.xml
+++ b/src/chrome/content/rules/118-Information.xml
@@ -4,17 +4,17 @@
- (www.)my118information.co.uk (times out)
-->
-
+
-
+
-
diff --git a/src/chrome/content/rules/11_Main.com.xml b/src/chrome/content/rules/11_Main.com.xml
new file mode 100644
index 000000000000..583a3d1e96e1
--- /dev/null
+++ b/src/chrome/content/rules/11_Main.com.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/11footballclub.xml b/src/chrome/content/rules/11footballclub.xml
index 7075bef9a40b..44ad5fddb611 100644
--- a/src/chrome/content/rules/11footballclub.xml
+++ b/src/chrome/content/rules/11footballclub.xml
@@ -1,13 +1,21 @@
-
+
+
+
-
+
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/11street.my.xml b/src/chrome/content/rules/11street.my.xml
new file mode 100644
index 000000000000..1672cbf1f5e2
--- /dev/null
+++ b/src/chrome/content/rules/11street.my.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/123-reg.xml b/src/chrome/content/rules/123-reg.xml
index 3b85b97b6f44..d29487376f73 100644
--- a/src/chrome/content/rules/123-reg.xml
+++ b/src/chrome/content/rules/123-reg.xml
@@ -1,11 +1,18 @@
+
+
-
-
+
+
+
-
+
-
+
-
-
-
-
+ -->
+
diff --git a/src/chrome/content/rules/123ContactForm.com.xml b/src/chrome/content/rules/123ContactForm.com.xml
new file mode 100644
index 000000000000..69f4e95344f8
--- /dev/null
+++ b/src/chrome/content/rules/123ContactForm.com.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/123Count.com.xml b/src/chrome/content/rules/123Count.com.xml
index f8965949917b..59423203ca8d 100644
--- a/src/chrome/content/rules/123Count.com.xml
+++ b/src/chrome/content/rules/123Count.com.xml
@@ -1,19 +1,42 @@
+
+
+
+
-
+
+
+
-
-
\ No newline at end of file
+
+
+
diff --git a/src/chrome/content/rules/123RF.xml b/src/chrome/content/rules/123RF.xml
index 44435ad6e4c4..afc97a790c86 100644
--- a/src/chrome/content/rules/123RF.xml
+++ b/src/chrome/content/rules/123RF.xml
@@ -8,19 +8,25 @@
- static.123rf.com
-->
-
+
+
-
+
+
+
-
+
-
-
-
\ No newline at end of file
+
+
+
diff --git a/src/chrome/content/rules/123domain.eu.xml b/src/chrome/content/rules/123domain.eu.xml
new file mode 100644
index 000000000000..4334bee0ec97
--- /dev/null
+++ b/src/chrome/content/rules/123domain.eu.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/123eHost.com.xml b/src/chrome/content/rules/123eHost.com.xml
index 739ba06e7c9d..c8e7e7c98cbc 100644
--- a/src/chrome/content/rules/123eHost.com.xml
+++ b/src/chrome/content/rules/123eHost.com.xml
@@ -1,19 +1,58 @@
-
+
+
-
-
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
diff --git a/src/chrome/content/rules/123systems.xml b/src/chrome/content/rules/123systems.xml
index 15c048b453bc..dec65718a502 100644
--- a/src/chrome/content/rules/123systems.xml
+++ b/src/chrome/content/rules/123systems.xml
@@ -1,15 +1,42 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
diff --git a/src/chrome/content/rules/126.com.xml b/src/chrome/content/rules/126.com.xml
new file mode 100644
index 000000000000..da0c9639946c
--- /dev/null
+++ b/src/chrome/content/rules/126.com.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/126.net.xml b/src/chrome/content/rules/126.net.xml
new file mode 100644
index 000000000000..b2a22113a66e
--- /dev/null
+++ b/src/chrome/content/rules/126.net.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/127.net.xml b/src/chrome/content/rules/127.net.xml
new file mode 100644
index 000000000000..afafbb9c6579
--- /dev/null
+++ b/src/chrome/content/rules/127.net.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/12_Foot_Hedgehog.com.xml b/src/chrome/content/rules/12_Foot_Hedgehog.com.xml
deleted file mode 100644
index d836cdf70b26..000000000000
--- a/src/chrome/content/rules/12_Foot_Hedgehog.com.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/131002.net.xml b/src/chrome/content/rules/131002.net.xml
index 0a6ad0826ac8..bd12e5baeacb 100644
--- a/src/chrome/content/rules/131002.net.xml
+++ b/src/chrome/content/rules/131002.net.xml
@@ -1,10 +1,12 @@
+
-
+
diff --git a/src/chrome/content/rules/1337x.to.xml b/src/chrome/content/rules/1337x.to.xml
new file mode 100644
index 000000000000..04060f907fe0
--- /dev/null
+++ b/src/chrome/content/rules/1337x.to.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1431am.org.xml b/src/chrome/content/rules/1431am.org.xml
new file mode 100644
index 000000000000..c047e970c5ff
--- /dev/null
+++ b/src/chrome/content/rules/1431am.org.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/15Mcc.xml b/src/chrome/content/rules/15Mcc.xml
deleted file mode 100644
index 28a1986c6f64..000000000000
--- a/src/chrome/content/rules/15Mcc.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/src/chrome/content/rules/15Mpedia.xml b/src/chrome/content/rules/15Mpedia.xml
new file mode 100644
index 000000000000..676fafe4bf62
--- /dev/null
+++ b/src/chrome/content/rules/15Mpedia.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/16163.com.xml b/src/chrome/content/rules/16163.com.xml
new file mode 100644
index 000000000000..47fef755bfd6
--- /dev/null
+++ b/src/chrome/content/rules/16163.com.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/163.com-mixedcontent.xml b/src/chrome/content/rules/163.com-mixedcontent.xml
new file mode 100644
index 000000000000..891b9b795035
--- /dev/null
+++ b/src/chrome/content/rules/163.com-mixedcontent.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/163.com.xml b/src/chrome/content/rules/163.com.xml
new file mode 100644
index 000000000000..872e04b916a6
--- /dev/null
+++ b/src/chrome/content/rules/163.com.xml
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1688.com.xml b/src/chrome/content/rules/1688.com.xml
index 0e2ad7a9c224..8d334db14439 100644
--- a/src/chrome/content/rules/1688.com.xml
+++ b/src/chrome/content/rules/1688.com.xml
@@ -1,18 +1,177 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
-
+
diff --git a/src/chrome/content/rules/168qiquan.com.xml b/src/chrome/content/rules/168qiquan.com.xml
deleted file mode 100644
index 0beadaa22210..000000000000
--- a/src/chrome/content/rules/168qiquan.com.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/16personalities.com.xml b/src/chrome/content/rules/16personalities.com.xml
new file mode 100644
index 000000000000..310e1b445560
--- /dev/null
+++ b/src/chrome/content/rules/16personalities.com.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/179.ru.xml b/src/chrome/content/rules/179.ru.xml
new file mode 100644
index 000000000000..14bd29d6180d
--- /dev/null
+++ b/src/chrome/content/rules/179.ru.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/17track.net.xml b/src/chrome/content/rules/17track.net.xml
index 704dc441b195..f5c0c2e364f8 100644
--- a/src/chrome/content/rules/17track.net.xml
+++ b/src/chrome/content/rules/17track.net.xml
@@ -1,6 +1,8 @@
-
-
-
+
+
+
-
+
+
+
diff --git a/src/chrome/content/rules/1823.gov.hk.xml b/src/chrome/content/rules/1823.gov.hk.xml
new file mode 100644
index 000000000000..b6cea30a346b
--- /dev/null
+++ b/src/chrome/content/rules/1823.gov.hk.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1984.is.xml b/src/chrome/content/rules/1984.is.xml
index 8e648429c37b..0d53019744bf 100644
--- a/src/chrome/content/rules/1984.is.xml
+++ b/src/chrome/content/rules/1984.is.xml
@@ -1,12 +1,13 @@
+
+
-
-
+
-
-
+
-
-
-
\ No newline at end of file
+
+
diff --git a/src/chrome/content/rules/1984.live.xml b/src/chrome/content/rules/1984.live.xml
new file mode 100644
index 000000000000..73a099e153b9
--- /dev/null
+++ b/src/chrome/content/rules/1984.live.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1984_Hosting.com.xml b/src/chrome/content/rules/1984_Hosting.com.xml
new file mode 100644
index 000000000000..4a70ef16900a
--- /dev/null
+++ b/src/chrome/content/rules/1984_Hosting.com.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/19h17.info.xml b/src/chrome/content/rules/19h17.info.xml
new file mode 100644
index 000000000000..7f3b4c45a2e3
--- /dev/null
+++ b/src/chrome/content/rules/19h17.info.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1BTCXE.com.xml b/src/chrome/content/rules/1BTCXE.com.xml
new file mode 100644
index 000000000000..b2c496958b56
--- /dev/null
+++ b/src/chrome/content/rules/1BTCXE.com.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1Cart.xml b/src/chrome/content/rules/1Cart.xml
deleted file mode 100644
index 66938ed038c5..000000000000
--- a/src/chrome/content/rules/1Cart.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/1LotSTP.com.xml b/src/chrome/content/rules/1LotSTP.com.xml
deleted file mode 100644
index 57bfd92dc6ef..000000000000
--- a/src/chrome/content/rules/1LotSTP.com.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/1PipFix.xml b/src/chrome/content/rules/1PipFix.xml
index 1888c8a16078..0c91ce8616af 100644
--- a/src/chrome/content/rules/1PipFix.xml
+++ b/src/chrome/content/rules/1PipFix.xml
@@ -1,13 +1,19 @@
-
+
+
+
-
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/1ShoppingCart.com.xml b/src/chrome/content/rules/1ShoppingCart.com.xml
new file mode 100644
index 000000000000..9d7f2ed5f8c1
--- /dev/null
+++ b/src/chrome/content/rules/1ShoppingCart.com.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1TW.org.xml b/src/chrome/content/rules/1TW.org.xml
new file mode 100644
index 000000000000..694430d8188e
--- /dev/null
+++ b/src/chrome/content/rules/1TW.org.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1WT.eu.xml b/src/chrome/content/rules/1WT.eu.xml
index 985ff0377677..447d3ec8b679 100644
--- a/src/chrome/content/rules/1WT.eu.xml
+++ b/src/chrome/content/rules/1WT.eu.xml
@@ -1,34 +1,47 @@
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
-
+
diff --git a/src/chrome/content/rules/1X.xml b/src/chrome/content/rules/1X.xml
index 3fe24bcebbcf..cfa766f3292b 100644
--- a/src/chrome/content/rules/1X.xml
+++ b/src/chrome/content/rules/1X.xml
@@ -1,25 +1,43 @@
-
-
+
+
-
+
+
+
+
+
-
+
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1_Deg.org.xml b/src/chrome/content/rules/1_Deg.org.xml
new file mode 100644
index 000000000000..ae7de6e4a9c3
--- /dev/null
+++ b/src/chrome/content/rules/1_Deg.org.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1and1-Internet.xml b/src/chrome/content/rules/1and1-Internet.xml
index fa8a5278df5c..5f6f32a58dcc 100644
--- a/src/chrome/content/rules/1and1-Internet.xml
+++ b/src/chrome/content/rules/1and1-Internet.xml
@@ -1,68 +1,81 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1and1.ca.xml b/src/chrome/content/rules/1and1.ca.xml
new file mode 100644
index 000000000000..5d0f43291d06
--- /dev/null
+++ b/src/chrome/content/rules/1and1.ca.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1and1.co.uk.xml b/src/chrome/content/rules/1and1.co.uk.xml
new file mode 100644
index 000000000000..d4147373141e
--- /dev/null
+++ b/src/chrome/content/rules/1and1.co.uk.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1and1.es.xml b/src/chrome/content/rules/1and1.es.xml
new file mode 100644
index 000000000000..1c85957b91c7
--- /dev/null
+++ b/src/chrome/content/rules/1and1.es.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1anh.com.xml b/src/chrome/content/rules/1anh.com.xml
new file mode 100644
index 000000000000..3246ba264fcc
--- /dev/null
+++ b/src/chrome/content/rules/1anh.com.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1c-bitrix.ru.xml b/src/chrome/content/rules/1c-bitrix.ru.xml
index 160be81021a2..4903e992bcbb 100644
--- a/src/chrome/content/rules/1c-bitrix.ru.xml
+++ b/src/chrome/content/rules/1c-bitrix.ru.xml
@@ -13,7 +13,14 @@
-
+
+
+
+
+
+
+
+
@@ -22,7 +29,6 @@
-
-
\ No newline at end of file
+
+
diff --git a/src/chrome/content/rules/1d4.us.xml b/src/chrome/content/rules/1d4.us.xml
new file mode 100644
index 000000000000..0494998650df
--- /dev/null
+++ b/src/chrome/content/rules/1d4.us.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1dedic.ru.xml b/src/chrome/content/rules/1dedic.ru.xml
new file mode 100644
index 000000000000..ab34933dbf8b
--- /dev/null
+++ b/src/chrome/content/rules/1dedic.ru.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1dmp.io.xml b/src/chrome/content/rules/1dmp.io.xml
new file mode 100644
index 000000000000..e22c2d47ef73
--- /dev/null
+++ b/src/chrome/content/rules/1dmp.io.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1f0.de.xml b/src/chrome/content/rules/1f0.de.xml
index b099763a9bb9..08339502780c 100644
--- a/src/chrome/content/rules/1f0.de.xml
+++ b/src/chrome/content/rules/1f0.de.xml
@@ -1,17 +1,14 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1fichier.xml b/src/chrome/content/rules/1fichier.xml
new file mode 100644
index 000000000000..8d3fe557b874
--- /dev/null
+++ b/src/chrome/content/rules/1fichier.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1freehosting.com.xml b/src/chrome/content/rules/1freehosting.com.xml
new file mode 100644
index 000000000000..d894b26dc5e1
--- /dev/null
+++ b/src/chrome/content/rules/1freehosting.com.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1nightstandstory.xml b/src/chrome/content/rules/1nightstandstory.xml
deleted file mode 100644
index 3f38801d1768..000000000000
--- a/src/chrome/content/rules/1nightstandstory.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/1nsk.ru-problematic.xml b/src/chrome/content/rules/1nsk.ru-problematic.xml
index a6975dde1b4e..20f974c0c941 100644
--- a/src/chrome/content/rules/1nsk.ru-problematic.xml
+++ b/src/chrome/content/rules/1nsk.ru-problematic.xml
@@ -5,7 +5,8 @@
-
+
+
@@ -14,7 +15,6 @@
-
-
\ No newline at end of file
+
+
diff --git a/src/chrome/content/rules/1nsk.ru.xml b/src/chrome/content/rules/1nsk.ru.xml
index 9fff6e79069e..3a86e6c1e5c3 100644
--- a/src/chrome/content/rules/1nsk.ru.xml
+++ b/src/chrome/content/rules/1nsk.ru.xml
@@ -1,4 +1,8 @@
+
-
+
@@ -19,7 +23,6 @@
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/1over1.net.xml b/src/chrome/content/rules/1over1.net.xml
new file mode 100644
index 000000000000..77c1e327632e
--- /dev/null
+++ b/src/chrome/content/rules/1over1.net.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1phads.com.xml b/src/chrome/content/rules/1phads.com.xml
new file mode 100644
index 000000000000..c374b908d37b
--- /dev/null
+++ b/src/chrome/content/rules/1phads.com.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1prime.ru.xml b/src/chrome/content/rules/1prime.ru.xml
new file mode 100644
index 000000000000..3800699fed09
--- /dev/null
+++ b/src/chrome/content/rules/1prime.ru.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1src.com.xml b/src/chrome/content/rules/1src.com.xml
new file mode 100644
index 000000000000..091811ed05a2
--- /dev/null
+++ b/src/chrome/content/rules/1src.com.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1st-ART-Studio.xml b/src/chrome/content/rules/1st-ART-Studio.xml
deleted file mode 100644
index fd6ea61adb4a..000000000000
--- a/src/chrome/content/rules/1st-ART-Studio.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/1stWarning.com.xml b/src/chrome/content/rules/1stWarning.com.xml
new file mode 100644
index 000000000000..1fc53a466043
--- /dev/null
+++ b/src/chrome/content/rules/1stWarning.com.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1stwebdesigner.com.xml b/src/chrome/content/rules/1stwebdesigner.com.xml
new file mode 100644
index 000000000000..5889ced5c57d
--- /dev/null
+++ b/src/chrome/content/rules/1stwebdesigner.com.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1time.co.za.xml b/src/chrome/content/rules/1time.co.za.xml
deleted file mode 100644
index 4bcc195f9f64..000000000000
--- a/src/chrome/content/rules/1time.co.za.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/1tulatv.ru.xml b/src/chrome/content/rules/1tulatv.ru.xml
new file mode 100644
index 000000000000..decbd6147f3e
--- /dev/null
+++ b/src/chrome/content/rules/1tulatv.ru.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1tv.ru.xml b/src/chrome/content/rules/1tv.ru.xml
new file mode 100644
index 000000000000..1dca64357676
--- /dev/null
+++ b/src/chrome/content/rules/1tv.ru.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1ty.me.xml b/src/chrome/content/rules/1ty.me.xml
new file mode 100644
index 000000000000..652c03f0ee75
--- /dev/null
+++ b/src/chrome/content/rules/1ty.me.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1u1s.de.xml b/src/chrome/content/rules/1u1s.de.xml
new file mode 100644
index 000000000000..fef0179479fe
--- /dev/null
+++ b/src/chrome/content/rules/1u1s.de.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1und1.de.xml b/src/chrome/content/rules/1und1.de.xml
index 841ddae76f92..cb1e00ca34df 100644
--- a/src/chrome/content/rules/1und1.de.xml
+++ b/src/chrome/content/rules/1und1.de.xml
@@ -5,94 +5,121 @@
CDN buckets:
- i0.1und1.de.edgesuite.net
-
- - a1254.g.akamai.net
-
- 1und1.ivwbox.de
Nonfunctional subdomains:
- - blog *
- - erfolgscenter *
- - jobs *
- - press *
- - service-center *
+ - apps ⁴
+ - login ⁴
+ - mirror ¹
+ - newsroom ²
+ - presse ²
+ - tv ³
- * Refused
+ ¹ Dropped
+ ² Refused
+ ³ 404
+ ⁴ Invalid certificate
Problematic subdomains:
- - ^ (works, cert only matches www)
- - i0 (works, akamai)
- - tv (works; mismatched, CN: portal.gmx.net)
-
-
- Fully covered subdomains:
-
- - (www.) (^ → www)
- - apps
- - dsl
- - forum
- - hilfe-center
- - home
- - homepage
- - hosting
- - i0 (→ akamai)
- - ias
- - img
- - kunden
- - login
- - mein
- - mobile
- - pixel
- - redirect
- - sec-i0
- - tt
-
-
- Observed cookie domains:
-
- - .
- - apps
- - dsl
- - home
- - homepage
- - hosting
- - ias
- - jobs
- - kunden
- - mobile
- - presse
- - redirect
- - service-center
- - www
+ - ^ ¹
+ - erfolgscenter ¹
+ - i0 ²
+ - service-center ³
+
+ ¹ Mismatched
+ ² Akamai
+ ³ Refused
+
+
+ Insecure cookies are set for these domains and hosts:
+
+ - .1und1.de
+ - de-mail.1und1.de
+ - dsl.1und1.de
+ - hilfe-center.1und1.de
+ - hosting.1und1.de
+ - jobs.1und1.de
+ - mobile.1und1.de
+ - redirect.1und1.de
+ - www.1und1.de
Mixed content:
- - Web bug on hilfe-center from status-1und1.de
+ - Images on jobs from img.youtube.com ¹
+ - Images on unternehmen from blog-network.1and1.com
+
+ ¹ Secured by us
-->
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
-
+
+
-
+
diff --git a/src/chrome/content/rules/1xbet.com.xml b/src/chrome/content/rules/1xbet.com.xml
deleted file mode 100644
index 8c4551523bec..000000000000
--- a/src/chrome/content/rules/1xbet.com.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/2020mobile.es.xml b/src/chrome/content/rules/2020mobile.es.xml
index bb3a882eb223..7ae5c8dd31c6 100644
--- a/src/chrome/content/rules/2020mobile.es.xml
+++ b/src/chrome/content/rules/2020mobile.es.xml
@@ -1,6 +1,16 @@
-
+
+
+
-
+
diff --git a/src/chrome/content/rules/20min-tv.ch.xml b/src/chrome/content/rules/20min-tv.ch.xml
new file mode 100644
index 000000000000..c700bc75e1ff
--- /dev/null
+++ b/src/chrome/content/rules/20min-tv.ch.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/20min.ch.xml b/src/chrome/content/rules/20min.ch.xml
new file mode 100644
index 000000000000..0a0c49462bc4
--- /dev/null
+++ b/src/chrome/content/rules/20min.ch.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/20minutes.fr.xml b/src/chrome/content/rules/20minutes.fr.xml
new file mode 100644
index 000000000000..8c6a79b02988
--- /dev/null
+++ b/src/chrome/content/rules/20minutes.fr.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/20minuti.ch.xml b/src/chrome/content/rules/20minuti.ch.xml
new file mode 100644
index 000000000000..4323316e18ca
--- /dev/null
+++ b/src/chrome/content/rules/20minuti.ch.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/21.co.xml b/src/chrome/content/rules/21.co.xml
new file mode 100644
index 000000000000..6d75d4d28de6
--- /dev/null
+++ b/src/chrome/content/rules/21.co.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/21_Century_Rims.xml b/src/chrome/content/rules/21_Century_Rims.xml
deleted file mode 100644
index 146844817a9b..000000000000
--- a/src/chrome/content/rules/21_Century_Rims.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/21jingji.com.xml b/src/chrome/content/rules/21jingji.com.xml
new file mode 100644
index 000000000000..8a8c529e37ff
--- /dev/null
+++ b/src/chrome/content/rules/21jingji.com.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/220volt.hu.xml b/src/chrome/content/rules/220volt.hu.xml
index b30d24449d86..d3cabfc7ebb4 100644
--- a/src/chrome/content/rules/220volt.hu.xml
+++ b/src/chrome/content/rules/220volt.hu.xml
@@ -1,9 +1,16 @@
-
+
+
+
-
-
-
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/22Fevrier2019.org.xml b/src/chrome/content/rules/22Fevrier2019.org.xml
new file mode 100644
index 000000000000..64371073a2d3
--- /dev/null
+++ b/src/chrome/content/rules/22Fevrier2019.org.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2345.cn.xml b/src/chrome/content/rules/2345.cn.xml
new file mode 100644
index 000000000000..20b50c7264fd
--- /dev/null
+++ b/src/chrome/content/rules/2345.cn.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2345.com.xml b/src/chrome/content/rules/2345.com.xml
new file mode 100644
index 000000000000..1cac12464eb9
--- /dev/null
+++ b/src/chrome/content/rules/2345.com.xml
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/23Systems.xml b/src/chrome/content/rules/23Systems.xml
index 1a292f58c21e..cefde1351ed3 100644
--- a/src/chrome/content/rules/23Systems.xml
+++ b/src/chrome/content/rules/23Systems.xml
@@ -1,13 +1,12 @@
-
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/23andMe.com.xml b/src/chrome/content/rules/23andMe.com.xml
index e59c0c945826..6a76ef026b30 100644
--- a/src/chrome/content/rules/23andMe.com.xml
+++ b/src/chrome/content/rules/23andMe.com.xml
@@ -1,20 +1,18 @@
-
+
+
+
+
+
-
-
+
diff --git a/src/chrome/content/rules/24-7-Media-clients.xml b/src/chrome/content/rules/24-7-Media-clients.xml
deleted file mode 100644
index 91326ee927ce..000000000000
--- a/src/chrome/content/rules/24-7-Media-clients.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/24-7-Media.xml b/src/chrome/content/rules/24-7-Media.xml
index 0dab7f826dd7..ce9fbe17bcd9 100644
--- a/src/chrome/content/rules/24-7-Media.xml
+++ b/src/chrome/content/rules/24-7-Media.xml
@@ -1,7 +1,4 @@
-
-
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/24-7_Customer.xml b/src/chrome/content/rules/24-7_Customer.xml
deleted file mode 100644
index 4eecdb6aa11d..000000000000
--- a/src/chrome/content/rules/24-7_Customer.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/24-ways.xml b/src/chrome/content/rules/24-ways.xml
index 3a5884cb6f5e..f10a61ddcd31 100644
--- a/src/chrome/content/rules/24-ways.xml
+++ b/src/chrome/content/rules/24-ways.xml
@@ -1,24 +1,9 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/247filmz.xml b/src/chrome/content/rules/247filmz.xml
index 2b46b36b937d..3817a6e5ddf1 100644
--- a/src/chrome/content/rules/247filmz.xml
+++ b/src/chrome/content/rules/247filmz.xml
@@ -1,4 +1,11 @@
-
+
+
+
@@ -7,7 +14,6 @@
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/24img.com.xml b/src/chrome/content/rules/24img.com.xml
new file mode 100644
index 000000000000..1f5092abe2a8
--- /dev/null
+++ b/src/chrome/content/rules/24img.com.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/24paybank.com.xml b/src/chrome/content/rules/24paybank.com.xml
new file mode 100644
index 000000000000..b75ac446040c
--- /dev/null
+++ b/src/chrome/content/rules/24paybank.com.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/254a.com.xml b/src/chrome/content/rules/254a.com.xml
deleted file mode 100644
index 55520d9a989c..000000000000
--- a/src/chrome/content/rules/254a.com.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/256.com.xml b/src/chrome/content/rules/256.com.xml
deleted file mode 100644
index 0fa1a7e03583..000000000000
--- a/src/chrome/content/rules/256.com.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/256stuff.com.xml b/src/chrome/content/rules/256stuff.com.xml
new file mode 100644
index 000000000000..519d69ef2797
--- /dev/null
+++ b/src/chrome/content/rules/256stuff.com.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/25thandclement.com.xml b/src/chrome/content/rules/25thandclement.com.xml
new file mode 100644
index 000000000000..dacc742d9b1f
--- /dev/null
+++ b/src/chrome/content/rules/25thandclement.com.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2600.com.xml b/src/chrome/content/rules/2600.com.xml
new file mode 100644
index 000000000000..1bb8c5cf1cb7
--- /dev/null
+++ b/src/chrome/content/rules/2600.com.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2Checkout-mismatches.xml b/src/chrome/content/rules/2Checkout-mismatches.xml
index e8d293e19e08..28b2a58c860a 100644
--- a/src/chrome/content/rules/2Checkout-mismatches.xml
+++ b/src/chrome/content/rules/2Checkout-mismatches.xml
@@ -2,13 +2,15 @@
For rules that are on by default, see 2Checkout.xml.
-->
-
+
-
-
+
-
+
+
+
+
diff --git a/src/chrome/content/rules/2Checkout.xml b/src/chrome/content/rules/2Checkout.xml
index a687b03202b7..6d19d56fe1e6 100644
--- a/src/chrome/content/rules/2Checkout.xml
+++ b/src/chrome/content/rules/2Checkout.xml
@@ -1,25 +1,55 @@
-
+
-
-
-
+
+
-
-
+
+
+
-
-
-
-
+
diff --git a/src/chrome/content/rules/2Dialog.com.xml b/src/chrome/content/rules/2Dialog.com.xml
index c7885f448e4f..04ca950d87fa 100644
--- a/src/chrome/content/rules/2Dialog.com.xml
+++ b/src/chrome/content/rules/2Dialog.com.xml
@@ -1,8 +1,16 @@
+
-
+
@@ -11,4 +19,4 @@
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/2GIS.ru.xml b/src/chrome/content/rules/2GIS.ru.xml
new file mode 100644
index 000000000000..2c34c624788a
--- /dev/null
+++ b/src/chrome/content/rules/2GIS.ru.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2K.com.xml b/src/chrome/content/rules/2K.com.xml
new file mode 100644
index 000000000000..2cfdddc5fe11
--- /dev/null
+++ b/src/chrome/content/rules/2K.com.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2K_Games.xml b/src/chrome/content/rules/2K_Games.xml
index 2578c7c024c8..f8620958fea3 100644
--- a/src/chrome/content/rules/2K_Games.xml
+++ b/src/chrome/content/rules/2K_Games.xml
@@ -1,38 +1,44 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2K_Sports.xml b/src/chrome/content/rules/2K_Sports.xml
index fe28df1419d5..1e310410bdf5 100644
--- a/src/chrome/content/rules/2K_Sports.xml
+++ b/src/chrome/content/rules/2K_Sports.xml
@@ -1,17 +1,22 @@
+
-
+
+
-
-
-
-
+
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/2PipFixed.xml b/src/chrome/content/rules/2PipFixed.xml
deleted file mode 100644
index 0b23ac4eb093..000000000000
--- a/src/chrome/content/rules/2PipFixed.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/2_Ton.com.au.xml b/src/chrome/content/rules/2_Ton.com.au.xml
new file mode 100644
index 000000000000..a16e58dff5d8
--- /dev/null
+++ b/src/chrome/content/rules/2_Ton.com.au.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2buntu.com.xml b/src/chrome/content/rules/2buntu.com.xml
new file mode 100644
index 000000000000..6170844bc3b9
--- /dev/null
+++ b/src/chrome/content/rules/2buntu.com.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2ch.cm.xml b/src/chrome/content/rules/2ch.cm.xml
new file mode 100644
index 000000000000..bf553e49f91a
--- /dev/null
+++ b/src/chrome/content/rules/2ch.cm.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2ch.hk.xml b/src/chrome/content/rules/2ch.hk.xml
index 23a0227c69eb..37371279e5c7 100644
--- a/src/chrome/content/rules/2ch.hk.xml
+++ b/src/chrome/content/rules/2ch.hk.xml
@@ -1,12 +1,13 @@
-
+
-
+
-
+
+
diff --git a/src/chrome/content/rules/2ch.net.xml b/src/chrome/content/rules/2ch.net.xml
new file mode 100644
index 000000000000..ded17a2a59a9
--- /dev/null
+++ b/src/chrome/content/rules/2ch.net.xml
@@ -0,0 +1,246 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2chan.net.xml b/src/chrome/content/rules/2chan.net.xml
new file mode 100644
index 000000000000..286035cf107d
--- /dev/null
+++ b/src/chrome/content/rules/2chan.net.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2cnt.net.xml b/src/chrome/content/rules/2cnt.net.xml
new file mode 100644
index 000000000000..46bc9daba268
--- /dev/null
+++ b/src/chrome/content/rules/2cnt.net.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2co.co.xml b/src/chrome/content/rules/2co.co.xml
new file mode 100644
index 000000000000..798e031df126
--- /dev/null
+++ b/src/chrome/content/rules/2co.co.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2cyr.com.xml b/src/chrome/content/rules/2cyr.com.xml
new file mode 100644
index 000000000000..67541316df25
--- /dev/null
+++ b/src/chrome/content/rules/2cyr.com.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2dehands.be.xml b/src/chrome/content/rules/2dehands.be.xml
new file mode 100644
index 000000000000..273dccf81d7c
--- /dev/null
+++ b/src/chrome/content/rules/2dehands.be.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2ememain.be.xml b/src/chrome/content/rules/2ememain.be.xml
new file mode 100644
index 000000000000..32ecae7faa52
--- /dev/null
+++ b/src/chrome/content/rules/2ememain.be.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2ip.ru.xml b/src/chrome/content/rules/2ip.ru.xml
new file mode 100644
index 000000000000..a6f23359ebcc
--- /dev/null
+++ b/src/chrome/content/rules/2ip.ru.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2kom.ru.xml b/src/chrome/content/rules/2kom.ru.xml
new file mode 100644
index 000000000000..87258edf931b
--- /dev/null
+++ b/src/chrome/content/rules/2kom.ru.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2mdn.net.xml b/src/chrome/content/rules/2mdn.net.xml
index 498a25cf7bd4..f9d314dc2268 100644
--- a/src/chrome/content/rules/2mdn.net.xml
+++ b/src/chrome/content/rules/2mdn.net.xml
@@ -5,9 +5,20 @@
+
+
+
-
\ No newline at end of file
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2nd_Vote.com.xml b/src/chrome/content/rules/2nd_Vote.com.xml
new file mode 100644
index 000000000000..93edbf0b5507
--- /dev/null
+++ b/src/chrome/content/rules/2nd_Vote.com.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2o7.net.xml b/src/chrome/content/rules/2o7.net.xml
new file mode 100644
index 000000000000..a6aa5fa241d6
--- /dev/null
+++ b/src/chrome/content/rules/2o7.net.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2pay.ru.xml b/src/chrome/content/rules/2pay.ru.xml
new file mode 100644
index 000000000000..200d90c53664
--- /dev/null
+++ b/src/chrome/content/rules/2pay.ru.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2shared.xml b/src/chrome/content/rules/2shared.xml
index 00f93fc662bb..5fa1a3b29161 100644
--- a/src/chrome/content/rules/2shared.xml
+++ b/src/chrome/content/rules/2shared.xml
@@ -1,11 +1,11 @@
-
+
-
-
+
+
-
+
-
+
diff --git a/src/chrome/content/rules/3.cn.xml b/src/chrome/content/rules/3.cn.xml
new file mode 100644
index 000000000000..a006043699dd
--- /dev/null
+++ b/src/chrome/content/rules/3.cn.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/32Red_Online_Casino.xml b/src/chrome/content/rules/32Red_Online_Casino.xml
index 0ab17c90568b..4ec359e75102 100644
--- a/src/chrome/content/rules/32Red_Online_Casino.xml
+++ b/src/chrome/content/rules/32Red_Online_Casino.xml
@@ -17,7 +17,12 @@
-
+
+
+
+
+
+
@@ -26,7 +31,6 @@
-
-
\ No newline at end of file
+
+
diff --git a/src/chrome/content/rules/33Across.xml b/src/chrome/content/rules/33Across.xml
index e960828ed6e4..ec1abf8e4b5b 100644
--- a/src/chrome/content/rules/33Across.xml
+++ b/src/chrome/content/rules/33Across.xml
@@ -32,7 +32,7 @@
-
+
-
-
-
-
-
diff --git a/src/chrome/content/rules/33option.com.xml b/src/chrome/content/rules/33option.com.xml
new file mode 100644
index 000000000000..d530e92b1f33
--- /dev/null
+++ b/src/chrome/content/rules/33option.com.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/350.xml b/src/chrome/content/rules/350.xml
deleted file mode 100644
index 302fb63d3e44..000000000000
--- a/src/chrome/content/rules/350.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/350zEvolution.com.xml b/src/chrome/content/rules/350zEvolution.com.xml
index 6fd98e50f311..19d1aff7c7a4 100644
--- a/src/chrome/content/rules/350zEvolution.com.xml
+++ b/src/chrome/content/rules/350zEvolution.com.xml
@@ -1,13 +1,16 @@
-
+
+
-
+
-
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/360.cn.xml b/src/chrome/content/rules/360.cn.xml
new file mode 100644
index 000000000000..9db6a5f731ff
--- /dev/null
+++ b/src/chrome/content/rules/360.cn.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/360Cities.xml b/src/chrome/content/rules/360Cities.xml
index dfbdd03f354d..a61a0136ff17 100644
--- a/src/chrome/content/rules/360Cities.xml
+++ b/src/chrome/content/rules/360Cities.xml
@@ -1,25 +1,15 @@
-
-
+
+
+
+
-
-
-
-
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/360_Safe.com.xml b/src/chrome/content/rules/360_Safe.com.xml
new file mode 100644
index 000000000000..a528dec3cfc0
--- /dev/null
+++ b/src/chrome/content/rules/360_Safe.com.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/360_Total_Security.com.xml b/src/chrome/content/rules/360_Total_Security.com.xml
new file mode 100644
index 000000000000..2a00ba122805
--- /dev/null
+++ b/src/chrome/content/rules/360_Total_Security.com.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/360_Yield.xml b/src/chrome/content/rules/360_Yield.xml
index b862aef4071b..333312d6cc3b 100644
--- a/src/chrome/content/rules/360_Yield.xml
+++ b/src/chrome/content/rules/360_Yield.xml
@@ -1,52 +1,16 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
\ No newline at end of file
+
+
diff --git a/src/chrome/content/rules/360buy.com.xml b/src/chrome/content/rules/360buy.com.xml
new file mode 100644
index 000000000000..4ff7b0d251fd
--- /dev/null
+++ b/src/chrome/content/rules/360buy.com.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/360buyimg.com.xml b/src/chrome/content/rules/360buyimg.com.xml
new file mode 100644
index 000000000000..7a213e0e3990
--- /dev/null
+++ b/src/chrome/content/rules/360buyimg.com.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/365_Tickets.co.uk.xml b/src/chrome/content/rules/365_Tickets.co.uk.xml
new file mode 100644
index 000000000000..9bdad5dd9cad
--- /dev/null
+++ b/src/chrome/content/rules/365_Tickets.co.uk.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/365_Tickets.com.xml b/src/chrome/content/rules/365_Tickets.com.xml
new file mode 100644
index 000000000000..53722f852254
--- /dev/null
+++ b/src/chrome/content/rules/365_Tickets.com.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/365_Tickets_Central.com.xml b/src/chrome/content/rules/365_Tickets_Central.com.xml
new file mode 100644
index 000000000000..1a566b2b3f89
--- /dev/null
+++ b/src/chrome/content/rules/365_Tickets_Central.com.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/365_Tickets_Scotland.com.xml b/src/chrome/content/rules/365_Tickets_Scotland.com.xml
new file mode 100644
index 000000000000..0472289f0388
--- /dev/null
+++ b/src/chrome/content/rules/365_Tickets_Scotland.com.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/36Kr.xml b/src/chrome/content/rules/36Kr.xml
new file mode 100644
index 000000000000..34018363174f
--- /dev/null
+++ b/src/chrome/content/rules/36Kr.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/37Signals.xml b/src/chrome/content/rules/37Signals.xml
index e0478eec8674..be544f3e0efd 100644
--- a/src/chrome/content/rules/37Signals.xml
+++ b/src/chrome/content/rules/37Signals.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/src/chrome/content/rules/38.de.xml b/src/chrome/content/rules/38.de.xml
index 3f125c09c1e6..3428213ee900 100644
--- a/src/chrome/content/rules/38.de.xml
+++ b/src/chrome/content/rules/38.de.xml
@@ -1,37 +1,38 @@
-
+
-
+
+
+
+
+
+
-
+
-
-
+
+
+
diff --git a/src/chrome/content/rules/38degrees.xml b/src/chrome/content/rules/38degrees.xml
new file mode 100644
index 000000000000..a707cc835528
--- /dev/null
+++ b/src/chrome/content/rules/38degrees.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/38north.org.xml b/src/chrome/content/rules/38north.org.xml
new file mode 100644
index 000000000000..ed2bf79139aa
--- /dev/null
+++ b/src/chrome/content/rules/38north.org.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/39dollarglasses.com.xml b/src/chrome/content/rules/39dollarglasses.com.xml
new file mode 100644
index 000000000000..1e3731d0eb54
--- /dev/null
+++ b/src/chrome/content/rules/39dollarglasses.com.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/3Blue1Brown.com.xml b/src/chrome/content/rules/3Blue1Brown.com.xml
new file mode 100644
index 000000000000..3e1f7e72e86a
--- /dev/null
+++ b/src/chrome/content/rules/3Blue1Brown.com.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/3DCenter.org.xml b/src/chrome/content/rules/3DCenter.org.xml
new file mode 100644
index 000000000000..57b83cf6b455
--- /dev/null
+++ b/src/chrome/content/rules/3DCenter.org.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/3DStats.xml b/src/chrome/content/rules/3DStats.xml
deleted file mode 100644
index f2370e8cc264..000000000000
--- a/src/chrome/content/rules/3DStats.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/3D_Robotics.com.xml b/src/chrome/content/rules/3D_Robotics.com.xml
new file mode 100644
index 000000000000..6b4c6a76482a
--- /dev/null
+++ b/src/chrome/content/rules/3D_Robotics.com.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/3D_Vision_Live.com.xml b/src/chrome/content/rules/3D_Vision_Live.com.xml
deleted file mode 100644
index e227d44717ef..000000000000
--- a/src/chrome/content/rules/3D_Vision_Live.com.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/3FM.nl.xml b/src/chrome/content/rules/3FM.nl.xml
new file mode 100644
index 000000000000..785cbc402f14
--- /dev/null
+++ b/src/chrome/content/rules/3FM.nl.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/3FM.xml b/src/chrome/content/rules/3FM.xml
deleted file mode 100644
index ebe8722737bc..000000000000
--- a/src/chrome/content/rules/3FM.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/3M.com.xml b/src/chrome/content/rules/3M.com.xml
new file mode 100644
index 000000000000..6caa5297b33e
--- /dev/null
+++ b/src/chrome/content/rules/3M.com.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/3Play-Media.xml b/src/chrome/content/rules/3Play-Media.xml
index c35a761f5fbd..bb355d518705 100644
--- a/src/chrome/content/rules/3Play-Media.xml
+++ b/src/chrome/content/rules/3Play-Media.xml
@@ -7,7 +7,6 @@
-
+
diff --git a/src/chrome/content/rules/3_News-mixedcontent.xml b/src/chrome/content/rules/3_News-mixedcontent.xml
deleted file mode 100644
index c1fd5605ebc0..000000000000
--- a/src/chrome/content/rules/3_News-mixedcontent.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/3_News.xml b/src/chrome/content/rules/3_News.xml
index ce54e171216e..da9ccfdff907 100644
--- a/src/chrome/content/rules/3_News.xml
+++ b/src/chrome/content/rules/3_News.xml
@@ -1,25 +1,22 @@
-
+
+
+
-
-
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/3bbwifi.com.xml b/src/chrome/content/rules/3bbwifi.com.xml
index f5b4a20c9f7e..1fb8eaca8f1a 100644
--- a/src/chrome/content/rules/3bbwifi.com.xml
+++ b/src/chrome/content/rules/3bbwifi.com.xml
@@ -1,6 +1,13 @@
-
+
+
+
-
+
diff --git a/src/chrome/content/rules/3cdn.net.xml b/src/chrome/content/rules/3cdn.net.xml
new file mode 100644
index 000000000000..b7b12ca0d598
--- /dev/null
+++ b/src/chrome/content/rules/3cdn.net.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/3cdn.xml b/src/chrome/content/rules/3cdn.xml
deleted file mode 100644
index c129edf403ef..000000000000
--- a/src/chrome/content/rules/3cdn.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/3conline.com.xml b/src/chrome/content/rules/3conline.com.xml
new file mode 100644
index 000000000000..44e78147d47d
--- /dev/null
+++ b/src/chrome/content/rules/3conline.com.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/3ders.org.xml b/src/chrome/content/rules/3ders.org.xml
new file mode 100644
index 000000000000..812016c74e73
--- /dev/null
+++ b/src/chrome/content/rules/3ders.org.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/3dnews.ru.xml b/src/chrome/content/rules/3dnews.ru.xml
new file mode 100644
index 000000000000..1a4ea6f92ce2
--- /dev/null
+++ b/src/chrome/content/rules/3dnews.ru.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/3dr.com.xml b/src/chrome/content/rules/3dr.com.xml
new file mode 100644
index 000000000000..8ec4c41ead92
--- /dev/null
+++ b/src/chrome/content/rules/3dr.com.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/3dsupply.de.xml b/src/chrome/content/rules/3dsupply.de.xml
new file mode 100644
index 000000000000..2312be6fd952
--- /dev/null
+++ b/src/chrome/content/rules/3dsupply.de.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/3g2upl4pq6kufc4m.onion.xml b/src/chrome/content/rules/3g2upl4pq6kufc4m.onion.xml
new file mode 100644
index 000000000000..ad046cc1c13a
--- /dev/null
+++ b/src/chrome/content/rules/3g2upl4pq6kufc4m.onion.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/3min.xml b/src/chrome/content/rules/3min.xml
deleted file mode 100644
index dc119f41a8c4..000000000000
--- a/src/chrome/content/rules/3min.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/3refe.com.xml b/src/chrome/content/rules/3refe.com.xml
new file mode 100644
index 000000000000..cca7b473c762
--- /dev/null
+++ b/src/chrome/content/rules/3refe.com.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/3sat.xml b/src/chrome/content/rules/3sat.xml
new file mode 100644
index 000000000000..bccbd1b00f2c
--- /dev/null
+++ b/src/chrome/content/rules/3sat.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/3scale.net.xml b/src/chrome/content/rules/3scale.net.xml
new file mode 100644
index 000000000000..38af47c4846c
--- /dev/null
+++ b/src/chrome/content/rules/3scale.net.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/3scale.xml b/src/chrome/content/rules/3scale.xml
deleted file mode 100644
index 0926d5a4d6a2..000000000000
--- a/src/chrome/content/rules/3scale.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/3taps.xml b/src/chrome/content/rules/3taps.xml
index 8fc29d99b3a4..6ebb54a8ff55 100644
--- a/src/chrome/content/rules/3taps.xml
+++ b/src/chrome/content/rules/3taps.xml
@@ -1,13 +1,21 @@
-
+
+
+
-
+
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/3v1n0.net.xml b/src/chrome/content/rules/3v1n0.net.xml
new file mode 100644
index 000000000000..d3718ff44dab
--- /dev/null
+++ b/src/chrome/content/rules/3v1n0.net.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/4.CN.xml b/src/chrome/content/rules/4.CN.xml
new file mode 100644
index 000000000000..928c23e0167f
--- /dev/null
+++ b/src/chrome/content/rules/4.CN.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/419_Eater.com.xml b/src/chrome/content/rules/419_Eater.com.xml
new file mode 100644
index 000000000000..dc83a2b302dd
--- /dev/null
+++ b/src/chrome/content/rules/419_Eater.com.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/42Floors.com.xml b/src/chrome/content/rules/42Floors.com.xml
new file mode 100644
index 000000000000..9f821890956b
--- /dev/null
+++ b/src/chrome/content/rules/42Floors.com.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/435_by_MJC.com.xml b/src/chrome/content/rules/435_by_MJC.com.xml
new file mode 100644
index 000000000000..b12646d38f12
--- /dev/null
+++ b/src/chrome/content/rules/435_by_MJC.com.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/43rumors.com.xml b/src/chrome/content/rules/43rumors.com.xml
new file mode 100644
index 000000000000..00522c9de72e
--- /dev/null
+++ b/src/chrome/content/rules/43rumors.com.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/444.hu.xml b/src/chrome/content/rules/444.hu.xml
new file mode 100644
index 000000000000..9f4926be453d
--- /dev/null
+++ b/src/chrome/content/rules/444.hu.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/451-Group.xml b/src/chrome/content/rules/451-Group.xml
index 529e61fe1828..1e5017b81d8c 100644
--- a/src/chrome/content/rules/451-Group.xml
+++ b/src/chrome/content/rules/451-Group.xml
@@ -1,11 +1,11 @@
-
+
-
+
-
+
diff --git a/src/chrome/content/rules/451Unavailable.org.xml b/src/chrome/content/rules/451Unavailable.org.xml
new file mode 100644
index 000000000000..ef3030326d8a
--- /dev/null
+++ b/src/chrome/content/rules/451Unavailable.org.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/451_Unavailable.org.xml b/src/chrome/content/rules/451_Unavailable.org.xml
deleted file mode 100644
index 72592c846875..000000000000
--- a/src/chrome/content/rules/451_Unavailable.org.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/45_Million_Voices.xml b/src/chrome/content/rules/45_Million_Voices.xml
deleted file mode 100644
index 5e28009ef038..000000000000
--- a/src/chrome/content/rules/45_Million_Voices.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/48months.ie.xml b/src/chrome/content/rules/48months.ie.xml
new file mode 100644
index 000000000000..6f1a42a0fc40
--- /dev/null
+++ b/src/chrome/content/rules/48months.ie.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/49gov.ru.xml b/src/chrome/content/rules/49gov.ru.xml
new file mode 100644
index 000000000000..b746dc6891c0
--- /dev/null
+++ b/src/chrome/content/rules/49gov.ru.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/4D.com.xml b/src/chrome/content/rules/4D.com.xml
index e65eac2f5652..9cea66d66c22 100644
--- a/src/chrome/content/rules/4D.com.xml
+++ b/src/chrome/content/rules/4D.com.xml
@@ -6,13 +6,12 @@
-->
-
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/4DO.xml b/src/chrome/content/rules/4DO.xml
index e412d2f32532..fd1f5c59b2ce 100644
--- a/src/chrome/content/rules/4DO.xml
+++ b/src/chrome/content/rules/4DO.xml
@@ -1,18 +1,19 @@
-
+
-
+
+
+
-
+
-
-
+
diff --git a/src/chrome/content/rules/4K_Download.com.xml b/src/chrome/content/rules/4K_Download.com.xml
new file mode 100644
index 000000000000..9b255a862bc1
--- /dev/null
+++ b/src/chrome/content/rules/4K_Download.com.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/4PDA.xml b/src/chrome/content/rules/4PDA.xml
new file mode 100644
index 000000000000..faae363b026d
--- /dev/null
+++ b/src/chrome/content/rules/4PDA.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/4RX.com.xml b/src/chrome/content/rules/4RX.com.xml
deleted file mode 100644
index d15501163f52..000000000000
--- a/src/chrome/content/rules/4RX.com.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/4RunnerForex.com.xml b/src/chrome/content/rules/4RunnerForex.com.xml
deleted file mode 100644
index 5b5fbee8ac54..000000000000
--- a/src/chrome/content/rules/4RunnerForex.com.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/4Shared.xml b/src/chrome/content/rules/4Shared.xml
index ee5d1398331b..d826b7ca283a 100644
--- a/src/chrome/content/rules/4Shared.xml
+++ b/src/chrome/content/rules/4Shared.xml
@@ -1,18 +1,79 @@
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
-
+
diff --git a/src/chrome/content/rules/4Tulemar.xml b/src/chrome/content/rules/4Tulemar.xml
deleted file mode 100644
index 4261173884b2..000000000000
--- a/src/chrome/content/rules/4Tulemar.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/4_Free_Proxy.xml b/src/chrome/content/rules/4_Free_Proxy.xml
deleted file mode 100644
index 481f13072398..000000000000
--- a/src/chrome/content/rules/4_Free_Proxy.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/4armed.com.xml b/src/chrome/content/rules/4armed.com.xml
new file mode 100644
index 000000000000..601784eff3a7
--- /dev/null
+++ b/src/chrome/content/rules/4armed.com.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/4cdn.hu.xml b/src/chrome/content/rules/4cdn.hu.xml
new file mode 100644
index 000000000000..2eeb1668f53b
--- /dev/null
+++ b/src/chrome/content/rules/4cdn.hu.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/4chan.xml b/src/chrome/content/rules/4chan.xml
index e21030462334..2fb4acd8e0f2 100644
--- a/src/chrome/content/rules/4chan.xml
+++ b/src/chrome/content/rules/4chan.xml
@@ -1,44 +1,41 @@
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/4dsply.com.xml b/src/chrome/content/rules/4dsply.com.xml
new file mode 100644
index 000000000000..bc524422f32d
--- /dev/null
+++ b/src/chrome/content/rules/4dsply.com.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/4gamer.net.xml b/src/chrome/content/rules/4gamer.net.xml
index 9fb642a3ff72..03483c12eb68 100644
--- a/src/chrome/content/rules/4gamer.net.xml
+++ b/src/chrome/content/rules/4gamer.net.xml
@@ -16,4 +16,4 @@
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/4mlinux.com.xml b/src/chrome/content/rules/4mlinux.com.xml
new file mode 100644
index 000000000000..fa28035ba346
--- /dev/null
+++ b/src/chrome/content/rules/4mlinux.com.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
diff --git a/src/chrome/content/rules/4plebs.org.xml b/src/chrome/content/rules/4plebs.org.xml
new file mode 100644
index 000000000000..71b01abd0ce2
--- /dev/null
+++ b/src/chrome/content/rules/4plebs.org.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/4sevens.xml b/src/chrome/content/rules/4sevens.xml
index 65ead8e45a2a..7828e2b4d682 100644
--- a/src/chrome/content/rules/4sevens.xml
+++ b/src/chrome/content/rules/4sevens.xml
@@ -1,4 +1,14 @@
-
+
+
+
diff --git a/src/chrome/content/rules/4sqi.net.xml b/src/chrome/content/rules/4sqi.net.xml
new file mode 100644
index 000000000000..6fc5dd4bd04e
--- /dev/null
+++ b/src/chrome/content/rules/4sqi.net.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/4sysops.com.xml b/src/chrome/content/rules/4sysops.com.xml
new file mode 100644
index 000000000000..ee9e5a23e898
--- /dev/null
+++ b/src/chrome/content/rules/4sysops.com.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/500ish.com.xml b/src/chrome/content/rules/500ish.com.xml
new file mode 100644
index 000000000000..786d5c56e4dd
--- /dev/null
+++ b/src/chrome/content/rules/500ish.com.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/500px.com.xml b/src/chrome/content/rules/500px.com.xml
new file mode 100644
index 000000000000..43ec0ee6e664
--- /dev/null
+++ b/src/chrome/content/rules/500px.com.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/500px.org.xml b/src/chrome/content/rules/500px.org.xml
new file mode 100644
index 000000000000..7b8fc39a8167
--- /dev/null
+++ b/src/chrome/content/rules/500px.org.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/508surveys.com.xml b/src/chrome/content/rules/508surveys.com.xml
deleted file mode 100644
index 22bedea4fde5..000000000000
--- a/src/chrome/content/rules/508surveys.com.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/50gameslike.com.xml b/src/chrome/content/rules/50gameslike.com.xml
new file mode 100644
index 000000000000..80d3ebe20c9e
--- /dev/null
+++ b/src/chrome/content/rules/50gameslike.com.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/511tactical.com.xml b/src/chrome/content/rules/511tactical.com.xml
new file mode 100644
index 000000000000..d30718f0d489
--- /dev/null
+++ b/src/chrome/content/rules/511tactical.com.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/512_Pixels.xml b/src/chrome/content/rules/512_Pixels.xml
index 031df2a27d7c..fdbff58ff261 100644
--- a/src/chrome/content/rules/512_Pixels.xml
+++ b/src/chrome/content/rules/512_Pixels.xml
@@ -1,13 +1,13 @@
-
+
-
+
-
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/51fanli.net.xml b/src/chrome/content/rules/51fanli.net.xml
new file mode 100644
index 000000000000..5db79933ec03
--- /dev/null
+++ b/src/chrome/content/rules/51fanli.net.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/55ch.org.xml b/src/chrome/content/rules/55ch.org.xml
new file mode 100644
index 000000000000..d1bb32bf6765
--- /dev/null
+++ b/src/chrome/content/rules/55ch.org.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/55chan.org.xml b/src/chrome/content/rules/55chan.org.xml
new file mode 100644
index 000000000000..eafa00d4d218
--- /dev/null
+++ b/src/chrome/content/rules/55chan.org.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/58.com.xml b/src/chrome/content/rules/58.com.xml
new file mode 100644
index 000000000000..c3b56b8d1a20
--- /dev/null
+++ b/src/chrome/content/rules/58.com.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/58CDN.com.cn.xml b/src/chrome/content/rules/58CDN.com.cn.xml
new file mode 100644
index 000000000000..fe2ff184a651
--- /dev/null
+++ b/src/chrome/content/rules/58CDN.com.cn.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/5NINES.xml b/src/chrome/content/rules/5NINES.xml
index e801aa8a0c0f..3c9f0edad71e 100644
--- a/src/chrome/content/rules/5NINES.xml
+++ b/src/chrome/content/rules/5NINES.xml
@@ -1,19 +1,22 @@
+
-
+
-
+
-
+
diff --git a/src/chrome/content/rules/5_July.org.xml b/src/chrome/content/rules/5_July.org.xml
new file mode 100644
index 000000000000..03045fe68084
--- /dev/null
+++ b/src/chrome/content/rules/5_July.org.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/5ch.xml b/src/chrome/content/rules/5ch.xml
new file mode 100644
index 000000000000..dc7c80a0d85c
--- /dev/null
+++ b/src/chrome/content/rules/5ch.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/5dec.ru.xml b/src/chrome/content/rules/5dec.ru.xml
new file mode 100644
index 000000000000..838376b7c304
--- /dev/null
+++ b/src/chrome/content/rules/5dec.ru.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/5ka.ru.xml b/src/chrome/content/rules/5ka.ru.xml
new file mode 100644
index 000000000000..bdcaf98274dd
--- /dev/null
+++ b/src/chrome/content/rules/5ka.ru.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/5min.com.xml b/src/chrome/content/rules/5min.com.xml
index 45dcdbb2f776..b7fcc5b390e4 100644
--- a/src/chrome/content/rules/5min.com.xml
+++ b/src/chrome/content/rules/5min.com.xml
@@ -1,4 +1,19 @@
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
-
+
-
+
+
diff --git a/src/chrome/content/rules/5vpn.net.xml b/src/chrome/content/rules/5vpn.net.xml
deleted file mode 100644
index 28162f1587b2..000000000000
--- a/src/chrome/content/rules/5vpn.net.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/64Px.com.xml b/src/chrome/content/rules/64Px.com.xml
new file mode 100644
index 000000000000..b010eaf9dbf6
--- /dev/null
+++ b/src/chrome/content/rules/64Px.com.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/680news.com.xml b/src/chrome/content/rules/680news.com.xml
new file mode 100644
index 000000000000..a678585d2d54
--- /dev/null
+++ b/src/chrome/content/rules/680news.com.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/6Wunderkinder.xml b/src/chrome/content/rules/6Wunderkinder.xml
index 73b1949be875..d6503316b982 100644
--- a/src/chrome/content/rules/6Wunderkinder.xml
+++ b/src/chrome/content/rules/6Wunderkinder.xml
@@ -1,10 +1,4 @@
-
-
+
@@ -13,7 +7,7 @@
-
diff --git a/src/chrome/content/rules/6connect.com.xml b/src/chrome/content/rules/6connect.com.xml
new file mode 100644
index 000000000000..346041c51c13
--- /dev/null
+++ b/src/chrome/content/rules/6connect.com.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/6xq.net.xml b/src/chrome/content/rules/6xq.net.xml
index 0d7cc133cb9c..41c0554a742a 100644
--- a/src/chrome/content/rules/6xq.net.xml
+++ b/src/chrome/content/rules/6xq.net.xml
@@ -1,10 +1,16 @@
-
+
-
+-->
+
+
+
+
+
diff --git a/src/chrome/content/rules/7-Eleven.com.xml b/src/chrome/content/rules/7-Eleven.com.xml
new file mode 100644
index 000000000000..cbbdbba3b91b
--- /dev/null
+++ b/src/chrome/content/rules/7-Eleven.com.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/7-Zip.org.xml b/src/chrome/content/rules/7-Zip.org.xml
new file mode 100644
index 000000000000..de74249a118c
--- /dev/null
+++ b/src/chrome/content/rules/7-Zip.org.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/77777i.com.xml b/src/chrome/content/rules/77777i.com.xml
deleted file mode 100644
index 50ad7fc7c537..000000000000
--- a/src/chrome/content/rules/77777i.com.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/7_Elements.co.uk.xml b/src/chrome/content/rules/7_Elements.co.uk.xml
new file mode 100644
index 000000000000..682ff45af2dd
--- /dev/null
+++ b/src/chrome/content/rules/7_Elements.co.uk.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/7_Springs.com.xml b/src/chrome/content/rules/7_Springs.com.xml
index 3f02044072e9..e664eb7b535e 100644
--- a/src/chrome/content/rules/7_Springs.com.xml
+++ b/src/chrome/content/rules/7_Springs.com.xml
@@ -1,4 +1,7 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/7digital.xml b/src/chrome/content/rules/7digital.xml
index 493f95bbd855..08e22129a2fe 100644
--- a/src/chrome/content/rules/7digital.xml
+++ b/src/chrome/content/rules/7digital.xml
@@ -1,52 +1,48 @@
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/7eer.net.xml b/src/chrome/content/rules/7eer.net.xml
new file mode 100644
index 000000000000..b7832bd222a7
--- /dev/null
+++ b/src/chrome/content/rules/7eer.net.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/7static.com.xml b/src/chrome/content/rules/7static.com.xml
new file mode 100644
index 000000000000..377fc77a9f47
--- /dev/null
+++ b/src/chrome/content/rules/7static.com.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/7x7-journal.ru.xml b/src/chrome/content/rules/7x7-journal.ru.xml
new file mode 100644
index 000000000000..2ca082a1a489
--- /dev/null
+++ b/src/chrome/content/rules/7x7-journal.ru.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/80.lv.xml b/src/chrome/content/rules/80.lv.xml
new file mode 100644
index 000000000000..eb72f012fbd9
--- /dev/null
+++ b/src/chrome/content/rules/80.lv.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/800HelpFla.com.xml b/src/chrome/content/rules/800HelpFla.com.xml
new file mode 100644
index 000000000000..fd2086bee703
--- /dev/null
+++ b/src/chrome/content/rules/800HelpFla.com.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/80s_Purple.com.xml b/src/chrome/content/rules/80s_Purple.com.xml
index bda1a0ece3bd..0c6bb197559e 100644
--- a/src/chrome/content/rules/80s_Purple.com.xml
+++ b/src/chrome/content/rules/80s_Purple.com.xml
@@ -1,4 +1,8 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/888173.net.xml b/src/chrome/content/rules/888173.net.xml
new file mode 100644
index 000000000000..70b4a871ac3d
--- /dev/null
+++ b/src/chrome/content/rules/888173.net.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/888VoIP.com.xml b/src/chrome/content/rules/888VoIP.com.xml
index 1e4da445b5c6..b0824b616e25 100644
--- a/src/chrome/content/rules/888VoIP.com.xml
+++ b/src/chrome/content/rules/888VoIP.com.xml
@@ -1,13 +1,19 @@
-
+
+
+
-
+
-
+
diff --git a/src/chrome/content/rules/8ch.net.xml b/src/chrome/content/rules/8ch.net.xml
new file mode 100644
index 000000000000..24e9d5f9e353
--- /dev/null
+++ b/src/chrome/content/rules/8ch.net.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/8tracks.xml b/src/chrome/content/rules/8tracks.xml
index 65a12d744cde..308b6769ec64 100644
--- a/src/chrome/content/rules/8tracks.xml
+++ b/src/chrome/content/rules/8tracks.xml
@@ -1,4 +1,8 @@
+
-
+
+
-
+
+
+
-
-
\ No newline at end of file
+
+
+
diff --git a/src/chrome/content/rules/8win88win.com.xml b/src/chrome/content/rules/8win88win.com.xml
deleted file mode 100644
index 570a9d0f32f8..000000000000
--- a/src/chrome/content/rules/8win88win.com.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/91.com.xml b/src/chrome/content/rules/91.com.xml
new file mode 100644
index 000000000000..f54a1bdd2f9b
--- /dev/null
+++ b/src/chrome/content/rules/91.com.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/95516.com.xml b/src/chrome/content/rules/95516.com.xml
new file mode 100644
index 000000000000..0fa0e5c1d607
--- /dev/null
+++ b/src/chrome/content/rules/95516.com.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/95Bet.com.xml b/src/chrome/content/rules/95Bet.com.xml
deleted file mode 100644
index 39a56f60ca20..000000000000
--- a/src/chrome/content/rules/95Bet.com.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/96boards.org.xml b/src/chrome/content/rules/96boards.org.xml
new file mode 100644
index 000000000000..79b2ab8921fa
--- /dev/null
+++ b/src/chrome/content/rules/96boards.org.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/972mag.com.xml b/src/chrome/content/rules/972mag.com.xml
new file mode 100644
index 000000000000..b998fcabe88f
--- /dev/null
+++ b/src/chrome/content/rules/972mag.com.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/99.se.xml b/src/chrome/content/rules/99.se.xml
deleted file mode 100644
index e4fd2a9ae2c3..000000000000
--- a/src/chrome/content/rules/99.se.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/99Bitcoins.com.xml b/src/chrome/content/rules/99Bitcoins.com.xml
new file mode 100644
index 000000000000..4289c3c18b54
--- /dev/null
+++ b/src/chrome/content/rules/99Bitcoins.com.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/9anime.to.xml b/src/chrome/content/rules/9anime.to.xml
new file mode 100644
index 000000000000..a364c0bf83f6
--- /dev/null
+++ b/src/chrome/content/rules/9anime.to.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/9gag.com.xml b/src/chrome/content/rules/9gag.com.xml
new file mode 100644
index 000000000000..44b89bcf123f
--- /dev/null
+++ b/src/chrome/content/rules/9gag.com.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/9gag.xml b/src/chrome/content/rules/9gag.xml
deleted file mode 100644
index d6db2169b693..000000000000
--- a/src/chrome/content/rules/9gag.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/9p.io.xml b/src/chrome/content/rules/9p.io.xml
new file mode 100644
index 000000000000..e6ccff92c248
--- /dev/null
+++ b/src/chrome/content/rules/9p.io.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/chrome/content/rules/9seeds.xml b/src/chrome/content/rules/9seeds.xml
index 9a5bdfcacee0..40431ba03c0c 100644
--- a/src/chrome/content/rules/9seeds.xml
+++ b/src/chrome/content/rules/9seeds.xml
@@ -1,8 +1,58 @@
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/9to5google.com.xml b/src/chrome/content/rules/9to5google.com.xml
new file mode 100644
index 000000000000..6658437739fe
--- /dev/null
+++ b/src/chrome/content/rules/9to5google.com.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/9to5mac.com.xml b/src/chrome/content/rules/9to5mac.com.xml
new file mode 100644
index 000000000000..61bdd464cfc1
--- /dev/null
+++ b/src/chrome/content/rules/9to5mac.com.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/9to5toys.com.xml b/src/chrome/content/rules/9to5toys.com.xml
new file mode 100644
index 000000000000..5aa16d930750
--- /dev/null
+++ b/src/chrome/content/rules/9to5toys.com.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/9tv.co.il.xml b/src/chrome/content/rules/9tv.co.il.xml
new file mode 100644
index 000000000000..001299cad4cd
--- /dev/null
+++ b/src/chrome/content/rules/9tv.co.il.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/A-3.ru.xml b/src/chrome/content/rules/A-3.ru.xml
new file mode 100644
index 000000000000..6b738399a606
--- /dev/null
+++ b/src/chrome/content/rules/A-3.ru.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/A-Small-Orange.xml b/src/chrome/content/rules/A-Small-Orange.xml
index 8e61f1cfac34..992b6e322068 100644
--- a/src/chrome/content/rules/A-Small-Orange.xml
+++ b/src/chrome/content/rules/A-Small-Orange.xml
@@ -1,25 +1,49 @@
-
+
+
-
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
-
+
diff --git a/src/chrome/content/rules/A-ads.com.xml b/src/chrome/content/rules/A-ads.com.xml
index f4f126052dfa..98981c322bcf 100644
--- a/src/chrome/content/rules/A-ads.com.xml
+++ b/src/chrome/content/rules/A-ads.com.xml
@@ -6,19 +6,23 @@
- (www.)
- ad
+ - click
- static
-->
-
+
+
+
+
-
+
diff --git a/src/chrome/content/rules/A.fsdn.com.xml b/src/chrome/content/rules/A.fsdn.com.xml
deleted file mode 100644
index c542df6c4b70..000000000000
--- a/src/chrome/content/rules/A.fsdn.com.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/A1-Telekom-Austria.xml b/src/chrome/content/rules/A1-Telekom-Austria.xml
index f075e1b9b424..d8bd5ed93666 100644
--- a/src/chrome/content/rules/A1-Telekom-Austria.xml
+++ b/src/chrome/content/rules/A1-Telekom-Austria.xml
@@ -6,35 +6,43 @@
- (www.)a1blog.net (cert: www.bfi-stmk.at; shows that domain's data)
--->
-
-
-
-
-
-
-
-
+ Problematic domains:
+ - a1community.net ¹
+ - (www.)?telekom.at *
-
+ ¹ Expired
+ * Handshake fails
-
-
+ Fully covered domains:
+
+ - (www.)?telekom.at (→ www.a1.net)
-
+-->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
diff --git a/src/chrome/content/rules/A14_Electronics.com.xml b/src/chrome/content/rules/A14_Electronics.com.xml
new file mode 100644
index 000000000000..d4328c44642b
--- /dev/null
+++ b/src/chrome/content/rules/A14_Electronics.com.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/A16z.com.xml b/src/chrome/content/rules/A16z.com.xml
new file mode 100644
index 000000000000..b0bb238c53b2
--- /dev/null
+++ b/src/chrome/content/rules/A16z.com.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/A1A_Fast_Cash.xml b/src/chrome/content/rules/A1A_Fast_Cash.xml
deleted file mode 100644
index 6132f206d634..000000000000
--- a/src/chrome/content/rules/A1A_Fast_Cash.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/A1WebStats.com.xml b/src/chrome/content/rules/A1WebStats.com.xml
new file mode 100644
index 000000000000..fbf857b7ac9a
--- /dev/null
+++ b/src/chrome/content/rules/A1WebStats.com.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/A2_Hosting.xml b/src/chrome/content/rules/A2_Hosting.xml
index 0b5b99e74bd2..3b6489623c03 100644
--- a/src/chrome/content/rules/A2_Hosting.xml
+++ b/src/chrome/content/rules/A2_Hosting.xml
@@ -3,17 +3,52 @@
- community (no https)
+
+ Problematic hosts in *a2hosting.com:
+
+ - piwik *
+
+ * Untrusted root
+
+
+ Insecure cookies are set for these domains and hosts:
+
+ - .a2hosting.com
+ - my.a2hosting.com
+ - partners.a2hosting.com
+ - www.a2hosting.com
+
+
+ Mixed content:
+
+ - Image on partners from www *
+
+ * Secured by us
+
-->
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/A2e.de.xml b/src/chrome/content/rules/A2e.de.xml
deleted file mode 100644
index 82dd474687f2..000000000000
--- a/src/chrome/content/rules/A2e.de.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/A2z.xml b/src/chrome/content/rules/A2z.xml
index b3d13b735d51..51f91e0738ab 100644
--- a/src/chrome/content/rules/A2z.xml
+++ b/src/chrome/content/rules/A2z.xml
@@ -1,11 +1,54 @@
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
-
+
diff --git a/src/chrome/content/rules/A3li.li.xml b/src/chrome/content/rules/A3li.li.xml
new file mode 100644
index 000000000000..c56b943cabf1
--- /dev/null
+++ b/src/chrome/content/rules/A3li.li.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/A3li.xml b/src/chrome/content/rules/A3li.xml
deleted file mode 100644
index fe4a9eda23a4..000000000000
--- a/src/chrome/content/rules/A3li.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/A4apphack-mismatches.xml b/src/chrome/content/rules/A4apphack-mismatches.xml
index 2b93518a39b6..08202c62838a 100644
--- a/src/chrome/content/rules/A4apphack-mismatches.xml
+++ b/src/chrome/content/rules/A4apphack-mismatches.xml
@@ -1,16 +1,13 @@
-
-
+
-
+
+
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/A4uexpo.com.xml b/src/chrome/content/rules/A4uexpo.com.xml
index 2b47c2710bfa..6c81d0a6a1dd 100644
--- a/src/chrome/content/rules/A4uexpo.com.xml
+++ b/src/chrome/content/rules/A4uexpo.com.xml
@@ -30,7 +30,7 @@
-
+
@@ -39,4 +39,4 @@
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/A8.net.xml b/src/chrome/content/rules/A8.net.xml
new file mode 100644
index 000000000000..578190266b39
--- /dev/null
+++ b/src/chrome/content/rules/A8.net.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AA.net.uk.xml b/src/chrome/content/rules/AA.net.uk.xml
index e5f41de6e9b6..8cea07fb1174 100644
--- a/src/chrome/content/rules/AA.net.uk.xml
+++ b/src/chrome/content/rules/AA.net.uk.xml
@@ -29,13 +29,15 @@
-->
-
+
+
+
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AA.xml b/src/chrome/content/rules/AA.xml
deleted file mode 100644
index cb5046d3062c..000000000000
--- a/src/chrome/content/rules/AA.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/AAAI.org.xml b/src/chrome/content/rules/AAAI.org.xml
new file mode 100644
index 000000000000..3efc8e5868e5
--- /dev/null
+++ b/src/chrome/content/rules/AAAI.org.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AAAS.org.xml b/src/chrome/content/rules/AAAS.org.xml
index c8a8be8a911c..3954f329da01 100644
--- a/src/chrome/content/rules/AAAS.org.xml
+++ b/src/chrome/content/rules/AAAS.org.xml
@@ -1,24 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AABEST.com.xml b/src/chrome/content/rules/AABEST.com.xml
new file mode 100644
index 000000000000..9d4ce04c3565
--- /dev/null
+++ b/src/chrome/content/rules/AABEST.com.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AACQA.gov.au.xml b/src/chrome/content/rules/AACQA.gov.au.xml
new file mode 100644
index 000000000000..36b23acc4ff0
--- /dev/null
+++ b/src/chrome/content/rules/AACQA.gov.au.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AAMC.org.xml b/src/chrome/content/rules/AAMC.org.xml
new file mode 100644
index 000000000000..1cc6ce90df4d
--- /dev/null
+++ b/src/chrome/content/rules/AAMC.org.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AARNet.xml b/src/chrome/content/rules/AARNet.xml
new file mode 100644
index 000000000000..8474567acc89
--- /dev/null
+++ b/src/chrome/content/rules/AARNet.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AARP.org.xml b/src/chrome/content/rules/AARP.org.xml
new file mode 100644
index 000000000000..9064a50f6b58
--- /dev/null
+++ b/src/chrome/content/rules/AARP.org.xml
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AAS.org.xml b/src/chrome/content/rules/AAS.org.xml
new file mode 100644
index 000000000000..f8c3550abe99
--- /dev/null
+++ b/src/chrome/content/rules/AAS.org.xml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AASTOCKS.com.xml b/src/chrome/content/rules/AASTOCKS.com.xml
new file mode 100644
index 000000000000..3772da297842
--- /dev/null
+++ b/src/chrome/content/rules/AASTOCKS.com.xml
@@ -0,0 +1,152 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AAU.at.xml b/src/chrome/content/rules/AAU.at.xml
new file mode 100644
index 000000000000..13d4451b2a2c
--- /dev/null
+++ b/src/chrome/content/rules/AAU.at.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AB9IL.net.xml b/src/chrome/content/rules/AB9IL.net.xml
new file mode 100644
index 000000000000..5473f1b45291
--- /dev/null
+++ b/src/chrome/content/rules/AB9IL.net.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ABC-Music-Publishing.xml b/src/chrome/content/rules/ABC-Music-Publishing.xml
index 76fccbf13739..710d5943dd04 100644
--- a/src/chrome/content/rules/ABC-Music-Publishing.xml
+++ b/src/chrome/content/rules/ABC-Music-Publishing.xml
@@ -1,10 +1,4 @@
-
-
+
diff --git a/src/chrome/content/rules/ABC-Online.xml b/src/chrome/content/rules/ABC-Online.xml
index 36d0b341a661..16ca8477add4 100644
--- a/src/chrome/content/rules/ABC-Online.xml
+++ b/src/chrome/content/rules/ABC-Online.xml
@@ -3,42 +3,21 @@
- ABC-Music-Publishing.xml
-
- d1ros97qkrwjf5.cloudfront.net
- d3mfbaa198drag.cloudfront.net
- cp44823.edgefcs.net
-
-
- Nonfunctional:
-
- - mpegmedia.abc.net.au (Akamai; "An error occurred")
- - origin.abc.net.au (times out; redirects to www via http)
- - (www.)abc.net.au (Akamai; "An error occurred")
- - www2b.abc.net.au (times out)
- - (www.)abccommercial.com.au (ditto)
- - (www.)abccontentsales.com.au (ditto)
- - (www.)abcdigmusic.net.au
- - (www.)radioaustralianews.net.au (times out)
- - (www.)triplejunearthed.com (ditto)
-
+ Non-functional hosts in *.abc.net.au
+ Timeout:
+ - shop.abc.net.au
-->
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
+
diff --git a/src/chrome/content/rules/ABCDTeam.ovh.xml b/src/chrome/content/rules/ABCDTeam.ovh.xml
new file mode 100644
index 000000000000..f608f8211e41
--- /dev/null
+++ b/src/chrome/content/rules/ABCDTeam.ovh.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ABCNews.com.xml b/src/chrome/content/rules/ABCNews.com.xml
new file mode 100644
index 000000000000..2175b87535a2
--- /dev/null
+++ b/src/chrome/content/rules/ABCNews.com.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ABCNews.go.com.xml b/src/chrome/content/rules/ABCNews.go.com.xml
new file mode 100644
index 000000000000..e59f4b268340
--- /dev/null
+++ b/src/chrome/content/rules/ABCNews.go.com.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ABC_News.xml b/src/chrome/content/rules/ABC_News.xml
deleted file mode 100644
index 8bbcc3017edf..000000000000
--- a/src/chrome/content/rules/ABC_News.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/ABI.org.uk.xml b/src/chrome/content/rules/ABI.org.uk.xml
new file mode 100644
index 000000000000..349fc144046e
--- /dev/null
+++ b/src/chrome/content/rules/ABI.org.uk.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ABIS-studien.se.xml b/src/chrome/content/rules/ABIS-studien.se.xml
index 9e9b011beffb..ee6186dd274c 100644
--- a/src/chrome/content/rules/ABIS-studien.se.xml
+++ b/src/chrome/content/rules/ABIS-studien.se.xml
@@ -1,7 +1,6 @@
-
-
+
diff --git a/src/chrome/content/rules/ABI_Research.xml b/src/chrome/content/rules/ABI_Research.xml
index d715b8ac294b..f226f9389f78 100644
--- a/src/chrome/content/rules/ABI_Research.xml
+++ b/src/chrome/content/rules/ABI_Research.xml
@@ -1,22 +1,21 @@
-
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/ABNAMRO.xml b/src/chrome/content/rules/ABNAMRO.xml
index 29a8320544ff..521722787d60 100644
--- a/src/chrome/content/rules/ABNAMRO.xml
+++ b/src/chrome/content/rules/ABNAMRO.xml
@@ -1,8 +1,23 @@
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/src/chrome/content/rules/ACCAN.xml b/src/chrome/content/rules/ACCAN.xml
new file mode 100644
index 000000000000..2e4e08a95249
--- /dev/null
+++ b/src/chrome/content/rules/ACCAN.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ACI-Europe.org.xml b/src/chrome/content/rules/ACI-Europe.org.xml
new file mode 100644
index 000000000000..d77851d3ab8c
--- /dev/null
+++ b/src/chrome/content/rules/ACI-Europe.org.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ACLS.org.xml b/src/chrome/content/rules/ACLS.org.xml
index f82d7157961b..e602a9e41b4f 100644
--- a/src/chrome/content/rules/ACLS.org.xml
+++ b/src/chrome/content/rules/ACLS.org.xml
@@ -1,4 +1,9 @@
+
-
+
@@ -24,4 +29,4 @@
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/ACLU-of-Arizona.xml b/src/chrome/content/rules/ACLU-of-Arizona.xml
new file mode 100644
index 000000000000..2b6d495317d5
--- /dev/null
+++ b/src/chrome/content/rules/ACLU-of-Arizona.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ACLU-of-California.xml b/src/chrome/content/rules/ACLU-of-California.xml
new file mode 100644
index 000000000000..a58f0fdc9462
--- /dev/null
+++ b/src/chrome/content/rules/ACLU-of-California.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ACLU-of-Florida.xml b/src/chrome/content/rules/ACLU-of-Florida.xml
new file mode 100644
index 000000000000..35518a5a3607
--- /dev/null
+++ b/src/chrome/content/rules/ACLU-of-Florida.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ACLU-of-Georgia.xml b/src/chrome/content/rules/ACLU-of-Georgia.xml
new file mode 100644
index 000000000000..33b9c3d359d6
--- /dev/null
+++ b/src/chrome/content/rules/ACLU-of-Georgia.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ACLU-of-Kansas.xml b/src/chrome/content/rules/ACLU-of-Kansas.xml
new file mode 100644
index 000000000000..fcd2bd7b71c3
--- /dev/null
+++ b/src/chrome/content/rules/ACLU-of-Kansas.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ACLU-of-Louisiana.xml b/src/chrome/content/rules/ACLU-of-Louisiana.xml
index dd088c571972..bab3d2526fba 100644
--- a/src/chrome/content/rules/ACLU-of-Louisiana.xml
+++ b/src/chrome/content/rules/ACLU-of-Louisiana.xml
@@ -2,6 +2,6 @@
-
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/ACLU-of-Maine.xml b/src/chrome/content/rules/ACLU-of-Maine.xml
new file mode 100644
index 000000000000..75be52a3eee7
--- /dev/null
+++ b/src/chrome/content/rules/ACLU-of-Maine.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ACLU-of-Mississippi.xml b/src/chrome/content/rules/ACLU-of-Mississippi.xml
new file mode 100644
index 000000000000..88e0cac9f449
--- /dev/null
+++ b/src/chrome/content/rules/ACLU-of-Mississippi.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ACLU-of-Missouri.xml b/src/chrome/content/rules/ACLU-of-Missouri.xml
new file mode 100644
index 000000000000..605201f7ec72
--- /dev/null
+++ b/src/chrome/content/rules/ACLU-of-Missouri.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ACLU-of-Montana.xml b/src/chrome/content/rules/ACLU-of-Montana.xml
new file mode 100644
index 000000000000..80831fe0b851
--- /dev/null
+++ b/src/chrome/content/rules/ACLU-of-Montana.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ACLU-of-New-Mexico.xml b/src/chrome/content/rules/ACLU-of-New-Mexico.xml
new file mode 100644
index 000000000000..883faf13a090
--- /dev/null
+++ b/src/chrome/content/rules/ACLU-of-New-Mexico.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ACLU-of-North-Carolina.xml b/src/chrome/content/rules/ACLU-of-North-Carolina.xml
index 87db7f6bfac1..ae09f03a3115 100644
--- a/src/chrome/content/rules/ACLU-of-North-Carolina.xml
+++ b/src/chrome/content/rules/ACLU-of-North-Carolina.xml
@@ -4,42 +4,36 @@
Problematic domains:
- - (www.)epo-rtal.org (shows another domain; expired 2012-03-16, mismatched, CN: www.equalpeople.org)
+ - (www.)?acluofnc.org ¹
+ - (www.)?acluofnorthcarolina.org ²
+ ¹ Mismatched
+ ² Blocks Tor users
- Fully covered domains:
-
- - (www.)epo-rtal.org (→ www.acluofnorthcarolina.org)
-
-
- Mixed content:
-
- - css from:
-
- - fonts.googleapis.com *
-
- - Image from:
-
- - www.epo-rtal.org *
-
- * Secured by us
+ Fully covered domains:
- NB: We secure all resources, and thus
- platform should be removed with Ffx 24.
+ - (www.)?acluofnc.org (→ www.acluofnorthcarolina.org)
+ - (www.)?acluofnorthcarolina.org
-->
-
+
-
-
+
-
-
+
+
+
-
+
+
diff --git a/src/chrome/content/rules/ACLU-of-San-Diego.xml b/src/chrome/content/rules/ACLU-of-San-Diego.xml
new file mode 100644
index 000000000000..1b262a28d893
--- /dev/null
+++ b/src/chrome/content/rules/ACLU-of-San-Diego.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ACLU-of-Southern-California.xml b/src/chrome/content/rules/ACLU-of-Southern-California.xml
deleted file mode 100644
index 923ac265ca2d..000000000000
--- a/src/chrome/content/rules/ACLU-of-Southern-California.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/ACLU-of-Texas.xml b/src/chrome/content/rules/ACLU-of-Texas.xml
index f78e2ad1d774..b28775ab5f0e 100644
--- a/src/chrome/content/rules/ACLU-of-Texas.xml
+++ b/src/chrome/content/rules/ACLU-of-Texas.xml
@@ -1,13 +1,12 @@
-
+
-
+
-
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/ACLU-of-Virginia.xml b/src/chrome/content/rules/ACLU-of-Virginia.xml
index fa3669f19cb1..3c898bad0cda 100644
--- a/src/chrome/content/rules/ACLU-of-Virginia.xml
+++ b/src/chrome/content/rules/ACLU-of-Virginia.xml
@@ -1,17 +1,41 @@
-
+
+
-
+
+
+
-
-
\ No newline at end of file
+
+
+
diff --git a/src/chrome/content/rules/ACLU-of-Washington.xml b/src/chrome/content/rules/ACLU-of-Washington.xml
index 694ec0ac4af0..b3f188e18f57 100644
--- a/src/chrome/content/rules/ACLU-of-Washington.xml
+++ b/src/chrome/content/rules/ACLU-of-Washington.xml
@@ -1,7 +1,13 @@
-
+
+
-
-
\ No newline at end of file
+
+
diff --git a/src/chrome/content/rules/ACLU.xml b/src/chrome/content/rules/ACLU.xml
index 984731a2a262..e2421d90b3e1 100644
--- a/src/chrome/content/rules/ACLU.xml
+++ b/src/chrome/content/rules/ACLU.xml
@@ -1,49 +1,77 @@
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ACLU_SoCal.org.xml b/src/chrome/content/rules/ACLU_SoCal.org.xml
new file mode 100644
index 000000000000..9c8478f70f4f
--- /dev/null
+++ b/src/chrome/content/rules/ACLU_SoCal.org.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ACLU_of_Massachusetts.xml b/src/chrome/content/rules/ACLU_of_Massachusetts.xml
index 253312cbde88..95c76f441b65 100644
--- a/src/chrome/content/rules/ACLU_of_Massachusetts.xml
+++ b/src/chrome/content/rules/ACLU_of_Massachusetts.xml
@@ -1,17 +1,19 @@
-
+
-
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/ACLU_of_New_Jersey.xml b/src/chrome/content/rules/ACLU_of_New_Jersey.xml
index b5fa0e38bb50..7a5ffa3fae26 100644
--- a/src/chrome/content/rules/ACLU_of_New_Jersey.xml
+++ b/src/chrome/content/rules/ACLU_of_New_Jersey.xml
@@ -1,17 +1,39 @@
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/ACLU_of_Northern_California.xml b/src/chrome/content/rules/ACLU_of_Northern_California.xml
index 6a5b022ed369..c196cf298dd1 100644
--- a/src/chrome/content/rules/ACLU_of_Northern_California.xml
+++ b/src/chrome/content/rules/ACLU_of_Northern_California.xml
@@ -1,17 +1,19 @@
-
+
-
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/ACM.org.xml b/src/chrome/content/rules/ACM.org.xml
index 4a7c9e9068ec..e764b43d69ed 100644
--- a/src/chrome/content/rules/ACM.org.xml
+++ b/src/chrome/content/rules/ACM.org.xml
@@ -1,93 +1,56 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ACMA.gov.au.xml b/src/chrome/content/rules/ACMA.gov.au.xml
new file mode 100644
index 000000000000..f17a97893ee1
--- /dev/null
+++ b/src/chrome/content/rules/ACMA.gov.au.xml
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ACNC.gov.au.xml b/src/chrome/content/rules/ACNC.gov.au.xml
new file mode 100644
index 000000000000..6e1854f810f8
--- /dev/null
+++ b/src/chrome/content/rules/ACNC.gov.au.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ACPICA.org.xml b/src/chrome/content/rules/ACPICA.org.xml
deleted file mode 100644
index f2564e0e1522..000000000000
--- a/src/chrome/content/rules/ACPICA.org.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/ACSAC.org.xml b/src/chrome/content/rules/ACSAC.org.xml
new file mode 100644
index 000000000000..b6a0fda4bd43
--- /dev/null
+++ b/src/chrome/content/rules/ACSAC.org.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ACTION_Kooperative.xml b/src/chrome/content/rules/ACTION_Kooperative.xml
index 4e5db4660aff..e51c28a9f031 100644
--- a/src/chrome/content/rules/ACTION_Kooperative.xml
+++ b/src/chrome/content/rules/ACTION_Kooperative.xml
@@ -1,4 +1,12 @@
-
+
+
+
@@ -6,7 +14,6 @@
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AD4mat.xml b/src/chrome/content/rules/AD4mat.xml
new file mode 100644
index 000000000000..3d7b38983c89
--- /dev/null
+++ b/src/chrome/content/rules/AD4mat.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ADCocktail.xml b/src/chrome/content/rules/ADCocktail.xml
index 20b59defd6d7..3a87a35d1df9 100644
--- a/src/chrome/content/rules/ADCocktail.xml
+++ b/src/chrome/content/rules/ADCocktail.xml
@@ -15,7 +15,6 @@
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/ADD-Assoc-Southern-Region.xml b/src/chrome/content/rules/ADD-Assoc-Southern-Region.xml
index d53230d74e28..67386ac06618 100644
--- a/src/chrome/content/rules/ADD-Assoc-Southern-Region.xml
+++ b/src/chrome/content/rules/ADD-Assoc-Southern-Region.xml
@@ -1,6 +1,16 @@
-
+
+
+
-
-
\ No newline at end of file
+
+
diff --git a/src/chrome/content/rules/ADISC.org.xml b/src/chrome/content/rules/ADISC.org.xml
index 982266f5e791..b766fc22d806 100644
--- a/src/chrome/content/rules/ADISC.org.xml
+++ b/src/chrome/content/rules/ADISC.org.xml
@@ -1,13 +1,12 @@
-
+
-
+
diff --git a/src/chrome/content/rules/ADPLAN-DS.com.xml b/src/chrome/content/rules/ADPLAN-DS.com.xml
new file mode 100644
index 000000000000..e6e21e7708d5
--- /dev/null
+++ b/src/chrome/content/rules/ADPLAN-DS.com.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ADP_Retirement_Services.xml b/src/chrome/content/rules/ADP_Retirement_Services.xml
index e6ea9421a6b9..f4057bb2a8ae 100644
--- a/src/chrome/content/rules/ADP_Retirement_Services.xml
+++ b/src/chrome/content/rules/ADP_Retirement_Services.xml
@@ -1,20 +1,21 @@
+
- Cert only matches www.
+
-
-
+
-
-
-
-
-
\ No newline at end of file
+
+
diff --git a/src/chrome/content/rules/ADP_Screening_and_Selection_Services.xml b/src/chrome/content/rules/ADP_Screening_and_Selection_Services.xml
index 724095bab106..f35f3d71d75e 100644
--- a/src/chrome/content/rules/ADP_Screening_and_Selection_Services.xml
+++ b/src/chrome/content/rules/ADP_Screening_and_Selection_Services.xml
@@ -11,7 +11,7 @@
-
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/ADP_VirtualEdge.xml b/src/chrome/content/rules/ADP_VirtualEdge.xml
deleted file mode 100644
index a020302f700b..000000000000
--- a/src/chrome/content/rules/ADP_VirtualEdge.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/ADTmag.com.xml b/src/chrome/content/rules/ADTmag.com.xml
new file mode 100644
index 000000000000..471ddb8d8d16
--- /dev/null
+++ b/src/chrome/content/rules/ADTmag.com.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ADUM.fr.xml b/src/chrome/content/rules/ADUM.fr.xml
new file mode 100644
index 000000000000..6ed9d5088156
--- /dev/null
+++ b/src/chrome/content/rules/ADUM.fr.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AD_Security.org.xml b/src/chrome/content/rules/AD_Security.org.xml
new file mode 100644
index 000000000000..02a16fe5feb6
--- /dev/null
+++ b/src/chrome/content/rules/AD_Security.org.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ADindex.xml b/src/chrome/content/rules/ADindex.xml
index 25a462f83e93..c95baa934c84 100644
--- a/src/chrome/content/rules/ADindex.xml
+++ b/src/chrome/content/rules/ADindex.xml
@@ -1,13 +1,12 @@
-
+
-
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AEGEE-Enschede.nl.xml b/src/chrome/content/rules/AEGEE-Enschede.nl.xml
index 2fe975b56a7e..825ca0631e98 100644
--- a/src/chrome/content/rules/AEGEE-Enschede.nl.xml
+++ b/src/chrome/content/rules/AEGEE-Enschede.nl.xml
@@ -7,13 +7,12 @@
-
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AEI.org.xml b/src/chrome/content/rules/AEI.org.xml
new file mode 100644
index 000000000000..b74c131cb82e
--- /dev/null
+++ b/src/chrome/content/rules/AEI.org.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AEUP.eu.xml b/src/chrome/content/rules/AEUP.eu.xml
new file mode 100644
index 000000000000..d0de7a462eec
--- /dev/null
+++ b/src/chrome/content/rules/AEUP.eu.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AFCEA.xml b/src/chrome/content/rules/AFCEA.xml
index cec324232377..cf270bd43975 100644
--- a/src/chrome/content/rules/AFCEA.xml
+++ b/src/chrome/content/rules/AFCEA.xml
@@ -4,7 +4,7 @@
-
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AFNIC.fr.xml b/src/chrome/content/rules/AFNIC.fr.xml
index 761dda12f3fc..d4a8673acb95 100644
--- a/src/chrome/content/rules/AFNIC.fr.xml
+++ b/src/chrome/content/rules/AFNIC.fr.xml
@@ -1,34 +1,19 @@
-
-
+
+
+
+
+
-
-
-
-
-
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AFRA-Berlin.de.xml b/src/chrome/content/rules/AFRA-Berlin.de.xml
new file mode 100644
index 000000000000..7eef09e09dc4
--- /dev/null
+++ b/src/chrome/content/rules/AFRA-Berlin.de.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AFS.xml b/src/chrome/content/rules/AFS.xml
new file mode 100644
index 000000000000..d232e543e238
--- /dev/null
+++ b/src/chrome/content/rules/AFS.xml
@@ -0,0 +1,286 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AFSP.org.xml b/src/chrome/content/rules/AFSP.org.xml
new file mode 100644
index 000000000000..51ad76c14e31
--- /dev/null
+++ b/src/chrome/content/rules/AFSP.org.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AFUL.org.xml b/src/chrome/content/rules/AFUL.org.xml
new file mode 100644
index 000000000000..f112319bfb8d
--- /dev/null
+++ b/src/chrome/content/rules/AFUL.org.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AGU.org.xml b/src/chrome/content/rules/AGU.org.xml
new file mode 100644
index 000000000000..04da98e0bc22
--- /dev/null
+++ b/src/chrome/content/rules/AGU.org.xml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AI-Radio.org.xml b/src/chrome/content/rules/AI-Radio.org.xml
new file mode 100644
index 000000000000..4d89e37f28e0
--- /dev/null
+++ b/src/chrome/content/rules/AI-Radio.org.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AIA-Surety.xml b/src/chrome/content/rules/AIA-Surety.xml
index 1799285163b8..54da7900484e 100644
--- a/src/chrome/content/rules/AIA-Surety.xml
+++ b/src/chrome/content/rules/AIA-Surety.xml
@@ -1,18 +1,15 @@
-
+
+
-
+
-
-
-
+
diff --git a/src/chrome/content/rules/AIIB.org.xml b/src/chrome/content/rules/AIIB.org.xml
new file mode 100644
index 000000000000..f43caf8b6f66
--- /dev/null
+++ b/src/chrome/content/rules/AIIB.org.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AIP.org.xml b/src/chrome/content/rules/AIP.org.xml
new file mode 100644
index 000000000000..ae751b49dc66
--- /dev/null
+++ b/src/chrome/content/rules/AIP.org.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AIVD.nl.xml b/src/chrome/content/rules/AIVD.nl.xml
new file mode 100644
index 000000000000..f1208dd84efc
--- /dev/null
+++ b/src/chrome/content/rules/AIVD.nl.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AJC.com.xml b/src/chrome/content/rules/AJC.com.xml
index 352560eea382..e45f20f82011 100644
--- a/src/chrome/content/rules/AJC.com.xml
+++ b/src/chrome/content/rules/AJC.com.xml
@@ -1,14 +1,16 @@
-
+
-
-
-
+
+
+
+
+
diff --git a/src/chrome/content/rules/AJs_Ski_and_Sports.xml b/src/chrome/content/rules/AJs_Ski_and_Sports.xml
index aabfd3b3bfd7..eeb1614bde8d 100644
--- a/src/chrome/content/rules/AJs_Ski_and_Sports.xml
+++ b/src/chrome/content/rules/AJs_Ski_and_Sports.xml
@@ -1,13 +1,11 @@
-
+
+
-
+
-
-
-
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AK-Vorrat.de.xml b/src/chrome/content/rules/AK-Vorrat.de.xml
index d4d7af281ef2..325f0ef16767 100644
--- a/src/chrome/content/rules/AK-Vorrat.de.xml
+++ b/src/chrome/content/rules/AK-Vorrat.de.xml
@@ -1,13 +1,30 @@
-
-
-
-
+
+
-
+
+
+
+
+
-
+
diff --git a/src/chrome/content/rules/AKA.ms.xml b/src/chrome/content/rules/AKA.ms.xml
new file mode 100644
index 000000000000..3cb49cab2d2f
--- /dev/null
+++ b/src/chrome/content/rules/AKA.ms.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AKG.com.xml b/src/chrome/content/rules/AKG.com.xml
new file mode 100644
index 000000000000..587ccf16dfaa
--- /dev/null
+++ b/src/chrome/content/rules/AKG.com.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AK_Vorrat.org.xml b/src/chrome/content/rules/AK_Vorrat.org.xml
new file mode 100644
index 000000000000..af3a833e0464
--- /dev/null
+++ b/src/chrome/content/rules/AK_Vorrat.org.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ALA.org.xml b/src/chrome/content/rules/ALA.org.xml
new file mode 100644
index 000000000000..7b84840c9a11
--- /dev/null
+++ b/src/chrome/content/rules/ALA.org.xml
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ALDI.xml b/src/chrome/content/rules/ALDI.xml
index 2e26ce88d0f1..a3aec17cc9a1 100644
--- a/src/chrome/content/rules/ALDI.xml
+++ b/src/chrome/content/rules/ALDI.xml
@@ -1,22 +1,148 @@
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+Mismatch:
+ - games.aldi-sued.de
+ - games.aldi-suisse.ch
+ - inoc.aldi-suisse.ch
+ - games.aldi.co.uk
+ - games.aldi.com.au
+ - newsletter.aldi.dk
+ - newsletter.aldi.es
+ - haziasszonyok.aldi.hu
+ - games.aldi.hu
+ - games.aldi.us
+ - weeklyads.aldi.us
+ - games.hofer.at
+ - *gutaiderbichl.hofer.at
+ - games.hofer.si
-
-
-
+No response:
+ - herkunft.aldi-sued.de
+ - aldi.es
+Refused:
+ - transparenz.aldi-nord.de
+ - *aldi.com
+-->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ALDImobile.com.au.xml b/src/chrome/content/rules/ALDImobile.com.au.xml
new file mode 100644
index 000000000000..c604db0486e0
--- /dev/null
+++ b/src/chrome/content/rules/ALDImobile.com.au.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ALPriorityUSA.com.xml b/src/chrome/content/rules/ALPriorityUSA.com.xml
new file mode 100644
index 000000000000..ed7d1ab4dd60
--- /dev/null
+++ b/src/chrome/content/rules/ALPriorityUSA.com.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ALSOActebis.xml b/src/chrome/content/rules/ALSOActebis.xml
index b37f61b809ce..22e9410d3707 100644
--- a/src/chrome/content/rules/ALSOActebis.xml
+++ b/src/chrome/content/rules/ALSOActebis.xml
@@ -2,7 +2,7 @@
-
+
diff --git a/src/chrome/content/rules/ALTS.Trade.xml b/src/chrome/content/rules/ALTS.Trade.xml
new file mode 100644
index 000000000000..08a6a2821c74
--- /dev/null
+++ b/src/chrome/content/rules/ALTS.Trade.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ALT_Linux.org-problematic.xml b/src/chrome/content/rules/ALT_Linux.org-problematic.xml
new file mode 100644
index 000000000000..3d1d070c9f4d
--- /dev/null
+++ b/src/chrome/content/rules/ALT_Linux.org-problematic.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ALT_Linux.org.xml b/src/chrome/content/rules/ALT_Linux.org.xml
new file mode 100644
index 000000000000..df3e86b3e6c7
--- /dev/null
+++ b/src/chrome/content/rules/ALT_Linux.org.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AM-Best-Company.xml b/src/chrome/content/rules/AM-Best-Company.xml
deleted file mode 100644
index fdc4896992be..000000000000
--- a/src/chrome/content/rules/AM-Best-Company.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/AMC.xml b/src/chrome/content/rules/AMC.xml
index f077f6597b67..afe918873fd2 100644
--- a/src/chrome/content/rules/AMC.xml
+++ b/src/chrome/content/rules/AMC.xml
@@ -1,28 +1,57 @@
+
-
+
+
+
+
+
+
-
-
+
+
-
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AMCTheatres.xml b/src/chrome/content/rules/AMCTheatres.xml
index aab0be98654d..14015ed51587 100644
--- a/src/chrome/content/rules/AMCTheatres.xml
+++ b/src/chrome/content/rules/AMCTheatres.xml
@@ -2,7 +2,7 @@
-
+
-
-
\ No newline at end of file
+
+
diff --git a/src/chrome/content/rules/AMI.com.xml b/src/chrome/content/rules/AMI.com.xml
index 3b7633942bc7..58c50f395f99 100644
--- a/src/chrome/content/rules/AMI.com.xml
+++ b/src/chrome/content/rules/AMI.com.xml
@@ -1,10 +1,26 @@
+
+
-
+
+
+
+
+
+
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AMPR.org.xml b/src/chrome/content/rules/AMPR.org.xml
new file mode 100644
index 000000000000..b9a54fd51861
--- /dev/null
+++ b/src/chrome/content/rules/AMPR.org.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AMR.xml b/src/chrome/content/rules/AMR.xml
new file mode 100644
index 000000000000..9dda5ea5bb78
--- /dev/null
+++ b/src/chrome/content/rules/AMR.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AMS.org.xml b/src/chrome/content/rules/AMS.org.xml
new file mode 100644
index 000000000000..ced1f5703c86
--- /dev/null
+++ b/src/chrome/content/rules/AMS.org.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AMSl.com.xml b/src/chrome/content/rules/AMSl.com.xml
index 64ed9a749012..dae114106b73 100644
--- a/src/chrome/content/rules/AMSl.com.xml
+++ b/src/chrome/content/rules/AMSl.com.xml
@@ -1,10 +1,7 @@
-
-
-
-
+
diff --git a/src/chrome/content/rules/AMStat.org.xml b/src/chrome/content/rules/AMStat.org.xml
new file mode 100644
index 000000000000..72af77eb008e
--- /dev/null
+++ b/src/chrome/content/rules/AMStat.org.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AM_Best.com.xml b/src/chrome/content/rules/AM_Best.com.xml
new file mode 100644
index 000000000000..022bd84e3f44
--- /dev/null
+++ b/src/chrome/content/rules/AM_Best.com.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AMetSoc.org.xml b/src/chrome/content/rules/AMetSoc.org.xml
new file mode 100644
index 000000000000..d469d853050e
--- /dev/null
+++ b/src/chrome/content/rules/AMetSoc.org.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AMoAd.xml b/src/chrome/content/rules/AMoAd.xml
new file mode 100644
index 000000000000..3ce6c69a1b94
--- /dev/null
+++ b/src/chrome/content/rules/AMoAd.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AMuseWiki.org.xml b/src/chrome/content/rules/AMuseWiki.org.xml
new file mode 100644
index 000000000000..8c5e4bd1b9d0
--- /dev/null
+++ b/src/chrome/content/rules/AMuseWiki.org.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ANB.xml b/src/chrome/content/rules/ANB.xml
index ff4e524fe57a..dd067ee6eabe 100644
--- a/src/chrome/content/rules/ANB.xml
+++ b/src/chrome/content/rules/ANB.xml
@@ -1,9 +1,15 @@
+
-
+
+
+
+
-
+
diff --git a/src/chrome/content/rules/ANU.edu.au.xml b/src/chrome/content/rules/ANU.edu.au.xml
new file mode 100644
index 000000000000..09e701064628
--- /dev/null
+++ b/src/chrome/content/rules/ANU.edu.au.xml
@@ -0,0 +1,1159 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ANXBTC.com.xml b/src/chrome/content/rules/ANXBTC.com.xml
new file mode 100644
index 000000000000..379607bbbb6a
--- /dev/null
+++ b/src/chrome/content/rules/ANXBTC.com.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ANZ.co.nz.xml b/src/chrome/content/rules/ANZ.co.nz.xml
new file mode 100644
index 000000000000..0a3e376e9563
--- /dev/null
+++ b/src/chrome/content/rules/ANZ.co.nz.xml
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ANZ.com.au.xml b/src/chrome/content/rules/ANZ.com.au.xml
new file mode 100644
index 000000000000..8a9742b66fa1
--- /dev/null
+++ b/src/chrome/content/rules/ANZ.com.au.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/chrome/content/rules/ANZ.com.xml b/src/chrome/content/rules/ANZ.com.xml
new file mode 100644
index 000000000000..ad4891717d8f
--- /dev/null
+++ b/src/chrome/content/rules/ANZ.com.xml
@@ -0,0 +1,402 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ANZ.xml b/src/chrome/content/rules/ANZ.xml
deleted file mode 100644
index d97a92a361b2..000000000000
--- a/src/chrome/content/rules/ANZ.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/AOE.com.xml b/src/chrome/content/rules/AOE.com.xml
new file mode 100644
index 000000000000..06ff40fa07da
--- /dev/null
+++ b/src/chrome/content/rules/AOE.com.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AOK.de.xml b/src/chrome/content/rules/AOK.de.xml
index 69bc9a647795..dea5416056ec 100644
--- a/src/chrome/content/rules/AOK.de.xml
+++ b/src/chrome/content/rules/AOK.de.xml
@@ -1,5 +1,75 @@
-
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AOL-Advertising.xml b/src/chrome/content/rules/AOL-Advertising.xml
index 46eae9ad15b9..a0c12c0322ac 100644
--- a/src/chrome/content/rules/AOL-Advertising.xml
+++ b/src/chrome/content/rules/AOL-Advertising.xml
@@ -1,4 +1,11 @@
+
-
-
-
-
-
-
-
+
-
+
+
+
+
+
-
-
+
-
-
+
diff --git a/src/chrome/content/rules/AOL-mismatches.xml b/src/chrome/content/rules/AOL-mismatches.xml
index 955b2e6fefe1..02684029af22 100644
--- a/src/chrome/content/rules/AOL-mismatches.xml
+++ b/src/chrome/content/rules/AOL-mismatches.xml
@@ -1,75 +1,20 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/src/chrome/content/rules/AOL.co.uk.xml b/src/chrome/content/rules/AOL.co.uk.xml
new file mode 100644
index 000000000000..72b211311c22
--- /dev/null
+++ b/src/chrome/content/rules/AOL.co.uk.xml
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AOL.xml b/src/chrome/content/rules/AOL.xml
index 67ece4b543d0..739e8f0a35bf 100644
--- a/src/chrome/content/rules/AOL.xml
+++ b/src/chrome/content/rules/AOL.xml
@@ -1,23 +1,47 @@
+
-
+ Partially covered hosts in *aol.com:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ - my.screenname *
+ * Logout excluded
-
-
-
-
+ These altnames don't exist:
-
+ - holiday.aol.com
-
-
+ Insecure cookies are set for these domains and hosts: ᶜ
-
+ - .aol.com
+ - account.aol.com
+ - autos.aol.com
+ - .autos.aol.com
+ - bill.aol.com
+ - .bill.aol.com
+ - ui.comet.aol.com
+ - discover.aol.com
+ - feedback.aol.com
+ - .feedback.aol.com
+ - help.aol.com
+ - .mail.aol.com
+ - myaccount.aol.com
+ - .myaccount.aol.com
+ - .my.screenname.aol.com
+ - .search.aol.com
+ - dashboard.voice.aol.com
-
+ ᶜ See https://owasp.org/index.php/SecureFlag
-
-
+ Mixed content:
-
+ - Image on adinfo from media.blogcdn.com
+ - favicon on adinfo from www.aol.com
-
+-->
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AOL_CDN.com-problematic.xml b/src/chrome/content/rules/AOL_CDN.com-problematic.xml
new file mode 100644
index 000000000000..6d98961c9bca
--- /dev/null
+++ b/src/chrome/content/rules/AOL_CDN.com-problematic.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AOL_On_Network.com.xml b/src/chrome/content/rules/AOL_On_Network.com.xml
new file mode 100644
index 000000000000..d35b503ef5f8
--- /dev/null
+++ b/src/chrome/content/rules/AOL_On_Network.com.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AOMedia.org.xml b/src/chrome/content/rules/AOMedia.org.xml
new file mode 100644
index 000000000000..e9dec1c79c7f
--- /dev/null
+++ b/src/chrome/content/rules/AOMedia.org.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AOptix.xml b/src/chrome/content/rules/AOptix.xml
index 664dd978071f..746892436261 100644
--- a/src/chrome/content/rules/AOptix.xml
+++ b/src/chrome/content/rules/AOptix.xml
@@ -6,7 +6,7 @@
-
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AP.org.xml b/src/chrome/content/rules/AP.org.xml
new file mode 100644
index 000000000000..124ee57b9b02
--- /dev/null
+++ b/src/chrome/content/rules/AP.org.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/APA.org.xml b/src/chrome/content/rules/APA.org.xml
index 23dc38fbfca6..4becd0cd96eb 100644
--- a/src/chrome/content/rules/APA.org.xml
+++ b/src/chrome/content/rules/APA.org.xml
@@ -1,9 +1,41 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
diff --git a/src/chrome/content/rules/APAN.net.xml b/src/chrome/content/rules/APAN.net.xml
new file mode 100644
index 000000000000..09d951342f64
--- /dev/null
+++ b/src/chrome/content/rules/APAN.net.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/APAN.org.xml b/src/chrome/content/rules/APAN.org.xml
new file mode 100644
index 000000000000..4b75578d7ecc
--- /dev/null
+++ b/src/chrome/content/rules/APAN.org.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/APC-Magazine.xml b/src/chrome/content/rules/APC-Magazine.xml
index 86059871f1ab..ff649f12f6af 100644
--- a/src/chrome/content/rules/APC-Magazine.xml
+++ b/src/chrome/content/rules/APC-Magazine.xml
@@ -4,12 +4,10 @@
-
+
-
-
+
diff --git a/src/chrome/content/rules/APM.com.xml b/src/chrome/content/rules/APM.com.xml
index 4eae9406ea33..b91da56916a9 100644
--- a/src/chrome/content/rules/APM.com.xml
+++ b/src/chrome/content/rules/APM.com.xml
@@ -1,18 +1,30 @@
+
-
+
+
+
+
+
+
+
+
-
+
-
+
diff --git a/src/chrome/content/rules/APN_News_and_Media.xml.xml b/src/chrome/content/rules/APN_News_and_Media.xml.xml
deleted file mode 100644
index a66c8f9dfc1a..000000000000
--- a/src/chrome/content/rules/APN_News_and_Media.xml.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/APNews.com.xml b/src/chrome/content/rules/APNews.com.xml
new file mode 100644
index 000000000000..909f9f0f78bc
--- /dev/null
+++ b/src/chrome/content/rules/APNews.com.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/APO_Box.com.xml b/src/chrome/content/rules/APO_Box.com.xml
new file mode 100644
index 000000000000..01e66c0fa42c
--- /dev/null
+++ b/src/chrome/content/rules/APO_Box.com.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/APSJobs.xml b/src/chrome/content/rules/APSJobs.xml
new file mode 100644
index 000000000000..5838e7b7c492
--- /dev/null
+++ b/src/chrome/content/rules/APSJobs.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AP_Schedule.com.xml b/src/chrome/content/rules/AP_Schedule.com.xml
new file mode 100644
index 000000000000..b6b130eb3809
--- /dev/null
+++ b/src/chrome/content/rules/AP_Schedule.com.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AR-conference.org.xml b/src/chrome/content/rules/AR-conference.org.xml
new file mode 100644
index 000000000000..a5f57afeed1f
--- /dev/null
+++ b/src/chrome/content/rules/AR-conference.org.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AR15.com.xml b/src/chrome/content/rules/AR15.com.xml
new file mode 100644
index 000000000000..abdd3f435706
--- /dev/null
+++ b/src/chrome/content/rules/AR15.com.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ARDMediathek.de.xml b/src/chrome/content/rules/ARDMediathek.de.xml
new file mode 100644
index 000000000000..7b19a8cd5725
--- /dev/null
+++ b/src/chrome/content/rules/ARDMediathek.de.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AREWEFASTYET.com.xml b/src/chrome/content/rules/AREWEFASTYET.com.xml
new file mode 100644
index 000000000000..3f4dc9209818
--- /dev/null
+++ b/src/chrome/content/rules/AREWEFASTYET.com.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ARICR.org.xml b/src/chrome/content/rules/ARICR.org.xml
new file mode 100644
index 000000000000..693dadf7679a
--- /dev/null
+++ b/src/chrome/content/rules/ARICR.org.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ARIN.net.xml b/src/chrome/content/rules/ARIN.net.xml
index 030daa185f2f..5934255c677c 100644
--- a/src/chrome/content/rules/ARIN.net.xml
+++ b/src/chrome/content/rules/ARIN.net.xml
@@ -1,4 +1,8 @@
+
-
+
-
+
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/ARIVA.DE.xml b/src/chrome/content/rules/ARIVA.DE.xml
new file mode 100644
index 000000000000..d1156e80a907
--- /dev/null
+++ b/src/chrome/content/rules/ARIVA.DE.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ARM.com.xml b/src/chrome/content/rules/ARM.com.xml
new file mode 100644
index 000000000000..371168934f88
--- /dev/null
+++ b/src/chrome/content/rules/ARM.com.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ARM.xml b/src/chrome/content/rules/ARM.xml
deleted file mode 100644
index 7cc560269b55..000000000000
--- a/src/chrome/content/rules/ARM.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/ARPNetworks.com.xml b/src/chrome/content/rules/ARPNetworks.com.xml
index c04aa83ced7e..ecf8995b7457 100644
--- a/src/chrome/content/rules/ARPNetworks.com.xml
+++ b/src/chrome/content/rules/ARPNetworks.com.xml
@@ -5,16 +5,18 @@
-
+
+
+
-
+
-
diff --git a/src/chrome/content/rules/ARRL.xml b/src/chrome/content/rules/ARRL.xml
index ee635dfdb8a2..ba3adc7eb1ab 100644
--- a/src/chrome/content/rules/ARRL.xml
+++ b/src/chrome/content/rules/ARRL.xml
@@ -8,7 +8,7 @@
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AS112.net.xml b/src/chrome/content/rules/AS112.net.xml
new file mode 100644
index 000000000000..a70207e7aba4
--- /dev/null
+++ b/src/chrome/content/rules/AS112.net.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AS200651.net.xml b/src/chrome/content/rules/AS200651.net.xml
new file mode 100644
index 000000000000..ff94e2e16494
--- /dev/null
+++ b/src/chrome/content/rules/AS200651.net.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ASACP.org.xml b/src/chrome/content/rules/ASACP.org.xml
new file mode 100644
index 000000000000..037cf0cbc9fc
--- /dev/null
+++ b/src/chrome/content/rules/ASACP.org.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ASADA.xml b/src/chrome/content/rules/ASADA.xml
new file mode 100644
index 000000000000..1c625d72e705
--- /dev/null
+++ b/src/chrome/content/rules/ASADA.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ASC_Trust.com.xml b/src/chrome/content/rules/ASC_Trust.com.xml
new file mode 100644
index 000000000000..cd6a07cd3a2a
--- /dev/null
+++ b/src/chrome/content/rules/ASC_Trust.com.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ASDA.xml b/src/chrome/content/rules/ASDA.xml
index 9fc8e7332b8c..ca73bd774aae 100644
--- a/src/chrome/content/rules/ASDA.xml
+++ b/src/chrome/content/rules/ASDA.xml
@@ -1,64 +1,200 @@
+
-
+ - ^ ᵈ
+ - credit-card ᵃ
+ - ipadkiosk.direct ᵐ
+ - giftguide ᵈ
+ - greenroom ᵐ
+ - omniture.groceries ᵐ
+ - storelocator ᵐ
+ - www ᴬ
+ - your ᵐ
-
+ ᵃ Shows credit-cardapply, equivalent to another domain
+ ᴬ Akamai / mismatched
+ ᵈ Dropped, preemptable redirect
+ ᵐ Mismatched
-
+ Partially covered hosts in *asda.com:
+ - direct ʰ
-
+ ʰ Some pages redirect to http
-
-
+ These altnames do not exist:
+
+ - priceguarantee.asda.com
+
+
+ Insecure cookies are set for these domains and hosts: ᶜ
+
+ - .asda.com
+ - cards.asda.com
+ - groceries.asda.com
+ - .groceries.asda.com
+ - home-insurance.asda.com
+ - mobile.asda.com
+ - storelocator.asda.com
+
+ ᶜ See https://owasp.org/index.php/SecureFlag
+
+
+ Mixed content:
+
+ - Images, on:
+
+ - direct from asda.scene7.com
+ - your from pbs.twimg.com ˢ
+ - www from $self
+
+ - favicon on www from $self
+ - Bug on storelocator from dev.virtualearth.net ˢ
+
+ ˢ Secured by us, see https://www.paulirish.com/2010/the-protocol-relative-url/
+
+-->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/ASIC.xml b/src/chrome/content/rules/ASIC.xml
new file mode 100644
index 000000000000..fe299f2a8b59
--- /dev/null
+++ b/src/chrome/content/rules/ASIC.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ASI_robots.com.xml b/src/chrome/content/rules/ASI_robots.com.xml
index 8fd528c29ff8..f889e97acc26 100644
--- a/src/chrome/content/rules/ASI_robots.com.xml
+++ b/src/chrome/content/rules/ASI_robots.com.xml
@@ -9,13 +9,12 @@
-
+
-
+
diff --git a/src/chrome/content/rules/ASL19.org.xml b/src/chrome/content/rules/ASL19.org.xml
new file mode 100644
index 000000000000..2dd590cc6051
--- /dev/null
+++ b/src/chrome/content/rules/ASL19.org.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ASN_Bank.nl.xml b/src/chrome/content/rules/ASN_Bank.nl.xml
new file mode 100644
index 000000000000..00d6562e6a72
--- /dev/null
+++ b/src/chrome/content/rules/ASN_Bank.nl.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ASP.NET.xml b/src/chrome/content/rules/ASP.NET.xml
deleted file mode 100644
index d472379042f9..000000000000
--- a/src/chrome/content/rules/ASP.NET.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/ASPNETcdn.com.xml b/src/chrome/content/rules/ASPNETcdn.com.xml
index 2617d0b1c3fb..75ea14c95531 100644
--- a/src/chrome/content/rules/ASPNETcdn.com.xml
+++ b/src/chrome/content/rules/ASPNETcdn.com.xml
@@ -7,7 +7,7 @@
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/ASPPlayground.NET.xml b/src/chrome/content/rules/ASPPlayground.NET.xml
index 4a8d74c41fb5..c9d9a6f889e7 100644
--- a/src/chrome/content/rules/ASPPlayground.NET.xml
+++ b/src/chrome/content/rules/ASPPlayground.NET.xml
@@ -1,13 +1,42 @@
+
-
+
+
+
+
+
+
+
+
+
-
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/ASUS.com.xml b/src/chrome/content/rules/ASUS.com.xml
new file mode 100644
index 000000000000..c45c85c3e1e8
--- /dev/null
+++ b/src/chrome/content/rules/ASUS.com.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ASUS.xml b/src/chrome/content/rules/ASUS.xml
deleted file mode 100644
index 9378796a1298..000000000000
--- a/src/chrome/content/rules/ASUS.xml
+++ /dev/null
@@ -1,120 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/ATBank.xml b/src/chrome/content/rules/ATBank.xml
index 9a254cd3f709..29625fe0ea3c 100644
--- a/src/chrome/content/rules/ATBank.xml
+++ b/src/chrome/content/rules/ATBank.xml
@@ -1,8 +1,9 @@
-
+
-
-
+
+
-
+
diff --git a/src/chrome/content/rules/ATG_Web_Commerce.xml b/src/chrome/content/rules/ATG_Web_Commerce.xml
deleted file mode 100644
index 33785eda8b9d..000000000000
--- a/src/chrome/content/rules/ATG_Web_Commerce.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/ATNAME.xml b/src/chrome/content/rules/ATNAME.xml
index 911b89d66ad6..d80fdf6158dc 100644
--- a/src/chrome/content/rules/ATNAME.xml
+++ b/src/chrome/content/rules/ATNAME.xml
@@ -11,4 +11,4 @@
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/ATS.aq.xml b/src/chrome/content/rules/ATS.aq.xml
new file mode 100644
index 000000000000..09b86e4f9aab
--- /dev/null
+++ b/src/chrome/content/rules/ATS.aq.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ATV.hu.xml b/src/chrome/content/rules/ATV.hu.xml
index 84e3508d620b..8b3c127c4237 100644
--- a/src/chrome/content/rules/ATV.hu.xml
+++ b/src/chrome/content/rules/ATV.hu.xml
@@ -1,9 +1,15 @@
-
-
+
-
+
diff --git a/src/chrome/content/rules/AT_Internet_Solutions.xml b/src/chrome/content/rules/AT_Internet_Solutions.xml
index be9552273137..60022d59104f 100644
--- a/src/chrome/content/rules/AT_Internet_Solutions.xml
+++ b/src/chrome/content/rules/AT_Internet_Solutions.xml
@@ -1,19 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/ATandT.xml b/src/chrome/content/rules/ATandT.xml
index 6d83390f364a..bb476a5ed9fa 100644
--- a/src/chrome/content/rules/ATandT.xml
+++ b/src/chrome/content/rules/ATandT.xml
@@ -1,86 +1,63 @@
-
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
diff --git a/src/chrome/content/rules/ATbar.xml b/src/chrome/content/rules/ATbar.xml
index 76ab5e87f6eb..51ca62f66252 100644
--- a/src/chrome/content/rules/ATbar.xml
+++ b/src/chrome/content/rules/ATbar.xml
@@ -13,7 +13,6 @@
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/ATech.io.xml b/src/chrome/content/rules/ATech.io.xml
new file mode 100644
index 000000000000..9f29f133e3f2
--- /dev/null
+++ b/src/chrome/content/rules/ATech.io.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ATech_Media.xml b/src/chrome/content/rules/ATech_Media.xml
index f2f3f37b0b75..f629ce66a871 100644
--- a/src/chrome/content/rules/ATech_Media.xml
+++ b/src/chrome/content/rules/ATech_Media.xml
@@ -1,33 +1,86 @@
-
+
-
-
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/ATrpms.net.xml b/src/chrome/content/rules/ATrpms.net.xml
index 1c3c3dfdb60c..c6bd2b7c73b9 100644
--- a/src/chrome/content/rules/ATrpms.net.xml
+++ b/src/chrome/content/rules/ATrpms.net.xml
@@ -17,4 +17,4 @@
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AV-Comparatives.org.xml b/src/chrome/content/rules/AV-Comparatives.org.xml
new file mode 100644
index 000000000000..02b03d895fc2
--- /dev/null
+++ b/src/chrome/content/rules/AV-Comparatives.org.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AV-Comparatives.xml b/src/chrome/content/rules/AV-Comparatives.xml
deleted file mode 100644
index d40d615235bf..000000000000
--- a/src/chrome/content/rules/AV-Comparatives.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/AVG.com.xml b/src/chrome/content/rules/AVG.com.xml
new file mode 100644
index 000000000000..ccc60c2f814e
--- /dev/null
+++ b/src/chrome/content/rules/AVG.com.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AVHT.org.xml b/src/chrome/content/rules/AVHT.org.xml
new file mode 100644
index 000000000000..ad292896c51d
--- /dev/null
+++ b/src/chrome/content/rules/AVHT.org.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AVON.cz.xml b/src/chrome/content/rules/AVON.cz.xml
new file mode 100644
index 000000000000..c749753d5a7f
--- /dev/null
+++ b/src/chrome/content/rules/AVON.cz.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AWSCloud.com.xml b/src/chrome/content/rules/AWSCloud.com.xml
new file mode 100644
index 000000000000..78fb3d1fa935
--- /dev/null
+++ b/src/chrome/content/rules/AWSCloud.com.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AWSInsider.net.xml b/src/chrome/content/rules/AWSInsider.net.xml
new file mode 100644
index 000000000000..15811c841308
--- /dev/null
+++ b/src/chrome/content/rules/AWSInsider.net.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AWS_Trust.com.xml b/src/chrome/content/rules/AWS_Trust.com.xml
new file mode 100644
index 000000000000..8119734bcb90
--- /dev/null
+++ b/src/chrome/content/rules/AWS_Trust.com.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AWcloud.net.xml b/src/chrome/content/rules/AWcloud.net.xml
deleted file mode 100644
index 33dfd89d6feb..000000000000
--- a/src/chrome/content/rules/AWcloud.net.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/AWeber-Communications.xml b/src/chrome/content/rules/AWeber-Communications.xml
deleted file mode 100644
index aec21b56f2b6..000000000000
--- a/src/chrome/content/rules/AWeber-Communications.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/AWeber-static.com.xml b/src/chrome/content/rules/AWeber-static.com.xml
new file mode 100644
index 000000000000..43eb18005f54
--- /dev/null
+++ b/src/chrome/content/rules/AWeber-static.com.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AWeber.com.xml b/src/chrome/content/rules/AWeber.com.xml
new file mode 100644
index 000000000000..a187687b922b
--- /dev/null
+++ b/src/chrome/content/rules/AWeber.com.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AWeber.xml b/src/chrome/content/rules/AWeber.xml
deleted file mode 100644
index 1b3e6485b2fe..000000000000
--- a/src/chrome/content/rules/AWeber.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/AXA.xml b/src/chrome/content/rules/AXA.xml
index 30448946e7a0..b17581b781c4 100644
--- a/src/chrome/content/rules/AXA.xml
+++ b/src/chrome/content/rules/AXA.xml
@@ -1,23 +1,12 @@
+
+
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+