- Switch Planner mode helps prepare for your site's switch to HTTPS by generating
- a report of external HTTP resources that might not yet be available on HTTPS.
-
- After enabling, navigate around your site and try to exercise all
- functionality in order to get a comprehensive list of external resources.
-
- For each group of resources listed as "Unrewritten," find out whether they
- are available on HTTPS. If so: add a rule to HTTPS Everywhere! If not: try
- to make them available over HTTPS or use a different resource or provider.
- Otherwise your site will generate
- Mixed Content
- (passive or active) errors when you turn on HTTPS.
-
- For most accurate results, disable ad blockers before using. Closing this
- panel will deactivate Switch Planner mode and clear stored data.
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/chromium/popup.js b/chromium/popup.js
deleted file mode 100644
index f8231c67c2f0..000000000000
--- a/chromium/popup.js
+++ /dev/null
@@ -1,210 +0,0 @@
-"use strict";
-var backgroundPage = chrome.extension.getBackgroundPage();
-var stableRules = null;
-var unstableRules = null;
-var hostReg = /.*\/\/[^$/]*\//;
-
-function e(id) {
- return document.getElementById(id);
-}
-
-/**
- * Handles rule (de)activation in the popup
- * @param checkbox checkbox being clicked
- * @param ruleset the ruleset tied tot he checkbox
- */
-function toggleRuleLine(checkbox, ruleset) {
- ruleset.active = checkbox.checked;
-
- if (ruleset.active != ruleset.default_state) {
- localStorage[ruleset.name] = ruleset.active;
- } else {
- delete localStorage[ruleset.name];
- // purge the name from the cache so that this unchecking is persistent.
- backgroundPage.all_rules.ruleCache.remove(ruleset.name);
- }
- // Now reload the selected tab of the current window.
- chrome.tabs.reload();
-}
-
-/**
- * Creates a rule line (including checkbox and icon) for the popup
- * @param ruleset the ruleset to build the line for
- * @returns {*}
- */
-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;
-}
-
-/**
- * Create the list of rules for a specific tab
- * @param tab
- */
-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";
- }
- // Only show the "Add a rule" link if we're on an HTTPS page
- if (/^https:/.test(tab.url)) {
- show(e("add-rule-link"));
- }
-}
-
-/**
- * Fill in content into the popup on load
- */
-document.addEventListener("DOMContentLoaded", function () {
- stableRules = document.getElementById("StableRules");
- unstableRules = document.getElementById("UnstableRules");
- chrome.tabs.getSelected(null, gotTab);
-
- // Print the extension's current version.
- var the_manifest = chrome.runtime.getManifest();
- var version_info = document.getElementById('current-version');
- version_info.innerText = the_manifest.version;
-
- // Set up toggle checkbox for HTTP nowhere mode
- getOption_('httpNowhere', false, function(item) {
- var httpNowhereCheckbox = document.getElementById('http-nowhere-checkbox');
- httpNowhereCheckbox.addEventListener('click', toggleHttpNowhere, false);
- var httpNowhereEnabled = item.httpNowhere;
- if (httpNowhereEnabled) {
- httpNowhereCheckbox.setAttribute('checked', '');
- }
- });
-
- // auto-translate all elements with i18n attributes
- var elem = document.querySelectorAll("[i18n]");
- for (var i=0; i < elem.length; i++) {
- elem[i].innerHTML = chrome.i18n.getMessage(elem[i].getAttribute("i18n"));
- }
-
- // other translations
- e("whatIsThis").setAttribute("title", chrome.i18n.getMessage("chrome_what_is_this_title"));
- e("add-rule-link").addEventListener("click", addManualRule);
-});
-
-
-var escapeForRegex = function( value ) {
- return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
-};
-
-function hide(elem) {
- elem.style.display = "none";
-}
-
-function show(elem) {
- elem.style.display = "block";
-}
-
-/**
- * Handles the manual addition of rules
- */
-function addManualRule() {
- chrome.tabs.getSelected(null, function(tab) {
- hide(e("add-rule-link"));
- show(e("add-new-rule-div"));
- var newUrl = document.createElement('a');
- newUrl.href = tab.url;
- newUrl.protocol = "https:";
- e("new-rule-host").value = newUrl.host;
- var oldUrl = document.createElement('a');
- oldUrl.href = tab.url;
- oldUrl.protocol = "http:";
- var oldMatcher = "^" + escapeForRegex(oldUrl.protocol + "//" + oldUrl.host+ "/");
- e("new-rule-regex").value = oldMatcher;
- var redirectPath = newUrl.protocol + "//" + newUrl.host + "/";
- e("new-rule-redirect").value = redirectPath;
- e("new-rule-name").value = "Manual rule for " + oldUrl.host;
- e("add-new-rule-button").addEventListener("click", function() {
- var params = {
- host : e("new-rule-host").value,
- redirectTo : e("new-rule-redirect").value,
- urlMatcher : e("new-rule-regex").value
- };
- backgroundPage.addNewRule(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"));
- });
- });
-}
-
-function toggleHttpNowhere() {
- getOption_('httpNowhere', false, function(item) {
- setOption_('httpNowhere', !item.httpNowhere);
- });
-}
-
-function getOption_(opt, defaultOpt, callback) {
- var details = {};
- details[opt] = defaultOpt;
- return chrome.storage.sync.get(details, callback);
-}
-
-function setOption_(opt, value) {
- var details = {};
- details[opt] = value;
- return chrome.storage.sync.set(details);
-}
diff --git a/chromium/rule_list.js b/chromium/rule_list.js
deleted file mode 100644
index 0c962730ca18..000000000000
--- a/chromium/rule_list.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var rule_list = [
-"rules/default.rulesets",
-];
diff --git a/chromium/rules.js b/chromium/rules.js
deleted file mode 100644
index 756c1fe047f6..000000000000
--- a/chromium/rules.js
+++ /dev/null
@@ -1,399 +0,0 @@
-// Stubs so this runs under nodejs. They get overwritten later by util.js
-var DBUG = 1;
-function log(){};
-
-/**
- * A single rule
- * @param from
- * @param to
- * @constructor
- */
-function Rule(from, to) {
- //this.from = from;
- this.to = to;
- this.from_c = new RegExp(from);
-}
-
-/**
- * Regex-Compile a pattern
- * @param pattern The pattern to compile
- * @constructor
- */
-function Exclusion(pattern) {
- //this.pattern = pattern;
- this.pattern_c = new RegExp(pattern);
-}
-
-/**
- * Generates a CookieRule
- * @param host The host regex to compile
- * @param cookiename The cookie name Regex to compile
- * @constructor
- */
-function CookieRule(host, cookiename) {
- this.host = host;
- this.host_c = new RegExp(host);
- this.name = cookiename;
- this.name_c = new RegExp(cookiename);
-}
-
-/**
- *A collection of rules
- * @param set_name The name of this set
- * @param match_rule Quick test match rule
- * @param default_state activity state
- * @param note Note will be displayed in popup
- * @constructor
- */
-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 = {
- /**
- * Check if a URI can be rewritten and rewrite it
- * @param urispec The uri to rewrite
- * @returns {*} null or the rewritten uri
- */
- apply: function(urispec) {
- var returl = null;
- // 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;
- }
- }
- // If a ruleset 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;
- }
-
- // 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;
- }
-
-};
-
-/**
- * Initialize Rule Sets
- * @param userAgent The browser's user agent
- * @param cache a cache object (lru)
- * @param ruleActiveStates default state for rules
- * @constructor
- */
-function RuleSets(userAgent, cache, ruleActiveStates) {
- // Load rules into structure
- var t1 = new Date().getTime();
- this.targets = {};
- this.userAgent = userAgent;
-
- // A cache for potentiallyApplicableRulesets
- // Size chosen /completely/ arbitrarily.
- this.ruleCache = new cache(1000);
-
- // A cache for cookie hostnames.
- this.cookieHostCache = new cache(100);
-
- // A hash of rule name -> active status (true/false).
- this.ruleActiveStates = ruleActiveStates;
-}
-
-
-RuleSets.prototype = {
- /**
- * Iterate through data XML and load rulesets
- */
- addFromXml: function(ruleXml) {
- var sets = ruleXml.getElementsByTagName("ruleset");
- for (var i = 0; i < sets.length; ++i) {
- this.parseOneRuleset(sets[i]);
- }
- },
-
- /**
- * Return the RegExp for the local platform
- */
- localPlatformRegexp: (function() {
- var isOpera = /(?:OPR|Opera)[\/\s](\d+)(?:\.\d+)/.test(this.userAgent);
- if (isOpera && isOpera.length === 2 && parseInt(isOpera[1]) < 23) {
- // Opera <23 does not have mixed content blocking
- log(DBUG, 'Detected that we are running Opera < 23');
- return new RegExp("chromium|mixedcontent");
- } else {
- log(DBUG, 'Detected that we are running Chrome/Chromium');
- return new RegExp("chromium");
- }
- })(),
-
- /**
- * Load a user rule
- * @param params
- * @returns {boolean}
- */
- addUserRule : function(params) {
- log(INFO, 'adding new user rule for ' + JSON.stringify(params));
- var new_rule_set = new RuleSet(params.host, null, true, "user rule");
- var new_rule = new Rule(params.urlMatcher, params.redirectTo);
- new_rule_set.rules.push(new_rule);
- if (!(params.host in this.targets)) {
- this.targets[params.host] = [];
- }
- this.ruleCache.remove(params.host);
- // TODO: maybe promote this rule?
- this.targets[params.host].push(new_rule_set);
- if (new_rule_set.name in this.ruleActiveStates) {
- new_rule_set.active = (this.ruleActiveStates[new_rule_set.name] == "true");
- }
- log(INFO, 'done adding rule');
- return true;
- },
-
- /**
- * Does the loading of a ruleset.
- * @param ruletag The whole tag to parse
- */
- 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 this.ruleActiveStates) {
- rule_set.active = (this.ruleActiveStates[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);
- }
- },
-
- /**
- * Insert any elements from fromList into intoList, if they are not
- * already there. fromList may be null.
- * @param intoList
- * @param fromList
- */
- setInsert: function(intoList, fromList) {
- if (!fromList) return;
- for (var i = 0; i < fromList.length; i++)
- if (intoList.indexOf(fromList[i]) == -1)
- intoList.push(fromList[i]);
- },
-
- /**
- * Return a list of rulesets that apply to this host
- * @param host The host to check
- * @returns {*} (empty) list
- */
- potentiallyApplicableRulesets: function(host) {
- // Have we cached this result? If so, return it!
- var cached_item = this.ruleCache.get(host);
- if (cached_item !== undefined) {
- log(DBUG, "Ruleset cache hit for " + host + " items:" + cached_item.length);
- return cached_item;
- }
- log(DBUG, "Ruleset cache miss for " + host);
-
- var tmp;
- var results = [];
- if (this.targets[host]) {
- // Copy the host targets so we don't modify them.
- results = this.targets[host].slice();
- }
-
- // 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] = "*";
- this.setInsert(results, this.targets[segmented.join(".")]);
- segmented[i] = tmp;
- }
- // 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
- this.ruleCache.set(host, results);
- return results;
- },
-
- /**
- * 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.
- * @param cookie The cookie to test
- * @param knownHttps Is the context for setting this cookie is https ?
- * @returns {*} ruleset or null
- */
- shouldSecureCookie: function(cookie, knownHttps) {
- var hostname = cookie.domain;
- // cookie domain scopes can start with .
- while (hostname.charAt(0) == ".")
- hostname = hostname.slice(1);
-
- if (!knownHttps && !this.safeToSecureCookie(hostname)) {
- return null;
- }
-
- var rs = this.potentiallyApplicableRulesets(hostname);
- for (var i = 0; i < rs.length; ++i) {
- var ruleset = rs[i];
- if (ruleset.active) {
- 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;
- }
- }
- }
- }
- return null;
- },
-
- /**
- * Check if it is secure to secure the cookie (=patch the secure flag in).
- * @param domain The domain of the cookie
- * @returns {*} true or 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 domainBlacklist) {
- log(INFO, "cookies for " + domain + "blacklisted");
- return false;
- }
- var cached_item = this.cookieHostCache.get(domain);
- if (cached_item !== undefined) {
- log(DBUG, "Cookie host cache hit for " + domain);
- return cached_item;
- }
- log(DBUG, "Cookie host cache miss for " + domain);
-
- // If we passed that test, make up a random URL on the domain, and see if
- // we would HTTPSify that.
-
- var nonce_path = "/" + Math.random().toString();
- var test_uri = "http://" + domain + nonce_path + nonce_path;
-
- 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;
- if (rs[i].apply(test_uri)) {
- log(INFO, "Cookie domain could be secured.");
- this.cookieHostCache.set(domain, true);
- return true;
- }
- }
- log(INFO, "Cookie domain could NOT be secured.");
- this.cookieHostCache.set(domain, false);
- return false;
- },
-
- /**
- * Rewrite an URI
- * @param urispec The uri to rewrite
- * @param host The host of this uri
- * @returns {*} the new uri or null
- */
- 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;
- }
-};
-
-// Export for HTTPS Rewriter if applicable.
-if (typeof exports != 'undefined') {
- exports.RuleSets = RuleSets;
-}
diff --git a/chromium/switch-planner.html b/chromium/switch-planner.html
deleted file mode 100644
index 87fe4b5ef13a..000000000000
--- a/chromium/switch-planner.html
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/chromium/switch-planner.js b/chromium/switch-planner.js
deleted file mode 100644
index 5ed4d8381f70..000000000000
--- a/chromium/switch-planner.js
+++ /dev/null
@@ -1,7 +0,0 @@
-window.onload = function() {
- var backgroundPage = chrome.extension.getBackgroundPage();
- var tab = document.location.search.match(/tab=([^&]*)/)[1];
- document.getElementById("content").innerHTML =
- backgroundPage.switchPlannerDetailsHtml(tab);
-};
-
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 da7b7a5ffbfc..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 3b4246c85a2c..000000000000
--- a/chromium/util.js
+++ /dev/null
@@ -1,24 +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;
-console.log("Hey developer! Want to see more verbose logging?");
-console.log("Type this into the console: DEFAULT_LOG_LEVEL=1");
-
-function log(level, str) {
- if (level >= DEFAULT_LOG_LEVEL) {
- if (level === WARN) {
- // Show warning with a little yellow icon in Chrome.
- console.warn(str);
- } else {
- 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/docs/rulesets.html b/docs/rulesets.html
deleted file mode 100644
index 9f0a6eff7323..000000000000
--- a/docs/rulesets.html
+++ /dev/null
@@ -1,304 +0,0 @@
-
-
- This page describes how to write rulesets for
- HTTPS Everywhere,
- a browser extension that switches sites over from HTTP
- to HTTPS automatically. HTTPS Everywhere comes with
- thousands
- 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.
-
- A ruleset is an XML
- file describing behavior for a site or group of sites. A ruleset contains
- one or more rules. For example, here is
- RabbitMQ.xml,
- from the plugin distribution:
-
- 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, or regexp, in one of those rules matches, HTTPS
- Everywhere rewrites the URL
- according the the to attribute of the rule.
-
- 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.
-
- The rule tags do the actual rewriting work. The from attribute of
- each rule is a regular expression 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:
-
- 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, which are similar but not identical to Perl-style regular
- expressions.
- Note that if your rules include ampersands (&), they need
- to be appropriately XML-encoded: replace each occurence of
- & with &.
-
- 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:
-
- 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.
-
-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. Some of the guidelines in that document are intended to make Ruleset
-testing less cumbersome.
-
-Many HTTPS websites fail to correctly set the secure
-flag on authentication and/or tracking cookies. HTTPS
-Everywhere provides a facility for turning this flag on. For instance:
-
-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.
-
-We use an automated
-checker to run some basic tests on all rulesets. This is described in more
-detail in our Ruleset
-Testing 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
-<test url="..."/> 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 should also manually test your ruleset by
-placing it in the HTTPSEverywhereUserRules/ subdirectory in
-your
-Firefox profile directory, and then restarting Firefox. While
-using the rule, check for messages in the Firefox Error Console
-to see if there are any issues with the way the site supports
-HTTPS.
-
-
-
- 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 on our GitHub
- repository 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.
-
-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.
-
-
-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.
-
- Some rulesets may trigger active mixed content (i.e. scripts loaded over HTTP
- instead of HTTPS). This type of mixed content is blocked in both Chrome and
- Firefox, before HTTPS Everywhere has a chance to rewrite the URLs to an HTTPS
- version. This generally breaks the site.
- However, the Tor Browser doesn't block mixed content, in order to allow HTTPS
- Everywhere to try and rewrite the URLs to an HTTPS version.
-
-
-
- To enable a rule only on platforms that allow mixed content (currently
- only the Tor Browser), you can add a platform="mixedcontent"
- attribute to the ruleset element.
-
- By default, HTTPS Everywhere will refuse to allow rules that
- would downgrade a URL from HTTPS to HTTP. Occasionally, this is necessary
- because the extension rewrites a page to HTTPS, and that page contains relative
- links to resources which do not exist on the HTTPS part of the site.
- This is very rare, especially because these resources will typically be blocked
- by Mixed Content Blocking. If it necessary, you can
- add a downgrade="1" attribute to the rule to make it easier to audit
- the ruleset library for such rules.
-
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/fetch-test.sh b/fetch-test.sh
deleted file mode 100755
index 81f9a9b31270..000000000000
--- a/fetch-test.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-exec python2.7 https-everywhere-checker/src/https_everywhere_checker/check_rules.py https-everywhere-checker/manual.checker.config "$@"
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/https-everywhere-checker b/https-everywhere-checker
deleted file mode 160000
index fecfbe3b9b63..000000000000
--- a/https-everywhere-checker
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit fecfbe3b9b63c4f0bf16526048b6d04f9872f73d
diff --git a/https-everywhere-tests/README.md b/https-everywhere-tests/README.md
deleted file mode 100644
index 464daade5dab..000000000000
--- a/https-everywhere-tests/README.md
+++ /dev/null
@@ -1,65 +0,0 @@
-# Tests for HTTPS Everywhere
-
-## Prerequisites
-* Latest release of the Firefox Add-On SDK as a submodule:
- git submodule update
-
-# Running
- bash test.sh
-
-To add tests, put them in `./https-everywhere-tests/tests`.
-
-# Manual tests
-
-These are test cases to execute manually before a release, and we should
-implement them as automated tests:
-
-# Firefox
-- Visit a site that triggers a ruleset (e.g., Reddit.com). Verify counter appears on HTTPS
- Everywhere icon.
-- Click HTTPS Everywhere icon menu, click 'show counter'. Verify counter
- disappears. Verify checkmark disappears from menu item.
-- Click HTTPS Everywhere icon, verify ruleset shows up in green.
-- Click ruleset.
-- Reopen HTTPS Everywhere icon menu, verify ruleset shows up in grey.
-- Reload HTTP version of the site, ensure it doesn't get rewritten now that the
- ruleset is disabled.
-- Click HTTP Everywhere icon, click ruleset again.
-- Reopen HTTPS Everywhere icon menu, verify ruleset shows up in green.
-- Click HTTPS Everywhere icon menu, click 'Enable / disable rules'. This will
- freeze up the browser for a few seconds. Verify it eventually opens up a
- dialog box listing all rules.
-- Right-click on a rule, click 'View XML source.' Verify it opens up a dialog
- box and shows the rule source.
-- Click HTTPS Everywhere icon menu, click 'Block all HTTP requests'. Verify icon
- turns red.
-- Visit an HTTP site known to not have a rewrite rule. http://amazon.com is a
- good example. Verify page does not load.
-- Visit an HTTPS site that contains passive mixed content that is not rewritten
- to HTTPS. https://jacob.hoffman-andrews.com/passive-mixed-content.html is a
- good example. Verify the passive mixed content (e.g., image) does not load.
-- Click icon menu, click 'About HTTPS Everywhere.' Verify dialog opens.
-- Click icon menu, click 'SSL Observatory Preferences.' Verify dialog opens.
-- Click icon menu, click 'Disable HTTPS Everywhere.' Verify icon turns grey.
-- Visit a site that would normally trigger a ruleset. Verify it is not rewritten
- to HTTPS.
-- Click icon menu, click 'Enable HTTPS Everywhere.' Verify icon turns blue.
- Verify page reloads and is rewritten to HTTPS.
-- Look at log output, look for errors. Make sure certificates are being
-submitted to SSL Observatory
-- Tools > Web Developer > Browser Toolbox > Console. Check for errors.
-- TODO: Test translations?
-
-# Chromium
-
-- Visit a site that triggers a ruleset (e.g., Reddit.com). Verify counter appears
- on HTTPS Everywhere icon.
-- Click HTTPS Everywhere icon menu. Verify it contains appropriate ruleset.
-- Disable ruleset.
-- Visit HTTP version of the site again. Verify it does not get redirected to
- HTTPS.
-- Re-enable ruleset.
-- Visit HTTP version of the site again. Verify it does get redirected.
-- Visit site that does not have a ruleset. From icon menu, click 'Add this
- site', and complete site-adding process.
-- Reload the site. Verify it gets redirected to HTTPS.
diff --git a/https-everywhere-tests/lib/main.js b/https-everywhere-tests/lib/main.js
deleted file mode 100644
index e69de29bb2d1..000000000000
diff --git a/https-everywhere-tests/package.json b/https-everywhere-tests/package.json
deleted file mode 100644
index 90d35bce79ee..000000000000
--- a/https-everywhere-tests/package.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "https-everywhere-tests",
- "title": "https-everywhere-tests",
- "id": "jid1-we5BQOfc6skSMg",
- "description": "a basic add-on",
- "author": "",
- "license": "MPL 2.0",
- "version": "0.1"
-}
diff --git a/https-everywhere-tests/test/test-httpse-installed.js b/https-everywhere-tests/test/test-httpse-installed.js
deleted file mode 100644
index 6f77581ee999..000000000000
--- a/https-everywhere-tests/test/test-httpse-installed.js
+++ /dev/null
@@ -1,38 +0,0 @@
-// Test that HTTPS Everywhere component is installed and accessible
-
-const { Cc, Ci } = require("chrome");
-var tabs = require("sdk/tabs");
-
-let HTTPSEverywhere = Cc["@eff.org/https-everywhere;1"]
- .getService(Ci.nsISupports)
- .wrappedJSObject;
-
-exports["test httpse installed"] = function(assert) {
- assert.equal(typeof HTTPSEverywhere, "object",
- "Test that HTTPSEverywhere is defined");
- assert.equal(typeof HTTPSEverywhere.observe, "function",
- "Test that HTTPSEverywhere.observe is a function");
-};
-
-exports["test httpse potentiallyApplicableRulesets"] = function(assert) {
- let HTTPSRules = HTTPSEverywhere.https_rules;
- assert.deepEqual(HTTPSRules.potentiallyApplicableRulesets("www.eff.org").length,
- 1,
- "Test that HTTPSE finds one applicable rule for www.eff.org");
-}
-
-exports["test sample ruleset"] = function(assert, done) {
- tabs.open({
- url: "http://www.reddit.com/robots.txt",
- onOpen: function(tab) {
- tab.on('load', function(tab) {
- assert.equal(tab.url, "https://www.reddit.com/robots.txt",
- "Test that Reddit URLs are rewritten to HTTPS.");
- tab.close();
- done();
- });
- }
- });
-}
-
-require("sdk/test").run(exports);
diff --git a/https-everywhere-tests/test/test-main.js b/https-everywhere-tests/test/test-main.js
deleted file mode 100644
index 147f98adfafe..000000000000
--- a/https-everywhere-tests/test/test-main.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var main = require("./main");
-
-exports["test main"] = function(assert) {
- assert.pass("Unit test running!");
-};
-
-exports["test main async"] = function(assert, done) {
- assert.pass("async Unit test running!");
- done();
-};
-
-require("sdk/test").run(exports);
diff --git a/https-everywhere-tests/test_profile_skeleton/extensions.ini b/https-everywhere-tests/test_profile_skeleton/extensions.ini
deleted file mode 100644
index a0ca1c2d30e8..000000000000
--- a/https-everywhere-tests/test_profile_skeleton/extensions.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[ExtensionDirs]
-Extension0=/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/ubufox@ubuntu.com
-Extension1=/usr/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/{2e1445b0-2682-11e1-bfc2-0800200c9a66}
-Extension2=/usr/lib/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/online-accounts@lists.launchpad.net
-
-[ThemeDirs]
-Extension0=/usr/lib/firefox/browser/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}
diff --git a/https-everywhere-tests/test_profile_skeleton/extensions.json b/https-everywhere-tests/test_profile_skeleton/extensions.json
deleted file mode 100644
index daf2d58cc3b0..000000000000
--- a/https-everywhere-tests/test_profile_skeleton/extensions.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "addons": [
- {
- "aboutURL": "chrome://https-everywhere/content/about.xul",
- "active": false,
- "appDisabled": false,
- "applyBackgroundUpdates": 1,
- "bootstrap": false,
- "defaultLocale": {
- "creator": "Mike Perry & Peter Eckersley",
- "description": "Encrypt the Web! Automatically use HTTPS security on many sites.",
- "homepageURL": "https://www.eff.org/https-everywhere",
- "name": "HTTPS-Everywhere"
- },
- "foreignInstall": true,
- "hasBinaryComponents": false,
- "icon64URL": null,
- "iconURL": "chrome://https-everywhere/skin/https-everywhere.png",
- "id": "https-everywhere@eff.org",
- "installDate": 1407525887000,
- "internalName": null,
- "locales": [],
- "location": "app-profile",
- "optionsType": null,
- "optionsURL": "chrome://https-everywhere/content/meta-preferences.xul",
- "releaseNotesURI": null,
- "size": 5133044,
- "softDisabled": false,
- "sourceURI": null,
- "strictCompatibility": false,
- "syncGUID": "PbynBLfrwhTP",
- "targetPlatforms": [],
- "type": "extension",
- "userDisabled": false,
- "visible": true
- }],
- "schemaVersion": 16
-}
diff --git a/https-everywhere-tests/test_profile_skeleton/prefs.js b/https-everywhere-tests/test_profile_skeleton/prefs.js
deleted file mode 100644
index fbe6514614e8..000000000000
--- a/https-everywhere-tests/test_profile_skeleton/prefs.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// Submit SSL Observatory reports.
-user_pref("extensions.https_everywhere._observatory.enabled", true);
-// Don't show any popups that might get in the way of testing.
-user_pref("extensions.https_everywhere._observatory.popup_shown", true);
-user_pref("extensions.https_everywhere.toolbar_hint_shown", true);
-// Show all logs.
-user_pref("extensions.https_everywhere.LogLevel", 0);
-user_pref("extensions.https_everywhere.log_to_stdout", true);
-// Allow running of Mixed Content Blocking tests.
-user_pref("extensions.https_everywhere.show_ruleset_tests", true);
-// Make it quicker to make manual config changes.
-user_pref("general.warnOnAboutConfig", false);
-// Minimize unnecesary requests.
-user_pref("browser.safebrowsing.enabled", false);
-user_pref("browser.safebrowsing.malware.enabled", false);
-// These two preferences allow debugging the extension
-// using Tools > Web Developer > Browser Toolbox
-// (Note: Since this is not an SDK extension, you can't use the Addon
-// Debugger, but the Browser Toolbox is just about as good).
-user_pref("devtools.chrome.enabled", true);
-user_pref("devtools.debugger.remote-enabled", true);
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
index b66261658953..9259d02b8676 100755
--- a/install-dev-dependencies.sh
+++ b/install-dev-dependencies.sh
@@ -1,18 +1,110 @@
-#!/bin/bash -ex
+#!/bin/bash
# Install packages that are necessary and/or useful to build and debug
# HTTPS Everywhere
-set -o errexit -o xtrace
-if type apt-get >/dev/null ; then
- sudo apt-get install libxml2-dev libxml2-utils libxslt1-dev python-dev \
- firefox chromium-browser zip sqlite3 python-pip libcurl4-openssl-dev
-elif type brew >/dev/null ; then
+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
-elif type dnf >/dev/null ; then
- sudo dnf install libxml2-devel python-devel libxslt-devel
+
+# 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
@@ -20,10 +112,16 @@ git submodule init
git submodule update
# Install Python packages
-pip install --user --no-allow-insecure --no-allow-external -r requirements.txt
-cd https-everywhere-checker
-pip install --user -r requirements.txt
+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 a hook to run tests before pushing.
+# 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 cb339cdf5297..000000000000
--- a/makecrx.sh
+++ /dev/null
@@ -1,182 +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.
-RULESETS_SQLITE="$PWD/src/defaults/rulesets.sqlite"
-
-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
-
-# Build the SQLite DB even though we don't yet use it in the Chrome extension,
-# because trivial-validate.py depends on it.
-if [ "$1" != "--fast" -o ! -f "$RULESETS_SQLITE" ] ; then
- echo "Generating sqlite DB"
- python2.7 ./utils/make-sqlite.py
-fi
-
-# =============== BEGIN VALIDATION ================
-# Unless we're in a hurry, validate the ruleset library & locales
-
-die() {
- echo >&2 "ERROR:" "$@"
- exit 1
-}
-
-if [ "$1" != "--fast" ] ; then
- if python2.7 ./utils/trivial-validate.py --quiet --db $RULESETS_SQLITE >&2
- then
- echo Validation of included rulesets completed. >&2
- echo >&2
- else
- die "Validation of rulesets failed."
- fi
-
- # Check for xmllint.
- type xmllint >/dev/null || die "xmllint not available"
-
- GRAMMAR="utils/relaxng.xml"
- if [ -f "$GRAMMAR" ]
- then
- # xmllint spams stderr with " validates, even with the --noout
- # flag. We can't grep -v for that line, because the pipeline will mask error
- # status from xmllint. Instead we run it once going to /dev/null, and if
- # there's an error run it again, showing only error output.
- validate_grammar() {
- find src/chrome/content/rules -name "*.xml" | \
- xargs xmllint --noout --relaxng utils/relaxng.xml
- }
- if validate_grammar 2>/dev/null
- then
- echo Validation of rulesets against $GRAMMAR succeeded. >&2
- else
- validate_grammar 2>&1 | grep -v validates
- die "Validation of rulesets against $GRAMMAR failed."
- fi
- else
- echo Validation of rulesets against $GRAMMAR SKIPPED. >&2
- fi
-
- if [ -x ./utils/compare-locales.sh ] >&2
- then
- if ./utils/compare-locales.sh >&2
- then
- echo Validation of included locales completed. >&2
- else
- die "Validation of locales failed."
- fi
- fi
-fi
-# =============== END VALIDATION ================
-
-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 ../..
-
-. ./utils/merge-rulesets.sh || exit 1
-
-cp src/$RULESETS pkg/crx/rules/default.rulesets
-
-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" && ../../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" | sed -e 's/\s//g' -e 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf
- 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 cc63738afcee..000000000000
--- a/makexpi.sh
+++ /dev/null
@@ -1,167 +0,0 @@
-#!/bin/bash
-set -o errexit
-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`"
-RULESETS_SQLITE="$PWD/src/defaults/rulesets.sqlite"
-ANDROID_APP_ID=org.mozilla.firefox
-
-[ -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"
- # When a file is renamed, the old copy can linger in the checkout directory.
- # Ensure a clean build.
- git clean -fdx
-
- # 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"
- cp $SUBDIR/pkg/$XPI_NAME.xpi pkg/
- if ! cp $SUBDIR/pkg/$XPI_NAME-amo.xpi pkg/ 2> /dev/null ; then
- echo Old version does not support AMO
- fi
- rm -rf $SUBDIR
- exit 0
-fi
-
-if [ "$1" != "--fast" -o ! -f "$RULESETS_SQLITE" ] ; then
- # This is an optimization to get the OS reading the rulesets into RAM ASAP;
- # it's useful on machines with slow disk seek times; doing several of these
- # at once allows the IO subsystem to seek more efficiently.
- for firstchar in `echo {a..z} {A..Z} {0..9}` ; do
- # Those cover everything but it wouldn't matter if they didn't
- nohup cat src/chrome/content/rules/"$firstchar"*.xml >/dev/null 2>/dev/null &
- done
-
- echo "Generating sqlite DB"
- python2.7 ./utils/make-sqlite.py
-fi
-
-# =============== BEGIN VALIDATION ================
-# Unless we're in a hurry, validate the ruleset library & locales
-
-die() {
- echo >&2 "ERROR:" "$@"
- exit 1
-}
-
-if [ "$1" != "--fast" -a -z "$FAST" ] ; then
- if python2.7 ./utils/trivial-validate.py --quiet --db $RULESETS_SQLITE >&2
- then
- echo Validation of included rulesets completed. >&2
- echo >&2
- else
- die "Validation of rulesets failed."
- fi
-
- # Check for xmllint.
- type xmllint >/dev/null || die "xmllint not available"
-
- GRAMMAR="utils/relaxng.xml"
- if [ -f "$GRAMMAR" ]
- then
- # xmllint spams stderr with " validates, even with the --noout
- # flag. We can't grep -v for that line, because the pipeline will mask error
- # status from xmllint. Instead we run it once going to /dev/null, and if
- # there's an error run it again, showing only error output.
- validate_grammar() {
- find src/chrome/content/rules -name "*.xml" | \
- xargs xmllint --noout --relaxng utils/relaxng.xml
- }
- if validate_grammar 2>/dev/null
- then
- echo Validation of rulesets against $GRAMMAR succeeded. >&2
- else
- validate_grammar 2>&1 | grep -v validates
- die "Validation of rulesets against $GRAMMAR failed."
- fi
- else
- echo Validation of rulesets against $GRAMMAR SKIPPED. >&2
- fi
-
- if [ -x ./utils/compare-locales.sh ] >&2
- then
- if sh ./utils/compare-locales.sh >&2
- then
- echo Validation of included locales completed. >&2
- else
- die "Validation of locales failed."
- 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"
-else
- # During development, generate packages named with the short hash of HEAD.
- XPI_NAME="$XPI_NAME~`git rev-parse --short HEAD`"
- if ! git diff-index --quiet HEAD; then
- XPI_NAME="$XPI_NAME-dirty"
- fi
-fi
-
-# Prepare packages suitable for uploading to EFF and AMO, respectively.
-[ -d pkg ] || mkdir pkg
-[ -e pkg/xpi-eff ] && rm -rf pkg/xpi-eff
-cp -a src/ pkg/xpi-eff/
-rm -r pkg/xpi-eff/chrome/content/rules
-[ -e pkg/xpi-amo ] && rm -rf pkg/xpi-amo
-cp -a src/ pkg/xpi-amo/
-rm -r pkg/xpi-amo/chrome/content/rules
-# The AMO version of the package cannot contain the updateKey or updateURL tags
-sed -i.bak -e '/updateKey/d' -e '/updateURL/d' pkg/xpi-amo/install.rdf
-rm pkg/xpi-amo/install.rdf.bak
-
-# 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
-
-# Build the XPI!
-rm -f "${XPI_NAME}.xpi"
-rm -f "${XPI_NAME}-amo.xpi"
-python2.7 utils/create_xpi.py -n "${XPI_NAME}.xpi" -x ".build_exclusions" "pkg/xpi-eff"
-python2.7 utils/create_xpi.py -n "${XPI_NAME}-amo.xpi" -x ".build_exclusions" "pkg/xpi-amo"
-
-echo >&2 "Total included rules: `sqlite3 $RULESETS_SQLITE 'select count(*) from rulesets'`"
-echo >&2 "Rules disabled by default: `find src/chrome/content/rules -name "*.xml" | xargs grep -F default_off | wc -l`"
-echo >&2 "Created ${XPI_NAME}.xpi and ${XPI_NAME}-amo.xpi"
-
-bash utils/android-push.sh "$XPI_NAME.xpi"
-
-if [ -n "$BRANCH" ]; then
- cp $SUBDIR/$XPI_NAME.xpi pkg
- rm -rf $SUBDIR
-fi
diff --git a/requirements.txt b/requirements.txt
index e947e2a9b8bf..6f97e1d4cd67 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,5 +1 @@
lxml>=3.3.3
-pycurl
-regex
-bsdiff4
-python-Levenshtein
diff --git a/rewriter/package.json b/rewriter/package.json
deleted file mode 100644
index 7a219f2b1ab3..000000000000
--- a/rewriter/package.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "name" : "https-everywhere-rewriter",
- "version" : "1.0.0",
- "dependencies" : {
- "xmldom" : "0.1.17",
- "URIjs" : "1.11.2",
- "readdirp" : "0.3.2",
- "event-stream" : "3.0.20"
- }
-}
diff --git a/rewriter/rewriter.js b/rewriter/rewriter.js
deleted file mode 100644
index 359abbb95804..000000000000
--- a/rewriter/rewriter.js
+++ /dev/null
@@ -1,133 +0,0 @@
-// HTTPS Rewriter.
-//
-// Uses the rulesets from HTTPS to recursively rewrite URL references in a
-// given directory to HTTPS. Uses protocol-relative URLs wherever possible.
-// Makes a copy of each file at filename.bak.
-//
-// Usage:
-// cd https-everywhere
-// ./makecrx.sh # to build default.rulesets
-// cd rewriter
-// (install node and npm)
-// npm install
-// node rewriter.js ~/path/to/my/webapp
-// cd ~/path/to/my/webapp
-// git diff
-
-var path = require("path"),
- fs = require("fs"),
- DOMParser = require('xmldom').DOMParser,
- readdirp = require('readdirp'),
- es = require('event-stream'),
-
- lrucache = require("../chromium/lru"),
- rules = require("../chromium/rules"),
-
- URI = require("URIjs");
-
-var ruleSets = null;
-
-/**
- * For a given directory, recursively edit all files in it that match a filename
- * pattern representing source code. Replace URLs in those files with rewritten
- * ones if possible.
- */
-function processDir(dir) {
- var stream = readdirp({
- root: dir,
- fileFilter: ['*.html', '*.js', '*.rb', '*.erb', '*.mustache',
- '*.scala', '*.c', '*.cc', '*.cpp', '*.cxx',
- '*.java', '*.go', '*.php', '*.css', '*.pl', '*.py',
- '*.rhtml', '*.sh', '*.yaml']
- });
-
- stream
- .on('warn', function (err) {
- console.error('non-fatal error', err);
- // Optionally call stream.destroy() here in order to abort and cause 'close' to be emitted
- })
- .on('error', function (err) { console.error('fatal error', err); })
- .pipe(es.mapSync(function (entry) {
- var filename = path.join(dir, entry.path);
- console.log("Rewriting " + filename);
- try {
- processFile(filename);
- } catch(e) {
- console.log(filename, e);
- }
- }));
-}
-
-/**
- * Overwrite the default URI find_uri_expression with a modified one that
- * mitigates a catastrophic backtracking issue common in CSS.
- * The workaround was to insist that URLs start with http, since those are the
- * only ones we want to rewrite anyhow. Note that this may still go exponential
- * on certain inputs. http://www.regular-expressions.info/catastrophic.html
- * Example string that blows up URI.withinString:
- * image:url(http://img.youtube.com/vi/x7f
- */
-URI.find_uri_expression = /\b((?:http:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+)+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/ig;
-
-function processFile(filename) {
- var contents = fs.readFileSync(filename, 'utf8');
- var rewrittenFile = URI.withinString(contents, function(url) {
- var uri = new URI(url);
- if (uri.protocol() != 'http') return url;
-
- uri.normalize();
- var rewritten = ruleSets.rewriteURI(uri.toString(), uri.host());
- if (rewritten) {
- // If the rewrite was just a protocol change, output protocol-relative
- // URIs.
- var rewrittenUri = new URI(rewritten).protocol('http');
- if (rewrittenUri.toString() === uri.toString()) {
- return rewrittenUri.protocol('').toString();
- } else {
- return rewritten;
- }
- } else {
- return url;
- }
- });
-
- fs.writeFileSync(filename + ".new", rewrittenFile);
- fs.renameSync(filename, filename + ".bak");
- fs.renameSync(filename + ".new", filename);
-}
-
-/**
- * Load all rulesets for rewriting.
- */
-function loadRuleSets() {
- console.log("Loading rules...");
- var fileContents = fs.readFileSync(path.join(__dirname, '../pkg/crx/rules/default.rulesets'), 'utf8');
- var xml = new DOMParser().parseFromString(fileContents, 'text/xml');
- ruleSets = new rules.RuleSets("fake user agent", lrucache.LRUCache, {});
- ruleSets.addFromXml(xml);
-}
-
-function usage() {
- console.log("Usage: \n nodejs rewriter.js /path/to/my/webapp \n");
- process.exit(1);
-}
-
-if (process.argv.length <= 2) {
- usage();
-}
-
-for (var i = 2; i < process.argv.length; i++) {
- var rewritePath = process.argv[i];
- if (rewritePath.indexOf('-') == 0) {
- usage();
- }
- if (!fs.existsSync(rewritePath)) {
- console.log("Path doesn't exist: " + rewritePath);
- process.exit(1);
- }
-}
-
-loadRuleSets();
-for (var i = 2; i < process.argv.length; i++) {
- processDir(process.argv[i]);
-}
diff --git a/ruleset-style.md b/ruleset-style.md
deleted file mode 100644
index dbbd3b177e1b..000000000000
--- a/ruleset-style.md
+++ /dev/null
@@ -1,92 +0,0 @@
-# Ruleset Style Guide
-
-Goal: rules should be written in a way that is consistent, easy for humans to
-read and debug, reduces the chance of errors, and makes testing easy.
-
-To that end, here are some style guidelines for writing or modifying rulesets.
-They are intended to help and simplify in places where choices are ambiguous,
-but like all guidelines they can be broken if the circumstances require it.
-
-Avoid using the left-wildcard ("<target host='*.example.com'>") unless you
-really mean it. Many rules today specify a left-wildcard target, but the
-rewrite rules only rewrite an explicit list of hostnames.
-
-Instead, prefer listing explicit target hosts and a single rewrite from "^http:" to
-"^https:". This saves you time as a ruleset author because each explicit target
-host automatically creates a an implicit test URL, reducing the need to add your
-own test URLs. These also make it easier for someone reading the ruleset to figure out
-which subdomains are covered.
-
-If you know all subdomains of a given domain support HTTPS, go ahead and use a
-left-wildcard, along with a plain rewrite from "^http:" to "^https:". Make sure
-to add a bunch of test URLs for the more important subdomains. If you're not
-sure what subdomains might exist, check the 'subdomain' tab on Wolfram Alpha:
-http://www.wolframalpha.com/input/?i=_YOUR_DOMAIN_GOES_HERE_.
-
-If there are a handful of tricky subdomains, but most subdomains can handle the
-plain rewrite from "^http:" to "^https:", specify the rules for the tricky
-subdomains first, and then then plain rule last. Earlier rules will take
-precedence, and processing stops at the first matching rule. There may be a tiny
-performance hit for processing exception cases earlier in the ruleset and the
-common case last, but in most cases the performance issue is trumped by readability.
-
-Avoid regexes with long strings of subdomains, e.g. <rule
-from="^http://(foo|bar|baz|bananas).example.com" />. These are hard to read and
-maintain, and are usually better expressed with a longer list of target hosts,
-plus a plain rewrite from "^http:" to "^https:".
-
-Prefer dashes over underscores in filenames. Dashes are easier to type.
-
-When matching an arbitrary DNS label (a single component of a hostname), prefer
-`([\w-]+)` for a single label (i.e www), or `([\w.-]+)` for multiple labels
-(i.e. www.beta). Avoid more visually complicated options like `([^/:@\.]+\.)?`.
-
-For `securecookie` tags, it's common to match any cookie name. For these, prefer
-`.+` over `.*`. They are functionally equivalent, but it's nice to be
-consistent.
-
-Avoid the negative lookahead operator `?!`. This is almost always better
-expressed using positive rule tags and negative exclusion tags. Some rulesets
-have exclusion tags that contain negative lookahead operators, which is very
-confusing.
-
-Prefer capturing groups `(www\.)?` over non-capturing `(?:www\.)?`. The
-non-capturing form adds extra line noise that makes rules harder to read.
-Generally you can achieve the same effect by choosing a correspondingly higher
-index for your replacement group to account for the groups you don't care about.
-
-Here is an example ruleset today:
-
-```
-
-
-
-
-
-
-
-```
-
-Here is how you could rewrite it according to these style guidelines, including
-test URLs:
-```
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ruleset-testing.md b/ruleset-testing.md
index 4fec87070066..9d3a6fb82304 100644
--- a/ruleset-testing.md
+++ b/ruleset-testing.md
@@ -5,62 +5,58 @@ 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.
+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 <test> tag in the XML, e.g.
-<test url="http://example.com/complex-page">.
-
-Test URLs will be matched against the regexes in each <rule> and <exclusion>. A
-test URL can only match against one <rule> and one <exclusion>. Once all the
-test URLs have been matched up, we count the number of test URLs matching each
-<rule> and each <exclusion>, and make sure the count meets the minimum number.
-The minimum number of test URLs for each <rule> or <exclusion> 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.
-
-TODO: We'd like to also require that there be at least three test URLs for every
-target host with a left-side wildcard, and at least ten test URLs for each
-target host with a right-side wildcard. But this is not yet implemented.
+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 <test> tags.
+("`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 rulest coverage is now part of the Travis CI 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, you'll need the https-everywhere-checker, which is now
-a submodule of https-everywhere. To set it up, run:
+To run the tests locally, first install the development dependencies:
./install-dev-dependencies.sh
To test a specific ruleset:
- ./fetch-test.sh rules/Example.xml
+ test/manual.sh rules/Example.xml
diff --git a/run-chromium.sh b/run-chromium.sh
deleted file mode 100755
index c9e2aed5c850..000000000000
--- a/run-chromium.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-#
-# Build the extension and run a chromium extension with it installed.
-#
-set -o errexit -o xtrace
-
-cd $(dirname $0)
-
-source makecrx.sh
-source utils/mktemp.sh
-
-PROFILE_DIRECTORY="$(mktemp -d)"
-trap 'rm -r "$PROFILE_DIRECTORY"' EXIT
-chromium-browser \
- --user-data-dir="$PROFILE_DIRECTORY" \
- --load-extension=pkg/crx/ "$@"
diff --git a/src/Changelog b/src/Changelog
index a3d31c00e379..db2f228f30d0 100644
--- a/src/Changelog
+++ b/src/Changelog
@@ -1,3 +1,377 @@
+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.
@@ -60,11 +434,11 @@ Firefox 4.0.3 / Chrome-2015.01.22 (2015-01-22)
* 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, Maashable, LinkedIn ,
+ * 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 Archvie,
+ 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
@@ -197,7 +571,7 @@ chrome-2014.4.14
* 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:
+ * 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
@@ -249,10 +623,10 @@ chrome-2014.1.3
* 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
+ 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
@@ -325,10 +699,10 @@ chrome-2014.1.3
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
@@ -398,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
@@ -447,15 +821,15 @@ 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://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:
@@ -539,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
@@ -555,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
@@ -566,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
@@ -608,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
@@ -666,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
@@ -683,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
@@ -729,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),
@@ -753,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
@@ -779,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,
@@ -793,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,
@@ -829,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
@@ -924,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
@@ -940,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
@@ -952,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
@@ -996,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
@@ -1014,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
@@ -1041,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
@@ -1063,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)
@@ -1072,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
@@ -1108,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
@@ -1171,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
@@ -1207,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
@@ -1224,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 :( :( :(
@@ -1269,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
@@ -1322,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
@@ -1368,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)
@@ -1376,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
@@ -1384,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
@@ -1414,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
@@ -1465,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)
@@ -1478,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
@@ -1503,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
@@ -1517,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
@@ -1537,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 37d5ffead2b7..000000000000
--- a/src/chrome.manifest
+++ /dev/null
@@ -1,70 +0,0 @@
-content https-everywhere chrome/content/
-override chrome://https-everywhere/content/rulesets.sqlite defaults/rulesets.sqlite
-
-locale https-everywhere en chrome/locale/en/
-locale https-everywhere ar chrome/locale/ar/
-locale https-everywhere bg chrome/locale/bg/
-locale https-everywhere ca chrome/locale/ca/
-locale https-everywhere cs chrome/locale/cs/
-locale https-everywhere da chrome/locale/da/
-locale https-everywhere de chrome/locale/de/
-locale https-everywhere el chrome/locale/el/
-locale https-everywhere en-GB chrome/locale/en_GB/
-locale https-everywhere es chrome/locale/es/
-locale https-everywhere et chrome/locale/et/
-locale https-everywhere eu chrome/locale/eu/
-locale https-everywhere fa chrome/locale/fa/
-locale https-everywhere fi chrome/locale/fi/
-locale https-everywhere fo chrome/locale/fo/
-locale https-everywhere fr chrome/locale/fr/
-locale https-everywhere fr-CA chrome/locale/fr_CA/
-locale https-everywhere he chrome/locale/he/
-locale https-everywhere hr-HR chrome/locale/hr_HR/
-locale https-everywhere hu chrome/locale/hu/
-locale https-everywhere it chrome/locale/it/
-locale https-everywhere ja chrome/locale/ja/
-locale https-everywhere km chrome/locale/km/
-locale https-everywhere ko chrome/locale/ko/
-locale https-everywhere lt chrome/locale/lt/
-locale https-everywhere lv chrome/locale/lv/
-locale https-everywhere ms-MY chrome/locale/ms_MY/
-locale https-everywhere nb chrome/locale/nb/
-locale https-everywhere nl chrome/locale/nl/
-locale https-everywhere pl chrome/locale/pl/
-locale https-everywhere pt chrome/locale/pt/
-locale https-everywhere pt-BR chrome/locale/pt_BR/
-locale https-everywhere ro chrome/locale/ro/
-locale https-everywhere ru chrome/locale/ru/
-locale https-everywhere si-LK chrome/locale/si_LK/
-locale https-everywhere sk chrome/locale/sk/
-locale https-everywhere sk-SK chrome/locale/sk_SK/
-locale https-everywhere sl chrome/locale/sl/
-locale https-everywhere sl-SI chrome/locale/sl_SI/
-locale https-everywhere sq chrome/locale/sq/
-locale https-everywhere sr chrome/locale/sr/
-locale https-everywhere sv chrome/locale/sv/
-locale https-everywhere th chrome/locale/th/
-locale https-everywhere tr chrome/locale/tr/
-locale https-everywhere uk chrome/locale/uk/
-locale https-everywhere zh-CN chrome/locale/zh-CN/
-locale https-everywhere zh-TW chrome/locale/zh_TW/
-
-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
-
-# XUL gets included in every non-mobile build
-# Android has some non-XUL UI that is loaded from the
-# sessionstore-windows-restored observer in https-everywhere.js
-overlay chrome://browser/content/browser.xul chrome://https-everywhere/content/toolbar_button.xul application={ec8030f7-c20a-464f-9b0e-13a3a9e97384} application={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} application={3550f703-e582-4d05-9a08-453d09bdfdc6} application={a79fe89b-6662-4ff4-8e88-09950ad4dfde}
-overlay chrome://navigator/content/navigator.xul chrome://https-everywhere/content/toolbar_button.xul application={ec8030f7-c20a-464f-9b0e-13a3a9e97384} application={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} application={3550f703-e582-4d05-9a08-453d09bdfdc6} application={a79fe89b-6662-4ff4-8e88-09950ad4dfde}
-
-style chrome://global/content/customizeToolbar.xul chrome://https-everywhere/skin/https-everywhere.css
-
-# Observatory does not yet have mobile-friendly UI
-component {0f9ab521-986d-4ad8-9c1f-6934e195c15c} components/ssl-observatory.js application={ec8030f7-c20a-464f-9b0e-13a3a9e97384} application={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} application={3550f703-e582-4d05-9a08-453d09bdfdc6} application={a79fe89b-6662-4ff4-8e88-09950ad4dfde}
-contract @eff.org/ssl-observatory;1 {0f9ab521-986d-4ad8-9c1f-6934e195c15c} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384} application={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} application={3550f703-e582-4d05-9a08-453d09bdfdc6} application={a79fe89b-6662-4ff4-8e88-09950ad4dfde}
-category profile-after-change SSLObservatory @eff.org/ssl-observatory;1 application={ec8030f7-c20a-464f-9b0e-13a3a9e97384} application={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} application={3550f703-e582-4d05-9a08-453d09bdfdc6} application={a79fe89b-6662-4ff4-8e88-09950ad4dfde}
diff --git a/src/chrome/content/about.xul b/src/chrome/content/about.xul
deleted file mode 100644
index 6a99d945cbf0..000000000000
--- a/src/chrome/content/about.xul
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/chrome/content/code/AndroidUI.jsm b/src/chrome/content/code/AndroidUI.jsm
deleted file mode 100644
index 1a4936dadf4a..000000000000
--- a/src/chrome/content/code/AndroidUI.jsm
+++ /dev/null
@@ -1,236 +0,0 @@
-const CC = Components.classes;
-const CI = Components.interfaces;
-const CU = Components.utils;
-
-var HTTPSEverywhere = CC["@eff.org/https-everywhere;1"]
- .getService(CI.nsISupports).wrappedJSObject;
-
-CU.import("resource://gre/modules/Prompt.jsm");
-
-var menuId;
-var urlbarId;
-var aWindow = getWindow();
-
-
-/*
- * Setup/Teardown for the UI
- */
-
-function loadIntoWindow() {
- if (!aWindow) {
- return;
- }
- var enabled = HTTPSEverywhere.prefs.getBoolPref("globalEnabled");
- addToggleItemToMenu(enabled);
- if (enabled) {
- urlbarId = aWindow.NativeWindow.pageactions.add(urlbarOptions);
- } else if (urlbarId) {
- aWindow.NativeWindow.pageactions.remove(urlbarId);
- }
-
- // When navigating away from a page, we want to clear the applicable list for
- // that page. There are a few different APIs to do this, but this is the one
- // that work on mobile. We trigger on pagehide rather than pageshow because we
- // want to capture subresources during load.
- var BrowserApp = aWindow.BrowserApp;
- BrowserApp.deck.addEventListener("pagehide", function(evt) {
- var browser = BrowserApp.getBrowserForDocument(evt.target);
- HTTPSEverywhere.resetApplicableList(browser);
- }, true);
-}
-
-function unloadFromWindow() {
- if (!aWindow) {
- return;
- }
- aWindow.NativeWindow.menu.remove(menuId);
- aWindow.NativeWindow.pageactions.remove(urlbarId);
-}
-
-
-/*
- * Add a menu item to toggle HTTPS Everywhere
- */
-
-function addToggleItemToMenu(enabled) {
- if (menuId) { aWindow.NativeWindow.menu.remove(menuId); }
- var menuLabel = enabled ? "HTTPS Everywhere on" : "HTTPS Everywhere off";
- menuId = aWindow.NativeWindow.menu.add(menuLabel, null, function() {
- popupToggleMenu(aWindow, enabled);
- });
-}
-
-function popupToggleMenu(aWindow, enabled) {
- var buttons = [
- {
- label: "Yes",
- callback: function() {
- toggleEnabledState();
- var msg = enabled ? "HTTPS Everywhere disabled!" : "HTTPS Everywhere enabled!";
- aWindow.NativeWindow.toast.show(msg, "short");
- return true;
- }
- }, {
- label: "No",
- callback: function() { return false; }
- }
- ];
- var newState = enabled ? "off?" : "on?";
- aWindow.NativeWindow.doorhanger.show("Would you like to turn HTTPS Everywhere "+newState,
- "doorhanger-toggle", buttons);
-}
-
-
-/*
- * The HTTPS Everywhere icon in the URL bar shows a popup of rules that the
- * user can activate/deactivate. On long click, reset all rules to defaults.
- */
-
-var popupInfo = {
- rules: [],
- ruleItems: [],
- ruleStatus: [],
- alist: null,
- getApplicableList: function() {
- var browser = aWindow.BrowserApp.selectedBrowser;
- return HTTPSEverywhere.getApplicableListForBrowser(browser);
- },
- fill: function() {
- this.clear();
- this.alist = this.getApplicableList();
- HTTPSEverywhere.log(4,"applicable list active: "+JSON.stringify(this.alist.active));
- HTTPSEverywhere.log(4,"applicable list inactive: "+JSON.stringify(this.alist.inactive));
- for (var rule in this.alist.all) {
- if (this.alist.active.hasOwnProperty(rule)) {
- // active rules are checked and toggleable
- this.ruleItems.push({ label: rule, selected: true });
- this.ruleStatus.push(true);
- this.rules.push(this.alist.active[rule]);
- } else if (this.alist.moot.hasOwnProperty(rule)) {
- // moot rules are checked and toggleable too
- this.ruleItems.push({ label: rule, selected: true });
- this.ruleStatus.push(true);
- this.rules.push(this.alist.moot[rule]);
- } else if (this.alist.inactive.hasOwnProperty(rule)) {
- // inactive rules are unchecked and toggleable
- this.ruleItems.push({ label: rule });
- this.ruleStatus.push(false);
- this.rules.push(this.alist.inactive[rule]);
- } else if (this.alist.breaking.hasOwnProperty(rule)) {
- // breaking rules are get a unicode clockwise arrow next to them
- var ruleLabel = "\u21B7"+rule;
- var isSelected = this.alist.breaking[rule].active;
- this.ruleItems.push({ label: ruleLabel, selected: isSelected });
- this.ruleStatus.push(isSelected);
- this.rules.push(this.alist.breaking[rule]);
- }
- }
- },
- clear: function() {
- this.rules = [];
- this.ruleItems = [];
- this.ruleStatus = [];
- this.alist = {};
- }
-};
-
-var urlbarOptions = {
-
- title: "HTTPS Everywhere",
-
- icon: "chrome://https-everywhere/skin/https-everywhere-128.png",
-
- clickCallback: function() {
- popupInfo.fill();
- rulesPrompt.setMultiChoiceItems(popupInfo.ruleItems);
- rulesPrompt.show(function(data) {
- var db = data.button;
- if (db === -1) { return null; } // user didn't click the accept button
- if (popupInfo.rules.length !== db.length) {
- // Why does db sometimes have an extra entry that doesn't correspond
- // to any of the ruleItems? No idea, but let's log it.
- HTTPSEverywhere.log(5,"Got length mismatch between popupInfo.ruleItems and data.button");
- HTTPSEverywhere.log(4,"Applicable rules: "+JSON.stringify(popupInfo.rules));
- HTTPSEverywhere.log(4, "data.button: "+JSON.stringify(db));
- }
- for (var i=0; i " +
- this.uri.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.uri.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.uri.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 browser = wm.getMostRecentWindow("navigator:browser").gBrowser.selectedBrowser;
- var location = browser.currentURI.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', JSON.stringify(rule.id)+'-command');
- command.setAttribute('label', rule.name);
- command.setAttribute('oncommand', 'toggle_rule("'+JSON.stringify(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 ca70939f2f05..000000000000
--- a/src/chrome/content/code/ChannelReplacement.js
+++ /dev/null
@@ -1,389 +0,0 @@
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-
-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: XPCOMUtils.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: XPCOMUtils.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: XPCOMUtils.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: XPCOMUtils.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 f9134bc4df75..000000000000
--- a/src/chrome/content/code/Cookie.js
+++ /dev/null
@@ -1,150 +0,0 @@
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-
-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: XPCOMUtils.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 e41573adf465..000000000000
--- a/src/chrome/content/code/HTTPS.js
+++ /dev/null
@@ -1,320 +0,0 @@
-INCLUDE('Cookie');
-
-var securityService = CC['@mozilla.org/ssservice;1']
- .getService(CI.nsISiteSecurityService);
-
-// 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,
-
- /**
- * Given a channel and a list of potentially applicable rules,
- * redirect or abort a request if appropriate.
- *
- * @param {RuleSet[]} applicable_list A list of potentially applicable rules
- * (i.e. those that match on a hostname basis).
- * @param {nsIChannel} channel The channel to be manipulated.
- * @param {boolean} httpNowhereEnabled Whether to abort non-https requests.
- * @returns {boolean} True if the request was redirected; false if it was
- * untouched or aborted.
- */
- replaceChannel: function(applicable_list, channel, httpNowhereEnabled) {
- var blob = HTTPSRules.rewrittenURI(applicable_list, channel.URI.clone());
- var isSTS = securityService.isSecureURI(
- CI.nsISiteSecurityService.HEADER_HSTS, channel.URI, 0);
- if (blob === null) {
- // Abort insecure requests if HTTP Nowhere is on
- if (httpNowhereEnabled && channel.URI.schemeIs("http") && !isSTS) {
- IOUtil.abort(channel);
- }
- return false; // no rewrite
- }
- var uri = blob.newuri;
- if (!uri) this.log(WARN, "OH NO BAD ARGH\nARGH");
-
- // Abort downgrading if HTTP Nowhere is on
- if (httpNowhereEnabled && uri.schemeIs("http")) {
- IOUtil.abort(channel);
- }
-
- 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;
- if (httpNowhereEnabled && channel.URI.schemeIs("http")) {
- IOUtil.abort(channel);
- }
- 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.host + " " + 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 fc91385d78fe..000000000000
--- a/src/chrome/content/code/HTTPSRules.js
+++ /dev/null
@@ -1,830 +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);
-}
-
-function RuleSet(id, 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=id;
- this.on_by_default = true;
- this.compiled = false;
- this.name = name;
- this.xmlName = xmlName;
- 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) {
- // we rewrote the uri
- this.log(DBUG, "Rewrote " + urispec + " -> " + returl + " using " + this.xmlName + ": " + this.rules[i].from_c + " -> " + this.rules[i].to);
- 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;
- },
-
- read: function(file) {
- if (!file.exists())
- return 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();
- return data;
- },
-
- write: function(file, data) {
- //if (!file.exists())
- // return null;
- this.log(DBUG, "Opening " + file.path + " for writing");
- var fstream = CC["@mozilla.org/network/file-output-stream;1"]
- .createInstance(CI.nsIFileOutputStream);
- fstream.init(file, -1, -1, 0);
-
- var retval = fstream.write(data, data.length);
- this.log(DBUG, "Got retval " + retval);
- fstream.close();
- return data;
- },
-
- rulesetFromFile: function(file, rule_store, ruleset_id) {
- if ((rule_store.targets == null) && (rule_store.targets != {}))
- this.log(WARN, "TARGETS IS NULL");
- var data = this.read(file);
- if (!data) return null;
- return this.readFromString(data, rule_store, ruleset_id);
- },
-
- readFromString: function(data, rule_store, ruleset_id) {
- try {
- var xmlruleset = dom_parser.parseFromString(data, "text/xml");
- } catch(e) { // file has been corrupted; XXX: handle error differently
- this.log(WARN,"Error in XML data: " + e + "\n" + data);
- return null;
- }
- this.parseOneRuleset(xmlruleset.documentElement, rule_store, ruleset_id);
- },
-
- parseOneRuleset: function(xmlruleset, rule_store, ruleset_id) {
- // 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"));
-
- var match_rl = xmlruleset.getAttribute("match_rule");
- var dflt_off = xmlruleset.getAttribute("default_off");
- var platform = xmlruleset.getAttribute("platform");
- var rs = new RuleSet(ruleset_id, xmlruleset.getAttribute("name"), xmlruleset.getAttribute("f"), match_rl, dflt_off, platform);
-
- // 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);
- return null;
- }
-
- // Add this ruleset id into HTTPSRules.targets if it's not already there.
- // This should only happen for custom user rules. Built-in rules get
- // their ids preloaded into the targets map, and have their
- // tags stripped when the sqlite database is built.
- var targets = xmlruleset.getElementsByTagName("target");
- for (var i = 0; i < targets.length; i++) {
- var host = targets[i].getAttribute("host");
- if (!host) {
- this.log(WARN, " missing host in " + xmlruleset.getAttribute("name"));
- return null;
- }
- if (! rule_store.targets[host])
- rule_store.targets[host] = [];
- this.log(DBUG, "Adding " + host + " to targets, pointing at " + ruleset_id);
- rule_store.targets[host].push(ruleset_id);
- }
-
- 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 pattern -> list of
- // applicable ruleset ids
- this.rulesetsByID = {};
- this.rulesetsByName = {};
- var t1 = new Date().getTime();
- this.checkMixedContentHandling();
- var rulefiles = RuleWriter.enumerate(RuleWriter.getCustomRuleDir());
- this.scanRulefiles(rulefiles);
-
- // Initialize database connection.
- var dbFile = new FileUtils.File(RuleWriter.chromeToPath("chrome://https-everywhere/content/rulesets.sqlite"));
- var rulesetDBConn = Services.storage.openDatabase(dbFile);
- this.queryForRuleset = rulesetDBConn.createStatement(
- "select contents from rulesets where id = :id");
-
- // Preload the mapping of hostname target -> ruleset ID from DB.
- // This is a little slow (287 ms on a Core2 Duo @ 2.2GHz with SSD),
- // but is faster than loading all of the rulesets. If this becomes a
- // bottleneck, change it to load in a background webworker, or load
- // a smaller bloom filter instead.
- var targetsQuery = rulesetDBConn.createStatement("select host, ruleset_id from targets");
- this.log(DBUG, "Loading targets...");
- while (targetsQuery.executeStep()) {
- var host = targetsQuery.row.host;
- var id = targetsQuery.row.ruleset_id;
- if (!this.targets[host]) {
- this.targets[host] = [id];
- } else {
- this.targets[host].push(id);
- }
- }
- this.log(DBUG, "Loading adding targets.");
- } catch(e) {
- this.log(DBUG,"Rules Failed: "+e);
- }
- var t2 = new Date().getTime();
- this.log(NOTE,"Loading targets took " + (t2 - t1) / 1000.0 + " seconds");
-
- var gitCommitQuery = rulesetDBConn.createStatement("select git_commit from git_commit");
- if (gitCommitQuery.executeStep()) {
- this.GITCommitID = gitCommitQuery.row.git_commit;
- }
-
- try {
- if (HTTPSEverywhere.instance.prefs.getBoolPref("performance_tests")) {
- this.testRulesetRetrievalPerformance();
- }
- } catch(e) {
- this.log(WARN, "Exception during testing " + e);
- }
- 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);
- var ruleset_id = "custom_" + i;
- RuleWriter.rulesetFromFile(rulefiles[i], this, ruleset_id);
- } 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(DBUG, "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(NOTE, 'Could not check applicable rules for '+uri.spec + '\n'+e);
- 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) {
- 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]);
- },
-
- loadAllRulesets: function() {
- for (var host in this.targets) {
- var ruleset_ids = this.targets[host];
- for (var i = 0; i < ruleset_ids.length; i++) {
- var id = ruleset_ids[i];
- if (!this.rulesetsByID[id]) {
- this.loadRulesetById(id);
- }
- }
- }
- },
-
- // Load a ruleset by numeric id, e.g. 234
- // NOTE: This call runs synchronously, which can lock up the browser UI. Is
- // there any way to fix that, given that we need to run blocking in the request
- // flow? Perhaps we can preload all targets from the DB into memory at startup
- // so we only hit the DB when we know there is something to be had.
- loadRulesetById: function(ruleset_id) {
- this.queryForRuleset.params.id = ruleset_id;
-
- try {
- if (this.queryForRuleset.executeStep()) {
- RuleWriter.readFromString(this.queryForRuleset.row.contents, this, ruleset_id);
- } else {
- this.log(WARN,"Couldn't find ruleset for id " + ruleset_id);
- }
- } finally {
- this.queryForRuleset.reset();
- }
- },
-
- // Get all rulesets matching a given target, lazy-loading from DB as necessary.
- rulesetsByTarget: function(target) {
- var rulesetIds = this.targets[target];
-
- var output = [];
- if (rulesetIds) {
- this.log(INFO, "For target " + target + ", found ids " + rulesetIds.toString());
- for (var i = 0; i < rulesetIds.length; i++) {
- var id = rulesetIds[i];
- if (!this.rulesetsByID[id]) {
- this.loadRulesetById(id);
- }
- if (this.rulesetsByID[id]) {
- output.push(this.rulesetsByID[id]);
- }
- }
- } else {
- this.log(DBUG, "For target " + target + ", found no ids in DB");
- }
- return output;
- },
-
- /**
- * Return a list of rulesets that declare targets matching a given hostname.
- * The returned rulesets include those that are disabled for various reasons.
- * This function is only defined for fully-qualified hostnames. Wildcards and
- * cookie-style domain attributes with a leading dot are not permitted.
- * @param host {string}
- * @return {Array.}
- */
- potentiallyApplicableRulesets: function(host) {
- var i, tmp, t;
- var results = [];
-
- var attempt = function(target) {
- this.setInsert(results, this.rulesetsByTarget(target));
- }.bind(this);
-
- attempt(host);
-
- // replace each portion of the domain with a * in turn
- var segmented = host.split(".");
- for (i = 0; i < segmented.length; ++i) {
- tmp = segmented[i];
- if (tmp.length === 0) {
- this.log(WARN,"Malformed host passed to potentiallyApplicableRulesets: " + host);
- return null;
- }
- segmented[i] = "*";
- t = segmented.join(".");
- segmented[i] = tmp;
- attempt(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 = 2; i <= segmented.length - 2; ++i) {
- t = "*." + segmented.slice(i,segmented.length).join(".");
- attempt(t);
- }
- this.log(DBUG,"Potentially applicable rules for " + host + ":");
- for (i = 0; i < results.length; ++i)
- this.log(DBUG, " " + results[i].name);
- return results;
- },
-
- testRulesetRetrievalPerformance: function() {
- // We can use this function to measure the impact of changes in the ruleset
- // storage architecture, potentiallyApplicableRulesets() caching
- // implementations, etc.
- var req = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
- .createInstance(Ci.nsIXMLHttpRequest);
- req.open("GET", "https://www.eff.org/files/alexa-top-10000-global.txt", false);
- req.send();
- var domains = req.response.split("\n");
- var domains_l = domains.length - 1; // The last entry in this thing is bogus
- var prefix = "";
- this.log(WARN, "Calling potentiallyApplicableRulesets() with " + domains_l + " domains");
- var count = 0;
- var t1 = new Date().getTime();
- for (var n = 0; n < domains_l; n++) {
- if (this.potentiallyApplicableRulesets(prefix + domains[n]).length != 0)
- count++;
- }
- var t2 = new Date().getTime();
- this.log(NOTE, count + " hits: average call to potentiallyApplicableRulesets took " + (t2 - t1) / domains_l + " milliseconds");
- count = 0;
- t1 = new Date().getTime();
- for (var n = 0; n < domains_l; n++) {
- if (this.potentiallyApplicableRulesets(prefix + domains[n]).length != 0)
- count++;
- }
- t2 = new Date().getTime();
- this.log(NOTE, count + " hits: average subsequent call to potentiallyApplicableRulesets took " + (t2 - t1) / domains_l + " milliseconds");
- },
-
- /**
- * If a cookie's domain attribute has a leading dot to indicate it should be
- * sent for all subdomains (".example.com"), return the actual host part (the
- * part after the dot).
- *
- * @param cookieDomain {string} A cookie domain to strip a leading dot from.
- * @return {string} a fully qualified hostname.
- */
- hostFromCookieDomain: function(cookieDomain) {
- if (cookieDomain.length > 0 && cookieDomain[0] == ".") {
- return cookieDomain.slice(1);
- } else {
- return cookieDomain;
- }
- },
-
- /**
- * Check to see if the Cookie object c meets any of our cookierule citeria
- * for being marked as secure.
- *
- * @param applicable_list {ApplicableList} an ApplicableList for record keeping
- * @param c {nsICookie2} The cookie we might secure.
- * @param known_https {boolean} True if the cookie appeared in an HTTPS request and
- * so we know it is okay to mark it secure (assuming a cookierule matches it.
- * TODO(jsha): Double-check that the code calling this actually does that.
- * @return {boolean} True if the cookie in question should have the 'secure'
- * flag set to true.
- */
- shouldSecureCookie: function(applicable_list, c, known_https) {
- this.log(DBUG," rawhost: " + c.rawHost + " name: " + c.name + " host" + c.host);
- var i,j;
- // potentiallyApplicableRulesets is defined on hostnames not cookie-style
- // "domain" attributes, so we strip a leading dot before calling.
- var rs = this.potentiallyApplicableRulesets(this.hostFromCookieDomain(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 && 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;
- },
-
- /**
- * 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. In particular, if cookies are set from Javascript (as
- * opposed to HTTP/HTTPS responses), we don't know what page context that
- * Javascript ran in.
-
- * 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.
- *
- * @param domain {string} The cookie's 'domain' attribute.
- * @return {boolean} True if it's safe to secure a cookie on that domain.
- */
- safeToSecureCookie: function(domain) {
- 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(DBUG, "Testing securecookie applicability with " + test_uri);
- // potentiallyApplicableRulesets is defined on hostnames not cookie-style
- // "domain" attributes, so we strip a leading dot before calling.
- var rs = this.potentiallyApplicableRulesets(this.hostFromCookieDomain(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(DBUG, "Safe to secure cookie for " + test_uri + ": " + rewrite);
- return true;
- }
- }
- this.log(DBUG, "Unsafe to secure cookie for " + test_uri);
- return false;
- }
-};
diff --git a/src/chrome/content/code/IOUtil.js b/src/chrome/content/code/IOUtil.js
deleted file mode 100644
index f3a5bee05b7b..000000000000
--- a/src/chrome/content/code/IOUtil.js
+++ /dev/null
@@ -1,265 +0,0 @@
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-
-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: XPCOMUtils.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(Components.results.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 378a6805db34..000000000000
--- a/src/chrome/content/code/NSS.js
+++ /dev/null
@@ -1,493 +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) {
- Components.utils.import("resource://gre/modules/Services.jsm");
- var nssFile = Services.dirsvc.get("GreD", Ci.nsILocalFile);
- nssFile.append(ctypes.libraryName("nss3"));
- sharedLib = ctypes.open(nssFile.path);
- }
-
- 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 15372bc4b4eb..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
-
-var 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/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 d3f23cf0cd9f..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 = {
- '000AA4E99FE86D84F762DFB2DC29323D0614B95AA335A270AF204EBA2F2240AF' : true,
- '002F83BE1562B658A7BA747EEE36FFBA25A7D6C66E263B2901184058802D9A43' : true,
- '006014E5A5190652C3475AA099483A273989F403FDB282AAD77DB72397C274A8' : true,
- '00C5E47B1FD6776F23E3C277A5D0E051E060E8540B49A8A955F5578EC1212899' : true,
- '013470D100AFBBA6D4E03735C1D924EFA6E25E66F781E9DBB6155EF713336307' : true,
- '0147A7B139D599058A43CDE86602DA56375CC78C2C15AC512953E3C98592D4D2' : true,
- '0163052F69741784B5CE768D0EE6B5C7C1B977358FDF7E1EC53F249CF0E1F62E' : true,
- '016BBB29A76DA59A20C5E9909D8D0A9CD25824D7462BD51B022D61B503569936' : true,
- '019591B144FAEE294D2BB557FD005FCFE7EC772543C79A86B968FAC895C5C57E' : true,
- '01E42F89ABE23F6B00E5A35240F35DF38A861FADA04A0B07B6DA9FFA4B57075C' : true,
- '01FC275FB7BB83082EA2C546876545030D74F68355AF2B0CCB1972993B393E58' : true,
- '02748B445F904F6C04BB42BB810B11B77BDE047350F3181DF40C3BA79D4DC89F' : true,
- '028CD123ABEA12F150435947299419928DC5E80E94E9148841265B64344C3DBC' : true,
- '028D7A3A5ACA6156AA42F1DAE25BD6116A417EFD8E64B7E6A004B1911CABCAC0' : true,
- '02E266B8D011CF92708D0DD0D9D840BB8EF54B4A4670BF700AE90EE6F7E445A8' : true,
- '02EE88738EA513E191ED7197DA80736330AAC72CD846B866683ECA283945113E' : true,
- '02FB82CE0C8614F748564CB3D14C2BCDDFCF982D6187EC85E5A33B28E5340CF7' : true,
- '0383B8763C6ED572306AB1253E433A3169F1EDF7078F57D07BC3461199BEF86B' : true,
- '043B68D81BB683927B40D3DAFC7F89C56F400F859DE68C0EA88AAB1FB1D75A27' : true,
- '044588D0C47A1900949CA779023D646E858FA13CC0E29236CCB270B925AE7A8D' : true,
- '045B734DD0081F9504751492B6059B22BC201018436701D98832E3A9AF050ADE' : true,
- '0494ED6BB7E16B78F2AEAAC053DAE6B31B52E39F0E10F5E8D95B77ECBA0A0BAC' : true,
- '04BE558E6D064E92B741B3C551CFE1F38462EF3A08AC56470894D1A80278AD5E' : true,
- '0508390E2DF4B63477E49A461AE883335BC71F03A24BAA06F46EB0DBF42641EF' : true,
- '0529FFECC3EB688DEA32684A0348F89876F1BD45FEA23DC8E9A25D524E7B1333' : true,
- '054806D84102E23956A821100183D32EC4B5E8E9DE72912A1F8E6EE53FF9A839' : true,
- '05546BBD905F23086AF150C0B1E30F0BCA2705B6E0CBDB56092D8E62CFD09D0E' : true,
- '055C88BD28194042771FF813973E086A30710231DB219FF377B79FA075E7F2AD' : true,
- '0589AF9C3A578488F4259AB8BBFFB2089D4C678B63D4C40B6A46CE2405346C0D' : true,
- '06183C90C1DCDC3E9340477D37DC231361321A9960C1948E92D1A175A1500A08' : true,
- '062C8DBFF4E5BE9BC9B9FFB76AF6CCCECFE8C0DDF52EB61EC9A4C7BCB6A1932C' : true,
- '06354AFD85075A5BDE2D84F8408B185CCFD354C2D75988D8FC67948AA6F60562' : true,
- '06808645F29D708E4C31AC40FA00000733238E10A56D2067AA62803C9736E923' : true,
- '0698D7B65AF15F9A903D8D364BB7DBC1B238DACA79505B8BCE8D44AEAAB5709D' : true,
- '06CF7C8A288CED36FD6E94F36E2726C7D96EC14BE860ACA35AC4B22922EB11BF' : true,
- '06D7D04035F29672F6921CF0BB432541AE7579AA2591ABFA9155639DBEFFD2F5' : true,
- '0742E85FE9C68350E070039897F5B790BDA92D92229D74BA9C6906D958A5C510' : true,
- '077495BFAEEBF5E62CEA015EDCE70CE78AF13C813920FD9D4AB72C999F60D4DC' : true,
- '0780AB0F9801F169F4E7DE6F6F40F9575707D4561E4EFEBBADE71279825E0CE6' : true,
- '07B61AF096B72D71AF801B9C7EB9F76C42CC20A7192C78DF1336611644289BE5' : true,
- '07CF2A06F1718D6E476B98C2B42E370A35FAFE4C1F41CF7A1DE115CDB6222FAC' : true,
- '07D5A15EAED5AE2CA304FFCAD864791055797B0252F925AE9177B686461E2C17' : true,
- '07E033082E94BEB3D19374BCFC5B127A65A98DF15004E1EBE6840CE81BAF8D60' : true,
- '09250AF23BC74D92973DD48812D5ED28CE1F5C110EE5F7CA791D9CFDE04A131C' : true,
- '095FB0FC3CC67539621E292205E758437D94D3B651714049E6F99130BD5ADB6D' : true,
- '097F996F81161F905C03E1882CA6F70044749A4954C30172DAB3768119934233' : true,
- '0B1C1033250F6DED11E4C0A7E43138AD3D52F5661FEC896519BEBCBEFDC16E41' : true,
- '0BA75006139D075BF8CD7D94B460A850F46509B23AD572CD1A1E23134F59431F' : true,
- '0BAA329411B026583F061B1244EE6A78030D6B5E0BE1DB8CD8A5BB62D12CE0A8' : true,
- '0CBDFCAB2337A7B0B7379B5FEC554D0361108C3CF55B6F2C39E6B843A47B28B7' : true,
- '0DAB05854E84AABD75D30CE09246103436A4C41E931374E16CC374596C8DBB94' : true,
- '0E3BD8F8BC06B326EF672A487855F0E9752EF7D4A2A913A41374088B6215EA44' : true,
- '0E49A9594364BFD4E6943DB24A2F77FA125596414D46F46AFCF070A1645AAC48' : true,
- '0ECB53FDA2349AB6008BBC0E5CD361EEC5B6BD769281800FF4B1C9764A925277' : true,
- '0EF8FA5AAD4BACDB842959378F18935855B027B0BADDCBDEADC9CC958C4C603B' : true,
- '0F01342B195E54DA8265E4B3928A2692F6CF05F41CB85152A8122FE6E914C67B' : true,
- '0F7391E841B068E145E12DBF6CC16DF16410083111E5F093302BA163AD4EF39F' : true,
- '0F820CFB486D8564C83E968049AD119FD838B2CD21C0B342A0D9B5D22C445C25' : true,
- '0FA392F6EABCE0F4DA14C7B5237B21BEEE6BDA55832A8A6090CAEBB53AC8D77B' : true,
- '0FBBC11F4627D5AA5F7A7847E0F8DE298021E175EC69ECA90A62740A71DC9B1F' : true,
- '0FEC8F0781CB9193F4996B43806C6D2C539847FBBC0C28146B64FC35617BAB99' : true,
- '105993C03E3F5C7E94D5A78242FCD6D0C7B7E5104295F8275752D7C6908428B8' : true,
- '1089E7487C08428CAACCCDBA18B8982049B6A915FBA4598E953395B4493CC358' : true,
- '10B8161FF4FC64020AD40EA57306CFC5010BF9682B18DEEF2544DD4D5DF0466E' : true,
- '10E65A16F0DEE4B2499EBD5C96CD416BD2713C73A422F3BDBA81899C736437C5' : true,
- '10E82776E55D0C2D58F6598E615CF38AA14161D1EAD97C4A09182FE1D44E695B' : true,
- '1134E778B42A8DBD01C547E9676F5294D4B16297DB8F6A512394F77B21F22052' : true,
- '116A5D5F3E99CFE5F72A4AFAC8699CC225C130F4B8520CDB350A1262D9585973' : true,
- '118FF53B6BEB35CBFE6592D45BE082BA1228D1817E46B2CC14B8855FCC5C9D59' : true,
- '119380AA5B344A339A3C0E724014E9F1562789F6E19320AA0C111B5910E8CE12' : true,
- '11F7A939F33BDF6270E16C747C0B0918902CD4501AF1843D9EA4445A2E708C58' : true,
- '12265448C0B0AEF0CD2A13E0F1D4BB1AE8A924A7418443345344E5F16E06758A' : true,
- '1243C75D0F805DA54E780D0D9C55247B1ABB31FC09EB65A7017695945F2A0D4A' : true,
- '12826065A034136FFC2258AA1A65F9E550A582B4017E396077917C775D42E553' : true,
- '12847FE3848EEBB38A6544A30C16833362D3A1E5601A38EA8138F09B59861CFA' : true,
- '1306A4D21476D28D3E2F7D6E4385686E1BCB6D7EEBB1A5217346A6E5855DF944' : true,
- '130F0A3C4B9E9132D1676B4EBBAB2B17AFD2AF39E291C983A696D8BF0DD379BD' : true,
- '13ECB3394571030912CDF82DDAFA05B242398929BD3ACE1598B79DBF28B701F8' : true,
- '142BA9FFCEF5D09FF3DE4BBF8110156D52FEF1C8C707E4B916692D7DDB335A6D' : true,
- '1491DCCE9B3E3F5EEA92C26671244EB7203C30F539EF5B6131459F389A0D2CD8' : true,
- '14CF0BEC6B8811A81FF5AD015C62BC85AF172E86B7504D40E9F27F0E0A6F9BDC' : true,
- '14D5F704481C18BA8A23559A9E49942C499BA8011926C09F4D721D92ACA5F20E' : true,
- '150B877BB614A98F2186C3B0978D190C77A605146A6A569036728F544520CDC8' : true,
- '150F5BC3D839579BD7DD1254A6C3C3AFE3485D7DED21C3B8123BA6875886A91A' : true,
- '154C4C43AAF5F838B7B9BE748FF671521BDF0ECF3D749EB85487F9C315239778' : true,
- '15ECBA98523C315922CFC13469827BC118123E02D1ADF24C3BF8305769869181' : true,
- '161AAA4D4A25BB68199DBE8BDDA1E8FBC52E9C7B299EC5BFAA7B36040B3916E5' : true,
- '163227E6A01ADF06502730FF25F39D8F52B79F9AE61D5AA2876980A21985A211' : true,
- '1632D9CADAB9444AAC7BBF6389BA59C12CD866725786D9284BF9B205E2586A28' : true,
- '1713C91C21F442044156AAD0A65E96A4C0020B2F765492A1431C6ABC3AF67D96' : true,
- '1715E347E92C85ADCEFCA2ED0C4B56DF7D7A3FA9C834B1F2DFA7CE115DC8DBC4' : true,
- '171F671393FB5CF2856957CB6925964B3C328E79EAF083DB15DE3D52233D6268' : true,
- '1765ACDC57A9EEDE87E6573443C7EBC42B17E012FE153D6D7158402D5CF9365C' : true,
- '18040AD71E7C0B9F8C0F275156BFF4FC6713FADA1F2AA5EF8BAD0552D02E7A50' : true,
- '183AE55CFEE1CAC5CCBC1C58D813DED429DF750E023362FB8BEDCB27A9F94559' : true,
- '1882C2D8D817DD1078933D244E379CFC5BA8EAAE302BCF9FA22636B08FAC86CE' : true,
- '18C1218D9ED6A609650AADB754644377914C34E7C35F305D12861D7C28BDBB80' : true,
- '18D46E40DC2A1F815A02742F6AAB8CCCB80BABB108B349D2E875762F7D80B2CC' : true,
- '191C5D575B18497FD90C8012DB912781FC016D2432EEF0F6A05493DE168FAB06' : true,
- '197B67187392F9D4653EC70C8BB277DD7DA843E62BA1A47B0BD95B89CB2C1735' : true,
- '1985D79429E03A4B25EF4195F04D0D6E770B36E8AB4369232CF3A1C1E40886D3' : true,
- '198719FE25A84786A0C2BD4053E93940AF864498D6071994E09A5335B675A73D' : true,
- '1A30713C34D901235DF30605AFB82AF55EE4D3940B86E60B50692145013AFBB5' : true,
- '1A91FBAFA70E4E0111480331EF09CBA83A6B53548CBE12A375C8D6C1C5BFEFAF' : true,
- '1A978CC61B3F7B936329198B939B5C27BD6B22EDA5BDE31FA7FCD35E6D61D265' : true,
- '1AA2692979DFDFEFD4854EC9EAB4CC323BE159529C3E85799E2C3C51350FB9C2' : true,
- '1AC37940540C25A5A2E2CC1DFF939F3FAE61C194894FD82F5861AC98E1D1ACE6' : true,
- '1B53976D26A5F691CEFCF098279AAEADDE2651B698FC3F7088F5C2A5B9CB2C5A' : true,
- '1BCC11E5459BEF3D48BCCFB10F57B0D640EC74C4BFAA3F0AA221B777170A5B6D' : true,
- '1BDD0D8B130AB4FE89DB814276912F04405F2D202CE9DA8B89C4420740517437' : true,
- '1D2A6A876B8C8A835206E337529E6C222E272D4AB79E2224E23A5B6414039D50' : true,
- '1DA6DEBFCC0A4BADEB9672E523C95F42B2D16B168759F75FD03EFBD2CD482032' : true,
- '1E07BA293C78E14CDFC629A797E8046A33F21981334BF6BFF9B4DD2D3C148CF4' : true,
- '1E51AC35C0CF103BB39F51DBC7096C53D1F3A255DC15A473B5882CC03C266198' : true,
- '1E5D810BCB8DA3AF393761C59CC88D22669ECB7D4F926760BE1EC6CD83E60765' : true,
- '1E8C696AD3E59F4835D10EF107B17427100E754EBE864B6FBC1501B8F1D00EAF' : true,
- '1F4C963A9BA39CE44E46F135EFEAD5B30D6A0A3A43545E18CBE59DE452A6468B' : true,
- '1F767AC5DDB239598F925936C242E61B280BBBD6D87C453E3131419530BC47C7' : true,
- '2088FE71BC64663BEA0FB04CF93E3053228D41914681A3F17DA61CA996D453AF' : true,
- '20C2806DEA7B729E29F7B7BB8B2653B8D71805605AD46394473D1B1F81103664' : true,
- '20C6290C0D7F1DC37BE540410CE80976FDC523C201D3BAF204454EF851F721E9' : true,
- '20E0911E2A528C3DC143646F9369D844E82CDA53C48549125DD690ED1047D8FF' : true,
- '20F5CF34D9A134A8920507B12EB84CB24C2F09152FE9B78FDADF57D892BE79E1' : true,
- '2128E4E9D372E50A94E43591AAA7C8B6BCDD8BF303C0B22F923B1DCD596E79B6' : true,
- '2156D89DFDE0B0676EBDE6CC82DF46DA81467DF96F9B8DC4A8B62F71DDA5DF95' : true,
- '21B2E2C095E47F4762069BA39AAD86802201AC4ED5B6DDBC20D1C7863AE511ED' : true,
- '21CA97793B165187383669364CEFC96F19BAF3F8987F7260CC46F3852721BA5C' : true,
- '21D70F62B14A3B2175742DB9F3C49999B67C15D0FF8ACA95B0C6A5393E043FA1' : true,
- '223264A2EEB01CD24524FB9273B38688A0AA8E3A2E7D63ECB76012B060039760' : true,
- '2234133DD7FCAE5D199EB31E1ED8A798554B29A355A895066FA6AE445386D9ED' : true,
- '225C19F21F4CC5241C15ACC6007060605DDF10817681F676CB8BD1B72014D52E' : true,
- '22CF6DCF97C92976F0572F0CD070A25697535E1980F08447D581FF18C6E74926' : true,
- '22E6BB3D9964F458D462BAF404323775B20EEF02F174CDBB442D4381DB98C61D' : true,
- '23980A7B935B10CA69315CDA05E61B4ABAE7876724C0E0C3CC7BE9748E41ACCC' : true,
- '240968FE922EFB9937AF8923AA4F0478D7F679937B9FA9BC1A2B1DF18994B9F8' : true,
- '24DFBC07031235121BEBA97AB5A061AAFCD8AAEB2145820A78EB0980E5111E02' : true,
- '2518D06777FE96E9D7D1B0D531149A5862177805443AC9D271BBCFEC660ACFC2' : true,
- '257335B1AD2B1D562552738ECA1C534A6331FD83B95C91A1EB3B6C2A44650BA9' : true,
- '261DD192486C36B9BF5DC0C4140F670FDD2BC62EA80C64123D827B5F32E0190B' : true,
- '262F8BE06605B4EE9D9545E404D32C2A965AC580A2A3179A8F5481F7D4BA9594' : true,
- '2635178113FBBCC75EABC09C497D411C994AD0170CF9DF999A4FF5C16872CDBB' : true,
- '2677470F2FBD067904B7014B88988BB94F72403C014240B9843AE5A5FA21661D' : true,
- '26D106DF3FE6E9C99924142C9DA27551E012C72C71FDE6EDD3CF4B5C87D59A26' : true,
- '26DCD94546C9207041868BA0293A40EF5DB353794EF0072BA3C63A76279B0C41' : true,
- '2741D5D511257BAB37E2DD48559D3FE3998CB3A5BA4FC1EA9C8656D5694D7BFD' : true,
- '274C93C8441ED469C7B7E01B5A4DB6D9923C3947C87CA4B71D09F34D13F37D47' : true,
- '27560906A3548AB767BA0992FD2F93575AD11AB83AED3354B6267C3F3228C858' : true,
- '278480669CEE2AB798934F06B963B68D25C0A276CA3EC4E523D2299CE01C4A4F' : true,
- '27893DE92514608F647A44E85314B90F983BD7E6BCD6CE9BE428FA52EEE34DD9' : true,
- '27B5CA8FBD760D881A9769019B0EC43CDADA9AAC3900861E1E14EE9348736FB9' : true,
- '28445F7C648AB6025EB469E9C5FD10C6C8D0D21B6A20F078854EFF406C55D3F7' : true,
- '2855C813E2F7369732C35656DD791928668591AC6AB3F9C73061B80AA7713920' : true,
- '286C62823B119606F33D5761CF39C86D4DFBC1531AC399969455CA227344D5C7' : true,
- '28B49BD8083286E1E01C3B94D6358697FE6827CCE71D7C1D0892941B49D83416' : true,
- '28C725A83ABDD4F961356B2B5583C1F165094C5BC820CF15A4FE18086272107E' : true,
- '290DE5FFD5BBBE1A557D3DABD01F3CF8FA5FDCFED4A919F4B73CF80B6CA2E4DF' : true,
- '2984CAEFE874032F0DF9F67888C0A304D8C7CDA1B4B8F915DDE42F125DF506F9' : true,
- '2AC8168217387601B753D08652B1FE2CD14E8A7C9A7DE7DF74A8300C976FBED2' : true,
- '2ADD4406064A5EBBD98A9D53051A0FB086A5D032655C12F503EA73C8179C783D' : true,
- '2AE917E3AB4B867883088BCFFED53EBEF9F87988C77AE47FE325547B181931A1' : true,
- '2B1B6843B33770E84785D0FACA5AA6EAB6C480AFA07E95F7A282534BEB69B065' : true,
- '2BDDDA7C2F05123A014AFE1044AE6AD3B1AA14F0BEAE4FDE812BE52DA271F992' : true,
- '2BE2AA18E281BB38BF0DCA7EED30F74DEC4A8BC8E3525D0632C4A9B4B426E0C2' : true,
- '2BE6A67777765CE8EB868416D68CA6AEA8C57D31523F4A683957DF560C152066' : true,
- '2C43EC0374BC603A1B191B88ADBCD5C1A0409120427995C2684A1590C7AB1432' : true,
- '2CAB9683916ADE98D778D3394221D8D07E07353E546771D507232A26FA577902' : true,
- '2CB02C933CD41CDB146CA0256A99AE53D9320BAFBDDE82EB24891AF68BC6E19B' : true,
- '2CD5E37B2C388FECDF839EE16998A0F0850B5A6BB39AA5A507AE676622001CB0' : true,
- '2CDCECA60D7F0E4700411340E6CBFE1B3C8FAFA9081E219462D25A14B61F9AB5' : true,
- '2D43ADE4441A40542869E06644741AE2392F1EC071E8D3E7732A322B8F051E98' : true,
- '2D4F0B81017D31BEFD5BA82CA91D5FBB95F3F8459E5ABF88360E9A3E1F1BB961' : true,
- '2D70DF21B5BE58F8A0664104F849ACB9741B90A871C2A0DBEA79CF012E3A0E53' : true,
- '2DBAF94C053FCCFA1EC09CBB22F54DAFF2DB4ABE1B3C61CFF1BEBC31260F4821' : true,
- '2DE3B602EC7847028D2EA59A8E241EDE63CEFAE7456802CAFFFAA8433CE9D885' : true,
- '2DEC053F97460AAAFB67EAB8C769B34049E9D44286F199A8D776D2FBC4A8A41C' : true,
- '2E40BCD87CC3A1033F406FD9FB81C5F405BDFC21283B22CE396562EC17CDDF02' : true,
- '2E936472C0CBE755C72128EECCF5BB8AE91AF188CB2F3277B205E27904A9EF20' : true,
- '2E9AA94F913F869B027272668BCA46D5076503EB9550737482C337950749E946' : true,
- '2F3A46F3C2FC1EBB5FB46B3135B7B4ED88CB515C2DB9A508716102340AC3583B' : true,
- '2F56C46CCFDB3A3F0192313C4801F02FFB1738F328CCF0F33F44C0731D340DD5' : true,
- '2FB44A33A5795F520D20CB4ABC4AE4E239FC193CC2E3D3A85056685ABDA9E0A5' : true,
- '2FEC6D75CCD95ADD4DB327257B4E73A880CC462E1760267970030576C46E0077' : true,
- '300B5DFEFE98F5280E47725FE63D7A0967CA022E4CF3531023A3969867677C6E' : true,
- '30354519FFD4794257A7EBEDB0D47DEC9A547B4E7213199000F41EB65C233EF7' : true,
- '305B4CDDF744AA543DA713E7E60C19ED5537D49ED2252330B46B7E664C4E588C' : true,
- '305D58D32D2FBAA00A386E3BCCE2202522B78C6B10E3D83C6A7402706ADEB4F6' : true,
- '30664111831B947406CEAFC2E660230B307F401DD060852E0E5281C95D9F526E' : true,
- '307483FC4C0D7608C2B6FC2DD068EDB1D686085586C4CA4284791294FC664D6F' : true,
- '308F0B0CF08358D501CB807667A31FEE7FDBF7539E1AE74945DD9245AB9F2CF6' : true,
- '311F6B428C4994F2677A56588DA04B704926D737669A76B1B3C8504EECCE4A61' : true,
- '31E5A342FC80BFBF1A1B4A76DF46481E5308BFBBC987D8A6DCF99057C1679E8C' : true,
- '31FE71304CC1591B0BBB208F10D39DB59FDF869D117BEC955E9A6430764312CF' : true,
- '3264E084FB98F560090992151EFBCB41AA84EAE0C3D8378127A974DF81473E9E' : true,
- '326F94C0B20B06F11A54904E31BCAB0C1A4DEC790BA2D1947E0E11F9B7210F58' : true,
- '32707DD6FF2DAE577C4097176D936DE4E46E5CF428B0831D12574128BBFF6309' : true,
- '32D398E73D053561EC78257EB01F0945C2A38D9F80674F6F2B4B10BA35A2B4E4' : true,
- '32ED76AE2E09C58605B9C2BF6A27080DB8C7EEB70889BCCCEA72104C7F33F95D' : true,
- '32FA61C84B195BCADA9A65448CD3C8CA66B1DFE252CF97D46567ACEB59BD2D83' : true,
- '33512B5F197ED2B530575C71046268C4E2F5724B645B8DF1C689EC535C0FC791' : true,
- '3361788E20F935BE971D4A9B9F49BCF9951C7B30E8E1B00E18130777401E634D' : true,
- '3379517964657D6F875971C1ED6218D9F890BEFC7390CA654C79A666D1989A18' : true,
- '33AA071D0BA51A7A7A2288437B87BD01B12CF0C62CA5D0ADE23344C14B729728' : true,
- '33C6F4BD1B6130814292B0D5334D6CEC9402FCB833F296664A7F519AC1DAACFD' : true,
- '34535CB0A54193C144158D23C5A7F6F0F448FDD8EB9C21542A1203BB66BB8144' : true,
- '34A2782BFE23B39D6C7FCE48ECD1675A8141BB9553898A1FF38EFCF14F7D3AED' : true,
- '34B1CD29AECA7639010C4082C4609B8EC6EFC5DF272CC90D2650D01ADEEA8A53' : true,
- '350123506BA002EA62350E82CFEC1DA7BF24B405C4160EF1BF4C445F7DC31757' : true,
- '35191A1755929B2A4039B3DA0C9FD6BAE4DDA312ED858BA6AA6444A34A4287CB' : true,
- '3551069D5774095145A9731885485CE10FBF3FB46144F33A4E48C03CF2E475E0' : true,
- '3572DCF086FCEFED230B4D1B47E73DF410A5C775BA3BC9DC2681204F2E980BC4' : true,
- '359BA4063DD43F04725A67F7E425EC48A593838AC97328374F83A31FFBB1EBF7' : true,
- '35D053D2BE3EF7503F4AA7A66006C38C0C6E9944A8A89EC5871103F4B83B312C' : true,
- '36267B2A60E0B5997DEEE17CDBE6AC7F7D54D279C6AB4F06CD469919F442E6AE' : true,
- '366B123FA1EA2FF7FDBCA0422E504C8E0AB62334AC8941D307060F5ACDFB58AA' : true,
- '376690DCA49A37377D699141D59A549953B2A0B730729BC6FF8BFDA67433F763' : true,
- '37F9EA077605A59865D6CE500A20AAFB318666DD42AE9B17FD10DF4C4DF4D157' : true,
- '381FB3EE49812423C2F3CA943350617377D0E36E0D7FAE21159F648DA79FD32F' : true,
- '383BD359B34DEAADBEF73CF41B93362BB3C59688EFCE1E8403C50C5783F1C50E' : true,
- '38BDD8D544DD1094861968FB021D7E27BC2A9D0031AA914F3398C377A4B5F9EB' : true,
- '38D12483160C6E3AC330EDC1DE173382B4C2AD79A298155181CCBC9A10CF6495' : true,
- '392944F5A1C82284C698C6BB512CB5ABA48445376D54BDDF0A53C66B832D1BB2' : true,
- '3955C196410B13A2BE4CE66E7CA1238F139DB5F00E2DF2997CD83903BA064B4F' : true,
- '3958BB2CE60148D4CDAE6266E4E04A6356E00B693621A4E9E05FC78C9709EF33' : true,
- '39863EF0FA91E0729FB834D4F99A376FE60A015301FBDC91EF818346489EA0E3' : true,
- '39FB813A6BE631C5802EA9C96CAEA7E21CBD7B831FECDA5F2A1FABA42B8F56E4' : true,
- '3A260A20CB6DC9BCEE25A21284C2304A9744F494B37359F5F0AFB46A1D0DABA6' : true,
- '3A2AC86801E185B3B8A189C42AF1574721D452DA425CEDEC6FA0CCD44894BBF2' : true,
- '3ACDE8B9E6B1100535007AC7316F4587DEA84EE0DF1B344DECEFFA952AEEDF96' : true,
- '3B00662EE3F01FFE2C40842F0F3B76C039ABB785962E371767E89E2AFA311A74' : true,
- '3B209B5718F54F113C557AB8D670B1501B05A16B92E6E16BC97D026087B90C3E' : true,
- '3BCC83CA8C459D028B1328C4431B939874F5D9DA09CF37A15A1A388498FF9B24' : true,
- '3C49B9DC9307C6B33E0DBE135836504ACB9F6204B7172A412C28E797E56CA02A' : true,
- '3C8B081D1FAE4B17E87EF63292AC0F5F754685EB3EB441213BD2170B068DEB54' : true,
- '3C9AD3DFF4DB327C01C03D00389A76E5E699D4C4707E23221DA6C61F949AD532' : true,
- '3D1C44AA234496D76A6BAC3434418253903B3C5019FF91F78348AC7C14E39CB6' : true,
- '3D666AC8FDB8483D6006C9E22E5E9539E27B322D5BCD0AF264DC8878F9476DB0' : true,
- '3D76435F7EA7583AD6F474333B7F8AC6368ACB53FAF4AFF9E8644765025ED427' : true,
- '3D7A71BB494A12E1F21A1EB9033CBEFCD1FE81F358B131016DAF92C1C06F1A38' : true,
- '3DB253A22F1FBD071CBAB9E97294CD6534BC74430123B82198F7A29ECF800D64' : true,
- '3E08AEB4D01EEE9C19968EDE2D5FEE0E974E6B7FD65769E767C28CCDADD85D46' : true,
- '3E09F448ED5A72584FA305F82A25706D2AE756083530B4E18665DA2AE46C1410' : true,
- '3E5558CB92AEDC7E01DB0FBCD0825CC0F51AA7B683ABFD01D1E5E04C8A4D716B' : true,
- '3E7D7F2DC25AB2F5F045601ECBD75B498A48731555E8027075BAC9768E34CA72' : true,
- '3E97B3E789A4BCF4776B5BD6E37B070DE9A1D4D5B27F1FD0E4DC9C6A65D637DC' : true,
- '3EE396E9C7E97016AFACE8285C152EC6781728AFFD747291AAA596D573C6ED5E' : true,
- '3EFF635571ED85551721F01985D1B2C62613C2B7DE25C8DAF17A8767ECFCC39F' : true,
- '3F1F9323436BD390A2355115CC333592B4B5AE3F3BA2755D342CD863371EAB1E' : true,
- '3F933B11C350C08B98993CBD045F11249CB355ADAA8FC405B9B3AAB0CBC72F7C' : true,
- '3FA41F7E559B84FA6918FAD6709B5026B05A1C1AC589049A4D5F05F3A6B7D65B' : true,
- '3FC8022D0C28EBFD45DC1D07E14F9E83F0CAD2E7ECEDBFDB991E01EBF2400F54' : true,
- '3FC92874F07DB0DEE11CCB2CA7BDF187641DC78ECE4C76E71B2253FBBC17E3FE' : true,
- '3FCBCC65096D7D731244167CCEAA21757E56D6EFC05A632AB3E062643E5B380F' : true,
- '4007AA6804EBD54CF48E514FC8BE08DE5BBBE5E6536D678DAC71DE0C05D05B07' : true,
- '41748175B1E9E26507156E326B06719603CCC2E54D9D1FAE0F6881012101F692' : true,
- '4181BB2178C564FEA4F0F5C87337921A1DB4C1CB1264B1E2168FFAF334C7DA55' : true,
- '41A4B72E197905E02DA1199B4B9D2B20CA9B1502151A14FE19D8470FCDF60E0C' : true,
- '41CD7602C418FD0831F1F207DD50A19A0A03679113F8508F43DE863AFD32FF45' : true,
- '4290EB1B22721BD2C297723FA6ACA6B3059F1E75C930FDC7075F14B3C5EB13E3' : true,
- '42A2B7BAFC9E81A94112C062E15EC8017861988A458D8C52A686702633559BEF' : true,
- '42D891E625A2FE563C10EC705A036928A9EED088915D480F5DDEDBC4BB35A557' : true,
- '43555C20820B179886354E63251A21247292B3B7BA46D8BEE860A0313258136A' : true,
- '43D81A0A5D8DE29F80ED805D9D440EB6DDEAF4AEC57B6F6D4883CBC3DFFA7EBB' : true,
- '440D00F6A763CEAF241756BFC150BABBB724D3AD48D6739ADEBC84004E24FB7A' : true,
- '448771ECDB6FF9B0B1A817E6C23048CAC06987EE2A6FCB6B84A6F0A75D7DAA6E' : true,
- '44C748D62020862C698F3A1BE86A0261BEEF4337B6E28B3597F7FA0E4A01E49A' : true,
- '450608B6DCC297A7FC00DACC4455E165091B8A4B56873B61C4ACD495A32AA2B7' : true,
- '452F8C17E67135B1FF58F58BC411FA165E80838C8705B1F6BAF1C90F287BBDC9' : true,
- '45CEF64AA866F2A2A72E13722374190F8EEDFE984F022C3B23B492A073741EBD' : true,
- '45D1C3C1E96982C752313C9059D4D6291BC0652ED7B266E25F67738E4D74915E' : true,
- '45EFC525BACC3D6E5AF98E1BFA4A60582231A423EE2E52D5760C184E66241DA5' : true,
- '4603C35A8304F6057C253381D39404E8B40AE0958B4EB2CEAB7777CD85802C0C' : true,
- '460D4CA817FB242D2263900689B3CBA7261A390B018391C7E1716991BE8ECAA0' : true,
- '46236B9468DB40FAF467AFB0C35B517E514251530785695F54440E6730AAE44A' : true,
- '464CC49DD9D781670D5B24D203D45F2CD011F63C8775862C2D7FAF4B23C64EEC' : true,
- '46601DC361A7306BA942625822C757F0702F63A009A5B0FA96CDB92CFDD07FB9' : true,
- '46E74AF8240C97D2E91E118761CA4F74371BF7D2266601BAF6084BB1924B62D6' : true,
- '478D230215F850914D64BD43327923DEC9E52B4F14EF5E7E9122B16F40B2733D' : true,
- '478E954CA5A715BC4E78DC2730A44ADFBB20D225C3AE4562882E0BFA3B13E374' : true,
- '47F4235DE4F1BBD02682F65A8B465D04721124582B6DEAFDAC164A699F56F419' : true,
- '48544D794B99D6942B8C3B2CF051782C2F6CE051860BECDE2736C2CD6A429893' : true,
- '48DF42F374FDCD58EB650256F421F6C1A73F663DCB8DE0972DF9421205509F8C' : true,
- '48E8ED415FD8EFB4407D0C67F3A4EBF15286569D29D566DEFA8B7AD8F135A5CD' : true,
- '49558145AB82E7F795C2E45402260F1AD1ED43D4DF145CF2577BA1615CD00843' : true,
- '4A12F9678B1A5B4677054BDA1CB6B41AD8A4F556A184E7E4C33669EDD31EA50D' : true,
- '4A80A015BEC13BF13BF90A093212BC7E939DF1F5F535730273342AE942769A2A' : true,
- '4A978057E01B2F443BFC218B48E7D00D2542DBA58ABD2609ECE7E152A8F86292' : true,
- '4AF1D354BDAA3AB076BB6A02BAA3E1BAA2503D21ABE54B54001BCF62C0982721' : true,
- '4AF86DB451BCBBB3BD8BB3D5982DBF4451CD96394540DE9FE6210E69F7C2F8D3' : true,
- '4B14ADF4E6015B7F5E4EBBEAE635E5FCA547B1885B9386DFD76A25B8D2A2A63C' : true,
- '4B29F275C3803C8B4E50951895FE2A4C94442F4A7D14922D54EADBCAAABF4056' : true,
- '4B50DC7F1BFC4867D02B551EBF66F63645DD5BC27681BA715154809449F381E4' : true,
- '4C71A0F5907EDCF7950980BCC1B7B6E00141C1FDD4A50D445BB43E1E054B59C5' : true,
- '4D112C44F7DBE6E0A55667E639E192515C54B00CE5E964EF696B13AA049BA656' : true,
- '4D26A014A4C4007564C743D9BBF9C2DC9A5A881C05E549DFFDAFCD3814F3966C' : true,
- '4D2E2CCFE3A068F7C89D22E4EA6F738F99D3E62287FC8B9C8787D78A7EA77B30' : true,
- '4D3CD85A0580A0298BECD2FA69BB246CA91261145CA03370847FEDD2BA707CB1' : true,
- '4D6CCD149A9BF9FA30CD78345F827ADB4A51553FCCDE1811FA39872E293EFE59' : true,
- '4DC761701AB68524A6BACAD94CAF1D8480229B66D8B9B9C0CDA3D3B233A6B785' : true,
- '4E49086BA0B8B96D1C31415D8A1464F19B93CF45B46D04AE4C21672279ECEFFB' : true,
- '4E5AD8D52C37A505176F9BA95BAF43CB5FD5A7FC4654DC71178ABEA8188E7ED6' : true,
- '4E9754EFADC9B8819640164B1D87C98B3E5D75AC7E64F33F7911ECBF389E0A80' : true,
- '4EEC544B64210519ACB153834E7AFE21867AA949946FEB78CE5A254D12A0934A' : true,
- '4EF7A69DC3625A39A416CCF7F607228D8A715D7419781218E4B827B83A504CCF' : true,
- '4F8C7657E222E678CED866714BEA093B11538CE155E1FD35D3E5AD1C8AE9877D' : true,
- '5020E1D1DCE61987673932CC9B92A411C081C5428EC637F3F0E3F8C0C5507E64' : true,
- '505707224B14F1FFF2F5937865DE662C85B0C21D090C59658E24B53CA635EFEA' : true,
- '50CC4D1AE164F66EC09AA6B7D5931074094FA1BB6788AFF3525D7711449CEA81' : true,
- '513B3B0E023E7013AD1D77E77AFDAC7D99627F8EE3C8FB291064D6D56C3CDFE4' : true,
- '51D06F5BD10CCE82EF993587A687822C99C3D8F3DD2F04408E99A5388C07333B' : true,
- '51F5AC607BCB1882F792585357C63B23D08267F717AAC5BE2AF557123EB19446' : true,
- '52064B1A1610B2374CC7319E51B4ABFAD46FA995B9447DF18ECBFC68382A9ACF' : true,
- '520E82B39BF086E3EFF21B582D587329371A881E2ADF8B656DB9DF190CE3E416' : true,
- '521E9362D22CC047B51F112D1C701D87E6BA49676A4C87CE8B9E6411C2FE425B' : true,
- '527E1D8CBE4936132EB16202101509A3A0535CEF78476DD9317AE7A31C097327' : true,
- '528F9666D1C35F9AB6C5E9E6496B0618C6A3F5C37D6808E0601A8F2829A352F5' : true,
- '52AFEFBC93919093868483354CF11C747FB38F946CDEFDCFA6E5117FB0F5039B' : true,
- '52BA9F37FFE1EE6E200988EE9266A9605C02B707A337993678389DEF865BB06B' : true,
- '52C584E4DA8D3FD6FD63E83B2EA0FD6D98DB0413776C26122FF0420A3F0F91A0' : true,
- '52E62F52537E672C499E0902B25BC800C87BD8C45BAB7B9683811A7D09C4559F' : true,
- '5320FDFFB41AF7F0E7057535EBCD28F5906D7F9B4F141B475B25E985399F0085' : true,
- '533D8997AAFFA435583E114FAF33F105F8CB1B87020DC86F5DA948808EE81AB4' : true,
- '5376577409E17E8F37B2CC6FD486FBD356FF2AD0B5EF520DB7CDAD06C6A6F3E0' : true,
- '539D60FA81E3F2D4A2BC38124BA464D8DE7068292B2F0A7E8A673AE0615749C6' : true,
- '53CB6E4A76F1BDA96200BC21FA943685A88C33EC1A4510F4073BF54644475390' : true,
- '5401D639B63C7A3075C6C5B61F64AD5246B8E06895EA510AA9D7C1418C3E06F4' : true,
- '545FFA9F423F4F13DF4C27ED786170DCE6D681B0AC9278B84CBC979E93A950AF' : true,
- '550C98DA3C1CCC2DB49A389D57397C73C4304F4A4B65A1EE1A300EBBFAB97478' : true,
- '55DB7B0ADB76D9C23CFF1CE64083074EAEFFB1F83642E1AEC2A7FBD365A9E962' : true,
- '5603628307C37436A0A6FD92B580DEDE34FE08652C3E73010745E471230A5B36' : true,
- '56A2C00BEDBCD3A014C22A89A1E887CB0F9A2095FED90ECF196F6719EFA35A5E' : true,
- '56B6BEB3100D40CAB0EA4E450188CDDA653F473F3F182578AAB314006E66FA5C' : true,
- '571DB04B46DBA2B26FD50FCC1F0B0F5C5ECA926E6A33D4354660B653FB62822E' : true,
- '5747EF64E7C857584498831611D042B568A3FFFBA79F476ED22F4D07E5239266' : true,
- '57A0A93A8193B5CC90AEED1D0B92696C9516F2C3A6FAF86F7BB8126B5A691311' : true,
- '57A0B57635F2D75EBC9C3B166E68E35E1CF91BD074AA9D5CBCB3359D93F02859' : true,
- '57B2958E7031793509E2EB58DE05C460E0791C4F78A43244640F7926FA3BD7D6' : true,
- '585568A4010D0650BF0F0C2F78402F25FBF6D0B8C82879E5B475708DA6617E35' : true,
- '58A7C6AD9A4C3247AE54306E47A631548065C989E435B13958BD5F552641E818' : true,
- '58B590F006C3B293A57D41FF491EDACB580EBBF8AB20A91D6F8F0ACC3D3C19EC' : true,
- '590F7D88D52E1E705632486F4CB869B519331ABADB9B139951F8705F33E42C55' : true,
- '59148BECF90A7738D4915EE2C70C38F7789A26131E0FDC0240A76CA7153EAC00' : true,
- '59A233455E2FEABA60B77DBCF09F6BF284C4A72856EE9107D2C574E77C56BFFE' : true,
- '5AA7341552FF047164227AEFB41437582F7116D76B854F54920A5D6A9B72271C' : true,
- '5BFE64EC4BAB95BBE3715E40574B76B99234097973E9C1862702C918DC6AAF29' : true,
- '5C34509E57E6B30A28891841EFB2A5F0D051493059DD80157C19B2822A97EAF4' : true,
- '5C3F4C823A953A561E8D0787CE7AD8FAC7434EF57CDEFA4520C18A5667C82003' : true,
- '5C568C32C672A2B3F7242D5CEAA2718B08CED5BDA028B84224D605079DBD0DD7' : true,
- '5CA279B9F09F877E7BC143481BCD463F2C04F39CEC9B8A4334DA493F429B66E3' : true,
- '5CCA5A4308740A6480296C690D8425A42D9D451269A542D00BE3335CB5C27EE4' : true,
- '5CDDF1DF7B5333F1B4C0FAA66297AD72ACA5258C5E9FDE4B9ACD9EAE832C7A02' : true,
- '5D088B418362280202FAACA75A39EC178CDD47900AD52E9849F99F37E0E945AD' : true,
- '5D133D3BC732EFC05E4C91931F8ACEC74F9BE1FFEC30F8C5E38616D2AF7BB20D' : true,
- '5D8DBE824180E72B5972E68A8373AC984757EAD57281A973B44B18C36DF6724B' : true,
- '5E03C9E7A51C7F8539BB4B25ABC9ED0CDB47B48D6A07B0C051D38939AAF91782' : true,
- '5EA032BC171418766EB1B1F71A7868FAB9DA3C484A487BB1FE062566DF166002' : true,
- '5EC202C52C6D9B266FD1A67D8A2D27FA39218E641E646119E4732787A70EF758' : true,
- '5F05ACF54EAA38008B650AAA2DBB3722805C793616B1A21B43E1879107254E38' : true,
- '5F0BC67CB7C74339B5D8389E90F5223CF35EBEE6315C083EA50063C379361473' : true,
- '5F71744E0B28E62ABB0626131E0877737B5084AA6E648D268DD7D0D26B115EA2' : true,
- '5FA0764CF295AD3743724E7419F3EB085D29E80E77731A2F7BE68DD3F2C559F3' : true,
- '5FB6ECAF5FD5CA42241B12521D7BB6F06B7D804C60C84D7BBA7B7A7543FE754E' : true,
- '5FEA0DFD20247FA12D63859439FF9F4D5D0207D6E1134820CAA9CFE4A1B08FEF' : true,
- '60B7C0E860123DF4BD6CD8EAC6560CAE6E9CE12DEA9B119B2FB90C57DB328EDE' : true,
- '60E9F3B150DCF1BD90562DEDD083FD783E2CA9A982C08BCA2C455F50BF977B98' : true,
- '60F715D7E6C8AD03E0A080602682966661E1F4614BD4B926E03BADE8CD94E042' : true,
- '610F08E31612A5F6111491389F25568731F3D330BC66751F950821A26870ADA1' : true,
- '6129C7157898F2D29FDF04A78AC6730FFB248F7467858C9F3441A5D4D6B88C8D' : true,
- '613E70A1BE3CA6314EDB7C00B2477990271E0C8DE8210EED56ACD391E8CFF28F' : true,
- '618F1FA3F38C857898847A865AE73D87B0071C8DCFD4EBB7E80828B11862151A' : true,
- '61BA185CD2FAB39562813CDCDDFCD75184A1572E2B2B87667728C2EE8596AC65' : true,
- '61CAB5A76C7B5AD89619944475E8D628F58A6A6DB42D66567FA80403883A4AB4' : true,
- '61FDD344421DEEB7314FAA2A6C1A5CD97720CB90B48C801EC4AE74C7D88F1E39' : true,
- '62210E1578BEBACCA159EED5A0EEE3192B7FA0C17FA2556A686E28B251D80C60' : true,
- '626042CAC6DE8C95C77C0E732144FCBD63418D72ED04CCB42FCBF260B38B21D5' : true,
- '62AD913E74BC37FCF69CB86718E13A47FDF1440C2B18A4241D3EEE7831456160' : true,
- '62B59DE2632C2A03669FF060A2C2047B9A95F49050C64B6BF5A782806AC10E99' : true,
- '62BCF7CB951CA841FD08B456BBBA3061C9B0DC3DD92BAEF748070BB923D68B4F' : true,
- '62C9A052080F8EBA5E8FEB9615B5CDDFFF1D74F8467653030CB1BA12337EB5D7' : true,
- '63448627F20BDD4F11B278941D82DE56AD3A689CC06064D867FF060FCFE29A49' : true,
- '635FDA4C1012FC8CA8E5EBCA6953D8F29D6B0EB279E72D043016658C0F62197B' : true,
- '63B7D2C03D1507A80B8617E50895472A3C9E47CA34E8756069378DCEF952CFD3' : true,
- '63E6A22E453B17B4EA3E35C6E39EB315DBB77A237B1BBA9BFB2B3BCF675A63B9' : true,
- '640AD0B7F4803223887EAE106DDD628BED925569AB309C01E1C8B640FF05B2B5' : true,
- '644685FCA2BDCE4C6D4AA3876174676CB961619414083ADA90FE2443CF929D32' : true,
- '64831454483CA9CA55859BBD324F492638DA8179EAAED19EA3CC8E16FCE7A83B' : true,
- '6489A71D718B44D5479D3C5AA2CEE70A2E6738AF25F0288B2BFFEF833280C0C5' : true,
- '64D1D9522071A54B43A6C43A759223AEA7AE209FEAB423EA24E3E95FD83BDFCC' : true,
- '64E4359CB75DDA1A17413906C2881931CCBA16E52A52F13F16E65A752C2097A4' : true,
- '651F8FBEC4C5909A0FDC3B8E8D557574FAF01B33981B5B725311B57DEBB47B24' : true,
- '65ACF48C5CF24783794CB8D5AFC30737273D3DDF93F62EF803EDCD05650D775F' : true,
- '662C92E3136C48881B42769EF6DA50B31CA577215D5AE4B465A1024CAAB1E033' : true,
- '6688912D47D0A49A3BF7EBA09AFCEA36E0D4DDF4BB571B383C134B763B17DF7A' : true,
- '668B926F5EAA59F351B7ABFCBBE5FA17B547B01C5A7D4AE385736CE8FD13359E' : true,
- '66B10F427AD63DB6544E9E20191BDE4F827A7C96F1DB17E01E0B254D67BE282E' : true,
- '66D67EC6407BBAA2F4A0EAF49D81F223332DEAADC96292827CD749DB07A82C02' : true,
- '67DBD139B060C071667F2A45E06C7E159117263D593C95138066C7BA3AD20DF0' : true,
- '68EE7C99FB1E2B8F0DA74C5339E58C6A1F7C2697CDE363B2A8A6D8E012D2C773' : true,
- '68F575FF9F2EE5CBBE2975DB80B0D2E8582B2B5A1624A70EE6470FD562D59E93' : true,
- '69643C10B6E53A5667D8BAF683B1D566BB54B001E0588D7B791E648EA5681BBB' : true,
- '69F71F4F07365D7F684EC748F9CE61559DA33FBE1C9772F836664D656F51A5F6' : true,
- '6A2DD995DB40154FF576E4B6C4544F92091BAAF3D43F075B63B5F882CFD21D5D' : true,
- '6A525C84FBFEF83BEA806634766F1530D9C5964DFAE49BD2F678984AF29FB474' : true,
- '6AC112C1828538894A1FAC7CECE0ACFEE75658118041513498E880274BD2B7C9' : true,
- '6AD39077DC61A2347F25E34A809107D3F11E18B1E197A88A9A39F5FDBB0A3861' : true,
- '6AEEBBFBD6A2EB3C41164F87A2491C293A66DB518999827273FDEA3F1892ADAD' : true,
- '6B02CD14A3675354A800006220E94D8D4D5F9774D60EC984955FF720D927E529' : true,
- '6B0F32FD3A2A683E8595F933F07DD41CF53C3CF786AB9A615DB27E7B865065A9' : true,
- '6B16CAD6D99596442162EEE7113248C0C77EBA7DBE1D3BDC044AB9802337D2CE' : true,
- '6B8153379F9AD865DAA48C0B805430D7B62D6624C4AA9389FBD770A366439995' : true,
- '6BC4B8F5756C6E11852DEAF28C2208733B463931BC5413937F897D4735CC2F01' : true,
- '6BF2234F99577BEF099F5A651C125E660A765202F83A7FF24C82FFC87F87C3FB' : true,
- '6C5E5DE77D1F4BC07A3C2AC49BD9022987191F576C92DCD778EC71399AA04E6E' : true,
- '6D2E55B7B10EC7E3F82F060350C9BB7DAEED8B6ACB8E79B4B088D9B711A9CC6E' : true,
- '6D53AA3328CC9AC46F2872113922BC105CC4A5C2B3EB7F45C331A93BBE4ADE3E' : true,
- '6DB177AE67C272A729818F26A5DC8A327236919BDF09E43961204BD9538CB09F' : true,
- '6DC90241CFAD3946A0A53940327E950D8D7248FA5896CFEFB60F543000A0B165' : true,
- '6EAC221C01F1C4E158E51B8AA15965260D186BDF22A579C9CE8D89E787A36FB3' : true,
- '6FCE4CF77E254C2920BE515857DAB1929ECE7638DD8C370C1AF6A374F36517A6' : true,
- '701E5C167D1D2A47E29F6E0EF64D59D978CA3287D20E3590ABF531EEFDDD885F' : true,
- '704172C04EB3CE46ADA086772ABDD4DEE208909ABA10D59D1815E9533107CE5C' : true,
- '707966CCAEC5908E84C5AE646566426234491D2F78CC00BA7C7B9E5F009924B0' : true,
- '7081C7813097A8602BE2DFE4BF202EF4574BCD4DDF51FE8C7A2F872F93481E83' : true,
- '70A137BA9CBC1043B06D08AF2800FC09F4D3334ACDC0915124CDC834A77564A1' : true,
- '70DF998D006A8684F543CF929F8223770479451AC680070169CF11B6B409CBD5' : true,
- '711280787458F0E54B0C9294A54270FA83E8CAB29E212ADAF665D7F6345C4DF9' : true,
- '7189EB04B704BF82CD647CEFCEFE86B96F5FC455827A531AFD9F991D8AD1229D' : true,
- '71CBA0C7ADFA0E0688BBE75D856278A477C4041C6F0895AB384BAD02B9D951BA' : true,
- '71F2DAF17AC798022DF73260BCDA153082CE08952CAED20A66A588B46E83000A' : true,
- '722368B696E375C97556E68FA5D53C3BA7CDCA15B13B72DB9E49090EE7C9C163' : true,
- '72821C51F9381C854D8EE79D8A515ED4A5B6104446A746FCE6337BD71D73F147' : true,
- '72950D958C6C1FFDAED4C597635776C7EC60B32CC683D03AF405B023C686FEC0' : true,
- '72F3DB1BB2B0B3D65683F62D927E20C95303A00E8C845E0088E4DACD4F3B19FE' : true,
- '73A621FFE0ABD75757F5C92C8EF20E63EC8F4A279A450BACC7E4FA9D75E0EE5A' : true,
- '73C4C95F998FC60D5EAE1283F28C36C63697C481E6B321EE7DC46DAE585B0E11' : true,
- '74711F9774C66CEC41DE4FD32197132B13A40A6758A106DC95BCADB9298A6241' : true,
- '74A9F7B27B38326F64792AAF791E5A5969071CD05C8ECB1E068035AF9AEAF482' : true,
- '74E97E84CDC17ED404B29595C6E408EBFE93159E45FB59FCE264BC111353EBFB' : true,
- '757071EF34F3CA907D7D29C6420EC14B6953F433FA03F2049636F55265E456B0' : true,
- '7572D3C2860E9D28159C0337E8DC7C693F307AE0F1F02E0C35E091AC1C1571F6' : true,
- '75893F8249D9326D2316BFA87F7DE3062EA1E00116C921C6876AFF322B636664' : true,
- '75A9264209E9CFFCF8C4D74F1988A6AD0F509269A5DDA3DAEFC0068EDBE6AB26' : true,
- '760650CA663BAF50AB023FB340DC4316998A7E66FE226C3A66E7D31CAACC9330' : true,
- '7633A1503B4C364C9C55BAAE30CC899238244FC16BEEDF7DC22E54CB9B569A6C' : true,
- '7644E55E75802D6FF784B75B8D77DCFADDADA23DA2FBF95836FA3CB975C6B982' : true,
- '76498ECB08242DC8AB6DE47C0EF0F87127C2809D2C1E1B8216D6297ED7D791D0' : true,
- '770784FC2B1A52F110194800E972006E868F055C52A8BE467F3AD7BCD7E441CC' : true,
- '77C5EFEDC19C242BDC746C5EF4A1DF4117918CBE078CF6DD65FC274DB64CFBAD' : true,
- '780AD07FBA71E98848DABAE3B6B94B292E5959CCC36769683E0213E78B759DEB' : true,
- '78765BF1DBA140B30E4EEBADC5DC056AE2A1E3E552907175AD14BFCCE2518C10' : true,
- '7889B1659DAF073B50A3FED9BDD6CA3F3F69E90E22C9EAC126E2F915C476984D' : true,
- '78DAE4B45606212F3DD7B93711B6DC11416C79D56578294E08A7C63CF4F0AFF5' : true,
- '78E4E5B9DC94A09084EF738F43D30114F90F95DDC550D6BC2ED203D722323EE3' : true,
- '78EA89695196A279F7B44D8F1AA15080C91C3BB240F1D1878A88F2B27228D430' : true,
- '79244B0AFBB3B26770A470A4F23555757DC25D3856F56D0096D9F06EB47D5889' : true,
- '792EE0B202E6A45AAA85E918497D9C9F16FEAC99500A7940C0FC812ECC42120C' : true,
- '79417B9E9B9B3E70E118AC6FDAFA782BA72701448D3A546540128FEA6E02A47D' : true,
- '79506C5663C38F43902B55BE2FFABE0757A806105C2A18473770E9DEE5322E40' : true,
- '79AF4B79980557257AA892DC9CE02CC8DAE19B98E5C60128F1A38410B39AD08C' : true,
- '79C0A68B7394978630E169EF44D521A7E53EF98358B122EA93706611C5FF62C9' : true,
- '7A081DEE8006EF40615953A1EF9BA820BADAA31338157E69660B3EBE7852838C' : true,
- '7A95B01B834A4CFF097B69C8D84488E0843D9C51A8045BF5AF6AC2CEAB65B079' : true,
- '7AD220DAF434C50200258E456AC5EB570821D33873A0238D87242111CF455A35' : true,
- '7AE7C2EA08D84EB5EE0F978D061FC9D6DDFB57C1382D5215977205894898E0EF' : true,
- '7B90E5B537B13743AC7B5B9F3EA28B3F5F5E95A6D9F4AA0904DE22858F38C780' : true,
- '7C63B78CCB8DE59051349EFBA4A9E34EB627F65855F3C754312DCFCDBFDC270C' : true,
- '7C99FBE3E1BF4CE4683186F8BC44BEA34B07919C1542ACDE9420CD75BBF3F388' : true,
- '7CD7424448AB83F8F029A00A71FB658B83B4F91FD3D0C32D9ADA20C23E02357C' : true,
- '7D100CF85EE12F47C6C9755F00CEDCEBBFA513CEC80993AE5E7FAF6F68289C23' : true,
- '7D3EF8DEBFDDD39FA7CA90EAC62E660639521686926488A315B10FB2A0005F6A' : true,
- '7D7CB9E4195E89426B889E09DD6EF0018B702EEA4C8E1C5C39DDB538E20CF150' : true,
- '7D817F280F1D664E0C9E717287D6AADB1132D4F3A3E2001B94009119733C9434' : true,
- '7DE8C95508E4933243E3EC7D7C222F82A250E1B71C5619C547FCDA51146392FD' : true,
- '7DFD6433613550E46711F591EB0B0790233460AB951DCCB4B60B61C91C359B83' : true,
- '7E01E1EBA9D9E46D3DEBEC868180199AE64DB3BC878F66066E91CB4C060B55D0' : true,
- '7E0AB095FE17F430AAE0B4AB7490366DF97BADF13AC223D96AF0913D6919BE7D' : true,
- '7E455271258308A370638B803981F4B05C819378F113C77DCDA5A91B9A5D6CDF' : true,
- '7E5A5F757EC2E17DB58177DB695DECDE6B3F7AECD795B207BA26ADFF2F8A0A00' : true,
- '7EAF183A91E8DA3866531C499039CEF3AEC4F214BEE293F268A28616B67D0474' : true,
- '7EB7AD799370443234A196FF0B9DBD7DA1F60A67C3857E41548072DE24BF479B' : true,
- '7F1566D05D1E3A90A9D5D551AEF51D2F1827FC9E82922F2BB32A08CDC5BDEC7F' : true,
- '7F3E5591F3F957AFC595F9336AAD8B4F578DFAAF1794FDBB7944DE7038AAAA3A' : true,
- '802B6D5941983A1F76B514028EDEAC33214B4F27AA490345BCE94DF9B1494516' : true,
- '806791E1F1BCA3B3AFECAB7D1EC6FD66C2616C6CF13A3256AF0D53AB0A759BCF' : true,
- '807849BBCF3FC901816BD5C23E0EFD51FFD9485FC34A5A086174A7E91DAD175D' : true,
- '80BB61C435AE010A1BBBC72F9CDD1BA74CCFFAEE4C74E07446ABED3DA2685427' : true,
- '80BCFC1145A7F287ABB29FD26F6FF09F2F9299D43DBFC2214B15BC346D1A7EE5' : true,
- '8133AEBBA592FF513EB1EA61723A0CEF57A583CDE66794FA9DE2FC0A8F573B54' : true,
- '813CF894750BE7FE8A0C8B5003B362D62D400F6F08BC1FCABF247172A63B17E7' : true,
- '8253A0516BAE8FA0D24AB03D7E4AF8898FD1EB8333D2925CE515FC3DB6ABC5CC' : true,
- '826F129EED33C26A96D2FA3EA71B7897E065E2A68280A77C03E948C9EAD80945' : true,
- '829124925C3F7AB9329A17C8329D55F04DE8C98994845083D9293F2546CFEED3' : true,
- '82AA24B77148C70C4C53F7E2F7DF295CC04E6BCA7AC4AF2635E8D10616F8DF84' : true,
- '82D1AEF2AFC46271D18C5FE50811DF9A5EAB812156C2FE6F531A34FD529E75A9' : true,
- '82F25208D7357EE223C6715E802CD0F8D019E3004DEFD76A90BFAB18D2DF07CE' : true,
- '844B51F620215D6845EB82700563692BDD5EE144D097D24FFA8D99C8FB5FCF28' : true,
- '846E636F41C74FCA1D44474F8B116D67A5E820299071548D70B98CD6ACAD2E4A' : true,
- '848E7A1C6E45D88BF111E43067FCF92F6F17BEE0B52C99381668797B108FE80A' : true,
- '84A093B67AC79FA09CC2E40B54BE4027DE363B86EDF64B623BC346188B877ACF' : true,
- '84A8C623C4304D57CE03893ACBF4E51FC9975C58658B89127508E5C33BE992A7' : true,
- '84B91F7D19D03A64195173E28A98C6A24AD166106B5AC14B36A404C45608B2D6' : true,
- '8540F78EF676D50879CFF30B3CAFCDCDB1287CE9472D0E39AD221AC0B049BF5C' : true,
- '8544A63131F49B49F2802FA5FFB5BB62D726E1A5972F668781040E2342770042' : true,
- '854588AEA6C97F0F9363D6AD09D324D0D154E1693A733A728287BE922B8FC86F' : true,
- '856D54922C6DB9C5747A1EE5ADB099907C63E0BB928B1D00BEFBF81E6B0E83A6' : true,
- '857EB3AE3D76F7A86260D7DF2583D65053D7DBC30558CF41078A51A841A15408' : true,
- '85CFBF3F71BABAFF31DBBAE3EE6615A269748572AACEC462E501B017A4B58C2F' : true,
- '85DBFA1260307B3DD783BA2AC6B1A3CDDFF073A9D0340834C4065EAE7E8466E3' : true,
- '8620FBF8F4B3D858B8AE9A6EF3423068026CEAD38ED1B70B12E65A66EBE62845' : true,
- '862F95FCB6F1CB539D4F62DFE7DF6F092DFC8A8120D2CC3DD8D62D75017F91A9' : true,
- '8632291EE6C74182159207F88A43B60EDD3715D9B23CB51B878C7DFA413AEBAC' : true,
- '878C8800E459A4D4B9989B0DB92C628E8A13574E71B3324E50484F70555B840C' : true,
- '878F9A1345B5F3F76831E0AA2CEC43E51FD88455FD70FF0C671DDB8D8646BECF' : true,
- '87C002662AAAB5BE7B6A7CF4B1CE9036E3A2A70A0A3CD80F64005C889ECCDDBE' : true,
- '884A5D3C3CBA39A5DD7D7199AC1624ED1DC87503CB52760360AD2F51090CD12C' : true,
- '8858520A8D4E5C88D777C33963CC7F43E796B555E7FC573681B59DCFAFB43EFA' : true,
- '88A9F13EF3721A05CD57C6E13E4B2D6F699C00312E92C24E04D86990177BFD3D' : true,
- '891419933107B0EC0222BF502DB271240F352C825D2E32776842C40D13C2F8C1' : true,
- '8998929C795E1C1A4D769B9E0FB886892FBA9D8F1542DD894E15E12530424BCC' : true,
- '8AA440E22415685F4A009BA8F14D9B8251614D78159C926A712542B0E9FCA143' : true,
- '8ADE74E6435437386C63E8C22DBF3BF0533A4B49E6668F5F15824AB58AF721D0' : true,
- '8B2E32630DFFDD0948A96CD94C57A433B9135F4949D2D93AB30D12B71AFF9D21' : true,
- '8B41B56DC76B41CBEF93FD4F1F74525CF5B11723140CB81A7DD29AA3D95703BD' : true,
- '8B52AE402628DBFA70BFCE1B172D676422D5E720F7E3AE2E7B195D4FB4E3F285' : true,
- '8B83806B610FF233FDE11E892A0023140E5CAD1500847E29F5E5C6CC21BF33C5' : true,
- '8BA369EB69B5D03D361F094FA58F73BEDE76E58E2ACC79B62DEBFA58CD695B1A' : true,
- '8BD1BB8CD29EBAEB36A58AFE2BA070CBB92EC003064B71AEC49E812E39C2874E' : true,
- '8BD3D0A64D73FCD8450DF0224F56F2B44F88D2B89B94EBBA3B5CB7E905DFCB74' : true,
- '8BF51CFA32BD64F3D54AF63295B5F890FF439D7FDF854D43F25F4D72E396021F' : true,
- '8C2DDBA5CA9E4CF79937A5A3AFCA79F371B6F235B37308EB53ADF12C319A7EC9' : true,
- '8C6DDA18A4CB339717E1321FBFDC9A3ACC52F2FEF6FB453EA389A2B43FFFC63C' : true,
- '8C742B891F670721F4F8E1D4DADEC74C9E9256E0C7D132578973823FE27C3A33' : true,
- '8C959CC99EA9E228577582BB36DBC373836E4D91CDD4FA3C89B20A289B11CD23' : true,
- '8CB93E0ED93C6730B58CC0314B8158A7A92184312C53A7CDABF05B369CC7E730' : true,
- '8D0394524B030A612B174B7F2FA75A535F6DE732E9317A394BA9286CD3F42F18' : true,
- '8D0CF6F0B227BE9394DA0DADABAB81A44900D104A915645ABF030220F3AE187C' : true,
- '8D1EBA5F6A209614B68AF63D583392DF844036E8BE335440D0740396366FFC4C' : true,
- '8DD64FF5EE29EAEA20DFFB1B446F1441CD291260939D41C7784AF872CDD60FAD' : true,
- '8E8FBD2654D291051FC080C47960747B4191C58D85765C77CAC1C239FF3DDD1C' : true,
- '8F1C043B3C47DD689F52F48EE4FF0AE4DDCB8D1F0C59619B65C6FD3853DAD0D1' : true,
- '8F31ABA69837A432E88579184085B0AE867412379E04666EF880DE539CB03257' : true,
- '8F8515B35B665B69D0DB9661EAE9FF0829B71CF4AFEB3BBF988BEE73985F5D3B' : true,
- '8FA478A1DE3999FD32313D519AB1BF7DA3C485C1EC90176E34F82CA74EE170B6' : true,
- '8FA49556B9E8C97F768F94A3D2653ED2E3E927D31EC7A916D0744BFF07B5E685' : true,
- '90C2F31A64343BA4CBEEAC90A43FCBDB46932CC21CC58095FB6D6CDA7B33F362' : true,
- '90DBD3387014AA593B61432DCBE6201BCD1ED7E17D539CDCBB996D2E00737EDC' : true,
- '91490F346E9CE34F77126105D7CB01AD7C58E0891B398289095613F1D1162F6C' : true,
- '91728081A414570C9CFDDB6A7F70CE56010D44F4E165762B73F4B05436D85351' : true,
- '918B02B75417DE289310E10FC77AF7041D1F380F02939D64F063776F121AD61E' : true,
- '91CD0D276921BD32F4C8616BF2676078C24E39AE1B30943C5263AE0377F41F21' : true,
- '91EE28B14AB2C7571BE6CDE2D75FD4C05C960FB033DA819EDD463D5D3C494591' : true,
- '9244CDCD0DED69F9AECD82846D0467062DDA89CD32D8174CD69F9DE602AED97E' : true,
- '925F02E984B20FB33B8343D81E8E22C24A55CE4CA9013260CC828758C144F73C' : true,
- '9295435D6B38A570B2F537814147422BC442A7E39E1AA307550DDEF0AB93C3DC' : true,
- '92E91A15A0542407788FCD78EF9287724B2B25A27F703C9FBF2F5BEE709A68F3' : true,
- '93197C3990B717E3C0A72941DE6DC382265AF352701F62FE07714449334CDD7F' : true,
- '93671EC41A75DADCAD2454D2D9951DA643ADD6C899C6F4EDF6E8806217949732' : true,
- '938B76624EF6CBA932EECEE4624D9172B10E681A4C42609117A073A5834FAE84' : true,
- '93DCEAA3D67BD8992097C446EECE4A6A02DCF89EAB0008EFAE7D0C9BE26B7C00' : true,
- '9446A5F64DFA26478AFBF6D0F3A0773ACDD46F1A4F7691A72BF24A58A411B340' : true,
- '94CE12FB5F69E4273C8F813ED37ECB954AD667BC81C4E37DD27A40C291DDB12E' : true,
- '95393B2FBDC6AECDA55FDFA4F7BE33E3CE85E1BA1AEFC030F2E9C44EABBFB536' : true,
- '956DE14452F6966BDC2C3CFE4874878D446083AE81BCD83C705B8E757FA0A390' : true,
- '95A4DD514D4B5F9B29118B3CE20FD8D4996F40424D7D64BF678A252262608C70' : true,
- '95A80082CCA2E52DFF16CA0E49B9FFE32F7ECB93770D20913605BBD47A2C65A6' : true,
- '95EEDB5E6C8B8552E29D7FB0C607EC68AB3D3F88A3FF97F4C70D7BA9D69C8521' : true,
- '9658D54C28C27DD6E9B79098D7D86C1EA32215492E8AE9DB225E3410EEBC39CE' : true,
- '9668363E5A4509F63E66C774CC7374E8D7654D0D63E833131665F65BB0116D90' : true,
- '96B78900F165A1CA3843F3036950C7A5CB299CFA98F7A1BA6950AADB5DC1459A' : true,
- '96ED7F4947B39E44EDCEEA05043F9B286C35BFA932C02D88A00B5338BE7829D5' : true,
- '9736272DB032615E95E0C6E413B0581BFDF19D9F398447A0512279743752F7A8' : true,
- '976ECEBA965B747F498F8E4D26E3BABEFC48A6DD2645210168D7D82BB97C15C5' : true,
- '977C77EDC0AE3D98F2FE87B8C309DACC9306DC575D2D8FC358973DC716EAD715' : true,
- '977FFC2869C36013D609F96B5C19E88EABF21E18BC7C80E1F8A63DB2E9FDBA66' : true,
- '9787C483E07B0D1A0251A93D9F86495C6E39D25375C395E9939145D6C1E818D6' : true,
- '979F95AFF9D71DE4B8ECE178862627DE62E0E24E5ABDA2E8A20E5177E8F428D2' : true,
- '983120089E357F1255EAA175207B7DB3462CC8481C2D4F8150B5C4FB93E274C7' : true,
- '9874E435B3A12419DA88FE7AE98EEFA9DE47D098DC95AA6204B499202AB1A0CB' : true,
- '98B754929FBB1859BAE00042F86599BCE3E4465C42503150BE320FDE8B82166C' : true,
- '99A4816C0BCDE615242EF4FCB3CD6E84EC60952E9F97E248424080DAD5D0629F' : true,
- '99BD9F4C25AF74058C9E443467C9FBA76EB37661CBEF5A1E1244D8077200A250' : true,
- '99DDDA7A8D6D222C3111DDF5E85A45261AE9A7CAE2972567996A7729D0FD6E68' : true,
- '99E2609E0CDCFD36015CC659568D5C5B01CE4F7FA0C5671738D525FD8C518B44' : true,
- '99E437DA5156E02DE52D0D95AFDE0FDBAF8F626F4D3BAD2FFFE7F4C75D76BD60' : true,
- '9A01E5759613554A5FAEB7E8889F18EEE16568073CCEDEFA0485F01969535C43' : true,
- '9A36248A6C3142FB6AE62E262E0F519CD609A0207BCB6891443BD5AA5C02AEDF' : true,
- '9A9B087A4581C1FE71B3F4D7C041E93D4EC1093B01AF3ED96548AB93254EF65A' : true,
- '9AC79E2916EDA1EB936B7FC6779F139ACC665C33F143340C5CE540B69F2E9F18' : true,
- '9AD27D42F0662852A1C45E122C3577E23F56342DA9598A26FC0D9B15C17ECB0F' : true,
- '9ADA51307C3FA225DB6F8E1FA3A218E477F775FA3D3DBE839232E3C385310902' : true,
- '9AF3A66EB67ED022E3F99B1E810BA8C0A110F83F0BF250914AA5F1F0989B2196' : true,
- '9B128E182D224AE31F63FA92892A8A322AE42BF2D4723D62F5A6744973C82F6C' : true,
- '9B80DD5C98B0F0A7AE343DBB896DBCE45DA52EB4E31BE057287A2A738D9CE3D6' : true,
- '9B8B430BCC7FFDD28FA85A1B18690D76DE8F18DE340656F63BD1472816A3C83E' : true,
- '9B8FAE805E1D9E43951E8E8D0DCB1A1EFAA3661C2BD974676CF6FCA8C046A4B0' : true,
- '9B98284571E5FBB2A2BE676AE24830A6F0048748FA38D1F11CBCB252505D2E62' : true,
- '9BAE8B30BBFA182D0BC3DCE5BADF78381980EE69F15884A0B93F291EA09A7EB9' : true,
- '9BAEB6606A1F13587AC6E8808B694D02541E6581F2874BD704DF55DF9202D9F0' : true,
- '9BEB9D4CF88A648ACC9CFFA48A687370D76E9F8188AB3BD638D9BFABD2D6AB24' : true,
- '9C0F47FE70B9E636409CD37362B052B40B3CF765DFE80E71D999E7EB1AE1D4C2' : true,
- '9C5435D416BDB4EAE642E2A66B8382BC848B362E3937069725DEFD9282772612' : true,
- '9C7DCBE2DF8C0BC947A09C39B1B6CD2EE137D366554F8CB46AFD80C5FA9C3B81' : true,
- '9CE9CC6694EE295272749CB4696616C9272DEDEDB7A4EF5253F4B7941C6A5F5D' : true,
- '9D28BF964F6C820DD26D42FFC18689C1D2FD43F4C4DA9B35F11CEB8FA24F2073' : true,
- '9D4DDF09ACA4F1241AA5774A1B24262777DD41A3473A029738F72E4084ACA7CD' : true,
- '9D98952A99B9FF1B2B7A86D21F50E311B3147CD9475830A856A4C63798B05630' : true,
- '9E418F784C18C79930946ED9BC408D8E2F694BE1E3DBAE4BB20917F8E1B277A7' : true,
- '9E492AEE3B5838FF2E4BDA9FF98D73B48CA846FBD2AEEDA19FB885A489F58DF1' : true,
- '9EA920DAC71F221B6CAAFD5F1728FA6D4A782E70BD5C0FB1A3789798D8E962B0' : true,
- '9F2B661A4824017A95B29022B95C6768B159D5A0CB1F442343A47A14424608A4' : true,
- '9F5CB7420AFF2B5250A87EE7D0F1878496A34BCADB0971DD5AC3C33465C07565' : true,
- '9FAD6E5AF9CE6D510DA6BF4AC01B74112692E4E4DBA814450224149D0A7653F0' : true,
- '9FB66B76C9B0AB6ED5DA3188A3DC6FCBC369AB273DCA99468C1EE4604A1E9E99' : true,
- 'A0212D4EE874832A0202ECD1349ED750083B1D238DB6E30120702BE1256F53D8' : true,
- 'A03D7CE2FA040738CCFEF1F20872DDC1E321745B2C34095822A51B3BDC07D9F5' : true,
- 'A03F32B0A7677B8D7102BCE24F121EE6CC503FF173C43CDD6B914BC69D954ACA' : true,
- 'A06E313693C42005CB7B7AE33A96E3ABD66E05A57012B6294671FBBEF4A84AAC' : true,
- 'A08110BB7D0D5F694D791F82071E44B4C968D4990C73A402B25E0E0ACA5EA6E7' : true,
- 'A0B4E9AFEFA1B8966355614B201506B13CC213060D2661264491601F7FAD8269' : true,
- 'A0B9ADCD27CD63E8842BAE80188453C09DEC27270C32748A4EC2508372AD36A5' : true,
- 'A13EAF82F0814BE5FA12BFB4D2FFBB75FC6375DF19E16B8490D140CFEB54AEE3' : true,
- 'A1504C131B0FE702B64AA259B901DA2D9B2AE9D85AADE02F1528C1147F98E535' : true,
- 'A15BB49CD56693B9881AD43F6366FD2966AF816643BB107E8A249E07227F67EA' : true,
- 'A16BC03AE3E35E7C39B45D339A22BEB39CEC134D6B9CCA289E873F91A384DCBF' : true,
- 'A16F347518B2C6930F30C6D6157AEF685D1993988846BA598AF8790E5A6C4F8C' : true,
- 'A19514A23AD3729EF69553D8293E9693528EC67609464D4EA0A96CEF8E9C3E05' : true,
- 'A1BF53CA92BD722E7277DF7C8AF1299DE0F3C35316EEDCA31EF7F4BF53CE5706' : true,
- 'A1D84A014F6ED46C07647B77CA8F2C88B9AB2273936AE3128C1DE7300963BE26' : true,
- 'A21691A9D41B6DA9C27DDA03477F63EE4377A978AF1CB6C296CFB7D2CC5783E1' : true,
- 'A219A198FA5CE79A2ADBC1EAB8BE34F086699B9A16F88DD2F823325F7481FA8D' : true,
- 'A277B893194AE7687EBBCFA344178B3578AA6228D2B430BBE2FC8D5EAEE43135' : true,
- 'A28337D306B9F107098D473AF3F34D8C14DCCBF62D725D5F8EEAE11BAAC558B0' : true,
- 'A29725F7446E6A2AD03DF0B7D77B72F9CF0249733B42F48DA80AE41C6B206C49' : true,
- 'A2C85895E192F69BFF3BD6CE420B8C84A6FC87B3A999F84701F0230887DD3344' : true,
- 'A300C56C8CB909C4F6ABAD6A7FCACC5E621BE17D5209717912B3F3BF2F7D6CAF' : true,
- 'A32A8197E25FF03AC02B1548EC597DC93B2F3376E971B143538542A6A2212AA1' : true,
- 'A32C868E44827044CE85B05E7E694717A5D3A7F8B9D28C41B7770DCD84F81218' : true,
- 'A334A1C1BCBBE82C131CA48858CC1D56495D2CE2B598E5C6E81672D7E9FF9FC7' : true,
- 'A33C924A4181FC26CCE183DF2C30AD332CF6D6A94626E2B6455CEF77560438F4' : true,
- 'A35426EFDAE7DC04D5F7926E254D5CEA23D4CAC5371D577ADA3A4AF828766F1F' : true,
- 'A37B9444FE3BB0FB2EC43F2677926EF458D0ED4F0688FEA6443A5F243F10C2AB' : true,
- 'A432841B8E8CE4F3B7992A740AB014B3D78ACD930DA113753E8D2E2E34A5358C' : true,
- 'A4433A490CBB5814065465D0A22C7260EBCAC5646C830971790254E4094DA502' : true,
- 'A46D4265BD5168CB36068465327371B2B9E2ACFBA66E368A8B90CF77A251ED09' : true,
- 'A61D1D1BF3A48836E418525F674E32CB457F4C74ECF525BC18A3035A26DB1CBE' : true,
- 'A6436C7837EB4F0FD89A1F3ECE954BCDC0D76E3817AD0289B64A22B78B071D7E' : true,
- 'A6781D1377008CD9AA9238D2F207B741EF8C42D209C06630E8C669EF1F863B56' : true,
- 'A686BB3EA8129BEA261D5B99357BDD2BC22DE15F0140AFA2D7CA3ADBCB64DE14' : true,
- 'A696B059AC99AA5CAF081FE9DE0F113EF0032A9F799A92663985EA5939B6F30B' : true,
- 'A718CF6FB0B4672FDB9BA1CDB812CDB98423DD8ACC8991780BE5E0FAEB863FBC' : true,
- 'A7636BE0A08F56D7F05A8D69AF0B7199FA7C05AAC123DCE71AB57C538A4D910A' : true,
- 'A82D480B6360B97B8FA507BD461FA4E2D6B73BDF171723C707FDBFD7C9C2C144' : true,
- 'A84DC1DB143EEE938A45743268683770BA0FB2EE69A4EB4B131841555CF1E124' : true,
- 'A8FFD3DCAC35478A6187DB3E317D7A9BA8D9823BDDA70440B8FCD5D83F49B836' : true,
- 'A9266E0A665A00C7C4360A7CE3FE0B5ADBD6E7E20A32677E43BA30FCFE112E30' : true,
- 'A9869713F6E5332E3F4902E82E81EACF34994042C411A28C8AAC116131EE90E9' : true,
- 'A9913780644EF0A55C80B8BBFFA76A7453DF7F9FC04E9BB09FB9434240D03961' : true,
- 'A9C3D776062E86182D7BFAD9005B716E1189EBD051D477078341EBA83F602DC7' : true,
- 'AA70F6E381B7B7BE508E8D5EB062186FB323FE00A75B264F43B771B731FE96AB' : true,
- 'AAA0B610FC8267716C7703C164E8E8A47B0DB68F821405F83AFBF5F4D7BB5219' : true,
- 'AB33CA8B659481B0120C5A227487E4F99D28106362B530D054FD812F7278CA51' : true,
- 'AB3975DCF7B531638F8E8EE570E416890F6E1FA4DFB66CD2EA62E81F6CB19383' : true,
- 'AB664D408382E848341572B2B10C2B9D1279B95F0AD02B8C5EAB00662D560C68' : true,
- 'ABD63734E1790C763452EFE508DAEE4EFA8A98F1BF72A2DAEACE57B02409CC33' : true,
- 'AC1199A88C3BB6564557B6BA422B776E8032D9457EE1099D0BD3E53DC44F73F5' : true,
- 'AC33C7B064D8FD9A0E5A00BC70581133E949AA0E61209B55010E310791339D4A' : true,
- 'AC523C58EEF332E2FA0491FD81659997FE32F1EEA4F7694D9C149ADF4B18BF2F' : true,
- 'AC72106DE06D4C1A17E641546E6DC5C53A1F48FCED34B9BD09368429F828CD70' : true,
- 'ACD1D0DF8BE51A80520D345BB16B04745BCBB48B01D936B018FFDA71981F817C' : true,
- 'ACE055C2E550D7C9F1D4847A26B21060A324BD4FF71EE2C3A8A202271EDEC115' : true,
- 'AD0C2E82F0B607A9B4D0571DF0302FF442E2B99ECE91C18E22C416B46B67E4F7' : true,
- 'AD40C15657CEFAB57F6A71035796462F0184B0AAA489E601087DE329F35CD757' : true,
- 'AD56E6AD659C808689220F5959DECE86001E37EEB88F452E2111BBAD634B4AFC' : true,
- 'AD5A935C6684CDB2459FA1D67250E8F9B6A6CB6455BC628750F9633FCF6EBF62' : true,
- 'AE51B75FD36BE0B6CF478F2441E57E91C216179A93BC05E35983D5FCD582CA91' : true,
- 'AE7BAFD9FB7AB3D87D0D58774420B314E46538D2894DC58DF5F5614DFE7F0435' : true,
- 'AE7D10798CDAEF50F7599FB03394DE7DED48C3054CE987479DB018E789E3718C' : true,
- 'AEA0E3A8AC6F70B681BDEFB28D9F156116F80230149D8E5C9DE76E9062EC015B' : true,
- 'AEBB7634F9BA9D293B5B1769E5E14C8EC2039487FFF02532DA9197A06DE84F77' : true,
- 'AEDE30ABFD76FFEFF77B437F8862FF677913239CB0DE0360FF93EDA6B515F731' : true,
- 'AF6F25BC29AA257FB80826165B3AA5BECB2CEF777817998D0619544F02FAF897' : true,
- 'AFBAAD26120F25FACFB7E1ABAD16A58455814B1A46DA986FCD04330A88DC1502' : true,
- 'AFDCE2C9BDE084811D64F5408E8AF94945CFB9F7FC69C9A27C8EE39102858DD3' : true,
- 'AFE6418D301202651844A84CC8B19A56C479D627DE922366E532643D995470A9' : true,
- 'B040095E5483E488179D07D81A9C14C6CE026480DBA570A6D16D75A7414D7499' : true,
- 'B06CD6AF9B4156B4379FF3C6C1F8CA182A923527D0DD92905394DB3446A11D5C' : true,
- 'B0A3CC901A3D58371289521F9345843F7ADEA438660729BE9B7B520DDB0BB965' : true,
- 'B0D656C4047A83E7012302B7CB04F056FDCC9493B506495E5DA4B0B97A9C1150' : true,
- 'B145A895F26B09540185848A600F7F58C0B03740C17B61A1B43BDC652740B80B' : true,
- 'B1991ED1894F821B66AEF2E26E0834CC796FFB43971A79588A44CCBF7E8B3076' : true,
- 'B1B58B7EEBC1947CB840FC4C2713D0DDB23DEBC75E58DB15610AB4EA9A1DE1C3' : true,
- 'B1BEE5F876D9695E23EBE9D0BF32D0DB4D05096C004A073487C5B3FA26719FCB' : true,
- 'B1D9B3EE2512A48A8E703E2D2263EEB4B0A3D24963F5165DB3719CD4750D2986' : true,
- 'B1EA0EB5DC9C9766C903870A4E9DD90C92C8780189ACCADDD9012E1D9911591B' : true,
- 'B2618AD6AE584F2CDCEC050ECB0FCE8E5BF0E9E978AFE692E4A1BCB8B7D03044' : true,
- 'B278FB3D58DC99E1CA192EEC63A0F34F9EB8294A23EF98C73F7C5F52A5C86FE4' : true,
- 'B295FDC9D7462488EBD4E5FA8E5B062FE5E2D0432C6A02B99F4CAD1F9BE6D0BB' : true,
- 'B29A6DB4686379EB52C1D8F249A74FA55A1DD9F2162B0B3E0683912C1E942437' : true,
- 'B2CB5A2A69339A575A4198D5B76822E6A0F90871A45C8348F2A060CEE67EC98D' : true,
- 'B30C7833C729209E938D2EDEE007438214024A6E424A849064A9B563040DDD39' : true,
- 'B31C07387E56AA457F17CA3D3A4C485683253CF387E6DCE37469B6A8E51CBF29' : true,
- 'B3251BB9A1B4F219400E69789FB08CA2BBA396C6D2FD3C4B69F4B7E1C0DDB615' : true,
- 'B33419AF991DF06128CC6A1EF6CAD190F68C1903CFB16B5346D0653C9C5139CA' : true,
- 'B3381C627EFBEF5DF3BCC9DB71A9B6E4C0A4F3114F7E7408A356FB33FBA5D20B' : true,
- 'B36D72C8B1F436DA49520421FC0A2869A9952DA405DA5E29EC3A1919453DD6F5' : true,
- 'B38307BF753F924511125E6FE9542C79A8541FCC780FF6905BA237A4C7FCBB13' : true,
- 'B3B278DD571DDC491FD26D3B0942C78EC4A1AE3D9A5D07C1E317CE901E6B8979' : true,
- 'B4130785116E5A84BF7B191696B213BA8877228388B18C2DA38DCB9EE14AC8CA' : true,
- 'B458C6F566E833CA5856703868BF09531CCC61D32AAB1BE65808DEEEC56EEF25' : true,
- 'B478303C0A26FF8A262C29BA3A9683FFC4CF075735E637F6A958640C5EC33669' : true,
- 'B4C49BF02ECA8D4E0648B386A408C377ED9A9E8E3DFEAC1D7904D3D14C5E2F76' : true,
- 'B4C5319F6F6A80B60C2A5A715FB1444F974024960339D49E0301E7F5A530595B' : true,
- 'B54B1776D34DF92E8E090FBF0C927D9852E6F18F98E6F306AE0369229A4AE2E6' : true,
- 'B5F50267B0042B154B8529FCD98F5E01C986F7D23628B49B63011A3C90398CEC' : true,
- 'B613D69F10DE096E664C3B4AA083E0BC9F50A98D0F9B682C496FDABB2E4AC9D2' : true,
- 'B663B6C8C60A5969BEE4F6844813AAB8945EE2CE2253CFBA67500B991CD8A07F' : true,
- 'B6B0AB34677500F9A39F33BFB229A8B211E9A75506BC0D4E894DA99804B40603' : true,
- 'B6CEE930054D71DEE1D167A566B9881B8971F7EB4BC4A34FCFD9DDB3DE311B9C' : true,
- 'B70CE73DC10ECA5F97059AFEA5A65F1B1CD45F3137BADD7F3A12DD1D6A468D82' : true,
- 'B740ED2F64278126EAE242BE49253ECE05B7EC944F8E201306B5128F82C0699E' : true,
- 'B75601AB7AE44FB2C77FF1E9C6FBC4B4D9ECB548009BF40C46CDDBBA8C0FE493' : true,
- 'B7EC03174DAD602E897345B072749AA86CAF05151062989E183C3039DE25569D' : true,
- 'B8845702F28C3AF9B35D8B5F1DFFFA014CE411CF592B18395F700CD8B937F3B9' : true,
- 'B902076C4F3E4FC9D45AE90E5AF637247D3A4566DBA2D6DAB15364828CF7BCD3' : true,
- 'B9891F4ABEA7FE5802FA2C07E596905422C39B16E36612B37FFABB81F49A0BCA' : true,
- 'B9B8984BD73419077A912955DEF673CCB572907E2C494256D627DCCAF86226A0' : true,
- 'B9EF83009F5C8B4C3A0C1B8EB263B4AADA87D4D2263887F8AFCA40FD4A7F78CE' : true,
- 'B9F8D7E05743BCE5E58CA2A0CDE89E7E1A9397417F75813B492785D72D4F8510' : true,
- 'BA43FBF51015CAA4D822D17A43F4DFB32561617B62E711D921112F12B76F9E43' : true,
- 'BA5BE146EA09B76F106B28AC62830E5240D1B7DC43BAD171EECC9998B1718E28' : true,
- 'BA8089CC9A0F25A27251DAD14E47714A331C35ACCE2EDFCC51CD73EFA83E2EB4' : true,
- 'BAFBC5503CBB29FE4D094BB0B0D04B22852E9120DD54D34D9247A4E570FD458B' : true,
- 'BB3C208314AFEC26DCB183A0E4DA2C1169F9CC435F1EDB38C349AD97B2C3F6B9' : true,
- 'BB998A2EEB4ED3C4251EB69296AE91EAE7360B0CBAF690FD250C38A710ACB38A' : true,
- 'BC0C5DBC1020476F067127D89E5C9A2AA88F141312919D7C0BF1B964D4820FF7' : true,
- 'BC86367AF49A238438C89460780C94DE2C1E49021437B3DFC590A63F46332888' : true,
- 'BC9B66EC1AF4106896624836D64B109922DA4163B83288E2131FD9A012CC95AC' : true,
- 'BCBFC4B205B7EEE5EB4D94029E1C3EED4DE049B3DF9FA6DB1D66F81B1247E9CF' : true,
- 'BCCC1893C98C4BD177A414C7B3D5EBD74893F964FB9A62B96B48A84F1FE64B53' : true,
- 'BCE02BE648B8A1EE092574F3D453388649082A1B72E7AFE7ADBA310EFBD38DE6' : true,
- 'BCEAEC2D8B8C18B58BD320D77850EC38285F419ACA8A9E939DAE7DFDF26696D0' : true,
- 'BD4309D792EBF40F5962B65405970EC2ACC7ED1109A1F5FEB486C84327FF6D46' : true,
- 'BE6E70EB169369668EF9523107E95867B1B9C0320C750180303720B35CF09798' : true,
- 'BED1A9D1A4414F4D465F04F9D8C8EC331F89388E19419D0371D0D177FA60287C' : true,
- 'BF7EAFFAA2647F47D816A83ADD1D7579F0CDDA690CBA00F75BC6ABD564987346' : true,
- 'C0144D1B67F2AB403DD08B73E5F1772F050E9713D8F2FD98BE999FCEE51D2792' : true,
- 'C03976BCBA4A9A4ADD099CE8F878A6DFF9B066179EC7DCF932EC4AA737FE415A' : true,
- 'C0A561684952AE3CE41432388E1F38C46B9CD607B4E555F46481AD90870CDA8F' : true,
- 'C0AB8B4E884A20E51AB9325567115F185D18654803E08E2C2C6A4632D7ACC2D0' : true,
- 'C0CDB9DCBD1FC873712C871C230C327A9E53E6D78FBD0E5CE1ABED5DA0D1C7D2' : true,
- 'C1EB50953EE0D16410A5DDFD97F5C05060B39F2902807F139EF6B015D0C66729' : true,
- 'C2118D84846AAB7DE521B0379672EC639CFD745D82E3D504EF68CA723725C5F6' : true,
- 'C2295D7C0FD4FC4DC7681FAF3CE851F6B416405554781C77FC8212DA169C258D' : true,
- 'C2C9A263D5F88D7064870FD13AB8633A10CD97E8281F0ECC49C2C1C3F54327A6' : true,
- 'C31135D0EE5E0B74D6A39E1FC67E9DB5CEAAE9F1D15338359CE02643C198634F' : true,
- 'C33DB47CE54F64CE33394E20A96D122EFB6F8DAB2584CF26120D8A8C5C380245' : true,
- 'C34069193CBFC866E03EB745416B50B25BBCAA00B5DE50D1D62D3365749CEDE4' : true,
- 'C34CDEA10E72069587970C7033095864B6F069B6637C6263A1E7A7A5187923BB' : true,
- 'C3801A5BC7707426FA083E828435810BE19C86FC9B94E18FD804BB3394459BFA' : true,
- 'C391E32BB11DD8F6F13BF71E0B9CE225364A50006E3F91147EDE39D2AA6E70E0' : true,
- 'C3DCE474FB44F22E6497A1FCE2C45DEE167853134C6F1C21C13F1707B0BC7FBC' : true,
- 'C3DD9BC59973438B62543E24CCB26B2724CC2346B0AE921EEECD064B50AA20F6' : true,
- 'C40FBDA777FF842501E19D444F8F3EE9B537C0D828537D59FE819AA9F9F3F145' : true,
- 'C4BDB4AF6E9CEE6017D3FB7ADD286E4B6348088E14D994CF698095DC86C939EB' : true,
- 'C4F9741D83486FFC06A841624631206EA81F82C5AE32E4A588C0911469989BA6' : true,
- 'C51ADC8D1B7014B4B9DB3EE230C67BF6F164956C390D41E5F8415977D9D9491E' : true,
- 'C58563CE93B0DF900E0681376244F32977F577D130320226D3BD9CF82863402E' : true,
- 'C58F0FF2DF810FAC8EA095F349A2E6D7E0D9C09D6FBE7D45895408530E1C75F4' : true,
- 'C591A346116A065185360B973A875B0329B48D924E15BE8D4FC4C0B849182732' : true,
- 'C689F3B9238DB156A7D563E76DF45FCA607B4B5F6CD62BDDC1AD1AC720E67952' : true,
- 'C6B197D2663DD850504C900569A800D914A5C99FD7E0DC7C2424A063B6C42CE5' : true,
- 'C6F63ACDAA452E008A1DCC711CAD36D00AFE55F958F2CC82A139BB53E27D11EB' : true,
- 'C7056A5FFEA8A4751271C17CAA9EF3BBDB7142A08ACA673522EDFD9AD18AFE66' : true,
- 'C71294A0124420512711C918C36F77192D2B45CDF8C99824B4BC862D0B31C3B0' : true,
- 'C74B4D9C0A7CB22F6F7B60BD4CEF94A34820E3A0419CA5CCA3CF187612693FAD' : true,
- 'C77AF2D81D578D009F9859CDEFD2E19A5B3DFA98FCE909C353E235D650DB514F' : true,
- 'C82AE26EBA1954BC778047DF9684F330C424E9FF778033485305AE0C87E57D68' : true,
- 'C936FEC68191D7AF75334834906C8CFB18F91FD53BDE7C2F0B2ACF8100ED3855' : true,
- 'C9462B9099A574DBBB9E2BB9B87C4AEA825DA388EE8153AB74414555420AA6DC' : true,
- 'C95235BA613C42AEEBE5B2CD04707B323083EF4BAF4B11C633288AAA7CF98AD7' : true,
- 'C959CD326D9F3AA21FDEDD42A5AF0B7A2FAA5E9B92907654F29F1ACDC691DBE6' : true,
- 'C9D7767021698AB5CFE3F43AB281F424E1515A52A0868C8752018CB292DE3190' : true,
- 'C9EF931AE82FA91CC76CEC12A5AE787BD3C081F57D4F70751DBB861B50CF38E2' : true,
- 'CA157632863D3E7B499F141741724FA84DBA48AEB51B04A53A9D3DFEA7F70BF1' : true,
- 'CA353A661EFF3C6EA9C66AA7585C19EDCD1C00085C06BB9B0DA2DA78C84D8CB2' : true,
- 'CA400A13D999554CB3EE03F1F12F7E578ED5C52CBCAF9748124E3402052F921E' : true,
- 'CA46DA728E76E97AD214DBB6AC9CB1EA2DC87202C88C35E87CE574FC1F2E0438' : true,
- 'CA529AC5A7489D57CEC2D6BA5881213C5A163409BD6946558DACFE899A977009' : true,
- 'CA846077B68DCA99AE30BAC33929143E856784B64E70098CBC7FF5BBD85C824B' : true,
- 'CAAF21212D1AFB10BA4844150A49541967BC1C9879801E43064429A632DFD941' : true,
- 'CAF98B60B1CE36971AD2DA67A18E72E53345EFCA16382827BD1C2022D009E751' : true,
- 'CB133229997821E418467CC3A72F77A7B9E31CC62B41032D6A82577B7AF1C6A2' : true,
- 'CC2E477D4A2640BCF70F232C040954DFC4878E536A4B03E788173E673A2D31FD' : true,
- 'CC8E9439ED527517579A913E8489CA704B4370AE09A823D36431063C53609C82' : true,
- 'CC99A37B34F4914C3E3B8B8D6236CE0E8F92DC77CEBEB09D50C6004D51C8D4CC' : true,
- 'CD35C7ABA0839C0D865DEA4C1DB624F709E5EA041A68DB55842E2C189F38BAC1' : true,
- 'CD749862756D49A24CD4B4893E78CC255639ABC6B8CF7972729F0A1DE547A050' : true,
- 'CDB02DBACBAD381EB4F6854E84372DAD1FD76462ACBC26A9DC86164E81E75C85' : true,
- 'CDE5ABA387C89D3B1CF6E70140F08B323027FF218A941CE31FA979E2295AEDEC' : true,
- 'CDEA4B65584E4EA2889F73E5907E95849BC6A2CA76B17EAD2B1FC7368193B550' : true,
- 'CED6501D3B06CDB7033EE79351EC3080BBC2993D0991AB91325DFC0550689AA7' : true,
- 'CEDFCE64CD03E3F512AC1CB6EE68C26F7C48C6753E8708E3A7D5AC867BA3ADC6' : true,
- 'CF099A3A9DBE3D79F3E420A47A8447A50A2F87ACF2874CA86D49F271B82A68C5' : true,
- 'CF19B1004488D5D9C882E2C4D0A47789618E0BCD6475F6D9C6B5591C2BF333C9' : true,
- 'CF44B5D052E8869D4632230291A81F3EBB7F681276D371161609BC23E40C8636' : true,
- 'CFF31BD8AB9FBB4681C17AA4135E67D402345E32CA8DC9D566537CA530F27B7D' : true,
- 'D027757FD24E68D7C422C10CFF9ED2401451C58A7B839DA3CA4A3BB3AB155642' : true,
- 'D03547E78303C9FBD70A38BEAFE87AA9F266A92275D818D1A8758DCB9D08DAE0' : true,
- 'D07441504C544C3C3374E4314A2FB91266585AE94460B2FBE5CD4292556CA20D' : true,
- 'D0927B6D60E3441E11D75A8FD593A38665AA7D211F691BDA3D0E815EBE303C25' : true,
- 'D0DA9A42796D063B8246DC549D1CDD1D64B0AEF50E7094F0A29F243B51012DC7' : true,
- 'D0F94901C782E50EA3A7B7300F6D9A113E45B5DA8944E956CE6629AF9C4C92B2' : true,
- 'D103ECB2B7F74BEFD44109C1CA30EA92D9016C0F9347F1DF3E5467C3AC20221B' : true,
- 'D10DFC97304D163140768E2D1698B1A0A3AF8331C4941F928622AB80091A3273' : true,
- 'D1C4E4D1F014FB8F889F45AFA39485BE742F64268C662BB28494855E393ADE96' : true,
- 'D207EED2218BA7CF564AD049677741A526B9ECB5BBB23CAF2B817A3B0085F004' : true,
- 'D277E65331EFA2A6668143F8BC5334AF870208332990F977BD7F3588689F4686' : true,
- 'D2785F7C48F180342D70978EEABFFC424D33A495A07D04F32C08B771BC4E43A4' : true,
- 'D39BD0C1656F99A47DA9D2957E2D7A49FC9EDD92CC6BE729C29299ECECFC42E7' : true,
- 'D44D1A7D80BD2F9B4A62E11BFEBBB74A5780B0366CB6038CEC9FBC8C8E19439A' : true,
- 'D44DF644880E56596405F1364D8C3E5301F05ACBF82FD66B671D895288C75360' : true,
- 'D462D57028E10CB7A7C87ADA83EBD7FE9B4DA384D2971BD7A708816C4EA8711F' : true,
- 'D46D29E4176A93E3DCD80BA5861A87E84FB7866B784488A977E7E4E4076DD2BD' : true,
- 'D5846E29C203E6EAFF8D474085653A1F9E2E123C4E9E8C1172D1CB62474789E4' : true,
- 'D5EDEAF240AD74C81017160821DE0FF6470839A2F8AB998D84E7392E90280D0D' : true,
- 'D60AFE53C8CF92DC2D9E8DD1E4003246A16A692A1F619426CE43EEE621319BCE' : true,
- 'D652650A3DE79A5C0DFEC1925007DA094925533D13F14094722A80F936FC9A8B' : true,
- 'D66B21D30F1CC1126A28B6349514DC6191F27FF727857D2EB2CAA9315AD46D5C' : true,
- 'D70BD006F4686795C1CF5435E8557D75BEECA1C5B96DE9D673A5B78E6BF95AED' : true,
- 'D7198C80471105D95103DB11B6BD2F6CDC8E7A7E67DB8329F1FA75C5F5D5E8CE' : true,
- 'D7632272521683A38E88A18C2CC6AED79B2C5E854483BDB6EE83D82BF41B96CA' : true,
- 'D780EB94814F0CE1AD1A2F8A1EFD6170C019F0B446E726C7C874C0730E59FF1C' : true,
- 'D78220C9BDCD563F71BD8139B40A495879DAE9FB1968AE3225BD0D04DAF294BF' : true,
- 'D844DEE1597B654C0E645C787DB52F6EA5C855C6C35626BD7787E71E873CAF8F' : true,
- 'D84CEE3A2993F9D7CA56C6C4B3ED9D4325A3542BAEABFFCB54C4E8F1CFCEFE42' : true,
- 'D86562629BA86C435C0965C4AC302160729F27804FEBA36E211F96CDEFB5DF8E' : true,
- 'D8AA8D8A7A48ACCB4C1B7E6C2228B7BFBC297EAFAB1315643744E3EE4DFA7E6C' : true,
- 'D8B8F53177C1E04D93746C8460A7296707654094814772BFAD31F79C03802240' : true,
- 'D91860DEFC109C7BEF5B4DA289D60CAA0EE1CA53D6D6675C1490315DE592FF7C' : true,
- 'D92D8ADE198EFC2EE43DCDF43C0433CB6B443F71A7AC083FB5C8DF1517007A36' : true,
- 'D92F41BE3DC8903580641073E0220C9B95B803B278C98E81DFF148386017BE36' : true,
- 'D96A581F03F6CAB11702CA28C088D4B71AD8B1CA6C3EFCDD66F5600EE11DA8FB' : true,
- 'D9FDB29EF83808BC82A97839FB2F22C2D20DAB2E6B67BF5862C8922BB1FA9068' : true,
- 'DA0D9391992825F7A10312F7E85568086F18DB901838A303E721E58239158EA0' : true,
- 'DA29D8725034D89C221F415CC5282F82A6502E1EAF416DFA41507BC662C90258' : true,
- 'DA5D20F1A6CF6CEC3AA7028A6E17D8F2E1A60069E497758B0CC938C08F4E76BC' : true,
- 'DA70536D31A4E949872D4E19BC8F111801425FEC6C955A5637D8B413D3C0DF0E' : true,
- 'DAA384D0D2A94A18A14E3DDF7A963E59BE41C06B978F3DC8862E1EE6C8E76DD0' : true,
- 'DAA9CED5BA817CED9942DB9CFAD0210505937A9DB2214298E0BEB831BFC8A31B' : true,
- 'DAFB1BB231A0D93B70726F2D3D8D8C8C54EFFCD901BB415C7A85AF02D09AA2A4' : true,
- 'DB18AF241CF4C262D080396F58EE892725C7FBD138DCD6FC8C995B647588AFAE' : true,
- 'DB301590A7DE580916559C6DE948B95A3F7FC50A7AB8678BC365595A4DCE4E4B' : true,
- 'DB7B1361B066EC2F777AE104F88A846DC163200AEB05B47D5BFEC91B6F13AC53' : true,
- 'DB8FEDEB510592FE37561120F9D27479A5E23FD1F77E6CAF662548F361739971' : true,
- 'DB90BF995B81CC0E7858647DA4AC0ECED0029E7E08DCC52CA18F21B426404DF7' : true,
- 'DB995D854C4EDEF4DB5CCF20B2B30719056F3EDAA0CCF4B9D9C5C898407C5C7A' : true,
- 'DBB0C3CC436B5E592960BE7E8836AE58D8D632D435365ED2EA3CFAA86681E272' : true,
- 'DBBF2D4498ED91C779C81FED5E96F9B5210CE86EA463712268BCAF098FE2E285' : true,
- 'DC8D710118FF258F27ED436F585756252FDB30F42DBB58B23B8CD3B2140E13B8' : true,
- 'DCA17501D12F98C84EE99DF4BC8EFC1FFFA9B65E2BC5A92B20C9296EC61C96CA' : true,
- 'DCC87ABAA2524536C43A280BC52710BF117E56EBB39444873F93AEF18519A502' : true,
- 'DCDE97B03688D8CB9F603AEF4D97110A38679F8EE01975E4B0B55855E4A8DD05' : true,
- 'DCF33FB3953551E4B5F06060A7EC211432C30FEF86FA7B45EE76A8F9F3473C86' : true,
- 'DD55F1E1BEBA4CF9F582CBEEF4A35E1C1DE36750A3403489C1C98955FCE9950E' : true,
- 'DD64C7D9E60AE6748B449ACE8CF9C21B5551BC6427EDDCE1D77B7C7720FD21E4' : true,
- 'DE327172F9BCDA3DBD4E6EEFC759F3EE88FBC635BAD34D76E360541420CDC8BC' : true,
- 'DE411E4537133A4D436E0D730AE192277792AA1D0584E60B1CECCDC736F53407' : true,
- 'DEA472B5BED8DA9F6F5539F8DC66FB5340010F7316FB28055E14EA76E03BBE41' : true,
- 'DEC7DC8AB8ED70C1D2FB2875F0F99FA99FB53E6BED70CD47B244ABA2104DA5AD' : true,
- 'DEF20D4F0C0D98AE8C9786C364182CCD8990A834C96C1F0989AAE9ECAF33720F' : true,
- 'DF0525A7807F3709BAD2DEC2ECC569A1D473F97F0C382C932DF726C79926DA0E' : true,
- 'DF4482289B54CB444569A5436AEEBEBFB348D966D2FBC8C5115376F3E5496303' : true,
- 'DF533C33DB800394971D608B89269426D3A2F58B76F190229C0573985E4F7CB8' : true,
- 'DF7FBA4917800A850600F3E7BD4DD0A717F2649060B300F5AF3B1F490BD26536' : true,
- 'DF905F5C4134B23862761FF69686B4E9C599F8F6D936E1C80695B652392E9E9A' : true,
- 'DF919779EC325DF19EE7186EC1AF526079C1D1552B18AA52004EF01F618266EB' : true,
- 'DFE29EDC6A77622D4963EAF8CEEAD0ED5DE393DD069425FE30175AD008D609DE' : true,
- 'E01A5251FAC16C537237EE4249874187E3BE3AF9B0F1D472E6C69E6C8B8832ED' : true,
- 'E09CD94E0A501BB4D25D5BBB02CCAE95A24D0BAF8CABADEC9D55A74B7D2C5BD8' : true,
- 'E0D7FA4702E25E7F51F94DD0D12C39A352DF48DE10A5249AE2687CBC15020CB3' : true,
- 'E1117A0AB7E1A80334C1C56891A4306CB553C100424773BB0F10C7574CF44ED5' : true,
- 'E1176E46C4FA7841D94FC724013E3D192E7B414933F92CD50EA36C51617A2C60' : true,
- 'E1595A9AA15B24610100AEB57ED619460CA1D976B769B856398EADA5A01F952B' : true,
- 'E17C4A5B0845135AEAE094BDCB314E32E76AF63A3BB51DFF4E47F83D8ACF972B' : true,
- 'E1A55E7ABA746B4A053359D13C91DCD7415F2CEECB7E87292DFD697213986946' : true,
- 'E1A583C63BCEBAC1136939B65CBD0E6DBD7493EA45910275D56E0E2DE209D2BF' : true,
- 'E1C97EFF3C246073604F341DBB3CEC9683EB6692463D85C1D23FA5269D9F3FFD' : true,
- 'E26F4C34273553354334DC7A22DC56A781F2491181799287CC91F12871FEB50D' : true,
- 'E276DC254DCFC8C0F2752221EE5D59EC0C86E714522A6600DB67A05E22E01740' : true,
- 'E27966B8B9C67C751F9AB8315D0BD1CEE334D96A8C5F60C764070EF8B8FCE61A' : true,
- 'E297439120E6E2701069440EC321BA98A5CFF9EA3F407FF16185671E466B87F0' : true,
- 'E2D55EAADCF87AD1BD50E53B7168CCC08561F0172004C1EC4DC13D8166D1A313' : true,
- 'E2D7EAAB6CC0961BE4E734BC1FEA960CB147DFD5A08F789506BB671A4360AC36' : true,
- 'E2FC1229FE0EDF06A3706DB8DBD2344B61A9364840A3E61E6B29CE49A966AC8F' : true,
- 'E30234ADF36D445F582C956B26E63BB76FF13FE90048CE1F37B40285BAE6529D' : true,
- 'E32ECC9EEA662085C10C003A5C910D77A6DCC1E99BD187576EFDD1BFA84591C4' : true,
- 'E37314E72C7304D32336940ABB576DBD7BE3190CD9A5E8F87413CEEB7579D502' : true,
- 'E381DF6792973BFE322D23C6CF2A6C24A4ECFC77F43F03D2FC04EE39FAD7C683' : true,
- 'E44515377AA3F7C1DC61E3A5C1F4C8FF52EC95BACDDAE1661B151E7700BEC1A9' : true,
- 'E469E3D28BF6AB0280F989BA50C11FF4D9EE608BAD2282219A5C4E60C0AD348E' : true,
- 'E4D680D0579075DCA20740BD4EF6AA4CEFD5542727071005774421A247941B8D' : true,
- 'E4F069C24D7162E3C94AB295EA33C8926BDDF79934CA28D8982A35650EB60B05' : true,
- 'E58CAB82E1F46C8DCFDB1387ECDCF227F1AF7FA9DDB14C71E4A035B028E2B34C' : true,
- 'E692108B3683F3C6362DF92476D62BAE60687035B70B9119F962190C9C215B04' : true,
- 'E6EB9DC7D407B4A2F308B4822E5BEA7428CD4520C59934214831D61E95F2BA34' : true,
- 'E72F9E7FF5A9E38975B19EE6627020754197E91E3EC6C8E75C3182CF7E877725' : true,
- 'E7EB8B4D5DE598BED2B9C817AB7D42F1EC99F16640B8C673AF2152D42F5344C4' : true,
- 'E7F4465713E093B4F7D970C89ED3A5E745457B80A974523648F07C6AAFCDC86C' : true,
- 'EA64F2625FAFE2EC122B493D4754C2B090153F167213AB6F07A87C1D993E5292' : true,
- 'EA7AD4DE86B47BEC726BFE21172676F92E0C0BB86888417916CB3123086E84A1' : true,
- 'EAA0454F2BBEED65A2FC7AAB8F308982387BDF33E6B56A1F3203F70F2981083A' : true,
- 'EB11019A7642C75F4DDC1DC9CF3B469BFB4C44B71C615693C73175F16DCA036C' : true,
- 'EB17EADBF0EA09B71BADD853CED1E5170C3A2D9FDE4F5C4A0EEC93E44C4B442C' : true,
- 'EB59182D7ACE742ED7D7AEE751763EF9F09EDF68D1DDF765E80BE40A53AD0E10' : true,
- 'EB6D34EFBF063DCACDFB823734B9788D9FB5E22A48372B7EA8AAFED8046652E1' : true,
- 'EBABE928B643E1B9FD6F61D67ACC4BA6A9BFCC95927D31D265F701AC4613B9AE' : true,
- 'EBD2581C1B0224FBDA489A642503CF3D3306751C336A66EB1816989900DA52BE' : true,
- 'EC521C3B04AF772AF812B63555A7C24BDA282C06EC619E1766CC346780EC6E04' : true,
- 'EC869ABCCE3A1C036F1AFABE5ECD4FDA581D16C0E81E16A2734E6004A55896BC' : true,
- 'ECB0646FEF13F818B1ACD2A8AFE448F3B39EC0EF6F623175931C48DC386EAF73' : true,
- 'ED5F00A17FCDDF01EF8531F5E1AD52C8F02F539C7B985A7C30EC87096AC8E59E' : true,
- 'ED918BDFDFCB9E4E679BC7C1938F9CE412AA85500BA3531FC550AD5213D5BDC7' : true,
- 'EDD929C40001C1ACDABD51797B63D689A0B80434FA323B4F7AD213AB8A530B8C' : true,
- 'EE5B8C42532363A48222B1493803B14EC2C98366CD0C5BA4126F468BA19C559D' : true,
- 'EE5D710097EAD11639F98940D1F32793ECC114F0408856CCB6536F1EF2366704' : true,
- 'EF0EE2FBF54D87B6AC02AEB88050155A27E1A60A5A8C4AC46FF24B529D912B04' : true,
- 'F09ECA7EC8BF7B582C42AEB4A0733A0D40FDFD28CEA2C70DA1BBCF1FF85E29FF' : true,
- 'F0BF33EE5C1D9A83A7BBDCDE95426DCD201D1C071CF1FB58CA4FE3776996A99F' : true,
- 'F0ED1008EDCD8A396F4C8FCE334210E629FBCECC19AF7416C901F6E4D30DFE45' : true,
- 'F0EDB0C989C20672BAFC51FA2710F3841BA5793BE379FC212D7ACC3AD4743455' : true,
- 'F1147FBF98A54E12693453EC571CE8B86C05D7FDF3995D775DFF135E10B9C520' : true,
- 'F11BB294EAD89BC4AAB21DD82BA85FFA6573215720E347D687D6D5D89EE33EEF' : true,
- 'F14532D01FD04640E9B009CCE5791EC4D11FA2979A4ED0978C234DAB8A8A2B24' : true,
- 'F153813F6CD126543E985CEFA06C8B978FE5D4825C189F58944DC0DE17D5A0E9' : true,
- 'F15E12419E936A907F201FD9D6D3DE2E01E5F8465AC4D8EDDCE1E58262183223' : true,
- 'F186AF5F155D63950BB5C05BFECA1273A93DD1DAE796E4FF71AE1DAB791CD327' : true,
- 'F18F115FE36E41A293BB1CA29875EFC7004D06144908713DD45305DAAE634687' : true,
- 'F205928C933AFF1F1A6411AB779CFAE3FAAF43754AB86735DB52F74DB1DA81D2' : true,
- 'F20CBF1FC073F7E7DEBC38DFE2042E2CDC5D82898773D6283C680A3BC966BC02' : true,
- 'F22F96FB88C9D96104167D95B3AD8B5888C92680B0AD13DC785FD5AD3E19EDB7' : true,
- 'F234FBFD807A0302CBF855175C73ABF27C94915B95135E3146C0ED73662DE3F5' : true,
- 'F28C56AA368BC4F8DA6B77CF3F8D2A7EF4994BBDE7DF85AA40FF740DC004750B' : true,
- 'F2C91876EDB36EAD7E4821C2A6581144F1E5A67B2DEF4A5E4AFDF79F5E1CC4D7' : true,
- 'F32ABEBBCFF1BE566CCDFCEC49D7D589FED08B97E855A11466D1734244449841' : true,
- 'F34151DCAD82DAF64C6A0674042BF618A93CA92F6A2CC66EB95D04B7099B20F3' : true,
- 'F35B7EB206DBF6A634A74B51611528984798BC06AF8882D899274B4461A55D3E' : true,
- 'F35B9D7C54418022E6FD4FDFE88C3261FD138329A11C013AD640145D40BE934A' : true,
- 'F3CA880E8CF918E29D956A8306A2A0EB9CF76E82135F60A9885033E22B7874E8' : true,
- 'F3D480D69675A57DC2061544BF7F52B631BB02716680C0E5605413C9B2A6183F' : true,
- 'F402A9D58A73C40B396B5CE756EDFCA68257AC6D8DE80AA8217F16C97512C51B' : true,
- 'F44731EEA5EB2ECD106E24F6BFB87505E09A46EEB921DAAF2351782C5EE13EAB' : true,
- 'F49BADFFBB2D2836A995A12E44ECF62E584F1B8D0740E0EDC7610C0C6765CDAA' : true,
- 'F4CF11FF85427F37B1546E4E840E6E3BC213A798F6912C841863BA2D99D9ED85' : true,
- 'F513DC8D7F8B425FCF55E74BDCF2675EF2ABF98523E5226CF8A2391B0A36A919' : true,
- 'F55617B92584757BB516B19BFCBDA9B4A71237075487651831CD9C5F9C6F5F29' : true,
- 'F5B19B2D5D880A4C1ADECA3D760FCB7E75FC2137B2EC99F3EEE034ADF788BADB' : true,
- 'F5D715B6BE56D1A677ECBF7C26B4D79716F5EC2D2E2EC323ABDFE3442F40BD31' : true,
- 'F5E43F516D61A0329F78A2560454B8346732A9420C172AC9983C0BEFFD8DEA0A' : true,
- 'F5FAC17F4DDD973352CBCD311E21AE81EEFA06150CE85B8C32126D7F1661EDA0' : true,
- 'F605AA2BD611765748A88F933BCBCEC70272F6C6A1A4AC614C2D02D17DAC6CEC' : true,
- 'F6620F848AB3CFC1695D2AF5399FD8FDD8F2FEC43F73F2924DF78C1A26C22653' : true,
- 'F69724886C30730DEC09A32E2BE002216EE35A06ECC2E951390A2C429B293A8A' : true,
- 'F6B9B7A36ADF7095D44420CCDCE4A739926841BC695ED40E78856D8F71D41257' : true,
- 'F74D9E23F4CB53775CA60178347F2A029F77579000B21AA08EC62A1C2932348A' : true,
- 'F754352E819D0C33E6CFC06EECBB4356DB5D8BD1FD2591C7C817CCE662BE2BC4' : true,
- 'F7FC63254BF2472575C6D5DEC8DDF02B24B6F1BDCE03D807B159A69820262D4A' : true,
- 'F805AE1FEDB2D94096F0D341B703ECD4975D773A179555DDC83D424F85578571' : true,
- 'F8237FCE3E7C9B2BE3592C0864ADEF9BA4A6FC3558E172E79DE6B025A755703A' : true,
- 'F94C306978496ED2183DC7591DA0240B513527293E5D522CF7089530E4C58D29' : true,
- 'F961BA44302F5AF5DC4045A7E3989D4B77AD4BDD53DE92A45F39FE56947293BF' : true,
- 'F9C9461AA83C154828777B8ED854A682D912463599CEC65AB54C6B919A47713F' : true,
- 'F9E220AC82D672997DC20E9EE89BF0713BC4153FB5F2EBC8D9AC9EE35A6E494D' : true,
- 'FA14D235A95650A4CFD7A2A4DD80BAF2AF47581E01E412D640F93D6BB79D1C06' : true,
- 'FA1B8F32DE3B7F4ACA8FEF5414B5D985FE3705D0E3371D4FE4AF46698B68B01B' : true,
- 'FA500D7B8D9BED2323488F83C9A6093C012143DEE3E453C1F75738625571E708' : true,
- 'FA616BE68A75F14CA6331BD5BFDBE3840CE34CC3C3C98E3C8C3E10F027389F2F' : true,
- 'FA75601E87823F0B02F8764B29377F4EBB02A179051297597E93FB4B1F5FCAD5' : true,
- 'FB067C05D337FC01FC0721FA712A9E1A4FFDE059A35F3B494D36FFE241107465' : true,
- 'FB1DF67EE132C7163167839175485C179E82024AD59EF806AF9D968A97F2ACA2' : true,
- 'FB3A5B27D3488E28ABA3F303A726C2F0440133025981816FEDF798E45B9B1751' : true,
- 'FB52A9B5EB7A494C06FB5CE4BB4505F32D6C666931AF2A018E6066244802A00D' : true,
- 'FB7EF701469F77B6412100BB2D6399B1A574BB9610186FFFCC0119E14CB2021F' : true,
- 'FB81BF294DB8EDE0C4DFFB7F5528EB3EB406FE435A6D62E6894482D8B42CCC48' : true,
- 'FBCC79E05CC135E183F4963C2A206F9DFDBC2DD0D379A743D5FB301741796921' : true,
- 'FBF769E6019DEA2724DB5768974B5D32E8A91F8045707B4F50552FE1D3BEAE4E' : true,
- 'FC072A7AD4E6E41680493AF4BEB98215D4D2F7CE040C95004BB3A1621A9DD513' : true,
- 'FC2B9FC5D6843065426D6D1E1F7EEC08D92A6569953AAC9F6273BFCA6E6D27B7' : true,
- 'FCA9C3A036EA797D58CA26F793C98A9952E59D37C35E352B67A30D4F8F49FC7D' : true,
- 'FCABE5BABEB2D2785BBA66B5D465FAF9F9A8E74E77AC1161273F49F4261F17B3' : true,
- 'FCC12514DEB82E09AFF7A8B73DAC3CF80683D447101F048804D0B1100169D87E' : true,
- 'FCF4BA663F0032118EADF9D327B65AB502C7A8B336462A397238884E9A28508E' : true,
- 'FDB416F216D943190D8CADA2EB8F138F77A99CB1BC1334246697D37D8C04AB38' : true,
- 'FE3360CC5F8AFA4C464A7FE90DE7FAE9462859FDADB9F2590171CE6081EB616E' : true,
- 'FE4A5357D197340536C61A1493D6EB64732D628B4435BCF43A1D52BCC5BF4CFD' : true,
- 'FE739A748FB17DAFB6CBA0DA5B2164B8E0435E8DA7FB85E7970BBE731B428631' : true,
- 'FEE9BBCB25431C59C14C72C963CEDF437D795B6BEFE79EBF262B7054B0E583A1' : true,
- 'FEFEF80071B0D8E2B57D6601BB353A435A425EAA701827370C3585CE09F2CE50' : true,
- 'FF3E77DFF8C24FE2DC89CE8757B6AE9ACBB838D35AEBDBD9A29D099E211380BB' : true,
- 'FF73EF3C41BC0CC04D28987004C7CC1C52B222AE6FE463A34E9E3C483EE731E8' : true,
- 'FFAE947BA6D3D7E8D31D04F02EEEE60601B0200ACDEBCB12AA5D617F650D5FD0' : true,
- 'FFFB09720CCEF3A610BCB81EEF5FCD614C1602D4968A9DE8400C05256AEDC1ED' : true,
-} ;
diff --git a/src/chrome/content/code/commonOCSP.json b/src/chrome/content/code/commonOCSP.json
deleted file mode 100644
index 106916d6cdbb..000000000000
--- a/src/chrome/content/code/commonOCSP.json
+++ /dev/null
@@ -1,289 +0,0 @@
-[
-"https://safebrowsing-cache.google.com/",
-"http://ocsp.pca.dfn.de/OCSP-Server/OCSP",
-"http://ocsp.digicert.com",
-"http://ocsp.verisign.com",
-"http://ocsp.comodoca.com",
-"http://clients1.google.com/ocsp",
-"http://ocsp.usertrust.com",
-"http://ocsp.disa.mil",
-"http://ocsp.quovadisglobal.com",
-"http://ocsp.nsn0.rcvs.nit.disa.mil",
-"http://ocsp.camerfirma.com",
-"http://ocsp.thawte.com",
-"http://ocsp.serverpass.telesec.de/ocspr",
-"http://ocsp.certum.pl",
-"http://ocsp.certisign.com.br",
-"http://ocsp.entrust.net",
-"http://telstra-ocsp.pki.telstra.com.au/ocsp",
-"http://ocsp.a-trust.at/ocsp",
-"http://ocsp.godaddy.com",
-"https://ocspaces.trustdst.com",
-"http://ocsp.identrust.com",
-"http://ocsp.pki.auth.gr",
-"http://ocsp2.globalsign.com/gsorganizationvalg2",
-"http://ocsp.starfieldtech.com",
-"http://ocsp.pki.bayern.de:8080",
-"http://ocsp.netsolssl.com",
-"http://ocsp.europki.org:8026",
-"http://ocsp.starfieldtech.com",
-"http://ocsp.treas.gov",
-"http://ocsp.trust-provider.com",
-"http://ocsp.rcsc.lt/ocspresponder.rcsc",
-"http://ocsp.globessl.com",
-"http://ocsp1.wosign.com/ca1",
-"http://gtssl-ocsp.geotrust.com",
-"http://ocsp.turktrust.com.tr",
-"http://ocsp.quovadisoffshore.com",
-"http://eva.orc.com",
-"http://ocsp.incosolutions.com/ocsp",
-"http://validator.wellsfargo.com",
-"http://jjedsocsp1.jnj.com",
-"http://ocsp.cybertrust.ne.jp/OcspServer",
-"http://ocsp.digsigtrust.com",
-"http://ocsp.trust.teliasonera.com",
-"http://ocsp.harica.gr",
-"http://ocsp.pki-services.siemens.com",
-"http://sd.symcd.com",
-"http://ocsp.catcert.cat",
-"http://ocsp.certificateservices.eads.com",
-"http://dc/ocsp",
-"http://ocsp.wosign.com/ca",
-"http://ocsp.swissdigicert.ch/rubin",
-"http://ocsp.unimelb.edu.au/ocsp",
-"http://ocsp.gandi.net",
-"http://ca.multistructure.co.id/ocsp",
-"http://ocsp.buypass.no/ocsp/BPOcsp",
-"http://rapidssl-ocsp.geotrust.com",
-"http://ocsp.tcclass3-II.trustcenter.de",
-"http://ocsp2.globalsign.com/gsalphasha2g2",
-"http://ldap.takata-petri.com:2560",
-"http://ocsp.dpwn.net",
-"http://ocsp.certyfikatyssl.pl",
-"https://ocsp.quovadisoffshore.com",
-"http://ocsp.swissdigicert.ch/smaragd",
-"http://sureseries-ocsp.cybertrust.ne.jp/OcspServer",
-"http://wongtaisin.ms.local/ocsp",
-"http://nsc.vrm.lt/OCSP/ocspresponder.nsc",
-"http://ocsp.webspace-forum.de",
-"http://ocsp.luxtrust.lu",
-"https://ca.e-szigno.hu/aocsp",
-"http://ocsp.trustsign.com.br",
-"http://ocspape.cert.fnmt.es/ocspape/OcspResponder",
-"http://telstra-ocsp.pki.telstra.com.au/ocsp",
-"http://ocsp.tcclass2.trustcenter.de",
-"http://ocsp.inmeta.net/ejbca/publicweb/status/ocsp",
-"http://igc.auf.org/ocsp",
-"http://ocsp.certification.tn",
-"http://ocsp.globaltrust.eu",
-"http://ocsp.e-tugra.com/status/ocsp",
-"http://ocsp.bezeq.com",
-"http://ocsp.nsn0.rcvs.gds.disa.mil",
-"http://certinfo-ocsp.ubs.com:53417",
-"http://ocsp.tbs-x509.com",
-"http://ocsp.ll.mit.edu",
-"http://pki.utg.ua/ocsp",
-"http://ocsp.accv.es",
-"http://crl.itsumo.pl/ocsphttp://corppki/ocsp",
-"http://tr-dc-r2.telering.biz/ocsp",
-"http://ocsp.eme.lv/responder.eme",
-"http://ocsp2.globalsign.com/gsalphag2",
-"http://ocsp.ssl.com",
-"http://ocsp.certificadodigital.com.br/serasa_cd2006",
-"http://la-email.corp.valueclick.com/ocsp",
-"http://ocsp.startssl.com/sub/class3/server/ca",
-"http://acbridge.ds.commun.test.fc2consortium.org:8080/ejbca/publicweb/status/ocsp",
-"http://remote.hirschmann.nl/ocsp",
-"http://ocsp1jca.defence.gov.sg",
-"http://ocsp02.telesec.de/ocspr",
-"http://certs.vonagenetworks.net/ocsp/vonsca",
-"http://ca-ocsp.disig.sk",
-"http://www.isscorp.com/PKI/ra/ocsp",
-"http://ocsp.digi-sign.com",
-"http://ocsp.certificadodigital.com.br/serasarfbv1",
-"http://certificates.medsigroup.ru/ocsp",
-"http://ocsp.bee.vimpelcom.ru/ocsp",
-"http://cert1.cert.internal.loc1.gathowin.net/ocsp",
-"http://ocsp-ext.pki.wellsfargo.com",
-"http://ocsp.innossl.com",
-"http://ocsp.pcf.pl/ocsp",
-"http://nts15.etoncollege.org.uk/ocsp",
-"http://ocsp.dreamhost.com",
-"http://ocspISAca.cert.fnmt.es/ocspISAca/OcspResponder",
-"http://bt1svl0a.bpa.bouyguestelecom.fr/ocsp",
-"http://ocsp.co.vectis.local/ocsp",
-"http://localhost:8080/ejbca/publicweb/status/ocsp",
-"http://ocsp.siteblindadocerts.com",
-"http://corpcert.app.corpintra.net/ocsp",
-"http://ocsp.nlss.com",
-"http://ocsp.bobo-rousselin.com",
-"http://cert.bioscomputers.com/ocsp",
-"http://ocsp.lienvietpostbank.com.vn/ocsp",
-"http://sslocsp.twca.com.tw",
-"http://ocsp.mdais.co.il",
-"http://pki.sana-bb.de/ocsp",
-"http://ocsp.wisekey.com",
-"https://ocsp.rcsc.lt/ocspresponder.rcsc",
-"http://ocsp.startssl.com/sub/class2/server/ca",
-"http://ocsp-cpki.telekom.de/ocsp",
-"http://ocsp2.ssc.lt:2560",
-"http://ocsp.it.point/RMGRCA/http://ocsp.extranet.royalmail.com/RMGRCA",
-"http://eca.ocspts.identrust.com",
-"http://ocsp.vkb-bank.com/ocsp",
-"http://pki.automobiletechnologies.com/ocsp",
-"http://ocsp.g4s.no/ocsp",
-"http://vpn.ozero.com/ocsp",
-"http://ocsp.village-roadshow.com/ocsp",
-"http://ocsp.groupensia.com/ocsp",
-"http://pki.rosautoprom.ru/ocsp",
-"http://ogbl-ocsp2.ogbl.lan/ocsp",
-"http://ocsp.southernco.com/ocsp",
-"http://ocsp.swiss.signdemo.com",
-"http://ocsp.itexcellence.rs/ocsp",
-"http://www.cepsa.com/pki/ocsp",
-"https://ocspaces.identrust.com",
-"http://ocsp.dtica.eu",
-"http://www.tys.org/aia",
-"http://ocsp2.globalsign.com/gsextendvalg2",
-"http://caors.wiltshire.ac.uk/ocsp",
-"http://ocsp1.ssp-strong-id.net/SSP-CA-A1",
-"http://cert.econgas.com/ocsp",
-"http://ocsp.wienerberger.net/ocsp",
-"http://ocsp.pki.wayport.net:2560",
-"http://pkib.mallesons.com/ocsp",
-"http://ocsp.ovh.com",
-"http://ocsp.certificadodigital.com.br/serasacdv1",
-"http://pkiva.indra.es",
-"http://itcert.stanford.edu/ocsp",
-"http://certenroll.bogdanov-associates.com/ocsp",
-"http://srv-pki/ocsp",
-"http://ocsp.godaddy.com",
-"http://ocsp.pki.slb.com/ocsp",
-"http://ocsp.swisssign.net",
-"http://cert.naftogaz.com/ocsp",
-"http://ocsp.uk.deloitte.com",
-"http://ocsp.comodoca3.com",
-"http://ocsp.exzumin.de/ocsp",
-"http://ocsp.msocsp.com",
-"http://cdp2.nis.rs/ocsp",
-"http://corptestcert.app.corpintra.net/ocsp",
-"http://ocsp.comodoca2.com",
-"http://ocsp.ersca.com",
-"http://ocsp.xth.cc",
-"http://ocsp1.ssp-strong-id.net/VA-SSP-CA-B2",
-"http://ocsp.vnpt-ca.vn/responder",
-"http://ocspts.identrust.com",
-"http://ocsp2.globalsign.com/gsdomainvalg2",
-"http://pkiva.bde.es",
-"http://certs.mapservices.fr/ocsp",
-"http://ino.inosoft.de/ocsp",
-"http://rootca.poclabs.net/ocsp",
-"http://pki.rtc-leasing.ru/ocsp",
-"http://ocsp.startssl.com/ca",
-"http://ocsp.ca.vodafone.com/ocsp",
-"http://ocsp.cs.auscert.org.au",
-"http://ocsp.tcclass2-II.trustcenter.de",
-"http://www.er76.ru/ocsp",
-"http://ocsp.walgreens.com/ocsp",
-"http://www.pki.nosc.us/ocsp",
-"http://test_pki1/ocsp",
-"http://ocsp.mytrc.net/ocsp",
-"http://certs.ankalagon.ru/ocsp",
-"http://www.ocsp.gpo.gov",
-"http://ocsp.bayanca.ir",
-"http://va.pfizer.com:1025",
-"http://certificates.dnv.com/ocsp",
-"http://ocsp.orapharma.com/ocsp",
-"http://ocsp.seattlecca.org/ocsp",
-"http://backbone.cnsd.interno.it/ocsp",
-"http://nyppki02/ocsp",
-"http://ocsp2.globalsign.com/gsorganizationvalsha2g2",
-"http://gtssl2-ocsp.geotrust.com",
-"http://ocsp.tcuniversal-I.trustcenter.de",
-"http://ocsp.register.com",
-"http://ocsp.ncdc.gov.sa",
-"http://pki.life.com.by/ocsp",
-"http://ocsp.sgssl.net",
-"http://pki.gmprint.local/ocsp",
-"http://pki.solitdev.com/ocsp",
-"http://ocsp.dics.ua/ocsp",
-"http://ocsp.pre.swissdigicert.ch/rubin",
-"http://ocsp.affirmtrust.com/commev",
-"http://aia.gdir.vt.ru/ocsp",
-"http://ocsp.averius.nl/ocsp",
-"http://ocsp.bechtel.com/ocsp",
-"http://ac.ds.commun.test.fc2consortium.org:8080/ejbca/publicweb/status/ocsp",
-"http://cert-services.e-control.at/OCSP?ca=EControl_IntermediateCA",
-"http://nfiocsp.managed.entrust.com",
-"http://cert.bernards.com/ocsp",
-"http://bhca2.baker-hostetler.com/ocsp",
-"http://pki.suva.ch/ocsp",
-"http://EVSecure-ocsp.verisign.com",
-"http://ocsp.go",
-"http://pki.wabag.com/ocsp",
-"http://ocsp.startssl.com/sub/class4/server/ca",
-"http://nfi2.eva.orc.com",
-"http://onsite-ocsp.verisign.com",
-"http://ocspsslv3.kamusm.gov.tr",
-"http://ocsp.pki.belgium.be",
-"https://www.isscorp.com/PKI/ra/ocsp",
-"http://ocsp.statoil.com:3502",
-"http://pki-ocsp.allscriptscloud.com/ocsp",
-"http://swoop-pki.swoopin.com/ocsp",
-"http://kzatpki0002.okioc.com/ocsp",
-"http://ocsp.policia.es",
-"http://ocsp.startssl.com/sub/class1/client/ca",
-"http://dc01/ocsp",
-"http://ocsp2.pki.wayfair.com/ocsp",
-"http://10.1.101.2/publicweb/status/ocsp",
-"http://ocsp.bt.com/ocsp",
-"http://ocsp.sanofi-aventis.com/ocsp",
-"http://dc-01.raise.group",
-"http://ocsp.spar-ics.eu/ocsp",
-"http://ocsp.vodokanal.spb.ru/ocsp",
-"http://socsp.turktrust.com.tr",
-"http://ocsp.thermocolor.com/ocsp",
-"http://ocsp.lisec-sw.com",
-"http://ocsp.csctrustedsecure.com",
-"http://houpki2.nov.com/ocsp",
-"http://ocsp.bwinservices.com/ocsp",
-"http://ocsp2.globalsign.com/gsextendvalsha2g2",
-"http://ocsp.tcclass3.trustcenter.de",
-"http://ocsp-b.pki.wayport.net:2560",
-"http://devdc01.dev.gatesfoundation.org/ocsp",
-"http://certsrv1.dc1.thomson-webcast.net/ocsp",
-"http://relay.systemshouse.ru/ocsp",
-"http://gold-root-g2.ocsp.swisssign.net",
-"http://pecs1.unisys.com/ocsp",
-"http://ocsp.europeanssl.eu",
-"http://gw.idsaas.de/ocsp",
-"http://ocsp.tcs.terena.org",
-"http://ocsp.trendmicro.com/tmca",
-"http://ocsp-ent.pki.wellsfargo.com",
-"http://www.meridian-capital.kz/ocsp",
-"http://ca.x-any.com/ocsp",
-"http://crl.inditex.com/ocsp",
-"http://ocsp.firmaprofesional.com",
-"http://ocsp2.globalsign.com/gsdomainvalsha2g2",
-"http://exchange.cdl.cz/ocsp",
-"http://pkicvs.cisco.com/pki/ocsp",
-"http://ocsp.affirmtrust.com/premev",
-"http://ocsp.icewarp.com",
-"http://ocsp.ferbritas.pt/ocsp",
-"http://cert.energokaskad.com/ocsp",
-"http://ocsp.utn.com.ua:2560",
-"http://ocsp.affirmtrust.com/ntwkev",
-"http://ocsp.omniroot.com/baltimoreroot",
-"http://ocsp.shamusclan.com",
-"http://ocsp.wurthnet.com/ocsp",
-"http://ocsp.pkic.es/ocsp",
-"http://ocsp.strixchomutov.cz",
-"http://sha2ocsp.dnsalias.com/responder",
-"http://ocsp-test.ncdc.gov.sa",
-"http://ocsp.sysadmins.lv",
-"http://cert.incoma.ru/ocsp",
-"http://ocsp.north-winds.org",
-"http://iis1.eeza.csic.es/ocsp",
-"http://pki.winextreme.org/ocsp",
-"http://ocsp.startssl.com/sub/class1/server/ca",
-"http://pki.eduuni.local/ocsp"]
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/fetch-source.js b/src/chrome/content/fetch-source.js
deleted file mode 100644
index 80c32c4df98d..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/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 + fs.DIRECTORY + filename + "?h=" + GITCommitID;
- },
-
- /**
- * 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.addEventListener("resize", function() {
- var textBox = document.getElementById("source-text");
- // TODO: Move to constants
- textBox.width = window.innerWidth - 100;
- textBox.height = window.innerHeight - 150;
-}, false);
-
-// 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 e686107d0f9a..000000000000
--- a/src/chrome/content/observatory-preferences.xul
+++ /dev/null
@@ -1,114 +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 1d9169ec0164..000000000000
--- a/src/chrome/content/observatory-xul.js
+++ /dev/null
@@ -1,201 +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");
- document.getElementById("show-cert-warning").checked =
- obsprefs.getBoolPref("extensions.https_everywhere._observatory.show_cert_warning");
-
- // 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);
- obsprefs.setBoolPref("extensions.https_everywhere._observatory.clean_config", 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_show_cert_warning() {
- var show_cert_warning = document.getElementById("show-cert-warning").checked;
- obsprefs.setBoolPref("extensions.https_everywhere._observatory.show_cert_warning", show_cert_warning);
-}
-
-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 4a61f0ac72d6..000000000000
--- a/src/chrome/content/preferences.js
+++ /dev/null
@@ -1,278 +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 = [];
-
-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');
- // Note: It takes several seconds to load all the rulesets, during which time
- // Firefox is unresponsive. There are too many rulesets to reasonably browse
- // in this view anyhow. Should start with an empty window and only show
- // rulesets that match a search term the user types in.
- https_everywhere.https_rules.loadAllRulesets();
- rulesets = Array.slice(https_everywhere.https_rules.rulesets);
- // Sort the rulesets by name to avoid revealing which subset of rulesets has
- // been visited, per https://trac.torproject.org/projects/tor/ticket/11655.
- rulesets.sort(function(a, b) {
- return a.name < b.name ? -1 : 1;
- });
-
- // 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 da722b31086e..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 333fe17a8591..000000000000
--- a/src/chrome/content/rules/00f.net.xml
+++ /dev/null
@@ -1,17 +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 658c42f42dd9..000000000000
--- a/src/chrome/content/rules/01.org.xml
+++ /dev/null
@@ -1,24 +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
index 7a48163de969..de2de8a6ac76 100644
--- a/src/chrome/content/rules/0nl1ne.at.xml
+++ b/src/chrome/content/rules/0nl1ne.at.xml
@@ -1,21 +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/0x41.no.xml b/src/chrome/content/rules/0x41.no.xml
deleted file mode 100644
index d8fe24fb9df8..000000000000
--- a/src/chrome/content/rules/0x41.no.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/0x539.se.xml b/src/chrome/content/rules/0x539.se.xml
deleted file mode 100644
index 6f72cb8c907f..000000000000
--- a/src/chrome/content/rules/0x539.se.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
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 d1e048c3b80c..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
index 17740e5a36db..f79f105d178d 100644
--- a/src/chrome/content/rules/100R.org.xml
+++ b/src/chrome/content/rules/100R.org.xml
@@ -1,11 +1,20 @@
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
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-falsemixed.xml b/src/chrome/content/rules/101domain.com-falsemixed.xml
deleted file mode 100644
index 74e5c25a996e..000000000000
--- a/src/chrome/content/rules/101domain.com-falsemixed.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/101domain.com.xml b/src/chrome/content/rules/101domain.com.xml
index 87a89c1b0205..8fbcddd6549c 100644
--- a/src/chrome/content/rules/101domain.com.xml
+++ b/src/chrome/content/rules/101domain.com.xml
@@ -1,56 +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 ec87470bfee3..b44f671c38ee 100644
--- a/src/chrome/content/rules/10gen.xml
+++ b/src/chrome/content/rules/10gen.xml
@@ -5,18 +5,37 @@
- MongoDB.org.xml
- Nonfunctional subdomains:
+ Problematic hosts in *10gen.com:
- - blog
+ - blog *
+
+ * Redirect from ($|\?) differs from http
-->
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
diff --git a/src/chrome/content/rules/1105_Media.com.xml b/src/chrome/content/rules/1105_Media.com.xml
index 621ec7389de9..4ff869a9a340 100644
--- a/src/chrome/content/rules/1105_Media.com.xml
+++ b/src/chrome/content/rules/1105_Media.com.xml
@@ -1,10 +1,16 @@
+
@@ -22,14 +29,15 @@
-
+
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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/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 68852151445f..0db459913b72 100644
--- a/src/chrome/content/rules/118-Information.xml
+++ b/src/chrome/content/rules/118-Information.xml
@@ -4,14 +4,14 @@
- (www.)my118information.co.uk (times out)
-->
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 5e8237ea0185..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 7dfae6f41090..afc97a790c86 100644
--- a/src/chrome/content/rules/123RF.xml
+++ b/src/chrome/content/rules/123RF.xml
@@ -8,19 +8,25 @@
- static.123rf.com
-->
-
+
+
-
+
+
+
-
+
-
+
+
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 42bc724f8be4..c8e7e7c98cbc 100644
--- a/src/chrome/content/rules/123eHost.com.xml
+++ b/src/chrome/content/rules/123eHost.com.xml
@@ -1,40 +1,27 @@
-
+
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
@@ -49,14 +36,23 @@ Fetch error: http://drive29.mywwwserver.com/ => https://drive29.mywwwserver.com/
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
diff --git a/src/chrome/content/rules/123systems.xml b/src/chrome/content/rules/123systems.xml
index 733a5a51240f..dec65718a502 100644
--- a/src/chrome/content/rules/123systems.xml
+++ b/src/chrome/content/rules/123systems.xml
@@ -1,9 +1,4 @@
-
-
+
-
-
+
+
+
+
+
+
+
+
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/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 326a3f6787c8..000000000000
--- a/src/chrome/content/rules/15Mcc.xml
+++ /dev/null
@@ -1,23 +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
index a3410056013e..310e1b445560 100644
--- a/src/chrome/content/rules/16personalities.com.xml
+++ b/src/chrome/content/rules/16personalities.com.xml
@@ -6,7 +6,7 @@ Fetch error: http://16personalities.com/ => https://www.16personalities.com/: Cy
(www.)?: Dropped
-->
-
+
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 8015fd84f91b..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/180upload.nl.xml b/src/chrome/content/rules/180upload.nl.xml
deleted file mode 100644
index c03b619c3296..000000000000
--- a/src/chrome/content/rules/180upload.nl.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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 bd91a3bb9823..0d53019744bf 100644
--- a/src/chrome/content/rules/1984.is.xml
+++ b/src/chrome/content/rules/1984.is.xml
@@ -1,33 +1,13 @@
+
-
-
-
-
-
-
-
-
+
+
-
+
-
+
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
index b4df28ef26d4..4a70ef16900a 100644
--- a/src/chrome/content/rules/1984_Hosting.com.xml
+++ b/src/chrome/content/rules/1984_Hosting.com.xml
@@ -18,7 +18,7 @@
-->
-
+
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 4c72dd122d80..000000000000
--- a/src/chrome/content/rules/1Cart.xml
+++ /dev/null
@@ -1,23 +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/1WT.eu.xml b/src/chrome/content/rules/1WT.eu.xml
index 4105beeb0cc7..447d3ec8b679 100644
--- a/src/chrome/content/rules/1WT.eu.xml
+++ b/src/chrome/content/rules/1WT.eu.xml
@@ -1,37 +1,36 @@
-
+
+
+
+
-
-
+
+
-
+
+
+
+
+
-
+
-
-
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/1_Deg.org.xml b/src/chrome/content/rules/1_Deg.org.xml
index a63dea288bd6..ae7de6e4a9c3 100644
--- a/src/chrome/content/rules/1_Deg.org.xml
+++ b/src/chrome/content/rules/1_Deg.org.xml
@@ -1,10 +1,15 @@
-
+
+
+
-
+
diff --git a/src/chrome/content/rules/1and1-Internet.xml b/src/chrome/content/rules/1and1-Internet.xml
index 4ca6f18505d1..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 e6f9793669d6..000000000000
--- a/src/chrome/content/rules/1nightstandstory.xml
+++ /dev/null
@@ -1,11 +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/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/1s_and_0s.nl.xml b/src/chrome/content/rules/1s_and_0s.nl.xml
deleted file mode 100644
index e3a4291e05c1..000000000000
--- a/src/chrome/content/rules/1s_and_0s.nl.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
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
index 30f91a16c67d..652c03f0ee75 100644
--- a/src/chrome/content/rules/1ty.me.xml
+++ b/src/chrome/content/rules/1ty.me.xml
@@ -4,7 +4,6 @@
-
+
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 3ae4d9a4926a..cb1e00ca34df 100644
--- a/src/chrome/content/rules/1und1.de.xml
+++ b/src/chrome/content/rules/1und1.de.xml
@@ -5,96 +5,121 @@
CDN buckets:
- i0.1und1.de.edgesuite.net
-
- - a1254.g.akamai.net
-
- 1und1.ivwbox.de
Nonfunctional subdomains:
- - blog *
- - erfolgscenter *
- - jobs *
- - mirror ²
- - press *
- - service-center *
+ - apps ⁴
+ - login ⁴
+ - mirror ¹
+ - newsroom ²
+ - presse ²
+ - tv ³
- * Refused
- ² Dropped
+ ¹ 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 7864ecd69f19..000000000000
--- a/src/chrome/content/rules/1xbet.com.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/2020mobile.es.xml b/src/chrome/content/rules/2020mobile.es.xml
index bc2d4387f365..7ae5c8dd31c6 100644
--- a/src/chrome/content/rules/2020mobile.es.xml
+++ b/src/chrome/content/rules/2020mobile.es.xml
@@ -1,9 +1,14 @@
+
-
+
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 b4cc983d32ec..000000000000
--- a/src/chrome/content/rules/21_Century_Rims.xml
+++ /dev/null
@@ -1,17 +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 eefed9d724e9..6a76ef026b30 100644
--- a/src/chrome/content/rules/23andMe.com.xml
+++ b/src/chrome/content/rules/23andMe.com.xml
@@ -1,42 +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 8c1095a67051..000000000000
--- a/src/chrome/content/rules/24-7-Media-clients.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/24-7-Media.xml b/src/chrome/content/rules/24-7-Media.xml
index 59d0f4fcbcd2..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-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 12957b211f5b..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 c8d45374ddb4..04ca950d87fa 100644
--- a/src/chrome/content/rules/2Dialog.com.xml
+++ b/src/chrome/content/rules/2Dialog.com.xml
@@ -1,11 +1,16 @@
+
-
+
@@ -14,4 +19,4 @@ Fetch error: http://www.2dialog.com/ => http://www.2dialog.com/: Redirect for 'h
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/2GIS.ru.xml b/src/chrome/content/rules/2GIS.ru.xml
index c73c2d5c62c2..2c34c624788a 100644
--- a/src/chrome/content/rules/2GIS.ru.xml
+++ b/src/chrome/content/rules/2GIS.ru.xml
@@ -20,7 +20,8 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2K_Games.xml b/src/chrome/content/rules/2K_Games.xml
index 0f401d5a9178..f8620958fea3 100644
--- a/src/chrome/content/rules/2K_Games.xml
+++ b/src/chrome/content/rules/2K_Games.xml
@@ -1,71 +1,44 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/2K_Sports.xml b/src/chrome/content/rules/2K_Sports.xml
index 726d5d56c0c5..1e310410bdf5 100644
--- a/src/chrome/content/rules/2K_Sports.xml
+++ b/src/chrome/content/rules/2K_Sports.xml
@@ -1,19 +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
index 7e7f35284570..bf553e49f91a 100644
--- a/src/chrome/content/rules/2ch.cm.xml
+++ b/src/chrome/content/rules/2ch.cm.xml
@@ -1,13 +1,20 @@
-
+
+
+
-
+
-
+
-
+
diff --git a/src/chrome/content/rules/2ch.hk.xml b/src/chrome/content/rules/2ch.hk.xml
index 36e3fa1811ce..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 52c4d714b8dc..f9d314dc2268 100644
--- a/src/chrome/content/rules/2mdn.net.xml
+++ b/src/chrome/content/rules/2mdn.net.xml
@@ -7,12 +7,11 @@
-
+ -->
diff --git a/src/chrome/content/rules/2nd_Vote.com.xml b/src/chrome/content/rules/2nd_Vote.com.xml
index 8bb1131c1f57..93edbf0b5507 100644
--- a/src/chrome/content/rules/2nd_Vote.com.xml
+++ b/src/chrome/content/rules/2nd_Vote.com.xml
@@ -12,7 +12,6 @@
-
+
diff --git a/src/chrome/content/rules/2o7.net.xml b/src/chrome/content/rules/2o7.net.xml
index 9bc4ee728478..a6aa5fa241d6 100644
--- a/src/chrome/content/rules/2o7.net.xml
+++ b/src/chrome/content/rules/2o7.net.xml
@@ -1,24 +1,25 @@
-
-
+
+
+
+
+
-
+
+
+
+
+
+
+
-
+
diff --git a/src/chrome/content/rules/2pay.ru.xml b/src/chrome/content/rules/2pay.ru.xml
index a942fb420480..200d90c53664 100644
--- a/src/chrome/content/rules/2pay.ru.xml
+++ b/src/chrome/content/rules/2pay.ru.xml
@@ -1,18 +1,25 @@
-
+
-
+
+
+
+
-
+
+
diff --git a/src/chrome/content/rules/2shared.xml b/src/chrome/content/rules/2shared.xml
index 30cc94e6945c..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/30_Boxes.com.xml b/src/chrome/content/rules/30_Boxes.com.xml
deleted file mode 100644
index f3d3b645c219..000000000000
--- a/src/chrome/content/rules/30_Boxes.com.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
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 47ff4a7a0824..000000000000
--- a/src/chrome/content/rules/350.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/350zEvolution.com.xml b/src/chrome/content/rules/350zEvolution.com.xml
index a2e0e54394e7..19d1aff7c7a4 100644
--- a/src/chrome/content/rules/350zEvolution.com.xml
+++ b/src/chrome/content/rules/350zEvolution.com.xml
@@ -2,16 +2,15 @@
(www.)?: Refused
-->
-
+
-
+
-
+
-
+
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 9930cd0bb0d7..a61a0136ff17 100644
--- a/src/chrome/content/rules/360Cities.xml
+++ b/src/chrome/content/rules/360Cities.xml
@@ -1,25 +1,15 @@
-
-
+
+
+
+
-
-
-
-
-
+
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
index 56074e2eae4d..4ff7b0d251fd 100644
--- a/src/chrome/content/rules/360buy.com.xml
+++ b/src/chrome/content/rules/360buy.com.xml
@@ -1,12 +1,24 @@
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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
index 226270b8fbd7..9bdad5dd9cad 100644
--- a/src/chrome/content/rules/365_Tickets.co.uk.xml
+++ b/src/chrome/content/rules/365_Tickets.co.uk.xml
@@ -5,7 +5,7 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/365_Tickets_Scotland.com.xml b/src/chrome/content/rules/365_Tickets_Scotland.com.xml
index 0fe78137421d..0472289f0388 100644
--- a/src/chrome/content/rules/365_Tickets_Scotland.com.xml
+++ b/src/chrome/content/rules/365_Tickets_Scotland.com.xml
@@ -5,7 +5,7 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/37Signals.xml b/src/chrome/content/rules/37Signals.xml
index 9b6a3eb568ae..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 9df55238c2b3..3428213ee900 100644
--- a/src/chrome/content/rules/38.de.xml
+++ b/src/chrome/content/rules/38.de.xml
@@ -1,39 +1,38 @@
-
+
-
+
+
+
+
+
+
-
+
-
-
+
+
+
diff --git a/src/chrome/content/rules/38degrees.xml b/src/chrome/content/rules/38degrees.xml
index 0b3b044688e4..a707cc835528 100644
--- a/src/chrome/content/rules/38degrees.xml
+++ b/src/chrome/content/rules/38degrees.xml
@@ -4,15 +4,16 @@
- you
-->
-
+
+
-
+
-
+
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
index 4847f21f7fbd..1e3731d0eb54 100644
--- a/src/chrome/content/rules/39dollarglasses.com.xml
+++ b/src/chrome/content/rules/39dollarglasses.com.xml
@@ -2,5 +2,5 @@
-
+
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 8bec6ac42e05..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
index a80de50833e1..6b4c6a76482a 100644
--- a/src/chrome/content/rules/3D_Robotics.com.xml
+++ b/src/chrome/content/rules/3D_Robotics.com.xml
@@ -1,4 +1,8 @@
+
-
+
-
+
+
-
+
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 6260a1a11601..000000000000
--- a/src/chrome/content/rules/3FM.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
diff --git a/src/chrome/content/rules/3M.com.xml b/src/chrome/content/rules/3M.com.xml
index 4d782fc91ad3..6caa5297b33e 100644
--- a/src/chrome/content/rules/3M.com.xml
+++ b/src/chrome/content/rules/3M.com.xml
@@ -28,7 +28,9 @@
-
+
+
+
-
-
-
-
-
-
-
-
-
+
+
-
+ to="https://cdn.mediaworks.nz/" />
diff --git a/src/chrome/content/rules/3bbwifi.com.xml b/src/chrome/content/rules/3bbwifi.com.xml
index 5bef001a0c4c..1fb8eaca8f1a 100644
--- a/src/chrome/content/rules/3bbwifi.com.xml
+++ b/src/chrome/content/rules/3bbwifi.com.xml
@@ -1,4 +1,11 @@
-
+
+
+
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/3dcenter.xml b/src/chrome/content/rules/3dcenter.xml
deleted file mode 100644
index 771b7d281bf5..000000000000
--- a/src/chrome/content/rules/3dcenter.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
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 c6262867f57e..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 12632442fd57..000000000000
--- a/src/chrome/content/rules/3scale.xml
+++ /dev/null
@@ -1,35 +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
index 8ad6551bbfbb..dc83a2b302dd 100644
--- a/src/chrome/content/rules/419_Eater.com.xml
+++ b/src/chrome/content/rules/419_Eater.com.xml
@@ -19,7 +19,6 @@
-
+
diff --git a/src/chrome/content/rules/42Floors.com.xml b/src/chrome/content/rules/42Floors.com.xml
index 233a03b70f2e..9f821890956b 100644
--- a/src/chrome/content/rules/42Floors.com.xml
+++ b/src/chrome/content/rules/42Floors.com.xml
@@ -1,4 +1,8 @@
+
-
+
+
+
+
-
+
diff --git a/src/chrome/content/rules/435_by_MJC.com.xml b/src/chrome/content/rules/435_by_MJC.com.xml
index 0f82cf965143..b12646d38f12 100644
--- a/src/chrome/content/rules/435_by_MJC.com.xml
+++ b/src/chrome/content/rules/435_by_MJC.com.xml
@@ -1,5 +1,8 @@
+
-
+
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 cdbfdeecda76..1e5017b81d8c 100644
--- a/src/chrome/content/rules/451-Group.xml
+++ b/src/chrome/content/rules/451-Group.xml
@@ -1,15 +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
index 4e7bea2a9cbe..6f1a42a0fc40 100644
--- a/src/chrome/content/rules/48months.ie.xml
+++ b/src/chrome/content/rules/48months.ie.xml
@@ -1,4 +1,5 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 a1ef3c998244..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 576b8bf3d6e1..000000000000
--- a/src/chrome/content/rules/4RX.com.xml
+++ /dev/null
@@ -1,21 +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 ce9cd6e6d613..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 855abcf4e558..000000000000
--- a/src/chrome/content/rules/4_Free_Proxy.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
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 f6d2071badf2..2fb4acd8e0f2 100644
--- a/src/chrome/content/rules/4chan.xml
+++ b/src/chrome/content/rules/4chan.xml
@@ -1,61 +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
index ec2c7bd9fecb..71b01abd0ce2 100644
--- a/src/chrome/content/rules/4plebs.org.xml
+++ b/src/chrome/content/rules/4plebs.org.xml
@@ -1,7 +1,8 @@
-
+
+
-
+
diff --git a/src/chrome/content/rules/4sqi.net.xml b/src/chrome/content/rules/4sqi.net.xml
index 92a09d87b65a..6fc5dd4bd04e 100644
--- a/src/chrome/content/rules/4sqi.net.xml
+++ b/src/chrome/content/rules/4sqi.net.xml
@@ -14,6 +14,7 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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
index 39507278cb21..43ec0ee6e664 100644
--- a/src/chrome/content/rules/500px.com.xml
+++ b/src/chrome/content/rules/500px.com.xml
@@ -4,13 +4,11 @@
- 500px.org.xml
- Fully covered subdomains:
+ Problematic hosts in *500px.com:
- - (www.)
- - developers
- - iso
- - prime
- - support
+ - developers *
+
+ * Mismatched
These altnames don't exist:
@@ -25,12 +23,12 @@
- developers.500px.com
-->
-
+
-
+
@@ -39,11 +37,10 @@
-
+
-
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
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
index 6bfb2da88934..d30718f0d489 100644
--- a/src/chrome/content/rules/511tactical.com.xml
+++ b/src/chrome/content/rules/511tactical.com.xml
@@ -2,5 +2,5 @@
-
+
diff --git a/src/chrome/content/rules/512_Pixels.xml b/src/chrome/content/rules/512_Pixels.xml
index 0cc16953ce18..fdbff58ff261 100644
--- a/src/chrome/content/rules/512_Pixels.xml
+++ b/src/chrome/content/rules/512_Pixels.xml
@@ -1,17 +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
index 25ad62c4cf4e..d1bb32bf6765 100644
--- a/src/chrome/content/rules/55ch.org.xml
+++ b/src/chrome/content/rules/55ch.org.xml
@@ -1,13 +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
index 099c18aa7b19..03045fe68084 100644
--- a/src/chrome/content/rules/5_July.org.xml
+++ b/src/chrome/content/rules/5_July.org.xml
@@ -1,7 +1,8 @@
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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 943a96c369b3..b7fcc5b390e4 100644
--- a/src/chrome/content/rules/5min.com.xml
+++ b/src/chrome/content/rules/5min.com.xml
@@ -1,4 +1,19 @@
+
-
+
@@ -75,12 +71,15 @@
+
+
+
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
index 93aebb596b9a..b010eaf9dbf6 100644
--- a/src/chrome/content/rules/64Px.com.xml
+++ b/src/chrome/content/rules/64Px.com.xml
@@ -1,14 +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/6PM.com.xml b/src/chrome/content/rules/6PM.com.xml
deleted file mode 100644
index eead38441978..000000000000
--- a/src/chrome/content/rules/6PM.com.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/6Scan.com.xml b/src/chrome/content/rules/6Scan.com.xml
deleted file mode 100644
index ed18b739034c..000000000000
--- a/src/chrome/content/rules/6Scan.com.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/6Wunderkinder.xml b/src/chrome/content/rules/6Wunderkinder.xml
index 04154c8ec6ce..d6503316b982 100644
--- a/src/chrome/content/rules/6Wunderkinder.xml
+++ b/src/chrome/content/rules/6Wunderkinder.xml
@@ -1,10 +1,4 @@
-
-
+
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 f3fb2f0c413c..41c0554a742a 100644
--- a/src/chrome/content/rules/6xq.net.xml
+++ b/src/chrome/content/rules/6xq.net.xml
@@ -1,15 +1,16 @@
-
+ Non-functional hosts
+ SSL peer certificate was not OK:
+ - ns.6xq.net
+
+ Connection refused:
+ - luna.6xq.net
-
-
+-->
+
+
-
-
+
+
diff --git a/src/chrome/content/rules/7-Eleven.com.xml b/src/chrome/content/rules/7-Eleven.com.xml
index 471f29475983..cbbdbba3b91b 100644
--- a/src/chrome/content/rules/7-Eleven.com.xml
+++ b/src/chrome/content/rules/7-Eleven.com.xml
@@ -1,50 +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 9ff3201bb8cf..000000000000
--- a/src/chrome/content/rules/77777i.com.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/777coin.com.xml b/src/chrome/content/rules/777coin.com.xml
deleted file mode 100644
index 9329fa852f99..000000000000
--- a/src/chrome/content/rules/777coin.com.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/7Headlines.com.xml b/src/chrome/content/rules/7Headlines.com.xml
deleted file mode 100644
index 680d8ab6d56b..000000000000
--- a/src/chrome/content/rules/7Headlines.com.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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 659e35199576..e664eb7b535e 100644
--- a/src/chrome/content/rules/7_Springs.com.xml
+++ b/src/chrome/content/rules/7_Springs.com.xml
@@ -15,7 +15,7 @@ Fetch error: http://www.7springs.com/ => https://www.7springs.com/: (7, 'Failed
- Images on (www.) from www.7springsresortrealty.com
-->
-
+
@@ -24,7 +24,6 @@ Fetch error: http://www.7springs.com/ => https://www.7springs.com/: (7, 'Failed
-
+
diff --git a/src/chrome/content/rules/7chan.xml b/src/chrome/content/rules/7chan.xml
index c66e1505d759..21add2a99dab 100644
--- a/src/chrome/content/rules/7chan.xml
+++ b/src/chrome/content/rules/7chan.xml
@@ -1,6 +1,25 @@
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/7digital.xml b/src/chrome/content/rules/7digital.xml
index 43bd1e1cdd09..08e22129a2fe 100644
--- a/src/chrome/content/rules/7digital.xml
+++ b/src/chrome/content/rules/7digital.xml
@@ -1,52 +1,48 @@
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
diff --git a/src/chrome/content/rules/7eer.net.xml b/src/chrome/content/rules/7eer.net.xml
index aec927729569..b7832bd222a7 100644
--- a/src/chrome/content/rules/7eer.net.xml
+++ b/src/chrome/content/rules/7eer.net.xml
@@ -2,10 +2,9 @@
For other Impact Radius coverage, see Impact-Radius.xml.
- Fully covered hosts in *7eer.net:
+ Insecure cookies are set for these hosts:
- - (www.)?
- - manilla
+ - hilton.7eer.net
Included on 3rd-party websites.
@@ -16,11 +15,16 @@
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/7terminals.com.xml b/src/chrome/content/rules/7terminals.com.xml
deleted file mode 100644
index d98f7fffbb5f..000000000000
--- a/src/chrome/content/rules/7terminals.com.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
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
index 25d7e15a8b9e..70b4a871ac3d 100644
--- a/src/chrome/content/rules/888173.net.xml
+++ b/src/chrome/content/rules/888173.net.xml
@@ -22,7 +22,6 @@
-
+
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/8R.com.xml b/src/chrome/content/rules/8R.com.xml
deleted file mode 100644
index 7b9f46785808..000000000000
--- a/src/chrome/content/rules/8R.com.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/8ch.net.xml b/src/chrome/content/rules/8ch.net.xml
index 469c24d54a09..24e9d5f9e353 100644
--- a/src/chrome/content/rules/8ch.net.xml
+++ b/src/chrome/content/rules/8ch.net.xml
@@ -1,13 +1,28 @@
+
+
-
+
+
+
+
+
+
+
-
+
-
+
diff --git a/src/chrome/content/rules/8chan.co.xml b/src/chrome/content/rules/8chan.co.xml
deleted file mode 100644
index f7948bb70b93..000000000000
--- a/src/chrome/content/rules/8chan.co.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/8tracks.xml b/src/chrome/content/rules/8tracks.xml
index 50e724911b61..308b6769ec64 100644
--- a/src/chrome/content/rules/8tracks.xml
+++ b/src/chrome/content/rules/8tracks.xml
@@ -1,4 +1,8 @@
+
-
+
diff --git a/src/chrome/content/rules/8win88win.com.xml b/src/chrome/content/rules/8win88win.com.xml
deleted file mode 100644
index 6666593e18a4..000000000000
--- a/src/chrome/content/rules/8win88win.com.xml
+++ /dev/null
@@ -1,17 +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/918autoloans.com.xml b/src/chrome/content/rules/918autoloans.com.xml
deleted file mode 100644
index dec92c9369dc..000000000000
--- a/src/chrome/content/rules/918autoloans.com.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
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/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/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 809b08385403..000000000000
--- a/src/chrome/content/rules/9gag.xml
+++ /dev/null
@@ -1,56 +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 dba7aa714d4b..40431ba03c0c 100644
--- a/src/chrome/content/rules/9seeds.xml
+++ b/src/chrome/content/rules/9seeds.xml
@@ -1,12 +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 e919d36659e1..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.fsdn.com.xml b/src/chrome/content/rules/A.fsdn.com.xml
deleted file mode 100644
index 8339d01eb007..000000000000
--- a/src/chrome/content/rules/A.fsdn.com.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/A1-Telekom-Austria.xml b/src/chrome/content/rules/A1-Telekom-Austria.xml
index 2156650e1484..d8bd5ed93666 100644
--- a/src/chrome/content/rules/A1-Telekom-Austria.xml
+++ b/src/chrome/content/rules/A1-Telekom-Austria.xml
@@ -9,8 +9,10 @@
Problematic domains:
+ - a1community.net ¹
- (www.)?telekom.at *
+ ¹ Expired
* Handshake fails
@@ -20,6 +22,9 @@
-->
+
+
@@ -27,10 +32,16 @@
-
-
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/A14_Electronics.com.xml b/src/chrome/content/rules/A14_Electronics.com.xml
index b0621f34ff6e..d4328c44642b 100644
--- a/src/chrome/content/rules/A14_Electronics.com.xml
+++ b/src/chrome/content/rules/A14_Electronics.com.xml
@@ -1,7 +1,13 @@
-
+
+
+
-
+
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
-
+
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 e0e51a5db981..000000000000
--- a/src/chrome/content/rules/A3li.xml
+++ /dev/null
@@ -1,15 +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 cc6b83fbfd8f..08202c62838a 100644
--- a/src/chrome/content/rules/A4apphack-mismatches.xml
+++ b/src/chrome/content/rules/A4apphack-mismatches.xml
@@ -1,12 +1,9 @@
-
-
+
-
+
+
diff --git a/src/chrome/content/rules/A4apphack.xml b/src/chrome/content/rules/A4apphack.xml
deleted file mode 100644
index 95da43418382..000000000000
--- a/src/chrome/content/rules/A4apphack.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
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 1d0f46fc72cf..000000000000
--- a/src/chrome/content/rules/AA.xml
+++ /dev/null
@@ -1,14 +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/AACQA.xml b/src/chrome/content/rules/AACQA.xml
deleted file mode 100644
index 2c4b45ab45db..000000000000
--- a/src/chrome/content/rules/AACQA.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
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
index af9644f35d94..f8c3550abe99 100644
--- a/src/chrome/content/rules/AAS.org.xml
+++ b/src/chrome/content/rules/AAS.org.xml
@@ -1,5 +1,12 @@
+
-
+
+
-
+
+
+
+
+
+
+
+
+
-
-
+
+
+
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
index 96584e265b51..13d4451b2a2c 100644
--- a/src/chrome/content/rules/AAU.at.xml
+++ b/src/chrome/content/rules/AAU.at.xml
@@ -3,7 +3,6 @@
-
+
diff --git a/src/chrome/content/rules/AB9IL.net.xml b/src/chrome/content/rules/AB9IL.net.xml
index 3e09bdddb8e8..5473f1b45291 100644
--- a/src/chrome/content/rules/AB9IL.net.xml
+++ b/src/chrome/content/rules/AB9IL.net.xml
@@ -4,7 +4,6 @@
-
+
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 7937c585203a..16ca8477add4 100644
--- a/src/chrome/content/rules/ABC-Online.xml
+++ b/src/chrome/content/rules/ABC-Online.xml
@@ -3,48 +3,21 @@
- ABC-Music-Publishing.xml
-
- CDN buckets:
-
- - d1ros97qkrwjf5.cloudfront.net
- - d3mfbaa198drag.cloudfront.net
- - cp44823.edgefcs.net
-
-
- Nonfunctional:
-
- - about.abc.net.au ¹
- - mpegmedia.abc.net.au ²
- - origin.abc.net.au ³ (redirects to www via http)
- - (www.)abc.net.au ²
- - www2b.abc.net.au ³
- - (www.)abccommercial.com.au ³
- - (www.)abccontentsales.com.au ³
- - (www.)abcdigmusic.net.au
- - (www.)radioaustralianews.net.au ³
- - (www.)triplejunearthed.com ³
-
- ¹ 503, akamai
- ² 504, akamai
- ³ Dropped
-
+ 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-falsemixed.xml b/src/chrome/content/rules/ABC_News-falsemixed.xml
deleted file mode 100644
index 545b1c03f9a7..000000000000
--- a/src/chrome/content/rules/ABC_News-falsemixed.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/ABC_News.xml b/src/chrome/content/rules/ABC_News.xml
deleted file mode 100644
index d98161faef17..000000000000
--- a/src/chrome/content/rules/ABC_News.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
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 ab1688e5b55b..521722787d60 100644
--- a/src/chrome/content/rules/ABNAMRO.xml
+++ b/src/chrome/content/rules/ABNAMRO.xml
@@ -18,7 +18,6 @@
-
+
diff --git a/src/chrome/content/rules/ABestWeb.com.xml b/src/chrome/content/rules/ABestWeb.com.xml
deleted file mode 100644
index a1bd6ca46690..000000000000
--- a/src/chrome/content/rules/ABestWeb.com.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/ACCAN.xml b/src/chrome/content/rules/ACCAN.xml
index e58c1dc05b89..2e4e08a95249 100644
--- a/src/chrome/content/rules/ACCAN.xml
+++ b/src/chrome/content/rules/ACCAN.xml
@@ -1,11 +1,6 @@
-
-
+
-
+
-
-
\ No newline at end of file
+
+
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-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-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 3cf4f63baa57..b28775ab5f0e 100644
--- a/src/chrome/content/rules/ACLU-of-Texas.xml
+++ b/src/chrome/content/rules/ACLU-of-Texas.xml
@@ -1,10 +1,9 @@
-
+
-
+
diff --git a/src/chrome/content/rules/ACLU-of-Washington.xml b/src/chrome/content/rules/ACLU-of-Washington.xml
index 728cae22cdac..b3f188e18f57 100644
--- a/src/chrome/content/rules/ACLU-of-Washington.xml
+++ b/src/chrome/content/rules/ACLU-of-Washington.xml
@@ -1,7 +1,13 @@
-
+
+
-
+
diff --git a/src/chrome/content/rules/ACLU.xml b/src/chrome/content/rules/ACLU.xml
index e0f4a0cdf92f..e2421d90b3e1 100644
--- a/src/chrome/content/rules/ACLU.xml
+++ b/src/chrome/content/rules/ACLU.xml
@@ -1,40 +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_Northern_California.xml b/src/chrome/content/rules/ACLU_of_Northern_California.xml
index e8c117c57a1f..c196cf298dd1 100644
--- a/src/chrome/content/rules/ACLU_of_Northern_California.xml
+++ b/src/chrome/content/rules/ACLU_of_Northern_California.xml
@@ -10,7 +10,7 @@
-
+
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/ACM.org.xml b/src/chrome/content/rules/ACM.org.xml
index 900ff9915ef4..e764b43d69ed 100644
--- a/src/chrome/content/rules/ACM.org.xml
+++ b/src/chrome/content/rules/ACM.org.xml
@@ -1,134 +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
index 323ea1540d00..b6a0fda4bd43 100644
--- a/src/chrome/content/rules/ACSAC.org.xml
+++ b/src/chrome/content/rules/ACSAC.org.xml
@@ -1,7 +1,5 @@
-
diff --git a/src/chrome/content/rules/ACTION_Kooperative.xml b/src/chrome/content/rules/ACTION_Kooperative.xml
index 0fbc4dd1bcd9..e51c28a9f031 100644
--- a/src/chrome/content/rules/ACTION_Kooperative.xml
+++ b/src/chrome/content/rules/ACTION_Kooperative.xml
@@ -1,8 +1,12 @@
+
-
+
@@ -10,7 +14,6 @@ Fetch error: http://mail.action.at/ => https://mail.action.at/: (51, "SSL: no al
-
+
-
\ 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 a0d0a4ab6f5b..67386ac06618 100644
--- a/src/chrome/content/rules/ADD-Assoc-Southern-Region.xml
+++ b/src/chrome/content/rules/ADD-Assoc-Southern-Region.xml
@@ -1,9 +1,14 @@
+
-
+
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 f365e2d9f44e..f4057bb2a8ae 100644
--- a/src/chrome/content/rules/ADP_Retirement_Services.xml
+++ b/src/chrome/content/rules/ADP_Retirement_Services.xml
@@ -1,4 +1,16 @@
-
+
+
+
+
+
diff --git a/src/chrome/content/rules/ADP_VirtualEdge.xml b/src/chrome/content/rules/ADP_VirtualEdge.xml
deleted file mode 100644
index 51df1c39731f..000000000000
--- a/src/chrome/content/rules/ADP_VirtualEdge.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/ADTmag.com.xml b/src/chrome/content/rules/ADTmag.com.xml
index 978f769211c6..471ddb8d8d16 100644
--- a/src/chrome/content/rules/ADTmag.com.xml
+++ b/src/chrome/content/rules/ADTmag.com.xml
@@ -19,7 +19,7 @@
-->
-
+
+
+
+
+
+
+
+
+
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/AEMI.xml b/src/chrome/content/rules/AEMI.xml
deleted file mode 100644
index 1ab878a83778..000000000000
--- a/src/chrome/content/rules/AEMI.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
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 @@
-
+
-
-
+
+
+
+
+
-
-
-
-
-
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AFP548.com-falsemixed.xml b/src/chrome/content/rules/AFP548.com-falsemixed.xml
deleted file mode 100644
index c6d943b98d2b..000000000000
--- a/src/chrome/content/rules/AFP548.com-falsemixed.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/AFP548.com.xml b/src/chrome/content/rules/AFP548.com.xml
deleted file mode 100644
index b05eb5e020d0..000000000000
--- a/src/chrome/content/rules/AFP548.com.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/AFRA-Berlin.de.xml b/src/chrome/content/rules/AFRA-Berlin.de.xml
index 449968d0a49a..7eef09e09dc4 100644
--- a/src/chrome/content/rules/AFRA-Berlin.de.xml
+++ b/src/chrome/content/rules/AFRA-Berlin.de.xml
@@ -4,7 +4,6 @@
-
+
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/AGU.org.xml b/src/chrome/content/rules/AGU.org.xml
index 8305150879b9..04da98e0bc22 100644
--- a/src/chrome/content/rules/AGU.org.xml
+++ b/src/chrome/content/rules/AGU.org.xml
@@ -56,7 +56,23 @@
-->
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AIA-Surety.xml b/src/chrome/content/rules/AIA-Surety.xml
index f92895fe5001..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/AIM.com.xml b/src/chrome/content/rules/AIM.com.xml
deleted file mode 100644
index 5ba924f8d68d..000000000000
--- a/src/chrome/content/rules/AIM.com.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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 5beaac902a57..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 a02eed41ea82..eeb1614bde8d 100644
--- a/src/chrome/content/rules/AJs_Ski_and_Sports.xml
+++ b/src/chrome/content/rules/AJs_Ski_and_Sports.xml
@@ -1,17 +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 df9e2cd6b95b..325f0ef16767 100644
--- a/src/chrome/content/rules/AK-Vorrat.de.xml
+++ b/src/chrome/content/rules/AK-Vorrat.de.xml
@@ -1,17 +1,30 @@
-
+
-
-
-
-
+
+
+
+
-
+
diff --git a/src/chrome/content/rules/AKA.ms.xml b/src/chrome/content/rules/AKA.ms.xml
index 273c19e90c98..3cb49cab2d2f 100644
--- a/src/chrome/content/rules/AKA.ms.xml
+++ b/src/chrome/content/rules/AKA.ms.xml
@@ -18,7 +18,7 @@
-->
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AK_Vorrat.org.xml b/src/chrome/content/rules/AK_Vorrat.org.xml
index c210b36105ea..af3a833e0464 100644
--- a/src/chrome/content/rules/AK_Vorrat.org.xml
+++ b/src/chrome/content/rules/AK_Vorrat.org.xml
@@ -1,29 +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 df5b278d0b70..a3aec17cc9a1 100644
--- a/src/chrome/content/rules/ALDI.xml
+++ b/src/chrome/content/rules/ALDI.xml
@@ -1,5 +1,11 @@
+
-
+
@@ -131,6 +137,8 @@ Refused:
to="https://www.alditalk.de/"/>
+
+
+
+
+
+
+
+
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/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 f0b4bd5eb097..000000000000
--- a/src/chrome/content/rules/AM-Best-Company.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/AMC.xml b/src/chrome/content/rules/AMC.xml
index ecf9a2ed53c7..afe918873fd2 100644
--- a/src/chrome/content/rules/AMC.xml
+++ b/src/chrome/content/rules/AMC.xml
@@ -1,28 +1,57 @@
+
-
+
+
+
+
+
+
-
-
+
+
-
-
+
diff --git a/src/chrome/content/rules/AMCTheatres.xml b/src/chrome/content/rules/AMCTheatres.xml
index 8fa4808c36eb..14015ed51587 100644
--- a/src/chrome/content/rules/AMCTheatres.xml
+++ b/src/chrome/content/rules/AMCTheatres.xml
@@ -2,7 +2,7 @@
-
+
-
+
diff --git a/src/chrome/content/rules/AMI.com.xml b/src/chrome/content/rules/AMI.com.xml
index 20dfe54732cd..58c50f395f99 100644
--- a/src/chrome/content/rules/AMI.com.xml
+++ b/src/chrome/content/rules/AMI.com.xml
@@ -1,15 +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
index c875bfab1799..ced1f5703c86 100644
--- a/src/chrome/content/rules/AMS.org.xml
+++ b/src/chrome/content/rules/AMS.org.xml
@@ -1,18 +1,67 @@
-
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
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
index c1ed3f136cc3..d469d853050e 100644
--- a/src/chrome/content/rules/AMetSoc.org.xml
+++ b/src/chrome/content/rules/AMetSoc.org.xml
@@ -41,7 +41,11 @@
-
+
+
+
+
+
@@ -61,7 +65,6 @@
-
+
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 de970b0b1e73..dd067ee6eabe 100644
--- a/src/chrome/content/rules/ANB.xml
+++ b/src/chrome/content/rules/ANB.xml
@@ -2,12 +2,14 @@
Disabled by https-everywhere-checker because:
Fetch error: http://anb.com.sa/ => https://www.anb.com.sa/: (60, 'SSL certificate problem: unable to get local issuer certificate')
-->
-
+
-
+
+
+
+
-
+
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
index 135f34675ef3..379607bbbb6a 100644
--- a/src/chrome/content/rules/ANXBTC.com.xml
+++ b/src/chrome/content/rules/ANXBTC.com.xml
@@ -1,7 +1,7 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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
index 40330abfeb81..06ff40fa07da 100644
--- a/src/chrome/content/rules/AOE.com.xml
+++ b/src/chrome/content/rules/AOE.com.xml
@@ -1,39 +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 5b75b08d524a..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.co.uk.xml b/src/chrome/content/rules/AOL.co.uk.xml
index 5c0bb63d55ad..72b211311c22 100644
--- a/src/chrome/content/rules/AOL.co.uk.xml
+++ b/src/chrome/content/rules/AOL.co.uk.xml
@@ -1,4 +1,9 @@
+
-
+
diff --git a/src/chrome/content/rules/AOL.xml b/src/chrome/content/rules/AOL.xml
index fe8805ec75bd..739e8f0a35bf 100644
--- a/src/chrome/content/rules/AOL.xml
+++ b/src/chrome/content/rules/AOL.xml
@@ -1,27 +1,43 @@
+
-
-
-
+
+
+
+
-
+
+
+
-
-
+
+
-
+
+
-
+
-
-
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
+
-
-
-
-
-
+
+
@@ -223,28 +233,25 @@
-
+
+
+
+
-
-
-
-
-
-
+
+
-
+
diff --git a/src/chrome/content/rules/AOL_CDN.com.xml b/src/chrome/content/rules/AOL_CDN.com.xml
deleted file mode 100644
index 16b9f2bd3f38..000000000000
--- a/src/chrome/content/rules/AOL_CDN.com.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/AOL_On_Network.com.xml b/src/chrome/content/rules/AOL_On_Network.com.xml
index a38ef77ebabd..d35b503ef5f8 100644
--- a/src/chrome/content/rules/AOL_On_Network.com.xml
+++ b/src/chrome/content/rules/AOL_On_Network.com.xml
@@ -1,4 +1,9 @@
+
-
+
-
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/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.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 a87d4e4db988..ff649f12f6af 100644
--- a/src/chrome/content/rules/APC-Magazine.xml
+++ b/src/chrome/content/rules/APC-Magazine.xml
@@ -1,20 +1,13 @@
-
-
+
-
+
-
-
+
diff --git a/src/chrome/content/rules/APM.com.xml b/src/chrome/content/rules/APM.com.xml
index 0effacf6dec6..b91da56916a9 100644
--- a/src/chrome/content/rules/APM.com.xml
+++ b/src/chrome/content/rules/APM.com.xml
@@ -1,14 +1,19 @@
+
-
+
-
+
+
-
-
-
-
-
-
-
-
\ 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
index f6e521dcbd78..01e66c0fa42c 100644
--- a/src/chrome/content/rules/APO_Box.com.xml
+++ b/src/chrome/content/rules/APO_Box.com.xml
@@ -1,7 +1,8 @@
-
+
+
+
+
+
-
-
-
\ No newline at end of file
+
+
+
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
index fd1f35f67169..abdd3f435706 100644
--- a/src/chrome/content/rules/AR15.com.xml
+++ b/src/chrome/content/rules/AR15.com.xml
@@ -17,10 +17,12 @@
- www from $self
- www from i\d+.photobucket.com
- - www from s\d+.postimg.org
+ - www from s\d+.postimg.org ˢ
- favicon on www from $self
+ ˢ Secured by us
+
-->
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-problematic.xml b/src/chrome/content/rules/ARM.com-problematic.xml
deleted file mode 100644
index 8a3d32d0d862..000000000000
--- a/src/chrome/content/rules/ARM.com-problematic.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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 d3ffb96f1b3d..000000000000
--- a/src/chrome/content/rules/ARM.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/ARPNetworks.com.xml b/src/chrome/content/rules/ARPNetworks.com.xml
index b333d269b099..ecf8995b7457 100644
--- a/src/chrome/content/rules/ARPNetworks.com.xml
+++ b/src/chrome/content/rules/ARPNetworks.com.xml
@@ -5,10 +5,12 @@
-
+
+
+
-
+
-
+
+
+
+
+
+
-
+
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/ASADA.xml b/src/chrome/content/rules/ASADA.xml
index b6c5017fbdb3..1c625d72e705 100644
--- a/src/chrome/content/rules/ASADA.xml
+++ b/src/chrome/content/rules/ASADA.xml
@@ -1,11 +1,7 @@
-
-
+
-
+
-
\ No newline at end of file
+
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 a56ef9e5eab3..ca73bd774aae 100644
--- a/src/chrome/content/rules/ASDA.xml
+++ b/src/chrome/content/rules/ASDA.xml
@@ -1,66 +1,200 @@
+
-
+ 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/
+
+-->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
diff --git a/src/chrome/content/rules/ASIC.xml b/src/chrome/content/rules/ASIC.xml
index e7bbe57158f2..fe299f2a8b59 100644
--- a/src/chrome/content/rules/ASIC.xml
+++ b/src/chrome/content/rules/ASIC.xml
@@ -1,10 +1,12 @@
-
+
+
+
-
\ No newline at end of file
+
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
index 74a0298f1d86..2dd590cc6051 100644
--- a/src/chrome/content/rules/ASL19.org.xml
+++ b/src/chrome/content/rules/ASL19.org.xml
@@ -9,13 +9,12 @@
-
+
-
+
diff --git a/src/chrome/content/rules/ASN_Bank.nl-problematic.xml b/src/chrome/content/rules/ASN_Bank.nl-problematic.xml
deleted file mode 100644
index eb0ae32eee7d..000000000000
--- a/src/chrome/content/rules/ASN_Bank.nl-problematic.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/ASN_Bank.nl.xml b/src/chrome/content/rules/ASN_Bank.nl.xml
index 3ddc5632588c..00d6562e6a72 100644
--- a/src/chrome/content/rules/ASN_Bank.nl.xml
+++ b/src/chrome/content/rules/ASN_Bank.nl.xml
@@ -1,48 +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 c30c000fb807..000000000000
--- a/src/chrome/content/rules/ASP.NET.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/ASPPlayground.NET.xml b/src/chrome/content/rules/ASPPlayground.NET.xml
index 8bf8cb61996b..c9d9a6f889e7 100644
--- a/src/chrome/content/rules/ASPPlayground.NET.xml
+++ b/src/chrome/content/rules/ASPPlayground.NET.xml
@@ -1,17 +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 54914b2581ce..000000000000
--- a/src/chrome/content/rules/ASUS.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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 ef04a1edf885..8b3c127c4237 100644
--- a/src/chrome/content/rules/ATV.hu.xml
+++ b/src/chrome/content/rules/ATV.hu.xml
@@ -1,11 +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 21766f684284..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 dfa03dc540ce..f629ce66a871 100644
--- a/src/chrome/content/rules/ATech_Media.xml
+++ b/src/chrome/content/rules/ATech_Media.xml
@@ -1,56 +1,86 @@
-
+
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
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 24a31d758585..000000000000
--- a/src/chrome/content/rules/AV-Comparatives.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
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/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 1ff96c77cda6..000000000000
--- a/src/chrome/content/rules/AWeber-Communications.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
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 8478203e9735..000000000000
--- a/src/chrome/content/rules/AWeber.xml
+++ /dev/null
@@ -1,103 +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
+
+
diff --git a/src/chrome/content/rules/AZHCA.org.xml b/src/chrome/content/rules/AZHCA.org.xml
index feeaa83f37e6..fe20a8dc163c 100644
--- a/src/chrome/content/rules/AZHCA.org.xml
+++ b/src/chrome/content/rules/AZHCA.org.xml
@@ -1,17 +1,26 @@
-
-
-
-
+
+
-
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/A_1000_Words.com.xml b/src/chrome/content/rules/A_1000_Words.com.xml
index 31668606bc36..0490eb9e8771 100644
--- a/src/chrome/content/rules/A_1000_Words.com.xml
+++ b/src/chrome/content/rules/A_1000_Words.com.xml
@@ -1,13 +1,11 @@
-
+
-
+
diff --git a/src/chrome/content/rules/A_Bigger_Society.com.xml b/src/chrome/content/rules/A_Bigger_Society.com.xml
index a38b913cb568..d629c46fbe0c 100644
--- a/src/chrome/content/rules/A_Bigger_Society.com.xml
+++ b/src/chrome/content/rules/A_Bigger_Society.com.xml
@@ -6,10 +6,12 @@
* Secured by us
-->
-
+
+
-
+
-
+
diff --git a/src/chrome/content/rules/A_Voice_for_Men.com.xml b/src/chrome/content/rules/A_Voice_for_Men.com.xml
index 45f8182a7f71..0ffa40540783 100644
--- a/src/chrome/content/rules/A_Voice_for_Men.com.xml
+++ b/src/chrome/content/rules/A_Voice_for_Men.com.xml
@@ -3,13 +3,12 @@ Automatically by https-everywhere-checker because:
Fetch error: http://avoiceformen.com/ => https://avoiceformen.com/: Cycle detected - URL already encountered: https://avoiceformen.com/
Fetch error: http://www.avoiceformen.com/ => https://www.avoiceformen.com/: Cycle detected - URL already encountered: https://www.avoiceformen.com/
-->
-
+
-
+
diff --git a/src/chrome/content/rules/A_Weird_Imagination.net.xml b/src/chrome/content/rules/A_Weird_Imagination.net.xml
new file mode 100644
index 000000000000..d08bf8a4c81e
--- /dev/null
+++ b/src/chrome/content/rules/A_Weird_Imagination.net.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Aaai.org.xml b/src/chrome/content/rules/Aaai.org.xml
deleted file mode 100644
index c9d680755d6b..000000000000
--- a/src/chrome/content/rules/Aaai.org.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Aachener_Zeitung.de.xml b/src/chrome/content/rules/Aachener_Zeitung.de.xml
new file mode 100644
index 000000000000..e98db9092f42
--- /dev/null
+++ b/src/chrome/content/rules/Aachener_Zeitung.de.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Aalborg_University.xml b/src/chrome/content/rules/Aalborg_University.xml
index dd21e4b913bb..5baf364cbd2c 100644
--- a/src/chrome/content/rules/Aalborg_University.xml
+++ b/src/chrome/content/rules/Aalborg_University.xml
@@ -26,13 +26,14 @@
-->
+
-
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Aalto.fi.xml b/src/chrome/content/rules/Aalto.fi.xml
new file mode 100644
index 000000000000..3079280ca18c
--- /dev/null
+++ b/src/chrome/content/rules/Aalto.fi.xml
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Aan.sh.xml b/src/chrome/content/rules/Aan.sh.xml
new file mode 100644
index 000000000000..820fa6fd6e59
--- /dev/null
+++ b/src/chrome/content/rules/Aan.sh.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Aaron_Brothers.xml b/src/chrome/content/rules/Aaron_Brothers.xml
deleted file mode 100644
index 657245e34df5..000000000000
--- a/src/chrome/content/rules/Aaron_Brothers.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/Aaron_D_Campbell.com.xml b/src/chrome/content/rules/Aaron_D_Campbell.com.xml
new file mode 100644
index 000000000000..eb59159eb16e
--- /dev/null
+++ b/src/chrome/content/rules/Aaron_D_Campbell.com.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Aaron_Lindsay.com.xml b/src/chrome/content/rules/Aaron_Lindsay.com.xml
new file mode 100644
index 000000000000..7c4f121a5687
--- /dev/null
+++ b/src/chrome/content/rules/Aaron_Lindsay.com.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Aaronparecki.com.xml b/src/chrome/content/rules/Aaronparecki.com.xml
index 1a535d934ae9..1b241095b902 100644
--- a/src/chrome/content/rules/Aaronparecki.com.xml
+++ b/src/chrome/content/rules/Aaronparecki.com.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/src/chrome/content/rules/Aart_de_Vos.xml b/src/chrome/content/rules/Aart_de_Vos.xml
index 91a13e18f553..dc531fc231df 100644
--- a/src/chrome/content/rules/Aart_de_Vos.xml
+++ b/src/chrome/content/rules/Aart_de_Vos.xml
@@ -11,4 +11,4 @@
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Aastatus.net.xml b/src/chrome/content/rules/Aastatus.net.xml
new file mode 100644
index 000000000000..77f13140b139
--- /dev/null
+++ b/src/chrome/content/rules/Aastatus.net.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Aaulan.dk.xml b/src/chrome/content/rules/Aaulan.dk.xml
new file mode 100644
index 000000000000..2de79afa8acf
--- /dev/null
+++ b/src/chrome/content/rules/Aaulan.dk.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Abbo-Shop.xml b/src/chrome/content/rules/Abbo-Shop.xml
index 972b875f39bf..6d8d2a42c721 100644
--- a/src/chrome/content/rules/Abbo-Shop.xml
+++ b/src/chrome/content/rules/Abbo-Shop.xml
@@ -1,8 +1,8 @@
-
+
-
+
diff --git a/src/chrome/content/rules/Abbott-Laboratories.xml b/src/chrome/content/rules/Abbott-Laboratories.xml
deleted file mode 100644
index 17f220ca063f..000000000000
--- a/src/chrome/content/rules/Abbott-Laboratories.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Abc.xyz.xml b/src/chrome/content/rules/Abc.xyz.xml
new file mode 100644
index 000000000000..2941845aed71
--- /dev/null
+++ b/src/chrome/content/rules/Abc.xyz.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AbcLinuxu.cz.xml b/src/chrome/content/rules/AbcLinuxu.cz.xml
index ce1baa9f65ce..24f12c14fd6e 100644
--- a/src/chrome/content/rules/AbcLinuxu.cz.xml
+++ b/src/chrome/content/rules/AbcLinuxu.cz.xml
@@ -1,46 +1,46 @@
-
+
+
-
+
+
+
+
-
+
diff --git a/src/chrome/content/rules/Abdn.ac.uk.xml b/src/chrome/content/rules/Abdn.ac.uk.xml
index 0a1eabd3e24d..7a10fbbaf6de 100644
--- a/src/chrome/content/rules/Abdn.ac.uk.xml
+++ b/src/chrome/content/rules/Abdn.ac.uk.xml
@@ -27,7 +27,6 @@
-
+
diff --git a/src/chrome/content/rules/Abdullah-ocalan.com.xml b/src/chrome/content/rules/Abdullah-ocalan.com.xml
new file mode 100644
index 000000000000..5372de4ca429
--- /dev/null
+++ b/src/chrome/content/rules/Abdullah-ocalan.com.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Abdussamad.com.xml b/src/chrome/content/rules/Abdussamad.com.xml
new file mode 100644
index 000000000000..c62177eee31b
--- /dev/null
+++ b/src/chrome/content/rules/Abdussamad.com.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Abendblatt.de.xml b/src/chrome/content/rules/Abendblatt.de.xml
new file mode 100644
index 000000000000..fda906bc67ab
--- /dev/null
+++ b/src/chrome/content/rules/Abendblatt.de.xml
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AbenteuerLand.at.xml b/src/chrome/content/rules/AbenteuerLand.at.xml
deleted file mode 100644
index 36bc189dbd71..000000000000
--- a/src/chrome/content/rules/AbenteuerLand.at.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Abercrombie.xml b/src/chrome/content/rules/Abercrombie.xml
new file mode 100644
index 000000000000..da02ae8d2122
--- /dev/null
+++ b/src/chrome/content/rules/Abercrombie.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AberdeenMosque.org.xml b/src/chrome/content/rules/AberdeenMosque.org.xml
new file mode 100644
index 000000000000..1bfb9c0f3adb
--- /dev/null
+++ b/src/chrome/content/rules/AberdeenMosque.org.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Aberdeen_City.gov.uk-falsemixed.xml b/src/chrome/content/rules/Aberdeen_City.gov.uk-falsemixed.xml
new file mode 100644
index 000000000000..eea8b000a150
--- /dev/null
+++ b/src/chrome/content/rules/Aberdeen_City.gov.uk-falsemixed.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Aberdeen_City.gov.uk.xml b/src/chrome/content/rules/Aberdeen_City.gov.uk.xml
new file mode 100644
index 000000000000..c93ca5e29e6a
--- /dev/null
+++ b/src/chrome/content/rules/Aberdeen_City.gov.uk.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Aberdeenshire.gov.uk.xml b/src/chrome/content/rules/Aberdeenshire.gov.uk.xml
new file mode 100644
index 000000000000..bfaeaf6841fc
--- /dev/null
+++ b/src/chrome/content/rules/Aberdeenshire.gov.uk.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Aberystwyth-University-mismatches.xml b/src/chrome/content/rules/Aberystwyth-University-mismatches.xml
deleted file mode 100644
index 2b47288d443f..000000000000
--- a/src/chrome/content/rules/Aberystwyth-University-mismatches.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Aberystwyth-University.xml b/src/chrome/content/rules/Aberystwyth-University.xml
index 6e813c71e14e..3b7655256b07 100644
--- a/src/chrome/content/rules/Aberystwyth-University.xml
+++ b/src/chrome/content/rules/Aberystwyth-University.xml
@@ -1,89 +1,53 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Abftracker.com.xml b/src/chrome/content/rules/Abftracker.com.xml
deleted file mode 100644
index 8a898840d0f8..000000000000
--- a/src/chrome/content/rules/Abftracker.com.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Abhayagiri.org.xml b/src/chrome/content/rules/Abhayagiri.org.xml
new file mode 100644
index 000000000000..76ff19ba290b
--- /dev/null
+++ b/src/chrome/content/rules/Abhayagiri.org.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Abila.com.xml b/src/chrome/content/rules/Abila.com.xml
deleted file mode 100644
index 548be47a9f93..000000000000
--- a/src/chrome/content/rules/Abila.com.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Abiliba.xml b/src/chrome/content/rules/Abiliba.xml
deleted file mode 100644
index e4a965889b31..000000000000
--- a/src/chrome/content/rules/Abiliba.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Abine.xml b/src/chrome/content/rules/Abine.xml
index 13993675c5a0..1d00da323361 100644
--- a/src/chrome/content/rules/Abine.xml
+++ b/src/chrome/content/rules/Abine.xml
@@ -1,13 +1,27 @@
-
+
+
+
+
-
+
+
+
+
+
-
+
diff --git a/src/chrome/content/rules/AbleGamers.xml b/src/chrome/content/rules/AbleGamers.xml
index b081ccd3be4d..464b44862dde 100644
--- a/src/chrome/content/rules/AbleGamers.xml
+++ b/src/chrome/content/rules/AbleGamers.xml
@@ -1,9 +1,4 @@
-
-
+
@@ -12,7 +7,6 @@ Fetch error: http://www.ablegamers.com/ => https://www.ablegamers.com/: (60, 'SS
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Abma.de.xml b/src/chrome/content/rules/Abma.de.xml
deleted file mode 100644
index 601cf93bbfa7..000000000000
--- a/src/chrome/content/rules/Abma.de.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Abosgratis.de.xml b/src/chrome/content/rules/Abosgratis.de.xml
index 856f1da96605..0c02c0e97fb6 100644
--- a/src/chrome/content/rules/Abosgratis.de.xml
+++ b/src/chrome/content/rules/Abosgratis.de.xml
@@ -2,5 +2,5 @@
-
+
diff --git a/src/chrome/content/rules/About-Ads.xml b/src/chrome/content/rules/About-Ads.xml
index c6e09ecce4a5..902bbd009933 100644
--- a/src/chrome/content/rules/About-Ads.xml
+++ b/src/chrome/content/rules/About-Ads.xml
@@ -1,15 +1,31 @@
-
-
-
-
+
+ Expired:
+ - jasperserver.aboutads.info
+ Mixed JS:
+ - www.aboutads.info/choices/
+-->
+
+
+
+
+
+
+
+
+
+
+
-
+
+
diff --git a/src/chrome/content/rules/AboutMe.xml b/src/chrome/content/rules/AboutMe.xml
index 74904aa3690f..0b2988db1893 100644
--- a/src/chrome/content/rules/AboutMe.xml
+++ b/src/chrome/content/rules/AboutMe.xml
@@ -8,10 +8,9 @@
-
+
-
+
diff --git a/src/chrome/content/rules/AboutUs-problematic.xml b/src/chrome/content/rules/AboutUs-problematic.xml
deleted file mode 100644
index 2e9c94c6cfa4..000000000000
--- a/src/chrome/content/rules/AboutUs-problematic.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/AboutUs.xml b/src/chrome/content/rules/AboutUs.xml
index f0330357bb5e..372ed71a5363 100644
--- a/src/chrome/content/rules/AboutUs.xml
+++ b/src/chrome/content/rules/AboutUs.xml
@@ -1,34 +1,14 @@
-
-
-
+
+
+
+
+
-
+
+
diff --git a/src/chrome/content/rules/About_My_Vote.co.uk.xml b/src/chrome/content/rules/About_My_Vote.co.uk.xml
index d21b7ffffc56..4ad205662b0d 100644
--- a/src/chrome/content/rules/About_My_Vote.co.uk.xml
+++ b/src/chrome/content/rules/About_My_Vote.co.uk.xml
@@ -1,8 +1,13 @@
-
+
-
+
+
+
+
-
+
-
+
+
-
+
+
diff --git a/src/chrome/content/rules/About_the_Data.com.xml b/src/chrome/content/rules/About_the_Data.com.xml
index d5ea32181ec6..62584df2c4f0 100644
--- a/src/chrome/content/rules/About_the_Data.com.xml
+++ b/src/chrome/content/rules/About_the_Data.com.xml
@@ -1,14 +1,12 @@
+
-
+
diff --git a/src/chrome/content/rules/Above.com.xml b/src/chrome/content/rules/Above.com.xml
index e692e2596349..354a771ec68e 100644
--- a/src/chrome/content/rules/Above.com.xml
+++ b/src/chrome/content/rules/Above.com.xml
@@ -26,7 +26,6 @@
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Abs.ch.xml b/src/chrome/content/rules/Abs.ch.xml
new file mode 100644
index 000000000000..e3eba99dfafd
--- /dev/null
+++ b/src/chrome/content/rules/Abs.ch.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Absolute.xml b/src/chrome/content/rules/Absolute.xml
deleted file mode 100644
index a7099da3c764..000000000000
--- a/src/chrome/content/rules/Absolute.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/AbuAminaElias.com.xml b/src/chrome/content/rules/AbuAminaElias.com.xml
new file mode 100644
index 000000000000..007a8fa183f8
--- /dev/null
+++ b/src/chrome/content/rules/AbuAminaElias.com.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Abuse.ch.xml b/src/chrome/content/rules/Abuse.ch.xml
deleted file mode 100644
index cb87045cab5d..000000000000
--- a/src/chrome/content/rules/Abuse.ch.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/AbuseIPDB.com.xml b/src/chrome/content/rules/AbuseIPDB.com.xml
new file mode 100644
index 000000000000..bfcd782a5949
--- /dev/null
+++ b/src/chrome/content/rules/AbuseIPDB.com.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Abusix.com.xml b/src/chrome/content/rules/Abusix.com.xml
index 3f31f98778ec..60cbc4866d73 100644
--- a/src/chrome/content/rules/Abusix.com.xml
+++ b/src/chrome/content/rules/Abusix.com.xml
@@ -1,10 +1,37 @@
-
+
+
+
+
+
+
+
-
+
diff --git a/src/chrome/content/rules/Abysmal.nl.xml b/src/chrome/content/rules/Abysmal.nl.xml
index 54c67485459a..62465e5e0e58 100644
--- a/src/chrome/content/rules/Abysmal.nl.xml
+++ b/src/chrome/content/rules/Abysmal.nl.xml
@@ -1,13 +1,18 @@
-
+
+
+
-
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Academia-Press.xml b/src/chrome/content/rules/Academia-Press.xml
deleted file mode 100644
index 72baeb7accd8..000000000000
--- a/src/chrome/content/rules/Academia-Press.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Academia-assets.com.xml b/src/chrome/content/rules/Academia-assets.com.xml
index 092a06b0d9b8..a8c8822f58f6 100644
--- a/src/chrome/content/rules/Academia-assets.com.xml
+++ b/src/chrome/content/rules/Academia-assets.com.xml
@@ -1,13 +1,10 @@
-
+
-
-
+
diff --git a/src/chrome/content/rules/Academia.edu.xml b/src/chrome/content/rules/Academia.edu.xml
index d4d086eac96d..37c13aac554f 100644
--- a/src/chrome/content/rules/Academia.edu.xml
+++ b/src/chrome/content/rules/Academia.edu.xml
@@ -12,21 +12,31 @@
assets[012].academia\.edu
- Fully covered subdomains:
+ Nearly all subdomains (with two exceptions) are covered using a wildcard:
+ The Academia.edu website has SSL enabled for subdomains www and of the form
+ .academia.edu.
- - (www.)?
- - independent
+
+ Exceptions:
+
+ - mail
+ - support
-->
-
-
+
+
+
+
+
+
+
+
-
+
+
diff --git a/src/chrome/content/rules/AcademiaPress.be.xml b/src/chrome/content/rules/AcademiaPress.be.xml
new file mode 100644
index 000000000000..9bd0c85ba466
--- /dev/null
+++ b/src/chrome/content/rules/AcademiaPress.be.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Academics.de.xml b/src/chrome/content/rules/Academics.de.xml
index 73940e2c5fd5..99ccca587016 100644
--- a/src/chrome/content/rules/Academics.de.xml
+++ b/src/chrome/content/rules/Academics.de.xml
@@ -1,8 +1,12 @@
-
-
+
+
-
-
+
+
+
@@ -15,8 +19,5 @@
-
-
-
+
diff --git a/src/chrome/content/rules/Academy-of-Model-Aeronautics.xml b/src/chrome/content/rules/Academy-of-Model-Aeronautics.xml
index 0e0309aecc62..df9ea33bf601 100644
--- a/src/chrome/content/rules/Academy-of-Model-Aeronautics.xml
+++ b/src/chrome/content/rules/Academy-of-Model-Aeronautics.xml
@@ -14,7 +14,7 @@
- xla*
- Set by advertising/.
-->
-
+
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Acalog.xml b/src/chrome/content/rules/Acalog.xml
deleted file mode 100644
index a7684e398219..000000000000
--- a/src/chrome/content/rules/Acalog.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/AcalogAdmin.com.xml b/src/chrome/content/rules/AcalogAdmin.com.xml
new file mode 100644
index 000000000000..c774318ef80e
--- /dev/null
+++ b/src/chrome/content/rules/AcalogAdmin.com.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Accela-Communications.xml b/src/chrome/content/rules/Accela-Communications.xml
deleted file mode 100644
index 2b57c11d875e..000000000000
--- a/src/chrome/content/rules/Accela-Communications.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Accelerate.lgbt.xml b/src/chrome/content/rules/Accelerate.lgbt.xml
new file mode 100644
index 000000000000..7ac1f58cad3d
--- /dev/null
+++ b/src/chrome/content/rules/Accelerate.lgbt.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Accellion.xml b/src/chrome/content/rules/Accellion.xml
index a7fab39d5e35..d0f38cd4a9be 100644
--- a/src/chrome/content/rules/Accellion.xml
+++ b/src/chrome/content/rules/Accellion.xml
@@ -1,12 +1,20 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
diff --git a/src/chrome/content/rules/Accenture.com.xml b/src/chrome/content/rules/Accenture.com.xml
deleted file mode 100644
index a59d4b0186c8..000000000000
--- a/src/chrome/content/rules/Accenture.com.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Acceptiva.com.xml b/src/chrome/content/rules/Acceptiva.com.xml
index d48e2c2746bb..96ee52cefaec 100644
--- a/src/chrome/content/rules/Acceptiva.com.xml
+++ b/src/chrome/content/rules/Acceptiva.com.xml
@@ -9,7 +9,6 @@
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Access-kaiseki-tools.com.xml b/src/chrome/content/rules/Access-kaiseki-tools.com.xml
index 532ba3257b4e..3c2828a8b4fa 100644
--- a/src/chrome/content/rules/Access-kaiseki-tools.com.xml
+++ b/src/chrome/content/rules/Access-kaiseki-tools.com.xml
@@ -8,7 +8,6 @@
-
+
diff --git a/src/chrome/content/rules/AccessGuardian.com.xml b/src/chrome/content/rules/AccessGuardian.com.xml
index ade6b3c81539..1a0e29ea383a 100644
--- a/src/chrome/content/rules/AccessGuardian.com.xml
+++ b/src/chrome/content/rules/AccessGuardian.com.xml
@@ -1,4 +1,11 @@
-
+
+
+
@@ -7,7 +14,6 @@
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AccessLabs.xml b/src/chrome/content/rules/AccessLabs.xml
deleted file mode 100644
index d22393e14b83..000000000000
--- a/src/chrome/content/rules/AccessLabs.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/AccessNow.xml b/src/chrome/content/rules/AccessNow.xml
index 48d278506e04..50c556ea9033 100644
--- a/src/chrome/content/rules/AccessNow.xml
+++ b/src/chrome/content/rules/AccessNow.xml
@@ -1,16 +1,19 @@
-
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AccessPrivacy.ca.xml b/src/chrome/content/rules/AccessPrivacy.ca.xml
index 152b03ed0cc4..afeec9a9206a 100644
--- a/src/chrome/content/rules/AccessPrivacy.ca.xml
+++ b/src/chrome/content/rules/AccessPrivacy.ca.xml
@@ -1,4 +1,9 @@
+
-
+
-
+
-
+
diff --git a/src/chrome/content/rules/Access_Office_Products.xml b/src/chrome/content/rules/Access_Office_Products.xml
index fcf62ca43d20..a93d1f8764af 100644
--- a/src/chrome/content/rules/Access_Office_Products.xml
+++ b/src/chrome/content/rules/Access_Office_Products.xml
@@ -1,17 +1,21 @@
+
-
+
-
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Access_Privacy.com.xml b/src/chrome/content/rules/Access_Privacy.com.xml
index 7deb5b9fe7d4..600a1e4f33f0 100644
--- a/src/chrome/content/rules/Access_Privacy.com.xml
+++ b/src/chrome/content/rules/Access_Privacy.com.xml
@@ -19,13 +19,12 @@
-
+
-
+
diff --git a/src/chrome/content/rules/AccessibilityNL.xml b/src/chrome/content/rules/AccessibilityNL.xml
index 148fc1c9cb51..de4889581dfe 100644
--- a/src/chrome/content/rules/AccessibilityNL.xml
+++ b/src/chrome/content/rules/AccessibilityNL.xml
@@ -4,5 +4,5 @@
-
+
diff --git a/src/chrome/content/rules/Accessible-Information-Management.xml b/src/chrome/content/rules/Accessible-Information-Management.xml
index 417f27c406a0..eb8d7a7757d7 100644
--- a/src/chrome/content/rules/Accessible-Information-Management.xml
+++ b/src/chrome/content/rules/Accessible-Information-Management.xml
@@ -1,4 +1,10 @@
-
+
+
+
diff --git a/src/chrome/content/rules/Accessorize.xml b/src/chrome/content/rules/Accessorize.xml
index 7a31aa88c0d6..07fa31358141 100644
--- a/src/chrome/content/rules/Accessorize.xml
+++ b/src/chrome/content/rules/Accessorize.xml
@@ -6,4 +6,4 @@
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AccesstoJustice.xml b/src/chrome/content/rules/AccesstoJustice.xml
deleted file mode 100644
index bf525365e7dd..000000000000
--- a/src/chrome/content/rules/AccesstoJustice.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/Accesstrade.net.xml b/src/chrome/content/rules/Accesstrade.net.xml
index 9736a971da7d..4d588eeee07f 100644
--- a/src/chrome/content/rules/Accesstrade.net.xml
+++ b/src/chrome/content/rules/Accesstrade.net.xml
@@ -18,7 +18,6 @@
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Accordance_Bible.com.xml b/src/chrome/content/rules/Accordance_Bible.com.xml
index 9984d1345f1d..9ef0d4d36c32 100644
--- a/src/chrome/content/rules/Accordance_Bible.com.xml
+++ b/src/chrome/content/rules/Accordance_Bible.com.xml
@@ -5,7 +5,7 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AccountSupport.com.xml b/src/chrome/content/rules/AccountSupport.com.xml
index 406965a5cc6d..dcde9bc41a19 100644
--- a/src/chrome/content/rules/AccountSupport.com.xml
+++ b/src/chrome/content/rules/AccountSupport.com.xml
@@ -7,13 +7,13 @@
-
+
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Account_Chooser.xml b/src/chrome/content/rules/Account_Chooser.xml
index fff91e070693..fe33f0f2af73 100644
--- a/src/chrome/content/rules/Account_Chooser.xml
+++ b/src/chrome/content/rules/Account_Chooser.xml
@@ -4,7 +4,6 @@
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Account_Online.com.xml b/src/chrome/content/rules/Account_Online.com.xml
index a3ab9facb518..1f8b1f4f5c92 100644
--- a/src/chrome/content/rules/Account_Online.com.xml
+++ b/src/chrome/content/rules/Account_Online.com.xml
@@ -22,4 +22,4 @@
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Accountservergroup.com.xml b/src/chrome/content/rules/Accountservergroup.com.xml
index e13b1de836eb..2c406d29aa29 100644
--- a/src/chrome/content/rules/Accountservergroup.com.xml
+++ b/src/chrome/content/rules/Accountservergroup.com.xml
@@ -6,4 +6,4 @@
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Accredible.com.xml b/src/chrome/content/rules/Accredible.com.xml
new file mode 100644
index 000000000000..e839d93d299c
--- /dev/null
+++ b/src/chrome/content/rules/Accredible.com.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AccuWeather.xml b/src/chrome/content/rules/AccuWeather.xml
index faa3c7d47c50..5005e66fff11 100644
--- a/src/chrome/content/rules/AccuWeather.xml
+++ b/src/chrome/content/rules/AccuWeather.xml
@@ -1,4 +1,8 @@
+
-
+
-
-
+
+
+
+
+
+
+
+
+
-
+
-
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Accuen-problematic.xml b/src/chrome/content/rules/Accuen-problematic.xml
index 80412323845a..f6f136ea8fc9 100644
--- a/src/chrome/content/rules/Accuen-problematic.xml
+++ b/src/chrome/content/rules/Accuen-problematic.xml
@@ -2,15 +2,13 @@
For rules that are on by default, see Accuen.xml.
-->
-
+
-
-
+
diff --git a/src/chrome/content/rules/Accuen.xml b/src/chrome/content/rules/Accuen.xml
index 4116a0fca2da..c25f8e43442a 100644
--- a/src/chrome/content/rules/Accuen.xml
+++ b/src/chrome/content/rules/Accuen.xml
@@ -1,14 +1,16 @@
-
+
-
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Accuvant.com.xml b/src/chrome/content/rules/Accuvant.com.xml
index 5d13625a71e9..2dc0ffe85993 100644
--- a/src/chrome/content/rules/Accuvant.com.xml
+++ b/src/chrome/content/rules/Accuvant.com.xml
@@ -1,4 +1,8 @@
+
-
+
-
+
+
+
-
-
+
diff --git a/src/chrome/content/rules/Ace-analyzer.com.xml b/src/chrome/content/rules/Ace-analyzer.com.xml
deleted file mode 100644
index aa36d2c28672..000000000000
--- a/src/chrome/content/rules/Ace-analyzer.com.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Ace-book.net.xml b/src/chrome/content/rules/Ace-book.net.xml
new file mode 100644
index 000000000000..c9710e2f8e45
--- /dev/null
+++ b/src/chrome/content/rules/Ace-book.net.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Ace_Hotel.com.xml b/src/chrome/content/rules/Ace_Hotel.com.xml
index c892653e41f2..7f5128e5a09e 100644
--- a/src/chrome/content/rules/Ace_Hotel.com.xml
+++ b/src/chrome/content/rules/Ace_Hotel.com.xml
@@ -1,7 +1,8 @@
-
+
+
@@ -19,7 +20,6 @@
-
+
diff --git a/src/chrome/content/rules/Acenet.xml b/src/chrome/content/rules/Acenet.xml
index e631c38dcbe6..f1a2fdac6e1e 100644
--- a/src/chrome/content/rules/Acenet.xml
+++ b/src/chrome/content/rules/Acenet.xml
@@ -9,11 +9,8 @@
-
-
-
-
+
diff --git a/src/chrome/content/rules/Acer.com.xml b/src/chrome/content/rules/Acer.com.xml
new file mode 100644
index 000000000000..246b2a8a0da3
--- /dev/null
+++ b/src/chrome/content/rules/Acer.com.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Acessa.xml b/src/chrome/content/rules/Acessa.xml
new file mode 100644
index 000000000000..b0641dae0429
--- /dev/null
+++ b/src/chrome/content/rules/Acessa.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Acessoseguro.net.xml b/src/chrome/content/rules/Acessoseguro.net.xml
index 3398fa15b23c..07c48354c49b 100644
--- a/src/chrome/content/rules/Acessoseguro.net.xml
+++ b/src/chrome/content/rules/Acessoseguro.net.xml
@@ -3,10 +3,10 @@
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Achelem.org.xml b/src/chrome/content/rules/Achelem.org.xml
deleted file mode 100644
index 69071b02e05d..000000000000
--- a/src/chrome/content/rules/Achelem.org.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Achievementstats.com.xml b/src/chrome/content/rules/Achievementstats.com.xml
new file mode 100644
index 000000000000..3a4c704ba1cb
--- /dev/null
+++ b/src/chrome/content/rules/Achievementstats.com.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Acik_Akademi.com.xml b/src/chrome/content/rules/Acik_Akademi.com.xml
index 643bab15f021..3324a4ab3ef1 100644
--- a/src/chrome/content/rules/Acik_Akademi.com.xml
+++ b/src/chrome/content/rules/Acik_Akademi.com.xml
@@ -4,11 +4,7 @@
For other Microsoft coverage, see Microsoft.xml.
- Problematic domains:
-
- - acikakademi.com *
-
- * Cert only matches www
+ ^acikakademi.com: Cert only matches www
-->
@@ -22,7 +18,7 @@
-
+
-
+
diff --git a/src/chrome/content/rules/Acoustics.org.xml b/src/chrome/content/rules/Acoustics.org.xml
index ccea3f155689..2f9af077e828 100644
--- a/src/chrome/content/rules/Acoustics.org.xml
+++ b/src/chrome/content/rules/Acoustics.org.xml
@@ -1,10 +1,16 @@
-
+
+
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Acquia.xml b/src/chrome/content/rules/Acquia.xml
index 4368a2dfeb8f..20de2c9376cd 100644
--- a/src/chrome/content/rules/Acquia.xml
+++ b/src/chrome/content/rules/Acquia.xml
@@ -1,13 +1,64 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Acrobat.com.xml b/src/chrome/content/rules/Acrobat.com.xml
index b88d990eac3d..3bd4770b165a 100644
--- a/src/chrome/content/rules/Acrobat.com.xml
+++ b/src/chrome/content/rules/Acrobat.com.xml
@@ -1,4 +1,9 @@
+
-
+
+
@@ -35,6 +33,8 @@
-->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Acrocomcontent.com.xml b/src/chrome/content/rules/Acrocomcontent.com.xml
deleted file mode 100644
index 819d721897c3..000000000000
--- a/src/chrome/content/rules/Acrocomcontent.com.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Acronis.com.xml b/src/chrome/content/rules/Acronis.com.xml
deleted file mode 100644
index 86671336dc90..000000000000
--- a/src/chrome/content/rules/Acronis.com.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Acronymfinder.com.xml b/src/chrome/content/rules/Acronymfinder.com.xml
new file mode 100644
index 000000000000..d0f3265d44eb
--- /dev/null
+++ b/src/chrome/content/rules/Acronymfinder.com.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AcrylicDepot.com.xml b/src/chrome/content/rules/AcrylicDepot.com.xml
new file mode 100644
index 000000000000..aa0bc6f62785
--- /dev/null
+++ b/src/chrome/content/rules/AcrylicDepot.com.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Acrylic_Wifi.com.xml b/src/chrome/content/rules/Acrylic_Wifi.com.xml
deleted file mode 100644
index 2ee1957d84bc..000000000000
--- a/src/chrome/content/rules/Acrylic_Wifi.com.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Act-On-Software.xml b/src/chrome/content/rules/Act-On-Software.xml
index 339d7dd40421..bffcb2062cd8 100644
--- a/src/chrome/content/rules/Act-On-Software.xml
+++ b/src/chrome/content/rules/Act-On-Software.xml
@@ -21,11 +21,11 @@
- ACTON (www)
- wpNNNN (*)
- - Set by
+ - Set by
actonsoftware.com/acton/attachment/NNNN/
e.g. acton/attachment/1205/f-0005/0/-/-/-/-/file.pdf
-->
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Act.demandprogress.org.xml b/src/chrome/content/rules/Act.demandprogress.org.xml
deleted file mode 100644
index 8d56ac39850d..000000000000
--- a/src/chrome/content/rules/Act.demandprogress.org.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/src/chrome/content/rules/ActBlue.com.xml b/src/chrome/content/rules/ActBlue.com.xml
new file mode 100644
index 000000000000..0b9446c2861e
--- /dev/null
+++ b/src/chrome/content/rules/ActBlue.com.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ActBlue.xml b/src/chrome/content/rules/ActBlue.xml
deleted file mode 100644
index ea8efc3e5e4e..000000000000
--- a/src/chrome/content/rules/ActBlue.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Actel.com.xml b/src/chrome/content/rules/Actel.com.xml
deleted file mode 100644
index 955ed878b640..000000000000
--- a/src/chrome/content/rules/Actel.com.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Action-Auto-Wreckers.xml b/src/chrome/content/rules/Action-Auto-Wreckers.xml
index 584a4a736e26..7c8e627808e2 100644
--- a/src/chrome/content/rules/Action-Auto-Wreckers.xml
+++ b/src/chrome/content/rules/Action-Auto-Wreckers.xml
@@ -1,14 +1,36 @@
+
+
+
+
+
+
-
+
+
+
+
-
+ to="https://www.actionautowreckers.com/" />
+
+
diff --git a/src/chrome/content/rules/Actionable_Intelligence.xml b/src/chrome/content/rules/Actionable_Intelligence.xml
index 2c27c4ac89f2..d242c7bc6520 100644
--- a/src/chrome/content/rules/Actionable_Intelligence.xml
+++ b/src/chrome/content/rules/Actionable_Intelligence.xml
@@ -11,7 +11,6 @@
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Actionallocator.com.xml b/src/chrome/content/rules/Actionallocator.com.xml
deleted file mode 100644
index c7260a51291d..000000000000
--- a/src/chrome/content/rules/Actionallocator.com.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/Activatejavascript.xml b/src/chrome/content/rules/Activatejavascript.xml
index 7bade1494600..c6155cec7682 100644
--- a/src/chrome/content/rules/Activatejavascript.xml
+++ b/src/chrome/content/rules/Activatejavascript.xml
@@ -2,12 +2,12 @@
CN: secure.syllabushare.com
-->
-
+
-
+
diff --git a/src/chrome/content/rules/Active-Events.xml b/src/chrome/content/rules/Active-Events.xml
index 29ddffa86999..6e5f2c231547 100644
--- a/src/chrome/content/rules/Active-Events.xml
+++ b/src/chrome/content/rules/Active-Events.xml
@@ -8,10 +8,7 @@
-
-
-
-
+
-
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Active.com.xml b/src/chrome/content/rules/Active.com.xml
index d4bb84132700..5a40bf7e127b 100644
--- a/src/chrome/content/rules/Active.com.xml
+++ b/src/chrome/content/rules/Active.com.xml
@@ -47,7 +47,17 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/ActiveState-Software.xml b/src/chrome/content/rules/ActiveState-Software.xml
index ff407b2a333f..f9c7dfab442a 100644
--- a/src/chrome/content/rules/ActiveState-Software.xml
+++ b/src/chrome/content/rules/ActiveState-Software.xml
@@ -26,13 +26,16 @@
-
+
+
+
+
+
-
+
diff --git a/src/chrome/content/rules/Active_Melody.xml b/src/chrome/content/rules/Active_Melody.xml
index 5c3a8feb6f50..f461b3ea45ce 100644
--- a/src/chrome/content/rules/Active_Melody.xml
+++ b/src/chrome/content/rules/Active_Melody.xml
@@ -1,13 +1,43 @@
-
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Active_Network.com.xml b/src/chrome/content/rules/Active_Network.com.xml
index 20f03638fad3..7ba366800975 100644
--- a/src/chrome/content/rules/Active_Network.com.xml
+++ b/src/chrome/content/rules/Active_Network.com.xml
@@ -27,8 +27,7 @@
-->
-
-
+
@@ -40,13 +39,10 @@
-
+
-
-
-
+
diff --git a/src/chrome/content/rules/Active_static.net.xml b/src/chrome/content/rules/Active_static.net.xml
index 737c3684abfe..5099738e25b7 100644
--- a/src/chrome/content/rules/Active_static.net.xml
+++ b/src/chrome/content/rules/Active_static.net.xml
@@ -1,14 +1,18 @@
+
-
+
-
+
diff --git a/src/chrome/content/rules/Activision.xml b/src/chrome/content/rules/Activision.xml
new file mode 100644
index 000000000000..0d762454c870
--- /dev/null
+++ b/src/chrome/content/rules/Activision.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Activision_Blizzard.com.xml b/src/chrome/content/rules/Activision_Blizzard.com.xml
index 14ec40d1f05d..7765d3c3c2ca 100644
--- a/src/chrome/content/rules/Activision_Blizzard.com.xml
+++ b/src/chrome/content/rules/Activision_Blizzard.com.xml
@@ -11,16 +11,13 @@
-->
-
+
-
-
diff --git a/src/chrome/content/rules/Actix.rs.xml b/src/chrome/content/rules/Actix.rs.xml
new file mode 100644
index 000000000000..7cd85ecbb21a
--- /dev/null
+++ b/src/chrome/content/rules/Actix.rs.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Acuity_Scheduling.com.xml b/src/chrome/content/rules/Acuity_Scheduling.com.xml
new file mode 100644
index 000000000000..784a920209aa
--- /dev/null
+++ b/src/chrome/content/rules/Acuity_Scheduling.com.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Acuity_platform.com.xml b/src/chrome/content/rules/Acuity_platform.com.xml
index 00aa2c110083..c39cbb1db1e1 100644
--- a/src/chrome/content/rules/Acuity_platform.com.xml
+++ b/src/chrome/content/rules/Acuity_platform.com.xml
@@ -5,13 +5,13 @@
-
+
+
-
+
diff --git a/src/chrome/content/rules/Aculab.com.xml b/src/chrome/content/rules/Aculab.com.xml
index cd73825d84f5..0dd01bfefc15 100644
--- a/src/chrome/content/rules/Aculab.com.xml
+++ b/src/chrome/content/rules/Aculab.com.xml
@@ -12,7 +12,6 @@
-
+
diff --git a/src/chrome/content/rules/Acunetix.com.xml b/src/chrome/content/rules/Acunetix.com.xml
deleted file mode 100644
index c953afbf236b..000000000000
--- a/src/chrome/content/rules/Acunetix.com.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Acxiom-online.com.xml b/src/chrome/content/rules/Acxiom-online.com.xml
index 9f6d57d013a7..57688b915fbf 100644
--- a/src/chrome/content/rules/Acxiom-online.com.xml
+++ b/src/chrome/content/rules/Acxiom-online.com.xml
@@ -1,16 +1,34 @@
+
-
+
-
+
+
+
+
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Acxiom.xml b/src/chrome/content/rules/Acxiom.xml
deleted file mode 100644
index 1134529d323e..000000000000
--- a/src/chrome/content/rules/Acxiom.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Acyba.com.xml b/src/chrome/content/rules/Acyba.com.xml
new file mode 100644
index 000000000000..1989846b8228
--- /dev/null
+++ b/src/chrome/content/rules/Acyba.com.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Ad-Center.com.xml b/src/chrome/content/rules/Ad-Center.com.xml
index 89914942137d..f88bd169a464 100644
--- a/src/chrome/content/rules/Ad-Center.com.xml
+++ b/src/chrome/content/rules/Ad-Center.com.xml
@@ -12,7 +12,6 @@
-
+
diff --git a/src/chrome/content/rules/Ad-Juster.xml b/src/chrome/content/rules/Ad-Juster.xml
index 4a7a86da1fa5..ec6fdc1d720a 100644
--- a/src/chrome/content/rules/Ad-Juster.xml
+++ b/src/chrome/content/rules/Ad-Juster.xml
@@ -1,7 +1,8 @@
-
+
+
diff --git a/src/chrome/content/rules/Ad-Stir.com.xml b/src/chrome/content/rules/Ad-Stir.com.xml
index adbdde92b5d1..e99bd276450e 100644
--- a/src/chrome/content/rules/Ad-Stir.com.xml
+++ b/src/chrome/content/rules/Ad-Stir.com.xml
@@ -9,6 +9,7 @@
Fully covered hosts in *ad-stir.com:
- (www.)?
+ - js
- en
- news
- sync
@@ -25,6 +26,7 @@
-->
+
diff --git a/src/chrome/content/rules/Ad4Game.xml b/src/chrome/content/rules/Ad4Game.xml
index dc1355d5ad04..42dce51db9ec 100644
--- a/src/chrome/content/rules/Ad4Game.xml
+++ b/src/chrome/content/rules/Ad4Game.xml
@@ -3,11 +3,11 @@
-->
-
+
+
-
+
-
+
diff --git a/src/chrome/content/rules/Ad6media.xml b/src/chrome/content/rules/Ad6media.xml
index 5997e94f495b..4f03b4d47b63 100644
--- a/src/chrome/content/rules/Ad6media.xml
+++ b/src/chrome/content/rules/Ad6media.xml
@@ -19,7 +19,6 @@
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AdAlliance.io.xml b/src/chrome/content/rules/AdAlliance.io.xml
new file mode 100644
index 000000000000..29362840df0f
--- /dev/null
+++ b/src/chrome/content/rules/AdAlliance.io.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AdAstraArms.com.xml b/src/chrome/content/rules/AdAstraArms.com.xml
new file mode 100644
index 000000000000..2efbc4cbfc5c
--- /dev/null
+++ b/src/chrome/content/rules/AdAstraArms.com.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AdBit.co.xml b/src/chrome/content/rules/AdBit.co.xml
index 3d8db6fd5e1e..249841f7e4af 100644
--- a/src/chrome/content/rules/AdBit.co.xml
+++ b/src/chrome/content/rules/AdBit.co.xml
@@ -1,11 +1,16 @@
+
-
+
diff --git a/src/chrome/content/rules/AdBlock.xml b/src/chrome/content/rules/AdBlock.xml
index f8b5ef1255bb..4512ae67c147 100644
--- a/src/chrome/content/rules/AdBlock.xml
+++ b/src/chrome/content/rules/AdBlock.xml
@@ -1,49 +1,29 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AdButler.xml b/src/chrome/content/rules/AdButler.xml
index c50843a43200..a526d4b40786 100644
--- a/src/chrome/content/rules/AdButler.xml
+++ b/src/chrome/content/rules/AdButler.xml
@@ -10,7 +10,7 @@
-
+
@@ -27,4 +27,4 @@
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AdCap.biz.xml b/src/chrome/content/rules/AdCap.biz.xml
new file mode 100644
index 000000000000..59059fd68af4
--- /dev/null
+++ b/src/chrome/content/rules/AdCap.biz.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AdExcite.xml b/src/chrome/content/rules/AdExcite.xml
deleted file mode 100644
index beba86096454..000000000000
--- a/src/chrome/content/rules/AdExcite.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/AdExtent.com-problematic.xml b/src/chrome/content/rules/AdExtent.com-problematic.xml
deleted file mode 100644
index 509e193bd1a9..000000000000
--- a/src/chrome/content/rules/AdExtent.com-problematic.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/AdExtent.com.xml b/src/chrome/content/rules/AdExtent.com.xml
deleted file mode 100644
index a595d1bc222b..000000000000
--- a/src/chrome/content/rules/AdExtent.com.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/AdF.ly.xml b/src/chrome/content/rules/AdF.ly.xml
index beb58d8c96b2..04cf93f04b15 100644
--- a/src/chrome/content/rules/AdF.ly.xml
+++ b/src/chrome/content/rules/AdF.ly.xml
@@ -1,24 +1,45 @@
-
+ Peer certificate cannot be authenticated with given CA certificates:
+ - custom.adf.ly
+ Mixed content blocking (MCB) tiggered:
+ - api.adf.ly
+ - kb.adf.ly
+ - v2.adf.ly
+-->
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AdFox.ru.xml b/src/chrome/content/rules/AdFox.ru.xml
new file mode 100644
index 000000000000..07a842306be8
--- /dev/null
+++ b/src/chrome/content/rules/AdFox.ru.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AdHands.ru.xml b/src/chrome/content/rules/AdHands.ru.xml
index b0bdaea1b8e7..afb3da99374e 100644
--- a/src/chrome/content/rules/AdHands.ru.xml
+++ b/src/chrome/content/rules/AdHands.ru.xml
@@ -16,10 +16,10 @@
-->
-
+
+
-
+
diff --git a/src/chrome/content/rules/AdJug.com.xml b/src/chrome/content/rules/AdJug.com.xml
index a561fc51e3cc..51bb403ee722 100644
--- a/src/chrome/content/rules/AdJug.com.xml
+++ b/src/chrome/content/rules/AdJug.com.xml
@@ -1,4 +1,18 @@
+
+
- - ^
- - de
- - uk
+
+
+
+
- - hosting.de
- - www.de
- - image
- - tracking
- - hosting.uk
- - www.uk
- - www.us
- - vast (→ akamai)
+
+
+
- - view subdomains:
+
+
- - de
- - uk
- - us
+
+
+
--->
-
+
+
+
+
-
-
+
+
+
+
-
-
+
+
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AdMarvel.com.xml b/src/chrome/content/rules/AdMarvel.com.xml
new file mode 100644
index 000000000000..ec30299ec048
--- /dev/null
+++ b/src/chrome/content/rules/AdMarvel.com.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AdMaster.com.cn.xml b/src/chrome/content/rules/AdMaster.com.cn.xml
index f15c3e87cc99..9afed6cadf82 100644
--- a/src/chrome/content/rules/AdMaster.com.cn.xml
+++ b/src/chrome/content/rules/AdMaster.com.cn.xml
@@ -1,4 +1,8 @@
+
-
+
diff --git a/src/chrome/content/rules/AdMatrix.jp.xml b/src/chrome/content/rules/AdMatrix.jp.xml
index 9bcf814de36f..2789a5975526 100644
--- a/src/chrome/content/rules/AdMatrix.jp.xml
+++ b/src/chrome/content/rules/AdMatrix.jp.xml
@@ -1,34 +1,30 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AdMob-mismatches.xml b/src/chrome/content/rules/AdMob-mismatches.xml
deleted file mode 100644
index 4782397ba14d..000000000000
--- a/src/chrome/content/rules/AdMob-mismatches.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/AdMob.xml b/src/chrome/content/rules/AdMob.xml
index 23ed74b37a9f..2dee87ed629b 100644
--- a/src/chrome/content/rules/AdMob.xml
+++ b/src/chrome/content/rules/AdMob.xml
@@ -1,24 +1,17 @@
-
+
+
-
-
+
+
-
-
-
+
diff --git a/src/chrome/content/rules/AdNow.com.xml b/src/chrome/content/rules/AdNow.com.xml
new file mode 100644
index 000000000000..362765fb0c86
--- /dev/null
+++ b/src/chrome/content/rules/AdNow.com.xml
@@ -0,0 +1,424 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AdPerfect.xml b/src/chrome/content/rules/AdPerfect.xml
deleted file mode 100644
index a9c56554af20..000000000000
--- a/src/chrome/content/rules/AdPerfect.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/AdReactor.xml b/src/chrome/content/rules/AdReactor.xml
index 33dfc8fd4516..3af548a8db56 100644
--- a/src/chrome/content/rules/AdReactor.xml
+++ b/src/chrome/content/rules/AdReactor.xml
@@ -9,7 +9,6 @@
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AdRiver.xml b/src/chrome/content/rules/AdRiver.xml
index 6f238f4dd2b5..a8494955e79f 100644
--- a/src/chrome/content/rules/AdRiver.xml
+++ b/src/chrome/content/rules/AdRiver.xml
@@ -1,4 +1,11 @@
+
+
-
+
@@ -52,6 +59,11 @@
+
+
+
+
+
diff --git a/src/chrome/content/rules/AdRoll-problematic.xml b/src/chrome/content/rules/AdRoll-problematic.xml
deleted file mode 100644
index 2213f49e7bb0..000000000000
--- a/src/chrome/content/rules/AdRoll-problematic.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/AdRoll.xml b/src/chrome/content/rules/AdRoll.xml
index 304749f34913..d2a405a3bb36 100644
--- a/src/chrome/content/rules/AdRoll.xml
+++ b/src/chrome/content/rules/AdRoll.xml
@@ -1,106 +1,26 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
diff --git a/src/chrome/content/rules/AdSafe.xml b/src/chrome/content/rules/AdSafe.xml
index 160d4ba34186..5f6615119361 100644
--- a/src/chrome/content/rules/AdSafe.xml
+++ b/src/chrome/content/rules/AdSafe.xml
@@ -1,32 +1,33 @@
+
-
+
+
-
-
-
+
-
-
+
diff --git a/src/chrome/content/rules/AdSafe_protected.com.xml b/src/chrome/content/rules/AdSafe_protected.com.xml
new file mode 100644
index 000000000000..4fe193ab3363
--- /dev/null
+++ b/src/chrome/content/rules/AdSafe_protected.com.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AdSonar.com.xml b/src/chrome/content/rules/AdSonar.com.xml
index e560ab3ff4ce..340db42a9b1d 100644
--- a/src/chrome/content/rules/AdSonar.com.xml
+++ b/src/chrome/content/rules/AdSonar.com.xml
@@ -1,19 +1,24 @@
-
-
+
+
@@ -34,6 +40,8 @@
+
+
diff --git a/src/chrome/content/rules/AdSpeed.biz.xml b/src/chrome/content/rules/AdSpeed.biz.xml
new file mode 100644
index 000000000000..6f950ef3dafb
--- /dev/null
+++ b/src/chrome/content/rules/AdSpeed.biz.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AdSpeed.net.xml b/src/chrome/content/rules/AdSpeed.net.xml
new file mode 100644
index 000000000000..04c24bb884af
--- /dev/null
+++ b/src/chrome/content/rules/AdSpeed.net.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/AdSpeed.xml b/src/chrome/content/rules/AdSpeed.xml
index 82a3786feba9..061e80a648e0 100644
--- a/src/chrome/content/rules/AdSpeed.xml
+++ b/src/chrome/content/rules/AdSpeed.xml
@@ -1,38 +1,36 @@
-
+
-
-
-
-
-
-
-
-
+
+
-
+
-
-
+
diff --git a/src/chrome/content/rules/AdSpirit.xml b/src/chrome/content/rules/AdSpirit.xml
index 303fe16be337..0fc912afffa3 100644
--- a/src/chrome/content/rules/AdSpirit.xml
+++ b/src/chrome/content/rules/AdSpirit.xml
@@ -1,15 +1,28 @@
+
-
+
+
+
+
+
+
+
+
+
+
-
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AdSupply.xml b/src/chrome/content/rules/AdSupply.xml
index 00d30c39c5ff..04a8d9657860 100644
--- a/src/chrome/content/rules/AdSupply.xml
+++ b/src/chrome/content/rules/AdSupply.xml
@@ -1,56 +1,30 @@
-
-
-
-
-
-
-
+
-
-
+
+
+
+
+
-
+
-
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AdXpansion.com.xml b/src/chrome/content/rules/AdXpansion.com.xml
deleted file mode 100644
index 8ff3a7d81925..000000000000
--- a/src/chrome/content/rules/AdXpansion.com.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/chrome/content/rules/Ad_Peeps_hosted.com.xml b/src/chrome/content/rules/Ad_Peeps_hosted.com.xml
index 5e9a7569e8b9..d5922e2f4168 100644
--- a/src/chrome/content/rules/Ad_Peeps_hosted.com.xml
+++ b/src/chrome/content/rules/Ad_Peeps_hosted.com.xml
@@ -13,7 +13,6 @@
-
+
diff --git a/src/chrome/content/rules/Ada.lt.xml b/src/chrome/content/rules/Ada.lt.xml
index 53becd3d0615..8a8fde71195c 100644
--- a/src/chrome/content/rules/Ada.lt.xml
+++ b/src/chrome/content/rules/Ada.lt.xml
@@ -16,7 +16,6 @@
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/AdaCore.xml b/src/chrome/content/rules/AdaCore.xml
index a683ce82e201..6f6872000ffc 100644
--- a/src/chrome/content/rules/AdaCore.xml
+++ b/src/chrome/content/rules/AdaCore.xml
@@ -1,20 +1,9 @@
-
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
diff --git a/src/chrome/content/rules/Ada_Initiative.org.xml b/src/chrome/content/rules/Ada_Initiative.org.xml
deleted file mode 100644
index 209d884607c6..000000000000
--- a/src/chrome/content/rules/Ada_Initiative.org.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Adafruit.xml b/src/chrome/content/rules/Adafruit.xml
index c2ff1eeb0ef6..542ee9ed2be9 100644
--- a/src/chrome/content/rules/Adafruit.xml
+++ b/src/chrome/content/rules/Adafruit.xml
@@ -1,13 +1,19 @@
-
+
+
-
+
+
+
+
+
-
+
diff --git a/src/chrome/content/rules/Adagio.com.xml b/src/chrome/content/rules/Adagio.com.xml
index 8a790c138bcf..cd2a6587127f 100644
--- a/src/chrome/content/rules/Adagio.com.xml
+++ b/src/chrome/content/rules/Adagio.com.xml
@@ -2,5 +2,5 @@
-
+
diff --git a/src/chrome/content/rules/Adallom.com.xml b/src/chrome/content/rules/Adallom.com.xml
deleted file mode 100644
index 5a79a52f03f5..000000000000
--- a/src/chrome/content/rules/Adallom.com.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/chrome/content/rules/Adam-Barth.xml b/src/chrome/content/rules/Adam-Barth.xml
new file mode 100644
index 000000000000..771fe0bce9db
--- /dev/null
+++ b/src/chrome/content/rules/Adam-Barth.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/chrome/content/rules/Adam_Caudill.com.xml b/src/chrome/content/rules/Adam_Caudill.com.xml
index d80ce71cd46e..878781a26f21 100644
--- a/src/chrome/content/rules/Adam_Caudill.com.xml
+++ b/src/chrome/content/rules/Adam_Caudill.com.xml
@@ -31,7 +31,7 @@
-->
-
+ https://adap.tv/: (7, 'Failed to connect to adap.tv port 443: Connection refused')
+Fetch error: http://www.adap.tv/ => https://adap.tv/: (7, 'Failed to connect to adap.tv port 443: Connection refused')
+
For other AOL coverage, see AOL.xml.
+ Nonfunctioanl hosts in *adap.tv:
+
+ - adaptv *
+
+ * 404
+
+
+ Problematic hosts in *adap.tv:
+
+ - redir ¹
+ - www ²
+
+ ¹ Akamai
+ ² Mismatched
+
+
Fully covered hosts in *adap.tv:
- - (www.)?
+ - (www.)? (www → ^)
- ads
- my
- redir (→ ads)
@@ -12,26 +33,31 @@
- sync
-->
-
+
+
-
+
+
+
-
-
+
+
diff --git a/src/chrome/content/rules/Adaptavist.com.xml b/src/chrome/content/rules/Adaptavist.com.xml
index 2529e65aedf4..87d9e47a9d6d 100644
--- a/src/chrome/content/rules/Adaptavist.com.xml
+++ b/src/chrome/content/rules/Adaptavist.com.xml
@@ -1,7 +1,8 @@
-
+
+
@@ -12,7 +13,6 @@
-
+
diff --git a/src/chrome/content/rules/Adaptec.com.xml b/src/chrome/content/rules/Adaptec.com.xml
index e5abb491bf1d..be63b4b6bfb0 100644
--- a/src/chrome/content/rules/Adaptec.com.xml
+++ b/src/chrome/content/rules/Adaptec.com.xml
@@ -1,4 +1,9 @@
+
-
+
diff --git a/src/chrome/content/rules/Adapteva.com.xml b/src/chrome/content/rules/Adapteva.com.xml
index 8536e0ebce57..db5fa193ef43 100644
--- a/src/chrome/content/rules/Adapteva.com.xml
+++ b/src/chrome/content/rules/Adapteva.com.xml
@@ -1,4 +1,8 @@
+
-
+
@@ -24,4 +28,4 @@
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Adaptive_Computing.xml b/src/chrome/content/rules/Adaptive_Computing.xml
index f756ba54f1c9..5ca61de18444 100644
--- a/src/chrome/content/rules/Adaptive_Computing.xml
+++ b/src/chrome/content/rules/Adaptive_Computing.xml
@@ -1,13 +1,37 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
-
+
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Adara-Media.xml b/src/chrome/content/rules/Adara-Media.xml
index aff3368657e9..0c24a893c3f6 100644
--- a/src/chrome/content/rules/Adara-Media.xml
+++ b/src/chrome/content/rules/Adara-Media.xml
@@ -16,7 +16,7 @@
-
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Adblade.xml b/src/chrome/content/rules/Adblade.xml
index 67cee9bb3134..94a339a12fe6 100644
--- a/src/chrome/content/rules/Adblade.xml
+++ b/src/chrome/content/rules/Adblade.xml
@@ -1,43 +1,70 @@
-
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
-
+
+
-
-
-
-
+
diff --git a/src/chrome/content/rules/AdblockPlus.xml b/src/chrome/content/rules/AdblockPlus.xml
index 9329b5a4ec94..95fa5dbaeb53 100644
--- a/src/chrome/content/rules/AdblockPlus.xml
+++ b/src/chrome/content/rules/AdblockPlus.xml
@@ -22,7 +22,7 @@
-
+
-
+
+
+
+ to="https://cdn.adbooth.net/" />
@@ -46,4 +48,4 @@
-
\ No newline at end of file
+
diff --git a/src/chrome/content/rules/Adbrite.xml b/src/chrome/content/rules/Adbrite.xml
index d250bc663ddb..4a94f2e0502c 100644
--- a/src/chrome/content/rules/Adbrite.xml
+++ b/src/chrome/content/rules/Adbrite.xml
@@ -1,4 +1,12 @@
+
+
-
+
diff --git a/src/chrome/content/rules/Adbusters.org.xml b/src/chrome/content/rules/Adbusters.org.xml
index d281720e042c..40d6bf8d1868 100644
--- a/src/chrome/content/rules/Adbusters.org.xml
+++ b/src/chrome/content/rules/Adbusters.org.xml
@@ -1,6 +1,22 @@
+
-
-
-
+
+
+
+
+
+
+
+
diff --git a/src/chrome/content/rules/Adbuyer.com.xml b/src/chrome/content/rules/Adbuyer.com.xml
index df1c0e33a5e8..114c008d637b 100644
--- a/src/chrome/content/rules/Adbuyer.com.xml
+++ b/src/chrome/content/rules/Adbuyer.com.xml
@@ -1,4 +1,8 @@
+
-
+