diff --git a/linux/build/preferences/browser/defaults/profile/bookmarks.html b/linux/build/preferences/browser/defaults/profile/bookmarks.html
new file mode 100644
index 0000000..e69de29
diff --git a/linux/build/preferences/browser/override.ini b/linux/build/preferences/browser/override.ini
new file mode 100644
index 0000000..00d051e
--- /dev/null
+++ b/linux/build/preferences/browser/override.ini
@@ -0,0 +1,2 @@
+[XRE]
+EnableProfileMigrator=0
diff --git a/linux/build/preferences/cck2/chrome.manifest b/linux/build/preferences/cck2/chrome.manifest
new file mode 100644
index 0000000..b1b9a9b
--- /dev/null
+++ b/linux/build/preferences/cck2/chrome.manifest
@@ -0,0 +1 @@
+resource cck2 modules/
diff --git a/linux/build/preferences/cck2/modules/CAPSCheckLoadURIFramescript.js b/linux/build/preferences/cck2/modules/CAPSCheckLoadURIFramescript.js
new file mode 100644
index 0000000..806fb3c
--- /dev/null
+++ b/linux/build/preferences/cck2/modules/CAPSCheckLoadURIFramescript.js
@@ -0,0 +1,154 @@
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+const EXPORTED_SYMBOLS = [];
+
+var gForceExternalHandler = false;
+
+XPCOMUtils.defineLazyServiceGetter(this, "extProtocolSvc",
+ "@mozilla.org/uriloader/external-protocol-service;1", "nsIExternalProtocolService");
+
+var documentObserver = {
+ observe: function observe(subject, topic, data) {
+ if (subject instanceof Ci.nsIDOMWindow && topic == 'content-document-global-created') {
+ var doc = subject.document;
+ doc.addEventListener("DOMContentLoaded", function onLoad(event) {
+ event.target.removeEventListener("DOMContentLoaded", onLoad, false);
+ // If the parent document is a local file, don't do anything
+ // Links will just work
+ if (doc.location.href.indexOf("file://") == 0) {
+ return;
+ }
+ var links = event.target.getElementsByTagName("a");
+ for (var i=0; i < links.length; i++) {
+ var link = links[i];
+ if (link.href.indexOf("file://") != 0) {
+ continue;
+ }
+ link.addEventListener("click", function(link) {
+ return function(event) {
+ event.preventDefault();
+ if (gForceExternalHandler) {
+ extProtocolSvc.loadUrl(Services.io.newURI(link.href, null, null));
+ } else {
+ var target = "_self";
+ if (link.hasAttribute("target")) {
+ target = link.getAttribute("target");
+ }
+ // If we were told somewhere other than current (based on modifier keys), use it
+ var where = whereToOpenLink(event);
+ if (where != "current" || target == "_blank") {
+ sendAsyncMessage("cck2:open-url", {
+ "url": link.href,
+ "where": (target == "_blank") ? "tab" : where
+ });
+ return;
+ }
+ switch (target) {
+ case "_self":
+ link.ownerDocument.location = link.href;
+ break;
+ case "_parent":
+ link.ownerDocument.defaultView.parent.document.location = link.href;
+ break;
+ case "_top":
+ link.ownerDocument.defaultView.top.document.location = link.href;
+ break;
+ default:
+ // Attempt to find the iframe that this goes into
+ var iframes = doc.defaultView.parent.document.getElementsByName(target);
+ if (iframes.length > 0) {
+ iframes[0].contentDocument.location = link.href;
+ } else {
+ link.ownerDocument.location = link.href;
+ }
+ break;
+ }
+ }
+ }
+ }(link), false);
+ }
+ }, false);
+ }
+ }
+}
+
+// Don't do this check before Firefox 29
+if (Services.vc.compare(Services.appinfo.version, "29") > 0) {
+ try {
+ if (Services.prefs.getCharPref("capability.policy.default.checkloaduri.enabled") == "allAccess") {
+ gForceExternalHandler = !extProtocolSvc.isExposedProtocol('file');
+ Services.obs.addObserver(documentObserver, "content-document-global-created", false);
+ addEventListener("unload", function() {
+ Services.obs.removeObserver(documentObserver, "content-document-global-created", false);
+ })
+ }
+ } catch (e) {}
+}
+
+
+/* Copied from http://mxr.mozilla.org/mozilla-central/source/browser/base/content/utilityOverlay.js?raw=1 */
+
+function getBoolPref(prefname, def)
+{
+ try {
+ return Services.prefs.getBoolPref(prefname);
+ }
+ catch(er) {
+ return def;
+ }
+}
+
+/* whereToOpenLink() looks at an event to decide where to open a link.
+ *
+ * The event may be a mouse event (click, double-click, middle-click) or keypress event (enter).
+ *
+ * On Windows, the modifiers are:
+ * Ctrl new tab, selected
+ * Shift new window
+ * Ctrl+Shift new tab, in background
+ * Alt save
+ *
+ * Middle-clicking is the same as Ctrl+clicking (it opens a new tab).
+ *
+ * Exceptions:
+ * - Alt is ignored for menu items selected using the keyboard so you don't accidentally save stuff.
+ * (Currently, the Alt isn't sent here at all for menu items, but that will change in bug 126189.)
+ * - Alt is hard to use in context menus, because pressing Alt closes the menu.
+ * - Alt can't be used on the bookmarks toolbar because Alt is used for "treat this as something draggable".
+ * - The button is ignored for the middle-click-paste-URL feature, since it's always a middle-click.
+ */
+function whereToOpenLink( e, ignoreButton, ignoreAlt )
+{
+ Components.utils.import("resource://gre/modules/AppConstants.jsm");
+
+ // This method must treat a null event like a left click without modifier keys (i.e.
+ // e = { shiftKey:false, ctrlKey:false, metaKey:false, altKey:false, button:0 })
+ // for compatibility purposes.
+ if (!e)
+ return "current";
+
+ var shift = e.shiftKey;
+ var ctrl = e.ctrlKey;
+ var meta = e.metaKey;
+ var alt = e.altKey && !ignoreAlt;
+
+ // ignoreButton allows "middle-click paste" to use function without always opening in a new window.
+ var middle = !ignoreButton && e.button == 1;
+ var middleUsesTabs = true;
+
+ // Don't do anything special with right-mouse clicks. They're probably clicks on context menu items.
+
+ var metaKey = AppConstants.platform == "macosx" ? meta : ctrl;
+ if (metaKey || (middle && middleUsesTabs))
+ return shift ? "tabshifted" : "tab";
+
+ if (alt && getBoolPref("browser.altClickSave", false))
+ return "save";
+
+ if (shift || (middle && !middleUsesTabs))
+ return "window";
+
+ return "current";
+}
diff --git a/linux/build/preferences/cck2/modules/CAPSClipboardFramescript.js b/linux/build/preferences/cck2/modules/CAPSClipboardFramescript.js
new file mode 100644
index 0000000..ffadb9d
--- /dev/null
+++ b/linux/build/preferences/cck2/modules/CAPSClipboardFramescript.js
@@ -0,0 +1,183 @@
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+Cu.import("resource://gre/modules/Services.jsm");
+
+const EXPORTED_SYMBOLS = [];
+
+var gAllowedPasteSites = [];
+var gAllowedCutCopySites = [];
+var gDeniedPasteSites = [];
+var gDeniedCutCopySites = [];
+var gDefaultPastePolicy = false;
+var gDefaultCutCopyPolicy = false;
+
+function allowCutCopy(doc) {
+ var win = doc.defaultView;
+ if (win !== win.top) {
+ // It's an iframe. Use the top level window
+ // for security purposes
+ win = win.top;
+ }
+
+ if (gDefaultCutCopyPolicy == true) {
+ for (var i=0; i < gDeniedCutCopySites.length; i++) {
+ if (win.location.href.indexOf(gDeniedCutCopySites[i]) == 0) {
+ return false;
+ }
+ }
+ return true;
+ } else {
+ for (var i=0; i < gAllowedCutCopySites.length; i++) {
+ if (win.location.href.indexOf(gAllowedCutCopySites[i]) == 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
+function allowPaste(doc) {
+ var win = doc.defaultView;
+ if (win !== win.top) {
+ // It's an iframe. Use the top level window
+ // for security purposes
+ win = win.top;
+ }
+
+ if (gDefaultPastePolicy == true) {
+ for (var i=0; i < gDeniedPasteSites.length; i++) {
+ if (win.location.href.indexOf(gDeniedPasteSites[i]) == 0) {
+ return false;
+ break;
+ }
+ }
+ return true;
+ } else {
+ for (var i=0; i < gAllowedPasteSites.length; i++) {
+ if (win.location.href.indexOf(gAllowedPasteSites[i]) == 0) {
+ return true;
+ break;
+ }
+ }
+ return false;
+ }
+}
+
+function myExecCommand(doc, originalExecCommand) {
+ return function(aCommandName, aShowDefaultUI, aValueArgument) {
+ switch (aCommandName.toLowerCase()) {
+ case "cut":
+ case "copy":
+ if (allowCutCopy(doc)) {
+ var win = Services.wm.getMostRecentWindow("navigator:browser");
+ win.goDoCommand("cmd_" + aCommandName.toLowerCase());
+ return true;
+ }
+ break;
+ case "paste":
+ if (allowPaste(doc)) {
+ var win = Services.wm.getMostRecentWindow("navigator:browser");
+ win.goDoCommand("cmd_" + aCommandName.toLowerCase());
+ return true;
+ }
+ break;
+ }
+ return originalExecCommand.call(doc, aCommandName, aShowDefaultUI, aValueArgument);
+ }
+}
+
+function myQueryCommandSupported(doc, originalQueryCommandSupported) {
+ return function(aCommandName) {
+ switch (aCommandName.toLowerCase()) {
+ case "cut":
+ case "copy":
+ if (allowCutCopy(doc)) {
+ return true;
+ }
+ break;
+ case "paste":
+ if (allowPaste(doc)) {
+ return true;
+ }
+ break;
+ }
+ return originalQueryCommandSupported.call(doc, aCommandName, aShowDefaultUI, aValueArgument);
+ }
+}
+
+var documentObserver = {
+ observe: function observe(subject, topic, data) {
+ if (subject instanceof Ci.nsIDOMWindow && topic == 'content-document-global-created') {
+ var doc = subject.document;
+ var cutCopyAllowed = allowCutCopy(doc);
+ var pasteAllowed = allowPaste(doc);
+ if (!cutCopyAllowed && !pasteAllowed) {
+ return;
+ }
+ var originalExecCommand = Cu.waiveXrays(doc).execCommand;
+ Cu.exportFunction(myExecCommand(doc, originalExecCommand), doc, {defineAs: "execCommand"});
+ var originalQueryCommandSupported = Cu.waiveXrays(doc).queryCommandSupported;
+ Cu.exportFunction(myQueryCommandSupported(doc, originalQueryCommandSupported), doc, {defineAs: "queryCommandSupported"});
+ var originalQueryCommandEnabled = Cu.waiveXrays(doc).queryCommandEnabled;
+ Cu.exportFunction(myQueryCommandSupported(doc, originalQueryCommandEnabled), doc, {defineAs: "queryCommandEnabled"});
+ }
+ }
+}
+
+// Don't do this check before Firefox 29
+if (Services.vc.compare(Services.appinfo.version, "29") > 0) {
+ try {
+ if (Services.prefs.getCharPref("capability.policy.default.Clipboard.cutcopy") == "allAccess") {
+ gDefaultCutCopyPolicy = true;
+ }
+ } catch (e) {}
+ try {
+ if (Services.prefs.getCharPref("capability.policy.default.Clipboard.paste") == "allAccess") {
+ gDefaultPastePolicy = true;
+ }
+ } catch (e) {}
+ try {
+ var policies = [];
+ policies = Services.prefs.getCharPref("capability.policy.policynames").split(', ');
+ for (var i=0; i < policies.length; i++ ) {
+ try {
+ if (Services.prefs.getCharPref("capability.policy." + policies[i] + ".Clipboard.cutcopy") == "allAccess") {
+ var allowedCutCopySites = Services.prefs.getCharPref("capability.policy." + policies[i] + ".sites").split(" ");
+ for (var j=0; j < allowedCutCopySites.length; j++) {
+ gAllowedCutCopySites.push(allowedCutCopySites[j]);
+ }
+ }
+ } catch(e) {}
+ try {
+ if (Services.prefs.getCharPref("capability.policy." + policies[i] + ".Clipboard.cutcopy") == "noAccess") {
+ var deniedCutCopySites = Services.prefs.getCharPref("capability.policy." + policies[i] + ".sites").split(" ");
+ for (var j=0; j < deniedCutCopySites.length; j++) {
+ gDeniedCutCopySites.push(deniedCutCopySites[j]);
+ }
+ }
+ } catch(e) {}
+ try {
+ if (Services.prefs.getCharPref("capability.policy." + policies[i] + ".Clipboard.paste") == "allAccess") {
+ var allowedPasteSites = Services.prefs.getCharPref("capability.policy." + policies[i] + ".sites").split(" ");
+ for (var j=0; j < allowedPasteSites.length; j++) {
+ gAllowedPasteSites.push(allowedPasteSites[j]);
+ }
+ }
+ } catch(e) {}
+ try {
+ if (Services.prefs.getCharPref("capability.policy." + policies[i] + ".Clipboard.paste") == "noAccess") {
+ var deniedPasteSites = Services.prefs.getCharPref("capability.policy." + policies[i] + ".sites").split(" ");
+ for (var j=0; j < deniedPasteSites.length; j++) {
+ gDeniedPasteSites.push(deniedPasteSites[j]);
+ }
+ }
+ } catch(e) {}
+ }
+ } catch (e) {}
+ if (gDefaultCutCopyPolicy || gDefaultPastePolicy ||
+ gAllowedCutCopySites.length > 0 || gAllowedPasteSites> 0) {
+ Services.obs.addObserver(documentObserver, "content-document-global-created", false);
+ addEventListener("unload", function() {
+ Services.obs.removeObserver(documentObserver, "content-document-global-created", false);
+ })
+ }
+}
diff --git a/linux/build/preferences/cck2/modules/CCK2.jsm b/linux/build/preferences/cck2/modules/CCK2.jsm
new file mode 100644
index 0000000..2a63260
--- /dev/null
+++ b/linux/build/preferences/cck2/modules/CCK2.jsm
@@ -0,0 +1,1495 @@
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+var EXPORTED_SYMBOLS = ["CCK2"];
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/NetUtil.jsm");
+Cu.import("resource://gre/modules/FileUtils.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/PlacesUtils.jsm");
+try {
+ Cu.import("resource://gre/modules/Timer.jsm");
+} catch (ex) {
+ Cu.import("resource://cck2/Timer.jsm");
+}
+Cu.import("resource://cck2/Preferences.jsm");
+Cu.import("resource://cck2/CTPPermissions.jsm");
+Cu.import("resource:///modules/distribution.js");
+
+XPCOMUtils.defineLazyServiceGetter(this, "bmsvc",
+ "@mozilla.org/browser/nav-bookmarks-service;1", "nsINavBookmarksService");
+XPCOMUtils.defineLazyServiceGetter(this, "annos",
+ "@mozilla.org/browser/annotation-service;1", "nsIAnnotationService");
+XPCOMUtils.defineLazyServiceGetter(this, "override",
+ "@mozilla.org/security/certoverride;1", "nsICertOverrideService");
+XPCOMUtils.defineLazyServiceGetter(this, "uuid",
+ "@mozilla.org/uuid-generator;1", "nsIUUIDGenerator");
+
+Cu.importGlobalProperties(["XMLHttpRequest"]);
+
+/* Hack to work around bug that AutoConfig is loaded in the wrong charset */
+/* Not used for Firefox 44 and above (see CCK2.init) */
+let fixupUTF8 = function(str) {
+ if (!str) {
+ return null;
+ }
+ var out, i, len, c;
+ var char2, char3;
+
+ out = "";
+ len = str.length;
+ i = 0;
+ while(i < len) {
+ c = str.charCodeAt(i++);
+ switch(c >> 4)
+ {
+ case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
+ // 0xxxxxxx
+ out += str.charAt(i-1);
+ break;
+ case 12: case 13:
+ // 110x xxxx 10xx xxxx
+ char2 = str.charCodeAt(i++);
+ out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
+ break;
+ case 14:
+ // 1110 xxxx 10xx xxxx 10xx xxxx
+ char2 = str.charCodeAt(i++);
+ char3 = str.charCodeAt(i++);
+ out += String.fromCharCode(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0));
+ break;
+ }
+ }
+
+ return out;
+};
+
+/* Crazy hack to work around distribution.ini bug */
+/* Basically if the distribution can't be parsed, make it null */
+let dirSvc = Cc["@mozilla.org/file/directory_service;1"].
+ getService(Ci.nsIProperties);
+let iniFile = dirSvc.get("XREAppDist", Ci.nsIFile);
+iniFile.leafName = "distribution";
+iniFile.append("distribution.ini");
+if (iniFile.exists()) {
+ try {
+ let ini = Cc["@mozilla.org/xpcom/ini-parser-factory;1"].
+ getService(Ci.nsIINIParserFactory).
+ createINIParser(iniFile);
+ } catch (e) {
+ DistributionCustomizer.prototype.__defineGetter__("_iniFile", function() { return null;});
+ }
+}
+
+var networkPrefMapping = {
+ proxyType: "network.proxy.type",
+ proxyHTTP: "network.proxy.http",
+ proxyHTTPPort: "network.proxy.http_port",
+ proxySSL: "network.proxy.ssl",
+ proxySSLPort: "network.proxy.ssl_port",
+ proxyFTP: "network.proxy.ftp",
+ proxyFTPPort: "network.proxy.ftp_port",
+ proxySOCKS: "network.proxy.socks",
+ proxySOCKSPort: "network.proxy.socks_port",
+ proxySocksVersion: "network.proxy.socks_version",
+ proxyNone: "network.proxy.no_proxies_on",
+ proxyAutoConfig: "network.proxy.autoconfig_url",
+ shareAllProxies: "network.proxy.share_proxy_settings",
+ proxySOCKSRemoteDNS: "network.proxy.socks_remote_dns",
+ proxyAutologin: "signon.autologin.proxy"
+}
+
+
+function alert(string) {
+ Services.prompt.alert(Services.wm.getMostRecentWindow("navigator:browser"), "", string);
+}
+
+var gBundlePrefFiles = [];
+
+var CCK2 = {
+ configs: {},
+ firstrun: false,
+ upgrade: false,
+ installedVersion: null,
+ initialized: false,
+ aboutFactories: [],
+ init: function(config, a, b) {
+ if (a == b) {
+ /* See bugzilla 1193625/1137799 */
+ fixupUTF8 = function(str) { return str };
+ }
+ // Bring back default profiles for >= FF46
+ if (Services.vc.compare(Services.appinfo.version, "46") >= 0) {
+ // If it is a new profile
+ if (!Preferences.isSet("browser.startup.homepage_override.mstone")) {
+ var defaultProfileDir = Services.dirsvc.get("GreD", Ci.nsIFile);
+ defaultProfileDir.append("defaults");
+ defaultProfileDir.append("profile");
+ if (defaultProfileDir.exists()) {
+ var profileDir = Services.dirsvc.get("ProfD", Ci.nsIFile);
+ try {
+ copyDir(defaultProfileDir, profileDir);
+ } catch(e) {
+ Components.utils.reportError("Error copying default profile directory: " + e);
+ }
+ }
+ }
+ }
+ try {
+ for (var id in this.configs) {
+ if (id == config.id) {
+ // We've already processed this config
+ return;
+ }
+ }
+ if (!config) {
+ // Try to get config from default preference. If it is there, default
+ // preference always wins
+ var configJSON = Preferences.defaults.get("extensions.cck2.config");
+ if (!configJSON) {
+ configJSON = Preferences.defaults.get("extensions.cck2.config");
+ }
+ if (!configJSON) {
+ // Try something else. Grou policy?
+ }
+ try {
+ config = JSON.parse(configJSON);
+ } catch (ex) {
+ return;
+ }
+ }
+
+ if (!config)
+ return;
+ if (!config.id) {
+ alert("Missing ID in config");
+ }
+ config.firstrun = Preferences.get("extensions.cck2." + config.id + ".firstrun", true);
+ Preferences.set("extensions.cck2." + config.id + ".firstrun", false);
+ if (!config.firstrun) {
+ config.installedVersion = Preferences.get("extensions.cck2." + config.id + ".installedVersion");
+ config.upgrade = (config.installedVersion != config.version);
+ }
+ Preferences.set("extensions.cck2." + config.id + ".installedVersion", config.version);
+ Preferences.lock("distribution.id", config.id);
+ Preferences.lock("distribution.version", config.version + " (CCK2)");
+// Preferences.lock("distribution.about", String(config.id + " - " + config.version + " (CCK2)"));
+
+ if (config.removeDefaultSearchEngines) {
+ Services.io.getProtocolHandler("resource").QueryInterface(Components.interfaces.nsIResProtocolHandler)
+ .setSubstitution("search-plugins", null);
+ }
+ if (config.noAddonCompatibilityCheck) {
+ Preferences.reset("extensions.lastAppVersion");
+ }
+ if (config.preferences) {
+ for (var i in config.preferences) {
+ // For plugin.disable_full_page_plugin_for_types, there is
+ // a default user value (application/pdf).
+ // Because of this, setting the default value doesn't work.
+ // So if a user is trying to set the default value, we set
+ // the user value instead.
+ // But we only do that if it's set to application/pdf
+ // or not set (startup), or it's a CCK2 upgrade or first install
+ // As a side note, at Firefox install, application/pdf is added
+ // to the pref no matter what
+ if (i == "plugin.disable_full_page_plugin_for_types") {
+ if (!config.preferences[i].userset &&
+ !config.preferences[i].locked &&
+ !config.preferences[i].clear) {
+ if (Preferences.get(i) == "application/pdf" ||
+ !Preferences.get(i) || // firstrun
+ config.upgrade ||
+ config.firstrun) {
+ Preferences.set(i, config.preferences[i].value);
+ continue;
+ }
+ }
+ }
+ // Workaround bug where this pref is coming is as a string from import
+ if (i == "toolkit.telemetry.prompted") {
+ config.preferences[i].value = parseInt(config.preferences[i].value);
+ }
+ if (config.preferences[i].locked) {
+ Preferences.lock(i, config.preferences[i].value);
+ } else if (config.preferences[i].userset) {
+ Preferences.set(i, config.preferences[i].value);
+ } else if (config.preferences[i].clear) {
+ Preferences.reset(i);
+ } else {
+ if (i == "browser.startup.homepage" ||
+ i == "gecko.handlerService.defaultHandlersVersion" ||
+ i == "browser.menu.showCharacterEncoding" ||
+ i == "intl.accept_languages" ||
+ i.indexOf("browser.search.defaultenginename") == 0 ||
+ i.indexOf("browser.search.order") == 0 ||
+ i.indexOf("browser.contentHandlers.types") == 0 ||
+ i.indexOf("gecko.handlerService.schemes") == 0) {
+ // If it's a complex preference, we need to set it differently
+ Preferences.defaults.set(i, "data:text/plain," + i + "=" + config.preferences[i].value);
+ } else {
+ Preferences.defaults.set(i, config.preferences[i].value);
+ }
+ }
+ }
+ }
+ if (config.registry && "@mozilla.org/windows-registry-key;1" in Cc) {
+ for (var i in config.registry) {
+ addRegistryKey(config.registry[i].rootkey,
+ config.registry[i].key,
+ config.registry[i].name,
+ config.registry[i].value,
+ config.registry[i].type);
+ }
+ }
+ if (config.permissions) {
+ for (var i in config.permissions) {
+ for (var j in config.permissions[i]) {
+ if (i.indexOf("http") == 0) {
+ Services.perms.add(NetUtil.newURI(i), j, config.permissions[i][j]);
+ } else {
+ var domain = i.replace(/^\*\./g, '');
+ Services.perms.add(NetUtil.newURI("http://" + domain), j, config.permissions[i][j]);
+ Services.perms.add(NetUtil.newURI("https://" + domain), j, config.permissions[i][j]);
+ }
+ if (j == "plugins") {
+ var plugins = Cc["@mozilla.org/plugin/host;1"].getService(Ci.nsIPluginHost).getPluginTags({});
+ for (var k=0; k < plugins.length; k++) {
+ if (i.indexOf("http") == 0) {
+ Services.perms.add(NetUtil.newURI(i), "plugin:" + CTP.getPluginPermissionFromTag(plugins[k]), config.permissions[i][j]);
+ Services.perms.add(NetUtil.newURI(i), "plugin-vulnerable:" + CTP.getPluginPermissionFromTag(plugins[k]), config.permissions[i][j]);
+ } else {
+ var domain = i.replace(/^\*\./g, '');
+ Services.perms.add(NetUtil.newURI("http://" + domain), "plugin:" + CTP.getPluginPermissionFromTag(plugins[k]), config.permissions[i][j]);
+ Services.perms.add(NetUtil.newURI("http://" + domain), "plugin-vulnerable:" + CTP.getPluginPermissionFromTag(plugins[k]), config.permissions[i][j]);
+ Services.perms.add(NetUtil.newURI("https://" + domain), "plugin:" + CTP.getPluginPermissionFromTag(plugins[k]), config.permissions[i][j]);
+ Services.perms.add(NetUtil.newURI("https://" + domain), "plugin-vulnerable:" + CTP.getPluginPermissionFromTag(plugins[k]), config.permissions[i][j]);
+ }
+ }
+ }
+ }
+ if (Object.keys(config.permissions[i]).length === 0) {
+ let perms = Services.perms.enumerator;
+ while (perms.hasMoreElements()) {
+ let perm = perms.getNext();
+ try {
+ // Firefox 41 and below
+ if (perm.host == i) {
+ Services.perms.remove(perm.host, perm.type);
+ }
+ } catch(e) {
+ if (i.indexOf("http") == 0) {
+ if (perm.matchesURI(NetUtil.newURI(i), false)) {
+ perm.remove(NetUtil.newURI(i), perm.type);
+ }
+ } else {
+ var domain = i.replace(/^\*\./g, '');
+ if (perm.matchesURI(NetUtil.newURI("http://" + domain), false)) {
+ perm.remove(NetUtil.newURI("http://" + domain), perm.type);
+ }
+ if (perm.matchesURI(NetUtil.newURI("https://" + i), false)) {
+ perm.remove(NetUtil.newURI("https://" + domain), perm.type);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ if (config.disablePrivateBrowsing) {
+ Preferences.lock("browser.taskbar.lists.tasks.enabled", false);
+ Preferences.lock("browser.privatebrowsing.autostart", false);
+ var aboutPrivateBrowsing = {};
+ aboutPrivateBrowsing.classID = Components.ID(uuid.generateUUID().toString());
+ aboutPrivateBrowsing.factory = disableAbout(aboutPrivateBrowsing.classID,
+ "Disable about:privatebrowsing - CCK",
+ "privatebrowsing");
+ CCK2.aboutFactories.push(aboutPrivateBrowsing);
+ }
+ if (config.noGetAddons) {
+ Preferences.lock("extensions.getAddons.showPane", false);
+ }
+ if (config.noAddons) {
+ Preferences.lock("xpinstall.enabled", false);
+ }
+ if (config.disablePDFjs) {
+ Preferences.lock("pdfjs.disabled", true);
+ }
+ if (config.disableHello) {
+ Preferences.lock("loop.enabled", false);
+ }
+ if (config.disablePocket) {
+ Preferences.lock("browser.pocket.enabled", false);
+ Preferences.lock("extensions.pocket.enabled", false);
+ Preferences.lock("browser.newtabpage.activity-stream.feeds.section.topstories", false);
+ }
+ if (config.disableHeartbeat) {
+ Preferences.lock("browser.selfsupport.url", "");
+ }
+ if (config.disableInContentPrefs) {
+ Preferences.lock("browser.preferences.inContent", false);
+ }
+ if (config.disableSync) {
+ var aboutAccounts = {};
+ aboutAccounts.classID = Components.ID(uuid.generateUUID().toString());
+ aboutAccounts.factory = disableAbout(aboutAccounts.classID,
+ "Disable about:accounts - CCK",
+ "accounts");
+ CCK2.aboutFactories.push(aboutAccounts);
+ var aboutSyncLog = {};
+ aboutSyncLog.classID = Components.ID(uuid.generateUUID().toString());
+ aboutSyncLog.factory = disableAbout(aboutSyncLog.classID,
+ "Disable about:sync-log - CCK",
+ "sync-log");
+ CCK2.aboutFactories.push(aboutSyncLog);
+ var aboutSyncProgress = {};
+ aboutSyncProgress.classID = Components.ID(uuid.generateUUID().toString());
+ aboutSyncProgress.factory = disableAbout(aboutSyncProgress.classID,
+ "Disable about:sync-progress - CCK",
+ "sync-progress");
+ CCK2.aboutFactories.push(aboutSyncProgress);
+ var aboutSyncTabs = {};
+ aboutSyncTabs.classID = Components.ID(uuid.generateUUID().toString());
+ aboutSyncTabs.factory = disableAbout(aboutSyncTabs.classID,
+ "Disable about:sync-tabs - CCK",
+ "sync-tabs");
+ CCK2.aboutFactories.push(aboutSyncTabs);
+ Preferences.lock("browser.syncPromoViewsLeftMap", JSON.stringify({bookmarks:0, passwords:0, addons:0}));
+ Preferences.lock("browser.newtabpage.activity-stream.migrationExpired", true);
+ Preferences.lock("identity.fxaccounts.enabled", false);
+ }
+ var disableAboutConfigFactory = null;
+ if (config.disableAboutConfig) {
+ var aboutConfig = {};
+ aboutConfig.classID = Components.ID(uuid.generateUUID().toString());
+ aboutConfig.factory = disableAbout(aboutConfig.classID,
+ "Disable about:config - CCK",
+ "config");
+ CCK2.aboutFactories.push(aboutConfig);
+ }
+ if (config.disableAboutProfiles) {
+ var aboutProfiles = {};
+ aboutProfiles.classID = Components.ID(uuid.generateUUID().toString());
+ aboutProfiles.factory = disableAbout(aboutProfiles.classID,
+ "Disable about:profiles - CCK",
+ "profiles");
+ CCK2.aboutFactories.push(aboutProfiles);
+ }
+ if (config.disableAboutSupport) {
+ var aboutSupport = {};
+ aboutSupport.classID = Components.ID(uuid.generateUUID().toString());
+ aboutSupport.factory = disableAbout(aboutSupport.classID,
+ "Disable about:support - CCK",
+ "support");
+ CCK2.aboutFactories.push(aboutSupport);
+ }
+ if (config.disableAddonsManager) {
+ var aboutAddons = {};
+ aboutAddons.classID = Components.ID(uuid.generateUUID().toString());
+ aboutAddons.factory = disableAbout(aboutAddons.classID,
+ "Disable about:addons - CCK",
+ "addons");
+ CCK2.aboutFactories.push(aboutAddons);
+ }
+
+ if (config.alwaysDefaultBrowser) {
+ var shellSvc = Cc["@mozilla.org/browser/shell-service;1"].getService(Ci.nsIShellService);
+ if (shellSvc) {
+ try {
+ var isDefault = shellSvc.isDefaultBrowser(true, false);
+ if (!isDefault) {
+ shellSvc.setDefaultBrowser(true, false);
+ }
+ } catch (e) {
+ // setDefaultBrowser errors on Yosemite, so we're just ignoring the error.
+ // See Bugzilla bug #1063529
+ }
+ }
+ }
+ if (config.dontCheckDefaultBrowser) {
+ Preferences.lock("browser.shell.checkDefaultBrowser", false);
+ }
+ if (config.dontUseDownloadDir) {
+ Preferences.lock("browser.download.useDownloadDir", false);
+ }
+ if (config.disableFormFill) {
+ Preferences.lock("browser.formfill.enable", false);
+ }
+ if (config.removeSmartBookmarks) {
+ Preferences.lock("browser.places.smartBookmarksVersion", -1);
+ }
+ if (config.disableCrashReporter) {
+ Preferences.lock("toolkit.crashreporter.enabled", false);
+ Preferences.lock("browser.crashReports.unsubmittedCheck.autoSubmit", false);
+ try {
+ Cc["@mozilla.org/toolkit/crash-reporter;1"].
+ getService(Ci.nsICrashReporter).submitReports = false;
+ } catch (e) {
+ // There seem to be cases where the crash reporter isn't defined
+ }
+ var aboutCrashes = {};
+ aboutCrashes.classID = Components.ID(uuid.generateUUID().toString());
+ aboutCrashes.factory = disableAbout(aboutCrashes.classID,
+ "Disable about:crashes - CCK",
+ "crashes");
+ CCK2.aboutFactories.push(aboutCrashes);
+ }
+ if (config.disableTelemetry) {
+ Preferences.lock("toolkit.telemetry.enabled", false);
+ Preferences.lock("toolkit.telemetry.prompted", 999);
+ Preferences.lock("datareporting.policy.dataSubmissionPolicyBypassNotification", true);
+ var aboutTelemetry = {};
+ aboutTelemetry.classID = Components.ID(uuid.generateUUID().toString());
+ aboutTelemetry.factory = disableAbout(aboutTelemetry.classID,
+ "Disable about:telemetry - CCK",
+ "telemetry");
+ CCK2.aboutFactories.push(aboutTelemetry);
+ }
+ if (config.removeDeveloperTools) {
+ Preferences.lock("devtools.scratchpad.enabled", false);
+ Preferences.lock("devtools.responsiveUI.enabled", false);
+ Preferences.lock("devtools.toolbar.enabled", false);
+ Preferences.lock("devtools.styleeditor.enabled", false);
+ Preferences.lock("devtools.debugger.enabled", false);
+ Preferences.lock("devtools.profiler.enabled", false);
+ Preferences.lock("devtools.errorconsole.enabled", false);
+ Preferences.lock("devtools.inspector.enabled", false);
+ }
+ if (config.homePage && !config.lockHomePage) {
+ Preferences.defaults.set("browser.startup.homepage", "data:text/plain,browser.startup.homepage=" + config.homePage);
+ /* If you have a distribution.ini, browser.startup.homepage gets wiped out */
+ /* We need to save it */
+ if (!Preferences.isSet("browser.startup.homepage")) {
+ Preferences.set("browser.startup.homepage", config.homePage);
+ }
+ }
+ if (config.lockHomePage) {
+ if (config.homePage) {
+ Preferences.lock("browser.startup.homepage", config.homePage);
+ } else {
+ Preferences.lock("browser.startup.homepage");
+ }
+ Preferences.lock("pref.browser.homepage.disable_button.current_page", true);
+ Preferences.lock("pref.browser.homepage.disable_button.bookmark_page", true);
+ Preferences.lock("pref.browser.homepage.disable_button.restore_default", true);
+ }
+ if (config.noWelcomePage) {
+ Preferences.lock("startup.homepage_welcome_url", "");
+ Preferences.lock("startup.homepage_welcome_url.additional", "");
+ Preferences.lock("browser.usedOnWindows10", true);
+
+ } else if (config.welcomePage) {
+ Preferences.lock("startup.homepage_welcome_url", config.welcomePage);
+ }
+ if (config.noUpgradePage) {
+ Preferences.lock("browser.startup.homepage_override.mstone", "ignore");
+ } else if (config.upgradePage) {
+ Preferences.lock("startup.homepage_override_url", config.upgradePage);
+ }
+ if (config.dontShowRights) {
+ Preferences.lock("browser.rights.override", true);
+ var rightsVersion = Preferences.get("browser.rights.version");
+ Preferences.lock("browser.rights." + rightsVersion + ".shown", true);
+ }
+ if (config.dontRememberPasswords) {
+ Preferences.lock("signon.rememberSignons", false);
+ }
+ if (config.disableFirefoxHealthReport) {
+ Preferences.lock("datareporting.healthreport.uploadEnabled", false);
+ var aboutHealthReport = {};
+ aboutHealthReport.classID = Components.ID(uuid.generateUUID().toString());
+ aboutHealthReport.factory = disableAbout(aboutHealthReport.classID,
+ "Disable about:healthreport - CCK",
+ "healthreport");
+ CCK2.aboutFactories.push(aboutHealthReport);
+ }
+ if (config.disableFirefoxHealthReportUpload) {
+ Preferences.lock("datareporting.healthreport.uploadEnabled", false);
+ }
+ if (config.disableResetFirefox) {
+ try {
+ Cu.import("resource:///modules/UITour.jsm");
+ UITour.origOnPageEvent = UITour.onPageEvent;
+ UITour.onPageEvent = function(a, b) {
+ var aEvent = b;
+ if (!aEvent) {
+ aEvent = a;
+ }
+ if (aEvent.detail.action == "resetFirefox") {
+ Services.prompt.alert(null, "CCK2", "This has been disabled by your administrator");
+ return;
+ }
+ UITour.origOnPageEvent(a, b);
+ }
+ Preferences.lock("browser.disableResetPrompt ", true);
+ } catch (e) {}
+ }
+ if (config.disableFirefoxUpdates) {
+ Preferences.lock("app.update.auto", false);
+ Preferences.lock("app.update.enabled", false);
+ }
+ if (config.network) {
+ for (var i in networkPrefMapping) {
+ if (i in config.network) {
+ Preferences.defaults.set(networkPrefMapping[i], config.network[i]);
+ }
+ if (config.network.locked) {
+ Preferences.lock(networkPrefMapping[i]);
+ }
+ }
+ }
+ if (config.removeSnippets) {
+ Preferences.lock("browser.newtabpage.activity-stream.disableSnippets", true);
+ }
+ // Fixup bad strings
+ if ("helpMenu" in config) {
+ if ("label" in config.helpMenu) {
+ config.helpMenu.label = fixupUTF8(config.helpMenu.label);
+ }
+ if ("accesskey" in config.helpMenu) {
+ config.helpMenu.accesskey = fixupUTF8(config.helpMenu.accesskey);
+ }
+ }
+ if ("titlemodifier" in config) {
+ config.titlemodifier = fixupUTF8(config.titlemodifier);
+ }
+ if ("defaultSearchEngine" in config) {
+ config.defaultSearchEngine = fixupUTF8(config.defaultSearchEngine);
+ }
+ this.configs[config.id] = config;
+ } catch (e) {
+ errorCritical(e);
+ }
+ },
+ getConfigs: function() {
+ return this.configs;
+ },
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "distribution-customization-complete":
+ for (var id in this.configs) {
+ var config = this.configs[id];
+ // Due to bug 947838, we have to reinitialize default preferences
+ {
+ var iniFile = Services.dirsvc.get("XREAppDist", Ci.nsIFile);
+ iniFile.leafName = "distribution";
+ iniFile.append("distribution.ini");
+ if (iniFile.exists()) {
+ if (config.preferences) {
+ for (var i in config.preferences) {
+ // Workaround bug where this pref is coming is as a string from import
+ if (i == "toolkit.telemetry.prompted") {
+ config.preferences[i].value = parseInt(config.preferences[i].value);
+ }
+ if (!("locked" in config.preferences[i]) &&
+ !("userset" in config.preferences[i]) &&
+ !("clear" in config.preferences[i])) {
+ if (Preferences.defaults.has(i)) {
+ try {
+ // If it's a complex preference, we need to set it differently
+ Services.prefs.getComplexValue(i, Ci.nsIPrefLocalizedString).data;
+ Preferences.defaults.set(i, "data:text/plain," + i + "=" + config.preferences[i].value);
+ } catch (ex) {
+ Preferences.defaults.set(i, config.preferences[i].value);
+ }
+ } else {
+ Preferences.defaults.set(i, config.preferences[i].value);
+ }
+ }
+ }
+ }
+ }
+ if (config.homePage && !config.lockHomePage) {
+ Preferences.defaults.set("browser.startup.homepage", "data:text/plain,browser.startup.homepage=" + config.homePage);
+ /* If you have a distribution.ini, we changed browser.startup.homepage */
+ /* Put it back */
+ if (Preferences.get("browser.startup.homepage") == config.homePage) {
+ Preferences.reset("browser.startup.homepage");
+ }
+ }
+ if (config.network) {
+ for (var i in networkPrefMapping) {
+ if (i in config.network) {
+ Preferences.defaults.set(networkPrefMapping[i], config.network[i]);
+ }
+ }
+ }
+ }
+ // Try to install devices every time just in case get added after install
+ if ("certs" in config && "devices" in config.certs) {
+ let pkcs11;
+ try {
+ pkcs11 = Components.classes["@mozilla.org/security/pkcs11;1"].getService(Ci.nsIPKCS11);
+ } catch (e) {
+ pkcs11 = Components.classes["@mozilla.org/security/pkcs11moduledb;1"].getService(Ci.nsIPKCS11ModuleDB);
+ }
+ for (var i=0; i < config.certs.devices.length; i++) {
+ var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
+ try {
+ file.initWithPath(config.certs.devices[i].path);
+ if (file.exists()) {
+ pkcs11.addModule(config.certs.devices[i].name, config.certs.devices[i].path, 0, 0);
+ }
+ } catch(e) {
+ // Ignore path errors in case we are on different OSes
+ }
+ }
+ }
+ if (!config.firstrun && config.installedVersion == config.version) {
+ continue;
+ }
+ if (config.removeSmartBookmarks) {
+ var smartBookmarks = annos.getItemsWithAnnotation("Places/SmartBookmark", {});
+ for (var i = 0; i < smartBookmarks.length; i++) {
+ try {
+ bmsvc.removeItem(smartBookmarks[i]);
+ } catch (ex) {}
+ }
+ }
+ let syncBookmarks = false;
+ if ("getIdForItemAt" in bmsvc) {
+ syncBookmarks = true;
+ }
+ if (config.removeDefaultBookmarks) {
+ if (syncBookmarks) {
+ var firefoxFolder = bmsvc.getIdForItemAt(bmsvc.bookmarksMenuFolder, 3);
+ if ((firefoxFolder != -1) && (bmsvc.getItemType(firefoxFolder) == bmsvc.TYPE_FOLDER)) {
+ var aboutMozilla = bmsvc.getIdForItemAt(firefoxFolder, 3);
+ if (aboutMozilla != -1 &&
+ bmsvc.getItemType(aboutMozilla) == bmsvc.TYPE_BOOKMARK &&
+ /https?:\/\/www.mozilla.(com|org)\/.*\/about/.test(bmsvc.getBookmarkURI(aboutMozilla).spec)) {
+ bmsvc.removeItem(firefoxFolder);
+ }
+ }
+ var userAgentLocale = Preferences.defaults.get("general.useragent.locale");
+ var gettingStartedURL = "https://www.mozilla.org/" + userAgentLocale + "/firefox/central/";
+ var bookmarks = bmsvc.getBookmarkIdsForURI(NetUtil.newURI("https://www.mozilla.org/" + userAgentLocale + "/firefox/central/"));
+ if (bookmarks.length == 0) {
+ bookmarks = bmsvc.getBookmarkIdsForURI(NetUtil.newURI("http://www.mozilla.com/" + userAgentLocale + "/firefox/central/"));
+ }
+ if (bookmarks.length > 0) {
+ bmsvc.removeItem(bookmarks[0])
+ }
+ var bookmarks = bmsvc.getBookmarkIdsForURI(NetUtil.newURI("https://www.mozilla.org/" + userAgentLocale + "/about/"));
+ if (bookmarks.length == 0) {
+ bookmarks = bmsvc.getBookmarkIdsForURI(NetUtil.newURI("http://www.mozilla.com/" + userAgentLocale + "/about/"));
+ }
+ if (bookmarks.length > 0) {
+ var mozillaFolder = bmsvc.getFolderIdForItem(bookmarks[0]);
+ if (mozillaFolder != -1) {
+ var mozillaFolderIndex = bmsvc.getItemIndex(mozillaFolder);
+ var mozillaFolderParent = bmsvc.getFolderIdForItem(mozillaFolder);
+ bmsvc.removeItem(mozillaFolder);
+ if (config.removeSmartBookmarks) {
+ var separator = bmsvc.getIdForItemAt(mozillaFolderParent, mozillaFolderIndex-1);
+ if (separator != -1) {
+ bmsvc.removeItem(separator);
+ }
+ }
+ }
+ }
+
+ } else {
+ removeDefaultBookmarks();
+ }
+ }
+
+ // If we detect an old CCK Wizard, remove it's bookmarks
+ var bookmarksToRemove = [];
+ if ("extension" in config) {
+ var oldCCKVersion = Preferences.get("extensions." + config.extension.id + ".version", null);
+ if (oldCCKVersion) {
+ Preferences.reset("extensions." + config.extension.id + ".version");
+ bookmarksToRemove = bookmarksToRemove.concat(annos.getItemsWithAnnotation(config.extension.id + "/" + oldCCKVersion, {}));
+ }
+ }
+ if (config.installedVersion != config.version) {
+ bookmarksToRemove = bookmarksToRemove.concat(annos.getItemsWithAnnotation(config.id + "/" + config.installedVersion, {}));
+ bookmarksToRemove = bookmarksToRemove.concat(annos.getItemsWithAnnotation(config.installedVersion + "/" + config.installedVersion, {}));
+ }
+ // Just in case, remove bookmarks for this version too
+ bookmarksToRemove = bookmarksToRemove.concat(annos.getItemsWithAnnotation(config.id + "/" + config.version, {}));
+ if (syncBookmarks) {
+ let bmFolders = [];
+ for (var i = 0; i < bookmarksToRemove.length; i++) {
+ try {
+ var itemType = bmsvc.getItemType(bookmarksToRemove[i]);
+ if (itemType == bmsvc.TYPE_FOLDER) {
+ bmFolders.push(bookmarksToRemove[i]);
+ } else {
+ bmsvc.removeItem(bookmarksToRemove[i]);
+ }
+ } catch (e) {
+ Components.utils.reportError(e);
+ }
+ }
+ if (bmFolders.length > 0) {
+ // Only remove folders if they are empty
+ for (var i = 0; i < bmFolders.length; i++) {
+ try {
+ var bmID = bmsvc.getIdForItemAt(bmFolders[i], 0);
+ if (bmID == -1) {
+ bmsvc.removeItem(bmFolders[i]);
+ } else {
+ var newTitle = bmsvc.getItemTitle(bmFolders[i]) + " (" + (oldCCKVersion || config.installedVersion) + ")";
+ bmsvc.setItemTitle(bmFolders[i], newTitle);
+ }
+ } catch (e) {
+ bmsvc.removeItem(bmFolders[i]);
+ }
+ }
+ }
+ } else {
+ removeOldBookmarks(bookmarksToRemove, oldCCKVersion || config.installedVersion);
+ }
+ if (config.bookmarks) {
+ if (config.bookmarks.toolbar) {
+ if (syncBookmarks) {
+ addBookmarksSync(config.bookmarks.toolbar, bmsvc.toolbarFolder, config.id + "/" + config.version, config.removeDuplicateBookmarkNames);
+ } else {
+ addBookmarks(config.bookmarks.toolbar, PlacesUtils.bookmarks.toolbarGuid, config.id + "/" + config.version, config.removeDuplicateBookmarkNames);
+ }
+ }
+ if (config.bookmarks.menu) {
+ if (syncBookmarks) {
+ addBookmarksSync(config.bookmarks.menu, bmsvc.bookmarksMenuFolder, config.id + "/" + config.version, config.removeDuplicateBookmarkNames);
+ } else {
+ addBookmarks(config.bookmarks.menu, PlacesUtils.bookmarks.menuGuid, config.id + "/" + config.version, config.removeDuplicateBookmarkNames);
+ }
+ }
+ }
+ if (config.searchplugins || config.defaultSearchEngine) {
+ searchInitRun(function() {
+ if (Array.isArray(config.searchplugins)) {
+ for (var i=0; i < config.searchplugins.length; i++) {
+ Services.search.addEngine(config.searchplugins[i], Ci.nsISearchEngine.DATA_XML, null, false, {
+ onSuccess: function (engine) {
+ if (engine.name == config.defaultSearchEngine) {
+ Services.search.currentEngine = engine;
+ }
+ },
+ onError: function (errorCode) {
+ Components.utils.reportError("Engine install error: " + errorCode);
+ // Ignore errors
+ }
+ });
+ }
+ } else {
+ for (let enginename in config.searchplugins) {
+ var engine = Services.search.getEngineByName(enginename);
+ if (engine) {
+ Services.search.removeEngine(engine);
+ }
+ Services.search.addEngine(config.searchplugins[enginename], Ci.nsISearchEngine.DATA_XML, null, false, {
+ onSuccess: function (engine) {
+ if (engine.name == config.defaultSearchEngine) {
+ Services.search.currentEngine = engine;
+ }
+ },
+ onError: function (errorCode) {
+ Components.utils.reportError("Engine install error: " + errorCode);
+ }
+ });
+ }
+ }
+
+ var defaultSearchEngine = Services.search.getEngineByName(config.defaultSearchEngine);
+ if (defaultSearchEngine) {
+ Services.search.currentEngine = defaultSearchEngine;
+ }
+ });
+ }
+ if (config.disableSearchEngineInstall) {
+ try {
+ Cu.import("resource:///modules/ContentLinkHandler.jsm");
+ ContentLinkHandler.origOnLinkAdded = ContentLinkHandler.onLinkAdded;
+ ContentLinkHandler.onLinkAdded = function(event, chromeGlobal) {
+ if (event.originalTarget.rel == "search") {
+ return;
+ }
+ ContentLinkHandler.origOnLinkAdded(event, chromeGlobal);
+ };
+ } catch (e) {
+ // Just in case we are pre Firefox 31
+ }
+ }
+ }
+ break;
+ case "browser-ui-startup-complete":
+ var disableWebApps = false;
+ for (var id in this.configs) {
+ var config = this.configs[id];
+ if (config.disableWebApps) {
+ disableWebApps = true;
+ break;
+ }
+ }
+ if (!disableWebApps) {
+ return;
+ }
+ try {
+ Cu.import("resource://gre/modules/WebappManager.jsm");
+ } catch (e) {
+ try {
+ Cu.import("resource:///modules/WebappManager.jsm");
+ } catch (e) {}
+ }
+ try {
+ WebappManager.doInstall = function() {
+ var win = Services.wm.getMostRecentWindow("navigator:browser");
+ var gBrowser = win.gBrowser;
+ var gNavigatorBundle = win.gNavigatorBundle
+ messageString = gNavigatorBundle.getString("xpinstallDisabledMessageLocked");;
+ var options = {
+ timeout: Date.now() + 30000
+ };
+ win.PopupNotifications.show(gBrowser.selectedBrowser, "xpinstall-disabled",
+ messageString, "addons-notification-icon",
+ null, null, options);
+ };
+ } catch(e) {
+ // Web Apps was removed
+ }
+ break;
+ case "final-ui-startup":
+ for (var id in this.configs) {
+ var config = this.configs[id];
+ // Delay loading unnecessary modules
+ // We should do this on a timeout
+ loadModules(config);
+ if (!config.firstrun && config.installedVersion == config.version) {
+ return;
+ }
+ if ("certs" in config) {
+ if ("override" in config.certs) {
+ for (var i=0; i < config.certs.override.length; i++) {
+ var xhr = new XMLHttpRequest();
+ try {
+ xhr.open("GET", "https://" + config.certs.override[i]);
+ xhr.channel.notificationCallbacks = SSLExceptions;
+ xhr.send(null);
+ } catch (ex) {}
+ }
+ }
+ var certdb = Cc["@mozilla.org/security/x509certdb;1"].getService(Ci.nsIX509CertDB);
+ var certdb2 = certdb;
+ try {
+ certdb2 = Cc["@mozilla.org/security/x509certdb;1"].getService(Ci.nsIX509CertDB2);
+ } catch (e) {}
+ if (config.certs.ca) {
+ for (var i=0; i < config.certs.ca.length; i++) {
+ var certTrust;
+ if (config.certs.ca[i].trust){
+ certTrust = config.certs.ca[i].trust
+ } else {
+ certTrust = ",,";
+ }
+ if (config.certs.ca[i].url) {
+ try {
+ download(config.certs.ca[i].url, function(file, extraParams) {
+ var istream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
+ istream.init(file, -1, -1, false);
+ var bstream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Ci.nsIBinaryInputStream);
+ bstream.setInputStream(istream);
+ var cert = bstream.readBytes(bstream.available());
+ bstream.close();
+ istream.close();
+ if (/-----BEGIN CERTIFICATE-----/.test(cert)) {
+ certdb2.addCertFromBase64(fixupCert(cert), extraParams.trust, "");
+ } else {
+ certdb.addCert(cert, extraParams.trust, "");
+ }
+ }, errorCritical, {trust: certTrust});
+ } catch (e) {
+ errorCritical("Unable to install " + config.certs.ca[i].url + " - " + e);
+ }
+ } else if (config.certs.ca[i].cert) {
+ certdb2.addCertFromBase64(fixupCert(config.certs.ca[i].cert), certTrust, "");
+ }
+ }
+ }
+ if (config.certs.server) {
+ for (var i=0; i < config.certs.server.length; i++) {
+ try {
+ download(config.certs.server[i], function(file) {
+ try {
+ certdb.importCertsFromFile(null, file, Ci.nsIX509Cert.SERVER_CERT);
+ } catch(e) {
+ // API removed in bugzilla #1064402 (FF47)
+ }
+ }, errorCritical);
+ } catch (e) {
+ errorCritical("Unable to install " + config.certs.server[i] + " - " + e);
+ }
+ }
+ }
+ }
+ if (config.persona) {
+ var temp = {};
+ Components.utils.import("resource://gre/modules/LightweightThemeManager.jsm", temp);
+ temp.LightweightThemeManager.currentTheme = config.persona;
+ }
+ if (config.addons) {
+ Cu.import("resource://gre/modules/AddonManager.jsm");
+ var numAddonsInstalled = 0;
+ var numAddons = config.addons.length;
+ let listener = {
+ onInstallEnded: function(install, addon) {
+ if (addon.isActive) {
+ // restartless add-on, so we don't need to restart
+ numAddons--;
+ } else {
+ numAddonsInstalled++;
+ }
+ if (numAddonsInstalled > 0 &&
+ numAddonsInstalled == numAddons) {
+ Services.startup.quit(Services.startup.eRestart | Services.startup.eAttemptQuit);
+ }
+ }
+ }
+ for (var i=0; i < config.addons.length; i++) {
+ try {
+ AddonManager.getInstallForURL(config.addons[i], function(addonInstall) {
+ addonInstall.addListener(listener);
+ addonInstall.install();
+ }, "application/x-xpinstall");
+ } catch (e) {
+ try {
+ AddonManager.getInstallForURL(config.addons[i], "application/x-xpinstall").then(addonInstall => {
+ addonInstall.addListener(listener);
+ addonInstall.install();
+ });
+ } catch (e) {
+ errorCriticial(e);
+ }
+ }
+ }
+ }
+ }
+ break;
+ case "load-extension-defaults":
+ if (gBundlePrefFiles.length > 0) {
+ // Create a temporary scope so the pref function works
+ var temp = {};
+ temp.pref = function(a, b) {
+ Preferences.defaults.set(a, b);
+ }
+ gBundlePrefFiles.forEach(function(prefFile) {
+ Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
+ .getService(Components.interfaces.mozIJSSubScriptLoader)
+ .loadSubScript(prefFile, temp);
+ });
+ }
+ break;
+ case "quit-application":
+ var registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
+ for (var i=0; i < CCK2.aboutFactories.length; i++)
+ registrar.unregisterFactory(CCK2.aboutFactories[i].classID, CCK2.aboutFactories[i].factory);
+ break;
+ }
+ }
+}
+
+async function removeDefaultBookmarks() {
+ var firefoxFolder = await PlacesUtils.bookmarks.fetch({
+ parentGuid: PlacesUtils.bookmarks.menuGuid,
+ index: 0});
+ if (firefoxFolder && firefoxFolder.type == PlacesUtils.bookmarks.TYPE_FOLDER) {
+ await PlacesUtils.bookmarks.remove(firefoxFolder);
+ }
+ var userAgentLocale = Preferences.defaults.get("general.useragent.locale");
+ if (!userAgentLocale) {
+ userAgentLocale = Services.locale.getRequestedLocales()[0];
+ }
+ var userAgentLocale = "en-US";
+ var gettingStartedURL = "https://www.mozilla.org/" + userAgentLocale + "/firefox/central/";
+ let bookmarks = [];
+ await PlacesUtils.bookmarks.fetch({url: gettingStartedURL}, b => bookmarks.push(b));
+ for (let bookmark of bookmarks) {
+ await PlacesUtils.bookmarks.remove(bookmark);
+ }
+}
+
+async function removeOldBookmarks(oldBookmarks, oldVersion) {
+ let bmFolders = [];
+ for (var i = 0; i < oldBookmarks.length; i++) {
+ try {
+ let guid = await PlacesUtils.promiseItemGuid(oldBookmarks[i]);
+ let bookmark = await PlacesUtils.bookmarks.fetch(guid);
+ if (bookmark.type == PlacesUtils.bookmarks.TYPE_FOLDER) {
+ bmFolders.push(bookmark);
+ } else {
+ await PlacesUtils.bookmarks.remove(bookmark);
+ }
+ } catch (ex) {
+ Components.utils.reportError(ex);
+ }
+ }
+ if (bmFolders.length > 0) {
+ // Only remove folders if they are empty
+ for (var i = 0; i < bmFolders.length; i++) {
+ let bookmarks = [];
+ await PlacesUtils.bookmarks.fetch({parentGuid: bmFolders[i].guid, index: 0}, b => bookmarks.push(b));
+ if (bookmarks.length == 0) {
+ await PlacesUtils.bookmarks.remove(bmFolders[i]);
+ } else {
+ PlacesUtils.bookmarks.update({guid: bmFolders[i].guid,
+ title: `${bmFolders[i].title} (${oldVersion})`});
+ }
+ }
+ }
+}
+
+function loadModules(config) {
+ let globalMM = Cc["@mozilla.org/globalmessagemanager;1"].getService();
+ globalMM.addMessageListener("cck2:get-configs", function(message) {
+ return CCK2.configs;
+ });
+ globalMM.addMessageListener("cck2:open-url", function(message) {
+ var win = Services.wm.getMostRecentWindow("navigator:browser");
+ if (win) {
+ win.openUILinkIn(message.data.url, message.data.where);
+ }
+ });
+ Cu.import("resource://cck2/CCK2AboutDialogOverlay.jsm");
+ Cu.import("resource://cck2/CCK2AboutAddonsOverlay.jsm");
+ Cu.import("resource://cck2/CCK2PreferencesOverlay.jsm");
+ globalMM.loadFrameScript("resource://cck2/CCK2Framescript.js", true);
+ globalMM.loadFrameScript("resource://cck2/CCK2AboutHomeFramescript.js", true);
+ globalMM.loadFrameScript("resource://cck2/CAPSCheckLoadURIFramescript.js", true);
+ globalMM.loadFrameScript("resource://cck2/CAPSClipboardFramescript.js", true);
+ Cu.import("resource://cck2/CCK2AboutSupportOverlay.jsm");
+ Cu.import("resource://cck2/CCK2BrowserOverlay.jsm");
+ Cu.import("resource://cck2/CCK2FileBlock.jsm");
+}
+
+function addRegistryKey(RootKey, Key, Name, NameValue, Type) {
+ const nsIWindowsRegKey = Ci.nsIWindowsRegKey;
+ var key = null;
+
+ try {
+ key = Cc["@mozilla.org/windows-registry-key;1"]
+ .createInstance(nsIWindowsRegKey);
+ var rootKey;
+ switch (RootKey) {
+ case "HKEY_CLASSES_ROOT":
+ rootKey = nsIWindowsRegKey.ROOT_KEY_CLASSES_ROOT;
+ break;
+ case "HKEY_CURRENT_USER":
+ rootKey = nsIWindowsRegKey.ROOT_KEY_CURRENT_USER;
+ break;
+ default:
+ rootKey = nsIWindowsRegKey.ROOT_KEY_LOCAL_MACHINE;
+ break;
+ }
+
+ key.create(rootKey, Key, nsIWindowsRegKey.ACCESS_WRITE);
+
+ switch (Type) {
+ case "REG_DWORD":
+ key.writeIntValue(Name, NameValue);
+ break;
+ case "REG_QWORD":
+ key.writeInt64Value(Name, NameValue);
+ break;
+ case "REG_BINARY":
+ key.writeBinaryValue(Name, NameValue);
+ break;
+ case "REG_SZ":
+ default:
+ key.writeStringValue(Name, NameValue);
+ break;
+ }
+ key.close();
+ } catch (ex) {
+ /* This could fail if you don't have the right authority on Windows */
+ if (key) {
+ key.close();
+ }
+ }
+}
+
+function addBookmarksSync(bookmarks, destination, annotation, removeDuplicateBookmarkNames) {
+ for (var i =0; i < bookmarks.length; i++) {
+ if (bookmarks[i].folder) {
+ var newFolderId = bmsvc.createFolder(destination, fixupUTF8(bookmarks[i].name), bmsvc.DEFAULT_INDEX);
+ annos.setItemAnnotation(newFolderId, annotation, "true", 0, annos.EXPIRE_NEVER);
+ addBookmarksSync(bookmarks[i].folder, newFolderId, annotation, removeDuplicateBookmarkNames);
+ } else if (bookmarks[i].type == "separator") {
+ var separatorId = bmsvc.insertSeparator(destination, bmsvc.DEFAULT_INDEX);
+ annos.setItemAnnotation(separatorId, annotation, "true", 0, annos.EXPIRE_NEVER);
+ } else {
+ try {
+ var uri = NetUtil.newURI(bookmarks[i].location);
+ var title = fixupUTF8(bookmarks[i].name);
+ var bookmarkIds = bmsvc.getBookmarkIdsForURI(uri, {}, {});
+ if (bookmarkIds.length > 0) {
+ // Remove duplicate bookmarks
+ for (var j=0; j < bookmarkIds.length; j++) {
+ // Unfortunately there's no way to generically
+ // check for any annotation, so we assume it is ours.
+ // We at least check if the destination is the same
+ let folderID = bmsvc.getFolderIdForItem(bookmarkIds[j]);
+ if (bmsvc.getItemTitle(bookmarkIds[j]) == title &&
+ destination == folderID) {
+ bmsvc.removeItem(bookmarkIds[j]);
+ }
+ }
+ }
+ if (removeDuplicateBookmarkNames) {
+ // This is hideous. There's no way to get the number of children
+ // in a folder, so we do a loop to get a quick count so we can
+ // work backwards.
+ let numItems = 0;
+ do {
+ let bmId = bmsvc.getIdForItemAt(destination, numItems);
+ if (bmId == -1) {
+ break;
+ }
+ numItems++;
+ } while (numItems < 50) // Failsafe just in case we somehow end up in a loop
+ for (var k=numItems; k > 0; k--) {
+ let bmId = bmsvc.getIdForItemAt(destination, k-1);
+ if (bmId == -1) { // Shouldn't happen
+ break;
+ }
+ if (bmsvc.getItemTitle(bmId) == title) {
+ bmsvc.removeItem(bmId);
+ }
+ }
+ }
+ var newBookmarkId = bmsvc.insertBookmark(destination, uri, bmsvc.DEFAULT_INDEX, title);
+ annos.setItemAnnotation(newBookmarkId, annotation, "true", 0, annos.EXPIRE_NEVER);
+ } catch(e) {
+ Components.utils.reportError(e);
+ }
+ }
+ }
+}
+
+let BOOKMARK_GUID_PREFIX = "CCKB-";
+let FOLDER_GUID_PREFIX = "CCKF-";
+let SEPARATOR_GUID_PREFIX = "CCKS-";
+
+function generateGuidWithPrefix(prefix) {
+ // Generates a random GUID and replace its beginning with the given
+ // prefix. We do this instead of just prepending the prefix to keep
+ // the correct character length.
+ return prefix + PlacesUtils.history.makeGuid().substring(prefix.length);
+}
+
+async function addBookmarks(bookmarks, parentGuid, annotation, removeDuplicateBookmarkNames) {
+ for (var i =0; i < bookmarks.length; i++) {
+ if (bookmarks[i].folder) {
+ let guid = generateGuidWithPrefix(FOLDER_GUID_PREFIX);
+ await PlacesUtils.bookmarks.insert({
+ type: PlacesUtils.bookmarks.TYPE_FOLDER,
+ title: fixupUTF8(bookmarks[i].name),
+ guid,
+ parentGuid
+ });
+ let newFolderId = await PlacesUtils.promiseItemId(guid);
+ annos.setItemAnnotation(newFolderId, annotation, "true", 0, annos.EXPIRE_NEVER);
+ addBookmarks(bookmarks[i].folder, guid, annotation, removeDuplicateBookmarkNames);
+ } else if (bookmarks[i].type == "separator") {
+ let guid = generateGuidWithPrefix(SEPARATOR_GUID_PREFIX);
+ await PlacesUtils.bookmarks.insert({
+ type: PlacesUtils.bookmarks.TYPE_SEPARATOR,
+ guid,
+ parentGuid
+ });
+ let newSeparatorId = await PlacesUtils.promiseItemId(guid);
+ annos.setItemAnnotation(newSeparatorId, annotation, "true", 0, annos.EXPIRE_NEVER);
+ } else {
+ try {
+ var title = fixupUTF8(bookmarks[i].name);
+ let bookmarksArray = [];
+ await PlacesUtils.bookmarks.fetch({url: bookmarks[i].location}, b => bookmarksArray.push(b));
+ for (let bookmark of bookmarksArray) {
+ // Unfortunately there's no way to generically
+ // check for any annotation, so we assume it is ours.
+ // We at least check if the destination is the same
+ if (bookmark.title == title &&
+ bookmark.parentGuid == parentGuid) {
+ }
+ await PlacesUtils.bookmarks.remove(bookmark);
+ }
+ if (removeDuplicateBookmarkNames) {
+ try {
+ await PlacesUtils.bookmarks.fetch({parentGuid}, b => bookmarksArray.push(b));
+ for (var k=bookmarksArray.length; k > 0; k--) {
+ if (bookmarks[i].title == title) {
+ await PlacesUtils.bookmarks.remove(bookmarksArray[i]);
+ }
+ }
+ } catch(e) {
+ // Bad index errors in some cases
+ }
+ }
+ let guid = generateGuidWithPrefix(BOOKMARK_GUID_PREFIX);
+ await PlacesUtils.bookmarks.insert({
+ url: bookmarks[i].location,
+ title: fixupUTF8(bookmarks[i].name),
+ guid,
+ parentGuid
+ });
+ let newBookmarkId = await PlacesUtils.promiseItemId(guid);
+ annos.setItemAnnotation(newBookmarkId, annotation, "true", 0, annos.EXPIRE_NEVER);
+ } catch(e) {
+ Components.utils.reportError(e);
+ }
+ }
+ }
+}
+
+function errorCritical(e) {
+ var stack = e.stack;
+ if (!stack) {
+ stack = Error().stack;
+ }
+ Components.utils.reportError("CCK2: " + e + "\n\n" + stack);
+}
+
+/**
+ * If the search service is not available, passing function
+ * to search service init
+ */
+function searchInitRun(func)
+{
+ if (Services.search.init && !Services.search.isInitialized)
+ Services.search.init(func);
+ else
+ func();
+}
+
+/**
+ * Remove all extraneous info from a certificates. addCertFromBase64 requires
+ * just the cert with no whitespace or anything.
+ *
+ * @param {String} certificate text
+ * @returns {String} certificate text cleaned up
+ */
+function fixupCert(cert) {
+ var beginCert = "-----BEGIN CERTIFICATE-----";
+ var endCert = "-----END CERTIFICATE-----";
+
+ cert = cert.replace(/[\r\n]/g, "");
+ var begin = cert.indexOf(beginCert);
+ var end = cert.indexOf(endCert);
+ return cert.substring(begin + beginCert.length, end);
+}
+
+/**
+ * Download the given URL to the user's download directory
+ *
+ * @param {String} URL of the file
+ * @param {function} Function to call on success - called with nsIFile
+ * @param {String} Function to call on failure
+ * @param {Object} extraParams passed to callback
+ * @returns {nsIFile} Downloaded file
+ */
+function download(url, successCallback, errorCallback, extraParams) {
+ var uri = Services.io.newURI(url, null, null);
+
+ var channel = Services.io.newChannelFromURI(uri);
+
+ var downloader = Cc["@mozilla.org/network/downloader;1"].createInstance(Ci.nsIDownloader);
+ var listener = {
+ onDownloadComplete: function(downloader, request, ctxt, status, result) {
+ if (Components.isSuccessCode(status)) {
+ result.QueryInterface(Ci.nsIFile);
+ if (result.exists() && result.fileSize > 0) {
+ successCallback(result, extraParams);
+ return;
+ }
+ }
+ errorCallback(new Error("Download failed (" + status + " for " + url));
+ }
+ }
+ downloader.init(listener, null);
+ channel.asyncOpen(downloader, null);
+}
+
+/**
+ * Used to allow the overriding of certificates
+ */
+var SSLExceptions = {
+ getInterface: function(uuid) {
+ return this.QueryInterface(uuid);
+ },
+ QueryInterface: function(uuid) {
+ if (uuid.equals(Ci.nsIBadCertListener2) ||
+ uuid.equals(Ci.nsISupports))
+ return this;
+ throw Components.results.NS_ERROR_NO_INTERFACE;
+ },
+
+ notifyCertProblem: function (socketInfo, status, targetSite) {
+ status.QueryInterface(Ci.nsISSLStatus);
+
+ let flags = 0;
+
+ if (status.isUntrusted)
+ flags |= override.ERROR_UNTRUSTED;
+ if (status.isDomainMismatch)
+ flags |= override.ERROR_MISMATCH;
+ if (status.isNotValidAtThisTime)
+ flags |= override.ERROR_TIME;
+
+ var hostInfo = targetSite.split(":");
+
+ override.rememberValidityOverride(
+ hostInfo[0],
+ hostInfo[1],
+ status.serverCert,
+ flags,
+ false);
+ return true; // Don't show error UI
+ }
+};
+
+var gAboutXHTML = '' +
+'' +
+'
' +
+' ' +
+' ' +
+' ' +
+' ' +
+' ' +
+' ' +
+'
' +
+'
%s
' +
+' ' +
+'
' +
+'
' +
+'
Access to %s has been disabled by your administrator.
' +
+'
' +
+'
' +
+'
' +
+' ' +
+' ' +
+'' +
+'';
+
+/**
+ * Register a component that replaces an about page
+ *
+ * @param {String} The ClassID of the class being registered.
+ * @param {String} The name of the class being registered.
+ * @param {String} The type of about to be disabled (config/addons/privatebrowsing)
+ * @returns {Object} The factory to be used to unregister
+ */
+function disableAbout(aClass, aClassName, aboutType) {
+ var gAbout = {
+ newChannel : function (aURI, aLoadInfo) {
+ var url = "data:text/html," + gAboutXHTML;
+ var channel = Services.io.newChannelFromURIWithLoadInfo(NetUtil.newURI(url), aLoadInfo);
+ channel.originalURI = aURI;
+ return channel;
+ },
+ getURIFlags : function getURIFlags(aURI) {
+ return Ci.nsIAboutModule.HIDE_FROM_ABOUTABOUT;
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIAboutModule]),
+
+ createInstance: function(outer, iid) {
+ return this.QueryInterface(iid);
+ },
+ };
+
+ var registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
+ registrar.registerFactory(aClass, aClassName, "@mozilla.org/network/protocol/about;1?what=" + aboutType, gAbout);
+ return gAbout;
+}
+
+var documentObserver = {
+ observe: function observe(subject, topic, data) {
+ if (subject instanceof Ci.nsIDOMWindow) {
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ if (topic == "chrome-document-global-created" ||
+ (topic == "content-document-global-created" && win.document.documentURIObject.scheme == "about")) {
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var configs = CCK2.getConfigs();
+ for (var id in configs) {
+ var config = configs[id];
+ if (config.hiddenUI) {
+ for (var i=0; i < config.hiddenUI.length; i++) {
+ var uiElements = doc.querySelectorAll(config.hiddenUI[i]);
+ for (var j=0; j < uiElements.length; j++) {
+ var uiElement = uiElements[j];
+ uiElement.setAttribute("hidden", "true");
+ }
+ }
+ }
+ }
+ }, false);
+ }
+ }
+ }
+}
+
+function copyDir(aOriginal, aDestination) {
+ var enumerator = aOriginal.directoryEntries;
+ while (enumerator.hasMoreElements()) {
+ var file = enumerator.getNext().QueryInterface(Components.interfaces.nsIFile);
+ if (file.isDirectory()) {
+ var subdir = aDestination.clone();
+ subdir.append(file.leafName);
+ subdir.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
+ copyDir(file, subdir);
+ } else {
+ file.copyTo(aDestination, null);
+ }
+ }
+}
+
+function loadBundleDirs() {
+ var cck2BundleDir = Services.dirsvc.get("GreD", Ci.nsIFile);
+ cck2BundleDir.append("cck2");
+ cck2BundleDir.append("bundles");
+ if (!cck2BundleDir.exists() || !cck2BundleDir.isDirectory()) {
+ return;
+ }
+ var enumerator = cck2BundleDir.directoryEntries;
+ while (enumerator.hasMoreElements()) {
+ var file = enumerator.getNext().QueryInterface(Ci.nsIFile);
+ var dirName = file.leafName;
+ file.append("chrome.manifest");
+ Components.manager.QueryInterface(Ci.nsIComponentRegistrar).autoRegister(file);
+ file.leafName = "defaults";
+ file.append("preferences");
+ if (!file.exists() || !file.isDirectory()) {
+ continue;
+ }
+ // In order to load prefs, we have to use a chrome URL.
+ // Create a resource that maps to the prefs directory.
+ var prefAlias = Services.io.newFileURI(file);
+ var resource = Services.io.getProtocolHandler("resource")
+ .QueryInterface(Ci.nsIResProtocolHandler);
+ resource.setSubstitution(dirName + "_prefs", prefAlias);
+ var prefEnumerator = file.directoryEntries;
+ while (prefEnumerator.hasMoreElements()) {
+ var prefFile = prefEnumerator.getNext().QueryInterface(Ci.nsIFile);
+ gBundlePrefFiles.push("resource://" + dirName + "_prefs/" + prefFile.leafName);
+ }
+ }
+}
+
+Services.obs.addObserver(CCK2, "distribution-customization-complete", false);
+Services.obs.addObserver(CCK2, "final-ui-startup", false);
+Services.obs.addObserver(CCK2, "browser-ui-startup-complete", false);
+Services.obs.addObserver(documentObserver, "chrome-document-global-created", false);
+Services.obs.addObserver(documentObserver, "content-document-global-created", false);
+Services.obs.addObserver(CCK2, "load-extension-defaults", false);
+try {
+ loadBundleDirs()
+} catch (e) {
+ Components.utils.reportError(e);
+}
diff --git a/linux/build/preferences/cck2/modules/CCK2AboutAddonsOverlay.jsm b/linux/build/preferences/cck2/modules/CCK2AboutAddonsOverlay.jsm
new file mode 100644
index 0000000..ea1bbd1
--- /dev/null
+++ b/linux/build/preferences/cck2/modules/CCK2AboutAddonsOverlay.jsm
@@ -0,0 +1,111 @@
+/* This file overlays about:addons. It does the following: */
+/* Workaround https://bugzilla.mozilla.org/show_bug.cgi?id=1132971 */
+/* Hide the "Install Add-on From File" menu if xpinstall.enabled is false */
+/* Hides the discover pane if xpinstall.enabled is false */
+/* Hides the add-on entry if specified in the CCK2 config */
+
+const EXPORTED_SYMBOLS = [];
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://cck2/CCK2.jsm");
+
+var addonId = "cck2wizard@kaply.com";
+
+var observer = {
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "chrome-document-global-created":
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var url = doc.location.href.split("?")[0].split("#")[0];
+ switch (url) {
+ case "about:addons":
+ case "chrome://mozapps/content/extensions/extensions.xul":
+ var configs = CCK2.getConfigs();
+ var hiddenAddons = [];
+ var requiredAddons = [];
+ for (let id in configs) {
+ var config = configs[id];
+ if (config && "extension" in config && config.extension.hide) {
+ hiddenAddons.push(config.extension.id);
+ }
+ if (config.requiredAddons) {
+ requiredAddons.push.apply(requiredAddons, config.requiredAddons.split(","));
+ }
+ }
+ if (hiddenAddons.length > 0 || requiredAddons.length > 0) {
+ var ss;
+ for (var i = 0; i < doc.styleSheets.length; i++) {
+ if (doc.styleSheets[i].href == "chrome://mozapps/skin/extensions/extensions.css") {
+ ss = doc.styleSheets[i];
+ break;
+ }
+ }
+ for (var i=0; i < hiddenAddons.length; i++) {
+ ss.insertRule("richlistitem[value='" + hiddenAddons[i] + "'] { display: none;}", ss.cssRules.length);
+ }
+ for (var i=0; i < requiredAddons.length; i++) {
+ ss.insertRule("richlistitem[value='" + requiredAddons[i] + "'] button[anonid='disable-btn'] { display: none;}", ss.cssRules.length);
+ ss.insertRule("richlistitem[value='" + requiredAddons[i] + "'] button[anonid='remove-btn'] { display: none;}", ss.cssRules.length);
+ }
+ if (requiredAddons.length > 0) {
+ win.gViewController.commands.cmd_disableItem.origIsEnabled = win.gViewController.commands.cmd_disableItem.isEnabled;
+ win.gViewController.commands.cmd_disableItem.isEnabled = function(aAddon) { if (aAddon && requiredAddons.indexOf(aAddon.id) != -1) return false; return this.origIsEnabled;}
+ win.gViewController.commands.cmd_uninstallItem.origIsEnabled = win.gViewController.commands.cmd_disableItem.isEnabled;
+ win.gViewController.commands.cmd_uninstallItem.isEnabled = function(aAddon) { if (aAddon && requiredAddons.indexOf(aAddon.id) != -1) return false; return this.origIsEnabled;}
+ }
+ }
+ var showDiscoverPane = true;
+ var xpinstallEnabled = true;
+ try {
+ xpinstallEnabled = Services.prefs.getBoolPref("xpinstall.enabled");
+ } catch (e) {}
+ try {
+ showDiscoverPane = Services.prefs.getBoolPref("extensions.getAddons.showPane");
+ } catch (e) {}
+ if (!xpinstallEnabled || !showDiscoverPane) {
+ // Work around Mozilla bug 1132971
+ // Hide the discover pane if it is the selected pane
+ if (E("view-port", doc) && E("view-port", doc).selectedIndex == 0) {
+ try {
+ win.gViewController.loadView("addons://list/extension");
+ } catch (ex) {
+ // This fails with Webconverger installed. Ignore it.
+ }
+ }
+ }
+ if (!xpinstallEnabled) {
+ // Hide the "Install Add-on From File" separator
+ hide(E("utils-installFromFile-separator", doc));
+ // Hide the "Install Add-on From File" menuitem
+ hide(E("utils-installFromFile", doc));
+ win.gDragDrop.onDragOver = function(event) {
+ event.dataTransfer.dropEffect = "none";
+ event.stopPropagation();
+ event.preventDefault();
+ };
+ }
+ break;
+ }
+ }, false);
+ break;
+ }
+ }
+}
+
+Services.obs.addObserver(observer, "chrome-document-global-created", false);
+
+function E(id, context) {
+ var element = context.getElementById(id);
+ return element;
+}
+
+function hide(element) {
+ if (element) {
+ element.setAttribute("hidden", "true");
+ }
+}
diff --git a/linux/build/preferences/cck2/modules/CCK2AboutDialogOverlay.jsm b/linux/build/preferences/cck2/modules/CCK2AboutDialogOverlay.jsm
new file mode 100644
index 0000000..630e27b
--- /dev/null
+++ b/linux/build/preferences/cck2/modules/CCK2AboutDialogOverlay.jsm
@@ -0,0 +1,33 @@
+/* This file is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1139509 */
+/* It bolds the Firefox version in the about dialog and unbolds the distribution information */
+/* It can be removed once Firefox 38 ESR is out of support */
+
+const EXPORTED_SYMBOLS = [];
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+var observer = {
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "chrome-document-global-created":
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var url = doc.location.href.split("?")[0].split("#")[0];
+ switch (url) {
+ case "chrome://browser/content/aboutDialog.xul":
+ doc.querySelector("#version").style.fontWeight = "bold";
+ doc.querySelector("#distribution").style.fontWeight = "normal";
+ doc.querySelector("#distributionId").style.fontWeight = "normal";
+ break;
+ }
+ }, false);
+ break;
+ }
+ }
+}
+
+Services.obs.addObserver(observer, "chrome-document-global-created", false);
diff --git a/linux/build/preferences/cck2/modules/CCK2AboutHomeFramescript.js b/linux/build/preferences/cck2/modules/CCK2AboutHomeFramescript.js
new file mode 100644
index 0000000..98e5b3d
--- /dev/null
+++ b/linux/build/preferences/cck2/modules/CCK2AboutHomeFramescript.js
@@ -0,0 +1,79 @@
+/* This file overrides about:home. It does the following:
+ * Remove the sync button if Sync is disabled
+ * Remove the Addons button if Sync is disabled
+ * Remove the snippets if snippets are disabled
+ */
+
+const EXPORTED_SYMBOLS = [];
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+var configs = null;
+
+var observer = {
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "content-document-global-created":
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var url = doc.location.href.split("?")[0].split("#")[0];
+ switch (url) {
+ case "about:home":
+ case "chrome://browser/content/abouthome/aboutHome.xhtml":
+ if (!configs) {
+ // TODO - Make this Async
+ configs = sendSyncMessage("cck2:get-configs")[0];
+ }
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.disableSync) {
+ remove(E("sync", doc));
+ }
+ if (config.disableAddonsManager) {
+ remove(E("addons", doc));
+ }
+ if (config.disableWebApps) {
+ remove(E("apps", doc));
+ }
+ if (config.removeSnippets) {
+ var snippets = E("snippets", doc);
+ if (snippets) {
+ snippets.style.display = "none";
+ }
+ }
+ if (config.hiddenUI) {
+ for (var i=0; i < config.hiddenUI.length; i++) {
+ var uiElements = doc.querySelectorAll(config.hiddenUI[i]);
+ for (var j=0; j < uiElements.length; j++) {
+ var uiElement = uiElements[j];
+ uiElement.setAttribute("hidden", "true");
+ }
+ }
+ }
+ }
+ break;
+ }
+ }, false);
+ break;
+ }
+ }
+}
+Services.obs.addObserver(observer, "content-document-global-created", false);
+
+addEventListener("unload", function() {
+ Services.obs.removeObserver(observer, "content-document-global-created", false);
+})
+
+function E(id, context) {
+ var element = context.getElementById(id);
+ return element;
+}
+
+function remove(element) {
+ if (element && element.parentNode)
+ element.parentNode.removeChild(element);
+}
diff --git a/linux/build/preferences/cck2/modules/CCK2AboutSupportOverlay.jsm b/linux/build/preferences/cck2/modules/CCK2AboutSupportOverlay.jsm
new file mode 100644
index 0000000..4da8fba
--- /dev/null
+++ b/linux/build/preferences/cck2/modules/CCK2AboutSupportOverlay.jsm
@@ -0,0 +1,62 @@
+/* This file overrides about:support It does the following:
+ * Remove the reset Firefox button if disableResetFirefox is set
+ * Remove the safe mode Button if disableSafeMode is set
+ * Remove the box if both are set
+ */
+
+const EXPORTED_SYMBOLS = [];
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://cck2/CCK2.jsm");
+
+var configs = null;
+
+var observer = {
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "chrome-document-global-created":
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var url = doc.location.href.split("?")[0].split("#")[0];
+ switch (url) {
+ case "about:support":
+ case "chrome://global/content/aboutSupport.xhtml":
+ if (!configs) {
+ configs = CCK2.getConfigs();
+ }
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.disableResetFirefox) {
+ remove(E("reset-box", doc));
+ }
+ if (config.disableSafeMode) {
+ remove(E("safe-mode-box", doc));
+ }
+ if (config.disableResetFirefox &&
+ config.disableSafeMode) {
+ remove(E("action-box", doc));
+ }
+ }
+ break;
+ }
+ }, false);
+ break;
+ }
+ }
+}
+Services.obs.addObserver(observer, "chrome-document-global-created", false);
+
+function E(id, context) {
+ var element = context.getElementById(id);
+ return element;
+}
+
+
+function remove(element) {
+ if (element && element.parentNode)
+ element.parentNode.removeChild(element);
+}
diff --git a/linux/build/preferences/cck2/modules/CCK2BrowserOverlay.jsm b/linux/build/preferences/cck2/modules/CCK2BrowserOverlay.jsm
new file mode 100644
index 0000000..52d59fb
--- /dev/null
+++ b/linux/build/preferences/cck2/modules/CCK2BrowserOverlay.jsm
@@ -0,0 +1,373 @@
+/* This file modifies the main browser window. It does the following:
+ * Goes through the hiddenUI list and hides any UI
+ *
+ */
+
+const EXPORTED_SYMBOLS = [];
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource:///modules/CustomizableUI.jsm");
+Cu.import("resource://gre/modules/PrivateBrowsingUtils.jsm");
+Cu.import("resource://cck2/CCK2.jsm");
+
+var configs = null;
+
+var observer = {
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "chrome-document-global-created":
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var url = doc.location.href.split("?")[0].split("#")[0];
+ switch (url) {
+ case "chrome://browser/content/browser.xul":
+ // Workaround https://bugzilla.mozilla.org/show_bug.cgi?id=1149617
+ var origSetReportPhishingMenu = win.gSafeBrowsing.setReportPhishingMenu;
+ win.gSafeBrowsing.setReportPhishingMenu = function() {
+ try {
+ origSetReportPhishingMenu();
+ } catch (e) {}
+ }
+
+ win.addEventListener("unload", function onUnload(event) {
+ win.removeEventListener("unload", onUnload, false);
+ var panelUIPopup = doc.getElementById("PanelUI-popup");
+ if (panelUIPopup) {
+ E("PanelUI-popup", doc).removeEventListener("popupshowing", onPanelShowing, false);
+ }
+ });
+ var panelUIPopup = doc.getElementById("PanelUI-popup");
+ if (panelUIPopup) {
+ E("PanelUI-popup", doc).addEventListener("popupshowing", onPanelShowing, false);
+ }
+ var appMenuPopup = doc.getElementById("appMenu-popup");
+ if (appMenuPopup) {
+ E("appMenu-popup", doc).addEventListener("popupshowing", onAppMenuShowing, false);
+ }
+ configs = CCK2.getConfigs();
+ for (let id in configs) {
+ config = configs[id];
+ if (config.disablePrivateBrowsing &&
+ PrivateBrowsingUtils.isWindowPrivate(win)) {
+ win.setTimeout(function() {
+ Services.prompt.alert(win, "Private Browsing", "Private Browsing has been disabled by your administrator");
+ win.close();
+ }, 0, false);
+ }
+ if (config.disablePrivateBrowsing) {
+ disablePrivateBrowsing(doc);
+ }
+ if (config.disableSync) {
+ disableSync(doc);
+ }
+ if (config.disableAddonsManager) {
+ disableAddonsManager(doc);
+ }
+ if (config.removeDeveloperTools) {
+ Services.tm.mainThread.dispatch(function() {
+ removeDeveloperTools(doc);
+ }, Ci.nsIThread.DISPATCH_NORMAL);
+ }
+ if (config.disableErrorConsole) {
+ disableErrorConsole(doc);
+ }
+ if (config.disableFirefoxHealthReport) {
+ var healthReportMenu = doc.getElementById("healthReport");
+ if (healthReportMenu) {
+ healthReportMenu.parentNode.removeChild(healthReportMenu);
+ }
+ }
+ if (config.removeSafeModeMenu) {
+ hide(E("helpSafeMode", doc));
+ }
+ if (config.titlemodifier) {
+ doc.getElementById("main-window").setAttribute("titlemodifier", config.titlemodifier);
+ }
+ if (config.removeSetDesktopBackground) {
+ // Because this is on a context menu, we can't use "hidden"
+ if (E("context-setDesktopBackground", doc)) {
+ E("context-setDesktopBackground", doc).setAttribute("style", "display: none;");
+ }
+ }
+ if (config.disableWebApps) {
+ CustomizableUI.destroyWidget("web-apps-button");
+ hide(E("menu_openApps", doc));
+ }
+ if (config.disableHello) {
+ CustomizableUI.destroyWidget("loop-button");
+ hide(E("menu_openLoop", doc));
+ }
+ if (config.disablePocket) {
+ CustomizableUI.destroyWidget("pocket-button");
+ }
+ if (config.disableSharePage) {
+ CustomizableUI.destroyWidget("social-share-button");
+ // Because these are on a context menu, we can't use "hidden"
+ if (E("context-sharelink", doc)) {
+ E("context-sharelink", doc).setAttribute("style", "display: none;");
+ }
+ if (E("context-shareselect", doc)) {
+ E("context-shareselect", doc).setAttribute("style", "display: none;");
+ }
+ if (E("context-shareimage", doc)) {
+ E("context-shareimage", doc).setAttribute("style", "display: none;");
+ }
+ if (E("context-sharevideo", doc)) {
+ E("context-sharevideo", doc).setAttribute("style", "display: none;");
+ }
+ if (E("context-sharepage", doc)) {
+ E("context-sharepage", doc).setAttribute("style", "display: none;");
+ }
+ }
+ if (config.disableSocialAPI) {
+ win.SocialActivationListener = {};
+ }
+ if (config.disableForget) {
+ CustomizableUI.destroyWidget("panic-button");
+ }
+ if (config.hiddenUI) {
+ hideUIElements(doc, config.hiddenUI);
+ }
+ if (config.helpMenu) {
+ // We need to run this function on a delay, because we won't know
+ // if the about menu is hidden for mac until after it is run.
+ Services.tm.mainThread.dispatch(function() {
+ var helpMenuPopup = doc.getElementById("menu_HelpPopup");
+ var menuitem = doc.createElement("menuitem");
+ menuitem.setAttribute("label", config.helpMenu.label);
+ if ("accesskey" in config.helpMenu) {
+ menuitem.setAttribute("accesskey", config.helpMenu.accesskey);
+ }
+ menuitem.setAttribute("oncommand", "openUILink('" + config.helpMenu.url + "');");
+ menuitem.setAttribute("onclick", "checkForMiddleClick(this, event);");
+ if (!E("aboutName", doc) || E("aboutName", doc).hidden) {
+ // Mac
+ helpMenuPopup.appendChild(menuitem);
+ } else {
+ helpMenuPopup.insertBefore(menuitem, E("aboutName", doc));
+ helpMenuPopup.insertBefore(doc.createElement("menuseparator"),
+ E("aboutName", doc));
+ }
+ }, Ci.nsIThread.DISPATCH_NORMAL);
+ }
+ if (config.firstrun || config.upgrade) {
+ if (config.displayBookmarksToolbar || (config.bookmarks && config.bookmarks.toolbar)) {
+ CustomizableUI.setToolbarVisibility("PersonalToolbar", "true");
+ }
+ if (config.displayMenuBar) {
+ CustomizableUI.setToolbarVisibility("toolbar-menubar", "true");
+ }
+ if (config.showSearchBar) {
+ CustomizableUI.addWidgetToArea("search-container", CustomizableUI.AREA_NAVBAR,
+ CustomizableUI.getPlacementOfWidget("urlbar-container").position + 1);
+ }
+ config.firstrun = false;
+ config.upgrade = false;
+ }
+ }
+ break;
+ case "chrome://browser/content/places/places.xul":
+ case "chrome://browser/content/bookmarks/bookmarksPanel.xul":
+ case "chrome://browser/content/history/history-panel.xul":
+ configs = CCK2.getConfigs();
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.disablePrivateBrowsing) {
+ if (E("placesContext_open:newprivatewindow", doc)) {
+ E("placesContext_open:newprivatewindow", doc).setAttribute("style", "display: none;");
+ }
+ }
+ if (config.hiddenUI) {
+ hideUIElements(doc, config.hiddenUI);
+ }
+ }
+ break;
+ }
+ }, false);
+ break;
+ }
+ }
+}
+Services.obs.addObserver(observer, "chrome-document-global-created", false);
+
+function disableSync(doc) {
+ var win = doc.defaultView;
+ if (win.gSyncUI) {
+ var mySyncUI = {
+ init: function() {
+ return;
+ },
+ initUI: function() {
+ return;
+ },
+ updateUI: function() {
+ hide(E("sync-setup-state", doc));
+ hide(E("sync-syncnow-state", doc));
+ hide(E("sync-setup", doc));
+ hide(E("sync-syncnowitem", doc));
+ }
+ }
+ win.gSyncUI = mySyncUI;
+ }
+ CustomizableUI.destroyWidget("sync-button");
+ CustomizableUI.removeWidgetFromArea("sync-button");
+ var toolbox = doc.getElementById("navigator-toolbox");
+ if (toolbox && toolbox.palette) {
+ let element = toolbox.palette.querySelector("#sync-button");
+ if (element) {
+ element.parentNode.removeChild(element);
+ }
+ }
+ hide(E("sync-setup-state", doc));
+ hide(E("sync-syncnow-state", doc));
+ hide(E("sync-setup", doc));
+ hide(E("sync-syncnowitem", doc));
+}
+
+function disablePrivateBrowsing(doc) {
+ disable(E("Tools:PrivateBrowsing", doc));
+ hide(E("menu_newPrivateWindow", doc));
+ // Because this is on a context menu, we can't use "hidden"
+ if (E("context-openlinkprivate", doc))
+ E("context-openlinkprivate", doc).setAttribute("style", "display: none;");
+ if (E("placesContext_open:newprivatewindow", doc))
+ E("placesContext_open:newprivatewindow", doc).setAttribute("style", "display: none;");
+ CustomizableUI.destroyWidget("privatebrowsing-button")
+}
+
+function disableAddonsManager(doc) {
+ hide(E("menu_openAddons", doc));
+ disable(E("Tools:Addons", doc)); // Ctrl+Shift+A
+ CustomizableUI.destroyWidget("add-ons-button")
+}
+
+function removeDeveloperTools(doc) {
+ var win = doc.defaultView;
+ // Need to delay this because devtools is created dynamically
+ win.setTimeout(function() {
+ CustomizableUI.destroyWidget("developer-button")
+ hide(E("webDeveloperMenu", doc));
+ var devtoolsKeyset = doc.getElementById("devtoolsKeyset");
+ if (devtoolsKeyset) {
+ for (var i = 0; i < devtoolsKeyset.childNodes.length; i++) {
+ devtoolsKeyset.childNodes[i].removeAttribute("oncommand");
+ devtoolsKeyset.childNodes[i].removeAttribute("command");
+ }
+ }
+ }, 0);
+ try {
+ doc.getElementById("Tools:ResponsiveUI").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:Scratchpad").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:BrowserConsole").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:BrowserToolbox").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:DevAppsMgr").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:DevToolbar").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:DevToolbox").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:DevToolbarFocus").removeAttribute("oncommand");
+ } catch (e) {}
+ CustomizableUI.destroyWidget("developer-button")
+}
+
+function disableErrorConsole(doc) {
+ doc.getElementById("Tools:ErrorConsole").removeAttribute("oncommand");
+}
+
+function onPanelShowing(event) {
+ var configs = CCK2.getConfigs();
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.disableSync) {
+ hide(E("PanelUI-fxa-status", event.target.ownerDocument));
+ hide(E("PanelUI-footer-fxa", event.target.ownerDocument)); // Firefox 42+
+ }
+ }
+}
+
+function onAppMenuShowing(event) {
+ var configs = CCK2.getConfigs();
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.disableSync) {
+ hide(E("appMenu-fxa-container", event.target.ownerDocument));
+ }
+ if (config.removeDeveloperTools) {
+ hide(E("appMenu-developer-button", event.target.ownerDocument));
+ }
+ }
+}
+
+function E(id, context) {
+ var element = context.getElementById(id);
+ return element;
+}
+
+function hide(element) {
+ if (element) {
+ element.setAttribute("hidden", "true");
+ }
+}
+
+function disable(element) {
+ if (element) {
+ element.disabled = true;
+ element.setAttribute("disabled", "true");
+ }
+}
+
+function hideUIElements(doc, hiddenUI) {
+ for (var i=0; i < hiddenUI.length; i++) {
+ var uiElements = doc.querySelectorAll(hiddenUI[i]);
+ // Don't use .hidden since it doesn't work sometimes
+ var style = doc.getElementById("cck2-hidden-style");
+ if (!style) {
+ style = doc.createElementNS("http://www.w3.org/1999/xhtml", "style");
+ style.setAttribute("id", "cck2-hidden-style");
+ style.setAttribute("type", "text/css");
+ doc.documentElement.appendChild(style);
+ }
+ style.textContent = style.textContent + hiddenUI[i] + "{display: none !important;}";
+ if (!uiElements || uiElements.length == 0) {
+ continue;
+ }
+ for (var j=0; j < uiElements.length; j++) {
+ var uiElement = uiElements[j];
+ if (uiElement.nodeName == "menuitem") {
+ uiElement.removeAttribute("key");
+ uiElement.removeAttribute("oncommand");
+ if (uiElement.hasAttribute("command")) {
+ var commandId = uiElement.getAttribute("command");
+ uiElement.removeAttribute("command");
+ var command = doc.getElementById(commandId);
+ command.removeAttribute("oncommand");
+ var keys = doc.querySelectorAll("key[command='" + commandId + "']")
+ for (var k=0; k < keys.length; k++) {
+ keys[k].removeAttribute("command");
+ }
+ }
+ }
+ // Horrible hack to work around the crappy Australis help menu
+ // Items on the menu always show up in the Australis menu, so we have to remove them.
+ if (uiElements[j].parentNode.id == "menu_HelpPopup") {
+ uiElements[j].parentNode.removeChild(uiElements[j]);
+ }
+ }
+ }
+}
diff --git a/linux/build/preferences/cck2/modules/CCK2FileBlock.jsm b/linux/build/preferences/cck2/modules/CCK2FileBlock.jsm
new file mode 100644
index 0000000..5cad7de
--- /dev/null
+++ b/linux/build/preferences/cck2/modules/CCK2FileBlock.jsm
@@ -0,0 +1,47 @@
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+var EXPORTED_SYMBOLS = [];
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+let CCK2FileBlock = {
+ chromeBlacklist: ["browser", "mozapps", "marionette", "specialpowers",
+ "branding", "alerts"],
+ shouldLoad: function(aContentType, aContentLocation, aRequestOrigin, aContext, aMimeTypeGuess, aExtra) {
+ // Prevent the loading of chrome URLs into the main browser window
+ if (aContentLocation.scheme == "chrome") {
+ if (aRequestOrigin &&
+ (aRequestOrigin.spec == "chrome://browser/content/browser.xul" ||
+ aRequestOrigin.scheme == "moz-nullprincipal")) {
+ for (var i=0; i < this.chromeBlacklist.length; i++) {
+ if (aContentLocation.host == this.chromeBlacklist[i]) {
+ if (aContentLocation.spec.includes(".xul")) {
+ return Ci.nsIContentPolicy.REJECT_REQUEST;
+ }
+ }
+ }
+ }
+ }
+ return Ci.nsIContentPolicy.ACCEPT;
+ },
+ shouldProcess: function(aContentType, aContentLocation, aRequestOrigin, aContext, aMimeTypeGuess, aExtra) {
+ return Ci.nsIContentPolicy.ACCEPT;
+ },
+ classDescription: "CCK2 FileBlock Service",
+ contractID: "@kaply.com/cck2-fileblock-service;1",
+ classID: Components.ID('{26e7afc9-e22d-4d12-bb57-c184fe24b828}'),
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPolicy]),
+ createInstance: function(outer, iid) {
+ return this.QueryInterface(iid);
+ },
+};
+
+var registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
+registrar.registerFactory(CCK2FileBlock.classID,
+ CCK2FileBlock.classDescription,
+ CCK2FileBlock.contractID,
+ CCK2FileBlock);
+
+var cm = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager);
+cm.addCategoryEntry("content-policy", CCK2FileBlock.contractID,
+ CCK2FileBlock.contractID, false, true);
diff --git a/linux/build/preferences/cck2/modules/CCK2Framescript.js b/linux/build/preferences/cck2/modules/CCK2Framescript.js
new file mode 100644
index 0000000..fda925c
--- /dev/null
+++ b/linux/build/preferences/cck2/modules/CCK2Framescript.js
@@ -0,0 +1,51 @@
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+Cu.import("resource://gre/modules/Services.jsm");
+
+var disableSearchEngineInstall = false;
+
+var documentObserver = {
+ observe: function observe(subject, topic, data) {
+ if (subject instanceof Ci.nsIDOMWindow && topic == 'content-document-global-created') {
+ var doc = subject.document;
+ doc.addEventListener("DOMContentLoaded", function onLoad(event) {
+ event.target.removeEventListener("DOMContentLoaded", onLoad, false);
+ if (disableSearchEngineInstall) {
+ subject.wrappedJSObject.external.AddSearchProvider = function() {};
+ }
+ if (!doc.documentURI.startsWith("about:")) {
+ return;
+ }
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.hiddenUI) {
+ for (var i=0; i < config.hiddenUI.length; i++) {
+ // Don't use .hidden since it doesn't work sometimes
+ var style = doc.getElementById("cck2-hidden-style");
+ if (!style) {
+ style = doc.createElementNS("http://www.w3.org/1999/xhtml", "style");
+ style.setAttribute("id", "cck2-hidden-style");
+ style.setAttribute("type", "text/css");
+ doc.documentElement.appendChild(style);
+ }
+ style.textContent = style.textContent + config.hiddenUI[i] + "{display: none !important;}";
+ }
+ }
+ }
+ }, false);
+ }
+ }
+}
+
+var configs = sendSyncMessage("cck2:get-configs")[0];
+for (var id in configs) {
+ var config = configs[id];
+ if (config.disableSearchEngineInstall) {
+ disableSearchEngineInstall = true;
+ break;
+ }
+}
+
+Services.obs.addObserver(documentObserver, "content-document-global-created", false);
+addEventListener("unload", function() {
+ Services.obs.removeObserver(documentObserver, "content-document-global-created", false);
+})
diff --git a/linux/build/preferences/cck2/modules/CCK2PreferencesOverlay.jsm b/linux/build/preferences/cck2/modules/CCK2PreferencesOverlay.jsm
new file mode 100644
index 0000000..3f165bd
--- /dev/null
+++ b/linux/build/preferences/cck2/modules/CCK2PreferencesOverlay.jsm
@@ -0,0 +1,123 @@
+/* This file modifies the preferences dialogs. It does the following:
+ * Removes private browsing from the pref UI if it is disabled
+ * Removes Sync from the pref UI if it is diabled
+ * Disables the crash reporter button if crash reporter is disabled
+ * Removed the master password UI if it is disabled
+ * Goes through the hiddenUI list and hides any UI
+ *
+ */
+
+const EXPORTED_SYMBOLS = [];
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://cck2/CCK2.jsm");
+
+var configs = null;
+
+var observer = {
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "chrome-document-global-created":
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var url = doc.location.href.split("?")[0].split("#")[0];
+ switch (url) {
+ case "chrome://browser/content/preferences/preferences.xul":
+ configs = CCK2.getConfigs();
+ win.addEventListener("paneload", function(event) {
+ updatePrefUI(event.target.ownerDocument);
+ }, false);
+ updatePrefUI(doc);
+ for (let id in configs) {
+ var config = configs[id];
+ if (!config.disableSync) {
+ continue;
+ }
+ var prefWindow = E("BrowserPreferences", doc);
+ var paneSyncRadio = doc.getAnonymousElementByAttribute(prefWindow, "pane", "paneSync");
+ hide(paneSyncRadio);
+ var paneDeck = doc.getAnonymousElementByAttribute(prefWindow, "anonid", "paneDeck");
+ var paneSync = E("paneSync", doc);
+ paneSync.removeAttribute("helpTopic");
+ var weavePrefsDeck = E("weavePrefsDeck", doc);
+ if (weavePrefsDeck)
+ weavePrefsDeck.parentNode.removeChild(weavePrefsDeck);
+ if (prefWindow.currentPane == E("paneSync", doc))
+ prefWindow.showPane(E("paneMain", doc));
+ }
+ break;
+ case "about:preferences":
+ case "chrome://browser/content/preferences/in-content/preferences.xul":
+ configs = CCK2.getConfigs();
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.disableSync) {
+ hide(E("category-sync", doc));
+ }
+ }
+ updatePrefUI(doc);
+ break;
+ }
+ }, false);
+ break;
+ }
+ }
+}
+Services.obs.addObserver(observer, "chrome-document-global-created", false);
+
+// The IDs are the same, so I can reuse this for regular and in-content prefs
+function updatePrefUI(doc) {
+ for (var id in configs) {
+ var config = configs[id];
+ if (config.disablePrivateBrowsing) {
+ hide(E("privateBrowsingAutoStart", doc));
+ var privateBrowsingMenu = doc.querySelector("menuitem[value='dontremember']");
+ hide(privateBrowsingMenu, doc);
+ }
+ if (config.disableCrashReporter) {
+ disable(E("submitCrashesBox", doc));
+ }
+ if (config.disableSync) {
+ hide(E("noFxaAccount", doc));
+ hide(E("hasFxaAccount", doc));
+ }
+ if (config.noMasterPassword == true) {
+ hide(E("useMasterPassword", doc));
+ hide(E("changeMasterPassword", doc));
+ }
+ if (config.hiddenUI) {
+ for (var i=0; i < config.hiddenUI.length; i++) {
+ // Don't use .hidden since it doesn't work sometimes
+ var style = doc.getElementById("cck2-hidden-style");
+ if (!style) {
+ style = doc.createElementNS("http://www.w3.org/1999/xhtml", "style");
+ style.setAttribute("id", "cck2-hidden-style");
+ style.setAttribute("type", "text/css");
+ doc.documentElement.appendChild(style);
+ }
+ style.textContent = style.textContent + config.hiddenUI[i] + "{display: none !important;}";
+ }
+ }
+ }
+}
+
+function E(id, context) {
+ var element = context.getElementById(id);
+ return element;
+}
+
+function hide(element) {
+ if (element) {
+ element.setAttribute("hidden", "true");
+ }
+}
+
+function disable(element) {
+ if (element) {
+ element.disabled = true;
+ }
+}
diff --git a/linux/build/preferences/cck2/modules/CTPPermissions.jsm b/linux/build/preferences/cck2/modules/CTPPermissions.jsm
new file mode 100644
index 0000000..862ea48
--- /dev/null
+++ b/linux/build/preferences/cck2/modules/CTPPermissions.jsm
@@ -0,0 +1,123 @@
+/**
+ * Copied from https://github.com/jvillalobos/CTP-Manager/blob/master/extension/modules/permissions.js
+ **/
+
+/**
+ * Copyright 2013 Jorge Villalobos
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ **/
+
+var EXPORTED_SYMBOLS = ["CTP"];
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+
+Components.utils.import("resource://gre/modules/Services.jsm");
+
+var CTP = {
+ /**
+ * Cleans up the plugin name to a more readable form.
+ * Taken from /browser/base/content/pageinfo/permissions.js (Firefox 20)
+ * @param aPluginName the name to clean up.
+ * @return cleaned up plugin name.
+ */
+ makeNicePluginName : function(aPluginName) {
+ let newName =
+ aPluginName.replace(/[\s\d\.\-\_\(\)]+$/, "").
+ replace(/\bplug-?in\b/i, "").trim();
+
+ return newName;
+ },
+
+ /**
+ * Gets the plugin permission string from the tag object. In Firefox 20, this
+ * is the plugin filename. In 21 an above, the file extension is removed and
+ * Flash and Java are special-cased.
+ * @param aTag the tag object with the plugin information.
+ * @return permission string that corresponds to the plugin in the tag.
+ */
+ getPluginPermissionFromTag : function(aTag) {
+ let permission = null;
+ let majorVersion = Services.appinfo.platformVersion.split(".")[0];
+
+ if (21 <= majorVersion) {
+ let mimeTypes = aTag.getMimeTypes();
+
+ if (CTP.isFlashPlugin(mimeTypes)) {
+ permission = "flash";
+ } else if (CTP.isJavaPlugin(mimeTypes)) {
+ permission = "java";
+ } else {
+ let lastPeriod = aTag.filename.lastIndexOf(".");
+
+ permission =
+ ((0 < lastPeriod) ? aTag.filename.substring(0, lastPeriod) :
+ aTag.filename);
+ // Remove digits at the end
+ permission = permission.replace(/[0-9]+$/, "");
+ permission = permission.toLowerCase();
+ }
+ } else {
+ permission = aTag.filename;
+ }
+
+ return permission;
+ },
+
+ /**
+ * Checks if the tag object corresponds to the Java plugin.
+ * @param aMimeTypes the list of MIME types for the plugin.
+ * @return true if the tag corresponds to the Java plugin.
+ */
+ isJavaPlugin : function(aMimeTypes) {
+ let isJava = false;
+ let mimeType;
+
+ for (let i = 0; i < aMimeTypes.length; i++) {
+ mimeType =
+ ((null != aMimeTypes[i].type) ? aMimeTypes[i].type : aMimeTypes[i]);
+
+ if ((0 == mimeType.indexOf("application/x-java-vm")) ||
+ (0 == mimeType.indexOf("application/x-java-applet")) ||
+ (0 == mimeType.indexOf("application/x-java-bean"))) {
+ isJava = true;
+ break;
+ }
+ }
+
+ return isJava;
+ },
+
+ /**
+ * Checks if the tag object corresponds to the Flash plugin.
+ * @param aMimeTypes the list of MIME types for the plugin.
+ * @return true if the tag corresponds to the Flash plugin.
+ */
+ isFlashPlugin : function(aMimeTypes) {
+ let isFlash = false;
+ let mimeType;
+
+ for (let i = 0; i < aMimeTypes.length; i++) {
+ mimeType =
+ ((null != aMimeTypes[i].type) ? aMimeTypes[i].type : aMimeTypes[i]);
+
+ if (0 == mimeType.indexOf("application/x-shockwave-flash")) {
+ isFlash = true;
+ break;
+ }
+ }
+
+ return isFlash;
+ }
+};
diff --git a/linux/build/preferences/cck2/modules/Preferences.jsm b/linux/build/preferences/cck2/modules/Preferences.jsm
new file mode 100644
index 0000000..2100911
--- /dev/null
+++ b/linux/build/preferences/cck2/modules/Preferences.jsm
@@ -0,0 +1,629 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Preferences.
+ *
+ * The Initial Developer of the Original Code is Mozilla.
+ * Portions created by the Initial Developer are Copyright (C) 2008
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Myk Melez
+ * Daniel Aquino
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+let EXPORTED_SYMBOLS = ["Preferences"];
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cr = Components.results;
+const Cu = Components.utils;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+// The minimum and maximum integers that can be set as preferences.
+// The range of valid values is narrower than the range of valid JS values
+// because the native preferences code treats integers as NSPR PRInt32s,
+// which are 32-bit signed integers on all platforms.
+const MAX_INT = Math.pow(2, 31) - 1;
+const MIN_INT = -MAX_INT;
+
+function Preferences(args) {
+ if (isObject(args)) {
+ if (args.branch)
+ this._prefBranch = args.branch;
+ }
+ else if (args)
+ this._prefBranch = args;
+ this.isDefaultBranch = false;
+}
+
+Preferences.prototype = {
+ /**
+ * Get the value of a pref, if any; otherwise return the default value.
+ *
+ * @param prefName {String|Array}
+ * the pref to get, or an array of prefs to get
+ *
+ * @param defaultValue
+ * the default value, if any, for prefs that don't have one
+ *
+ * @returns the value of the pref, if any; otherwise the default value
+ */
+ get: function(prefName, defaultValue) {
+ if (isArray(prefName))
+ return prefName.map(v => this.get(v, defaultValue));
+
+ return this._get(prefName, defaultValue);
+ },
+
+// In all cases below, the preference might exist as a user pref, but not
+// have a default value. In those cases, get* throws. Return the default value.
+ _get: function(prefName, defaultValue) {
+ switch (this._prefSvc.getPrefType(prefName)) {
+ case Ci.nsIPrefBranch.PREF_STRING:
+ try {
+ return this._prefSvc.getComplexValue(prefName, Ci.nsISupportsString).data;
+ } catch (ex) {
+ if (this.isDefaultBranch)
+ return defaultValue;
+ else
+ return this._prefSvc.getCharPref(prefName);
+ }
+
+ case Ci.nsIPrefBranch.PREF_INT:
+ try {
+ return this._prefSvc.getIntPref(prefName);
+ } catch (ex) {
+ return defaultValue;
+ }
+
+ case Ci.nsIPrefBranch.PREF_BOOL:
+ try {
+ return this._prefSvc.getBoolPref(prefName);
+ } catch (ex) {
+ return defaultValue;
+ }
+
+ case Ci.nsIPrefBranch.PREF_INVALID:
+ return defaultValue;
+
+ default:
+ // This should never happen.
+ throw "Error getting pref " + prefName + "; its value's type is " +
+ this._prefSvc.getPrefType(prefName) + ", which I don't know " +
+ "how to handle.";
+ }
+ },
+
+ /**
+ * Set a preference to a value.
+ *
+ * You can set multiple prefs by passing an object as the only parameter.
+ * In that case, this method will treat the properties of the object
+ * as preferences to set, where each property name is the name of a pref
+ * and its corresponding property value is the value of the pref.
+ *
+ * @param prefName {String|Object}
+ * the name of the pref to set; or an object containing a set
+ * of prefs to set
+ *
+ * @param prefValue {String|Number|Boolean}
+ * the value to which to set the pref
+ *
+ * Note: Preferences cannot store non-integer numbers or numbers outside
+ * the signed 32-bit range -(2^31-1) to 2^31-1, If you have such a number,
+ * store it as a string by calling toString() on the number before passing
+ * it to this method, i.e.:
+ * Preferences.set("pi", 3.14159.toString())
+ * Preferences.set("big", Math.pow(2, 31).toString()).
+ */
+ set: function(prefName, prefValue) {
+ if (isObject(prefName)) {
+ for (let [name, value] in Iterator(prefName))
+ this.set(name, value);
+ return;
+ }
+
+ this._set(prefName, prefValue);
+ },
+
+ _set: function(prefName, prefValue) {
+ let prefType;
+ if (typeof prefValue != "undefined" && prefValue != null)
+ prefType = prefValue.constructor.name;
+
+ var existingPrefType = this._prefSvc.getPrefType(prefName);
+ if (existingPrefType != Ci.nsIPrefBranch.PREF_INVALID)
+ {
+ // convert
+ if (existingPrefType == Ci.nsIPrefBranch.PREF_INT && prefType == "String")
+ {
+ prefValue = parseInt(prefValue);
+ if (isNaN(prefValue))
+ throw "Incompatible pref value type - " + prefName;
+ prefType = "Number";
+ }
+ else if (existingPrefType == Ci.nsIPrefBranch.PREF_BOOL && prefType == "String")
+ {
+ if (prefValue == "true")
+ prefValue = true;
+ else if (prefValue == "false")
+ prefValue = false;
+ else
+ throw "Incompatible pref value type - " + prefName;
+ prefType = "Boolean";
+ }
+ else if (existingPrefType == Ci.nsIPrefBranch.PREF_BOOL && prefType == "Number")
+ {
+ prefValue = prefValue != 0;
+ prefType = "Boolean";
+ }
+ }
+
+ switch (prefType) {
+ case "String":
+ {
+ try {
+ this._prefSvc.setStringPref(prefName, prefValue);
+ } catch (e) {
+ try {
+ let string = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
+ string.data = prefValue;
+ this._prefSvc.setComplexValue(prefName, Ci.nsISupportsString, string);
+ } catch (e2) {
+ Components.utils.reportError(e2);
+ }
+ }
+ }
+ break;
+
+ case "Number":
+ // We throw if the number is outside the range, since the result
+ // will never be what the consumer wanted to store, but we only warn
+ // if the number is non-integer, since the consumer might not mind
+ // the loss of precision.
+ if (prefValue > MAX_INT || prefValue < MIN_INT)
+ throw("you cannot set the " + prefName + " pref to the number " +
+ prefValue + ", as number pref values must be in the signed " +
+ "32-bit integer range -(2^31-1) to 2^31-1. To store numbers " +
+ "outside that range, store them as strings.");
+ try {
+ this._prefSvc.setIntPref(prefName, prefValue);
+ } catch (e) {
+ throw new Error(e.toString() + " - " + prefName);
+ }
+ if (prefValue % 1 != 0)
+ Cu.reportError("Warning: setting the " + prefName + " pref to the " +
+ "non-integer number " + prefValue + " converted it " +
+ "to the integer number " + this.get(prefName) +
+ "; to retain fractional precision, store non-integer " +
+ "numbers as strings.");
+ break;
+
+ case "Boolean":
+ this._prefSvc.setBoolPref(prefName, prefValue);
+ break;
+
+ default:
+ throw "can't set pref " + prefName + " to value '" + prefValue +
+ "'; it isn't a String, Number, or Boolean";
+ }
+ },
+
+ /**
+ * Whether or not the given pref has a value. This is different from isSet
+ * because it returns true whether the value of the pref is a default value
+ * or a user-set value, while isSet only returns true if the value
+ * is a user-set value.
+ *
+ * @param prefName {String|Array}
+ * the pref to check, or an array of prefs to check
+ *
+ * @returns {Boolean|Array}
+ * whether or not the pref has a value; or, if the caller provided
+ * an array of pref names, an array of booleans indicating whether
+ * or not the prefs have values
+ */
+ has: function(prefName) {
+ if (isArray(prefName))
+ return prefName.map(this.has, this);
+
+ return this._has(prefName);
+ },
+
+ _has: function(prefName) {
+ return (this._prefSvc.getPrefType(prefName) != Ci.nsIPrefBranch.PREF_INVALID);
+ },
+
+ /**
+ * Whether or not the given pref has a user-set value. This is different
+ * from |has| because it returns true only if the value of the pref is a user-
+ * set value, while |has| returns true if the value of the pref is a default
+ * value or a user-set value.
+ *
+ * @param prefName {String|Array}
+ * the pref to check, or an array of prefs to check
+ *
+ * @returns {Boolean|Array}
+ * whether or not the pref has a user-set value; or, if the caller
+ * provided an array of pref names, an array of booleans indicating
+ * whether or not the prefs have user-set values
+ */
+ isSet: function(prefName) {
+ if (isArray(prefName))
+ return prefName.map(this.isSet, this);
+
+ return (this.has(prefName) && this._prefSvc.prefHasUserValue(prefName));
+ },
+
+ /**
+ * Whether or not the given pref has a user-set value. Use isSet instead,
+ * which is equivalent.
+ * @deprecated
+ */
+ modified: function(prefName) { return this.isSet(prefName) },
+
+ reset: function(prefName) {
+ if (isArray(prefName)) {
+ prefName.map(v => this.reset(v));
+ return;
+ }
+
+ this._reset(prefName);
+ },
+
+ _reset: function(prefName) {
+ try {
+ this._prefSvc.clearUserPref(prefName);
+ }
+ catch(ex) {
+ // The pref service throws NS_ERROR_UNEXPECTED when the caller tries
+ // to reset a pref that doesn't exist or is already set to its default
+ // value. This interface fails silently in those cases, so callers
+ // can unconditionally reset a pref without having to check if it needs
+ // resetting first or trap exceptions after the fact. It passes through
+ // other exceptions, however, so callers know about them, since we don't
+ // know what other exceptions might be thrown and what they might mean.
+ if (ex.result != Cr.NS_ERROR_UNEXPECTED)
+ throw ex;
+ }
+ },
+
+ /**
+ * If you need to know the default values, without resetting the actual
+ * user prefs, you can use this.
+ * @returns {Preferences} a new Preferences object, which accesses
+ * the defaults rather than the user prefs.
+ * *Only* call get() on this.
+ * If you call set(), you will modify the defaults, so don't do that!
+ */
+ get defaults() {
+ // nsIPrefService
+ let defaultBranch = Services.prefs.
+ getDefaultBranch(this._prefBranch).
+ QueryInterface(Ci.nsIPrefBranch);
+ let prefs = new Preferences(this._prefBranch);
+ // override. nasty, but this is internal, so OK.
+ Object.defineProperty(prefs, "_prefSvc", {
+ get: function() {
+ return defaultBranch;
+ }
+ });
+ prefs.isDefaultBranch = true;
+ return prefs;
+ },
+
+ /**
+ * Lock a pref so it can't be changed.
+ *
+ * @param prefName {String|Array}
+ * the pref to lock, or an array of prefs to lock
+ * @param prefValue {String} (optional)
+ * default value of pref to lock only works if prefName isn't an array
+ */
+ lock: function(prefName, prefValue) {
+ if (isArray(prefName))
+ prefName.map(this.lock, this);
+ else if (typeof prefValue != "undefined")
+ this.defaults.set(prefName, prefValue);
+
+ this._prefSvc.lockPref(prefName);
+ },
+
+ /**
+ * Unlock a pref so it can be changed.
+ *
+ * @param prefName {String|Array}
+ * the pref to lock, or an array of prefs to lock
+ */
+ unlock: function(prefName) {
+ if (isArray(prefName))
+ prefName.map(this.unlock, this);
+
+ this._prefSvc.unlockPref(prefName);
+ },
+
+ /**
+ * Whether or not the given pref is locked against changes and
+ * if it is set to the passedi n value
+ *
+ * @param prefName {String|Array}
+ * the pref to check, or an array of prefs to check
+ * @param prefValue {String|Number|Boolean}}
+ * the pref value to compare against
+ *
+ * @returns {Boolean|Array}
+ * whether or not the pref is locked; or, if the caller
+ * provided an array of pref names, an array of booleans indicating
+ * whether or not the prefs are locked
+ * If a pref value was specified returns whether or not the pref
+ * was locked and equal to the passed in value.
+ */
+ locked: function(prefName, prefValue) {
+ if (isArray(prefName))
+ return prefName.map(this.locked, this);
+
+ if (prefValue)
+ return this._prefSvc.prefIsLocked(prefName) && (this.get(prefName) == prefValue);
+ else
+ return this._prefSvc.prefIsLocked(prefName);
+ },
+
+ /**
+ * Start observing a pref.
+ *
+ * The callback can be a function or any object that implements nsIObserver.
+ * When the callback is a function and thisObject is provided, it gets called
+ * as a method of thisObject.
+ *
+ * @param prefName {String}
+ * the name of the pref to observe
+ *
+ * @param callback {Function|Object}
+ * the code to notify when the pref changes;
+ *
+ * @param thisObject {Object} [optional]
+ * the object to use as |this| when calling a Function callback;
+ *
+ * @returns the wrapped observer
+ */
+ observe: function(prefName, callback, thisObject) {
+ let fullPrefName = this._prefBranch + (prefName || "");
+
+ let observer = new PrefObserver(fullPrefName, callback, thisObject);
+ Preferences._prefSvc.addObserver(fullPrefName, observer, true);
+ observers.push(observer);
+
+ return observer;
+ },
+
+ /**
+ * Stop observing a pref.
+ *
+ * You must call this method with the same prefName, callback, and thisObject
+ * with which you originally registered the observer. However, you don't have
+ * to call this method on the same exact instance of Preferences; you can call
+ * it on any instance. For example, the following code first starts and then
+ * stops observing the "foo.bar.baz" preference:
+ *
+ * let observer = function() {...};
+ * Preferences.observe("foo.bar.baz", observer);
+ * new Preferences("foo.bar.").ignore("baz", observer);
+ *
+ * @param prefName {String}
+ * the name of the pref being observed
+ *
+ * @param callback {Function|Object}
+ * the code being notified when the pref changes
+ *
+ * @param thisObject {Object} [optional]
+ * the object being used as |this| when calling a Function callback
+ */
+ ignore: function(prefName, callback, thisObject) {
+ let fullPrefName = this._prefBranch + (prefName || "");
+
+ // This seems fairly inefficient, but I'm not sure how much better we can
+ // make it. We could index by fullBranch, but we can't index by callback
+ // or thisObject, as far as I know, since the keys to JavaScript hashes
+ // (a.k.a. objects) can apparently only be primitive values.
+ let [observer] = observers.filter(v => v.prefName == fullPrefName &&
+ v.callback == callback &&
+ v.thisObject == thisObject);
+
+ if (observer) {
+ Preferences._prefSvc.removeObserver(fullPrefName, observer);
+ observers.splice(observers.indexOf(observer), 1);
+ }
+ },
+
+ /**
+ * Same as observe(), but automatically unregisters itself when
+ * the window closes, saving you from writing an unload handler and
+ * calling ignore().
+ * @param win {nsIDOMWindow} your |window|
+ */
+ observeAuto: function(win, prefName, callback, thisObject) {
+ if (!win instanceof Ci.nsIDOMWindow)
+ throw "Need your |window| as first parameter";
+ this.observe(prefName, callback, thisObject);
+ var self = this;
+ win.addEventListener("unload", function()
+ {
+ self.ignore(prefName, callback, thisObject);
+ }, false);
+ win = null; // don't let closure hold on to window unnecessarily
+ },
+
+ resetBranch: function(prefBranch) {
+ try {
+ this._prefSvc.resetBranch(prefBranch);
+ }
+ catch(ex) {
+ // The current implementation of nsIPrefBranch in Mozilla
+ // doesn't implement resetBranch, so we do it ourselves.
+ if (ex.result == Cr.NS_ERROR_NOT_IMPLEMENTED)
+ this.reset(this._prefSvc.getChildList(prefBranch, []));
+ else
+ throw ex;
+ }
+ },
+
+ /**
+ * Returns all child prefs of this pref branch.
+ * This equals nsIPrefBranch.getChildList().
+ * This allows you to do e.g.
+ * var myPrefs = new Preferences("extensions.cooler.");
+ * var contents = myPrefs.branch("contents.");
+ * for each (let prefname in contents.childPrefNames())
+ * dump("have " + contents.get(prefname) + " " + prefname + "\n");
+ *
+ * @returns {Array of String} The names of the children,
+ * without the base pref branch, but with subbranch.
+ */
+ childPrefNames : function() {
+ return this._prefSvc.getChildList("", []);
+ },
+
+ /**
+ * Returns an nsIPrefBranch for the pref branch that this object stands for.
+ * You can use this to use functions that are not supported here.
+ * @returns {nsIPrefBranch}
+ */
+ get mozillaPrefBranch() {
+ return this._prefSvc;
+ },
+
+ /**
+ * Returns the base pref name that this object stands for.
+ * E.g. "extensions.yourcooler.";
+ * @returns {String}
+ */
+ get prefBranchName() {
+ return this._prefBranch;
+ },
+
+ /**
+ * Returns an Preferences object for an sub pref branch
+ * underneath the current pref branch.
+ * @param subbranch {String} Will be appended to the
+ * current pref branch. Don't forget the trailing dot,
+ * where necessary.
+ * E.g. "contents."
+ * @returns {Preferences}
+ */
+ branch : function(subbranch) {
+ return new Preferences(this._prefBranch + subbranch);
+ },
+
+ /**
+ * The branch of the preferences tree to which this instance provides access.
+ * @private
+ */
+ _prefBranch: "",
+
+ /**
+ * Preferences Service
+ * @private
+ */
+ get _prefSvc() {
+ // nsIPrefService
+ let prefSvc = Services.prefs.
+ getBranch(this._prefBranch).
+ QueryInterface(Ci.nsIPrefBranch);
+ Object.defineProperty(this, "_prefSvc", {
+ get: function() {
+ return prefSvc;
+ }
+ });
+ return this._prefSvc;
+ }
+
+};
+
+// Give the constructor the same prototype as its instances, so users can access
+// preferences directly via the constructor without having to create an instance
+// first.
+Preferences.__proto__ = Preferences.prototype;
+
+/**
+ * A cache of pref observers.
+ *
+ * We use this to remove observers when a caller calls Preferences::ignore.
+ *
+ * All Preferences instances share this object, because we want callers to be
+ * able to remove an observer using a different Preferences object than the one
+ * with which they added it. That means we have to identify the observers
+ * in this object by their complete pref name, not just their name relative to
+ * the root branch of the Preferences object with which they were created.
+ */
+let observers = [];
+
+function PrefObserver(prefName, callback, thisObject) {
+ this.prefName = prefName;
+ this.callback = callback;
+ this.thisObject = thisObject;
+}
+
+PrefObserver.prototype = {
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
+
+ observe: function(subject, topic, data) {
+ // The pref service only observes whole branches, but we only observe
+ // individual preferences, so we check here that the pref that changed
+ // is the exact one we're observing (and not some sub-pref on the branch).
+ if (data != this.prefName)
+ return;
+
+ if (typeof this.callback == "function") {
+ let prefValue = Preferences.get(this.prefName);
+
+ if (this.thisObject)
+ this.callback.call(this.thisObject, prefValue);
+ else
+ this.callback(prefValue);
+ }
+ else // typeof this.callback == "object" (nsIObserver)
+ this.callback.observe(subject, topic, data);
+ }
+};
+
+function isArray(val) {
+ // We can't check for |val.constructor == Array| here, since the value
+ // might be from a different context whose Array constructor is not the same
+ // as ours, so instead we match based on the name of the constructor.
+ return (typeof val != "undefined" && val != null && typeof val == "object" &&
+ val.constructor.name == "Array");
+}
+
+function isObject(val) {
+ // We can't check for |val.constructor == Object| here, since the value
+ // might be from a different context whose Object constructor is not the same
+ // as ours, so instead we match based on the name of the constructor.
+ return (typeof val != "undefined" && val != null && typeof val == "object" &&
+ val.constructor.name == "Object");
+}
diff --git a/linux/build/preferences/cck2/modules/Timer.jsm b/linux/build/preferences/cck2/modules/Timer.jsm
new file mode 100644
index 0000000..d405b28
--- /dev/null
+++ b/linux/build/preferences/cck2/modules/Timer.jsm
@@ -0,0 +1,43 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+/**
+ * JS module implementation of nsIDOMJSWindow.setTimeout and clearTimeout.
+ */
+
+this.EXPORTED_SYMBOLS = ["setTimeout", "clearTimeout"];
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cu = Components.utils;
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+// This gives us >=2^30 unique timer IDs, enough for 1 per ms for 12.4 days.
+let gNextTimeoutId = 1; // setTimeout must return a positive integer
+
+let gTimeoutTable = new Map(); // int -> nsITimer
+
+this.setTimeout = function setTimeout(aCallback, aMilliseconds) {
+ let id = gNextTimeoutId++;
+ let args = Array.slice(arguments, 2);
+ let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ timer.initWithCallback(function setTimeout_timer() {
+ gTimeoutTable.delete(id);
+ aCallback.apply(null, args);
+ }, aMilliseconds, timer.TYPE_ONE_SHOT);
+
+ gTimeoutTable.set(id, timer);
+ return id;
+}
+
+this.clearTimeout = function clearTimeout(aId) {
+ if (gTimeoutTable.has(aId)) {
+ gTimeoutTable.get(aId).cancel();
+ gTimeoutTable.delete(aId);
+ }
+}
+
diff --git a/linux/build/preferences/cck2/modules/Utils.jsm b/linux/build/preferences/cck2/modules/Utils.jsm
new file mode 100644
index 0000000..559bb0b
--- /dev/null
+++ b/linux/build/preferences/cck2/modules/Utils.jsm
@@ -0,0 +1,10 @@
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+var EXPORTED_SYMBOLS = ["errorCritical"];
+
+Components.utils.import("resource://gre/modules/Services.jsm");
+
+function errorCritical(e)
+{
+ Services.prompt.alert(null, "", e);
+}
diff --git a/linux/build/preferences/cck2/resources/certs/purplei2p_ca.pem b/linux/build/preferences/cck2/resources/certs/purplei2p_ca.pem
new file mode 100644
index 0000000..bbbcc77
--- /dev/null
+++ b/linux/build/preferences/cck2/resources/certs/purplei2p_ca.pem
@@ -0,0 +1,23 @@
+-----BEGIN CERTIFICATE-----
+MIID7DCCAtSgAwIBAgIJAKXaTovgoTIUMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD
+VQQGEwJXVzEUMBIGA1UECAwLSTJQIE5ldHdvcmsxEjAQBgNVBAoMCVB1cnBsZUky
+UDEqMCgGA1UEAwwhUHVycGxlSTJQIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR0w
+GwYJKoZIhvcNAQkBFg5yNHNhc0BtYWlsLmkycDAeFw0xODA4MjQyMTQ3NTJaFw0y
+MzA4MjMyMTQ3NTJaMIGCMQswCQYDVQQGEwJXVzEUMBIGA1UECAwLSTJQIE5ldHdv
+cmsxEjAQBgNVBAoMCVB1cnBsZUkyUDEqMCgGA1UEAwwhUHVycGxlSTJQIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MR0wGwYJKoZIhvcNAQkBFg5yNHNhc0BtYWlsLmky
+cDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALAZnN/U5bgkmiBqp/Np
+yiMOkUPjr2tLhV78Oba46xDLA6AiQ7yTPg+/ZYPIfbF2dPBTpfgGdly2M1xymRKc
+3Pa+IUXkLw6oCA+lFzOFW0Swtekk9HRAgGyHgj6/Hvagva5Wer4HJIO1qRsFPew+
+XcM3uhhiXoiO8o+YGpJ/7kz0gED3p2b9OVsLPd8G/GfdR3miD+Au+kUx/27z/WdJ
+ISfFILFnYeYZGffrpRcFtoGwuZUCugwnbLtpQpNKuGq8jDidm1v6Rb85JmkoH3Sg
+lRaX1MK0aPhM4WfCf7aWCNe669FAWPNB3Ya2lue7ewPLI84ZUEqcoJwmWn2ci2SU
+EXUCAwEAAaNjMGEwHQYDVR0OBBYEFG3hwzikpXqMasw678OHM8uLyjEoMB8GA1Ud
+IwQYMBaAFG3hwzikpXqMasw678OHM8uLyjEoMA8GA1UdEwQIMAYBAf8CAQAwDgYD
+VR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQA07URxJMI/Ta9y1wIg+k7o
+1aHXsl6YOXmd2ymhKZhZHrZlutE2U19IQSoEV0SBddP9D05xD6Ovsrwo7caeYzNt
++2DJnlJ2IY61NqYUIDEoJyNPL/S7WleH+xO+bcSqWvbntTNYAD6WQVfHCAimVE6P
+RnSZGqG089i84DRCyrh/6F1OxnBd6j14z+2ctQD+h6NlQXiCAUIwzVirYoE7oGpH
+Xta7Ei+RDvBXLXLAQRdXpzSP/Ddf7MCJzmH3VYAy+0sVuHr09hpFMtC59hTrdLVD
+/qma0eKrBr1DGH6QrZMZDqpNfv4wUPyVQBsRbbn2/1fL9IqK43CIj8RUllCOsmyU
+-----END CERTIFICATE-----
diff --git a/linux/build/preferences/i2pdbrowser.cfg b/linux/build/preferences/i2pdbrowser.cfg
index ebcc93f..dfaf614 100644
--- a/linux/build/preferences/i2pdbrowser.cfg
+++ b/linux/build/preferences/i2pdbrowser.cfg
@@ -17,38 +17,39 @@
* For more information, see http://www.mozilla.org/unix/customizing.html#prefs
*/
-lockPref("accessibility.force_disabled", 1);
-pref("app.normandy.first_run", false);
-lockPref("app.update.auto", false);
-lockPref("app.update.channel", "no");
-lockPref("app.update.enabled", false);
-lockPref("app.update.interval", 0);
-lockPref("app.update.service.enabled", false);
-pref("app.update.staging.enabled", false);
-pref("app.update.timer", 0);
+// defaultPref("browser.startup.firstrunSkipsHomepage", false);
+// pref("browser.display.use_document_fonts", 0);
+// pref("browser.urlbar.suggest.history", false);
+// pref("dom.indexedDB.enabled", false);
+// pref("gfx.font_rendering.opentype_svg.enabled", false);
+// pref("javascript.options.asmjs", false);
+// pref("media.gmp-provider.enabled", false);
+// pref("network.cookie.cookieBehavior", 1);
+// pref("network.cookie.lifetimePolicy", 2);
+// pref("network.cookie.thirdparty.sessionOnly", true);
+// pref("network.dns.blockDotOnion", true);
+// pref("network.http.referer.spoofSource", true);
+// pref("network.http.referer.XOriginPolicy", 2);
+// pref("plugin.state.flash", 0);
+// pref("privacy.clearOnShutdown.cache", true);
+// pref("privacy.clearOnShutdown.cookies", true);
+// pref("privacy.clearOnShutdown.downloads", true);
+// pref("privacy.clearOnShutdown.formdata", true);
+// pref("privacy.clearOnShutdown.history", true);
+// pref("privacy.clearOnShutdown.offlineApps", true);
+// pref("privacy.clearOnShutdown.openWindows", true);
+// pref("privacy.clearOnShutdown.sessions", true);
+// pref("privacy.donottrackheader.enabled", true); // doesn't make sense anyway
+// pref("privacy.sanitize.sanitizeOnShutdown", true);
+// pref("shumway.disabled", true);
defaultPref("beacon.enabled", false);
-pref("breakpad.reportURL", "");
-pref("browser.aboutHomeSnippets.updateUrl", "");
defaultPref("browser.cache.disk.capacity", 131072);
defaultPref("browser.casting.enabled", false);
-pref("browser.crashReports.unsubmittedCheck.enabled", false);
-// pref("browser.display.use_document_fonts", 0);
-pref("browser.download.manager.retention", 0);
defaultPref("browser.download.useDownloadDir", false);
defaultPref("browser.feeds.showFirstRunUI", false);
defaultPref("browser.fixup.alternate.enabled", false);
-pref("browser.fixup.hide_user_pass", true);
defaultPref("browser.formfill.enable", false);
-// PREF: Delete Search and Form History
defaultPref("browser.formfill.expire_days", 0);
-// PREF: Delete temporary files on exit
-pref("browser.helperApps.deleteTempFileOnExit", true);
-lockPref("browser.newtabpage.activity-stream.default.sites", "http://i2pd.i2p/,http://333.i2p/,http://inr.i2p/,http://102chan.i2p/,http://flibusta.i2p/,http://fsoc.i2p/,http://lifebox.i2p/,http://onelon.i2p/,http://wiki.ilita.i2p/");
-lockPref("browser.newtabpage.activity-stream.feeds.section.highlights", false);
-lockPref("browser.newtabpage.activity-stream.feeds.snippets", false);
-lockPref("browser.newtabpage.activity-stream.showSearch", false);
-pref("browser.newtabpage.activity-stream.topSitesRows", 2);
-pref("browser.newtabpage.enhanced", false);
defaultPref("browser.newtabpage.introShown", true);
defaultPref("browser.onboarding.tour.onboarding-tour-addons.completed", true);
defaultPref("browser.onboarding.tour.onboarding-tour-customize.completed", true);
@@ -56,13 +57,7 @@ defaultPref("browser.onboarding.tour.onboarding-tour-default-browser.completed",
defaultPref("browser.onboarding.tour.onboarding-tour-performance.completed", true);
defaultPref("browser.onboarding.tour.onboarding-tour-private-browsing.completed", true);
defaultPref("browser.onboarding.tour.onboarding-tour-screenshots.completed", true);
-// PREF: Do not create screenshots of visited pages
-pref("browser.pagethumbnails.capturing_disabled", true);
-pref("browser.places.smartBookmarksVersion", -1);
defaultPref("browser.pocket.enabled", false);
-pref("browser.pocket.useLocaleList", false);
-pref("browser.reader.detectedFirstArticle", false);
-pref("browser.rights.3.shown", true);
defaultPref("browser.safebrowsing.appRepURL", "");
defaultPref("browser.safebrowsing.blockedURIs.enabled", false);
defaultPref("browser.safebrowsing.downloads.enabled", false);
@@ -89,60 +84,166 @@ defaultPref("browser.safebrowsing.reportURL", "");
defaultPref("browser.safebrowsing.updateURL", "");
defaultPref("browser.safebrowsing.warning.infoURL", "");
defaultPref("browser.search.countryCode", "US");
-defaultPref("browser.search.defaultenginename", "DuckDuckGo");
+defaultPref("browser.search.defaultenginename", "YaCy 'legwork'");
+defaultPref("browser.search.geoip.url", "");
defaultPref("browser.search.geoSpecificDefaults", false);
defaultPref("browser.search.geoSpecificDefaults.url", "");
-defaultPref("browser.search.geoip.url", "");
-defaultPref("browser.search.order.1", "DuckDuckGo");
+defaultPref("browser.search.hiddenOneOffs", "Amazon.com,Bing,DuckDuckGo,eBay,Google,Twitter,Wikipedia (en)");
+defaultPref("browser.search.official", false);
+defaultPref("browser.search.order.1", "YaCy 'legwork'");
defaultPref("browser.search.redirectWindowsSearch", false);
defaultPref("browser.search.region", "US");
defaultPref("browser.search.searchEnginesURL", "");
defaultPref("browser.search.suggest.enabled", false);
defaultPref("browser.search.update", false);
+pref("browser.search.widget.inNavBar", true);
+defaultPref("browser.shell.checkDefaultBrowser", false);
+defaultPref("browser.uitour.enabled", false);
+defaultPref("browser.urlbar.suggest.searches", false);
+defaultPref("datareporting.healthreport.about.reportUrl", "");
+defaultPref("datareporting.healthreport.about.reportUrlUnified", "");
+defaultPref("datareporting.healthreport.documentServerURI", "");
+defaultPref("datareporting.healthreport.pendingDeleteRemoteData", true);
+defaultPref("datareporting.healthreport.service.firstRun", false);
+defaultPref("datareporting.healthreport.uploadEnabled", false);
+defaultPref("extensions.update.enabled", false);
+defaultPref("geo.enabled", false);
+defaultPref("geo.wifi.uri", "");
+defaultPref("intl.locale.matchOS", true);
+defaultPref("media.eme.enabled", false);
+defaultPref("media.getusermedia.audiocapture.enabled", false);
+defaultPref("media.getusermedia.screensharing.enabled", false);
+defaultPref("media.navigator.enabled", false);
+defaultPref("media.navigator.video.enabled", false);
+defaultPref("media.peerconnection.enabled", false);
+defaultPref("media.peerconnection.ice.no_host", true);
+defaultPref("media.video_stats.enabled", false);
+defaultPref("media.webspeech.recognition.enable", false);
+defaultPref("media.webspeech.synth.enabled", false);
+defaultPref("network.dns.disableIPv6", true);
+defaultPref("network.dns.disableprefetch", true);
+defaultPref("network.dns.disablePrefetchFromHTTPS", true);
+defaultPref("network.prefetch-next", false);
+defaultPref("network.proxy.backup.ftp", "127.0.0.1");
+defaultPref("network.proxy.backup.ftp_port", 4444);
+defaultPref("network.proxy.backup.socks", "127.0.0.1");
+defaultPref("network.proxy.backup.socks_port", 4444);
+defaultPref("network.proxy.backup.ssl", "127.0.0.1");
+defaultPref("network.proxy.backup.ssl_port", 4444);
+defaultPref("network.proxy.ftp", "127.0.0.1");
+defaultPref("network.proxy.ftp_port", 4444);
+defaultPref("network.proxy.http", "127.0.0.1");
+defaultPref("network.proxy.http_port", 4444);
+defaultPref("network.proxy.share_proxy_settings", true);
+defaultPref("network.proxy.socks", "127.0.0.1");
+defaultPref("network.proxy.socks_port", 4444);
+defaultPref("network.proxy.socks_remote_dns", true);
+defaultPref("network.proxy.ssl", "127.0.0.1");
+defaultPref("network.proxy.ssl_port", 4444);
+defaultPref("pdfjs.disabled", true);
+defaultPref("pdfjs.enableWebGL", false);
+defaultPref("permissions.default.camera", 2);
+defaultPref("permissions.default.desktop-notification", 2);
+defaultPref("permissions.default.geo", 2);
+defaultPref("permissions.default.microphone", 2);
+defaultPref("plugin.default_plugin_disabled", true);
+defaultPref("plugin.state.java", 0);
+defaultPref("plugin.state.libgnome-shell-browser-plugin", 0);
+defaultPref("plugins.click_to_play", true);
+defaultPref("plugins.load_appdir_plugins", false);
+defaultPref("plugins.update.notifyUser", false);
+defaultPref("plugins.update.url", "");
+defaultPref("privacy.resistFingerprinting", true);
+defaultPref("privacy.spoof_english", 2);
+defaultPref("privacy.trackingprotection.enabled", true);
+defaultPref("privacy.trackingprotection.pbmode.enabled", true);
+defaultPref("security.insecure_field_warning.contextual.enabled", false);
+defaultPref("security.insecure_password.ui.enabled", false);
+defaultPref("services.blocklist.update_enabled", false);
+defaultPref("services.sync.prefs.sync.browser.search.update", false);
+defaultPref("services.sync.prefs.sync.extensions.update.enabled", false);
+defaultPref("startup.homepage_welcome_url", "http://i2pd.i2p/");
+defaultPref("toolkit.telemetry.archive.enabled", false);
+defaultPref("toolkit.telemetry.optoutSample", false);
+defaultPref("toolkit.telemetry.reportingpolicy.firstRun", false);
+defaultPref("toolkit.telemetry.unified", false);
+defaultPref("toolkit.telemetry.unifiedIsOptIn", true);
+defaultPref("webgl.disable-extensions", true);
+defaultPref("webgl.disable-fail-if-major-performance-caveat", true);
+defaultPref("webgl.disabled", true);
+defaultPref("webgl.enable-debug-renderer-info", false);
+defaultPref("webgl.min_capability_mode", true);
+lockPref("accessibility.force_disabled", 1);
+lockPref("app.update.auto", false);
+lockPref("app.update.channel", "no");
+lockPref("app.update.enabled", false);
+lockPref("app.update.interval", 0);
+lockPref("app.update.service.enabled", false);
+lockPref("browser.newtabpage.activity-stream.default.sites", "http://i2pd.i2p/,http://333.i2p/,http://inr.i2p/,http://102chan.i2p/,http://flibusta.i2p/,http://fsoc.i2p/,http://lifebox.i2p/,http://onelon.i2p/,http://wiki.ilita.i2p/");
+lockPref("browser.newtabpage.activity-stream.feeds.section.highlights", false);
+lockPref("browser.newtabpage.activity-stream.feeds.snippets", false);
+defaultPref("browser.newtabpage.activity-stream.showSearch", true);
+lockPref("browser.newtabpage.activity-stream.telemetry", false);
+lockPref("browser.tabs.crashReporting.sendReport", false);
+lockPref("browser.usedOnWindows10", false);
+lockPref("browser.usedOnWindows10.introURL", "");
+lockPref("camera.control.face_detection.enabled", false);
+lockPref("datareporting.healthreport.service.enabled", false);
+lockPref("general.platform.override", "Win32");
+lockPref("general.useragent.locale", "en-US");
+lockPref("general.useragent.override", "Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0");
+lockPref("geo.wifi.logging.enabled", false);
+lockPref("identity.fxaccounts.enabled", false);
+lockPref("network.proxy.type", 1);
+lockPref("services.sync.enabled", false);
+lockPref("toolkit.telemetry.enabled", false);
+lockPref("toolkit.telemetry.server", "");
+defaultPref("app.normandy.first_run", false);
+pref("app.update.staging.enabled", false);
+pref("app.update.timer", 0);
+pref("breakpad.reportURL", "");
+pref("browser.aboutHomeSnippets.updateUrl", "");
+pref("browser.cache.offline.enable", false);
+pref("browser.crashReports.unsubmittedCheck.enabled", false);
+pref("browser.download.manager.retention", 0);
+pref("browser.fixup.hide_user_pass", true);
+pref("browser.helperApps.deleteTempFileOnExit", true);
+pref("browser.newtabpage.activity-stream.topSitesRows", 2);
+pref("browser.newtabpage.enhanced", false);
+pref("browser.pagethumbnails.capturing_disabled", true);
+pref("browser.places.smartBookmarksVersion", -1);
+pref("browser.pocket.useLocaleList", false);
+pref("browser.reader.detectedFirstArticle", false);
+pref("browser.rights.3.shown", true);
+pref("browser.selfsupport.url", "");
pref("browser.send_pings", false);
pref("browser.send_pings.require_same_host", true);
-pref("browser.selfsupport.url", "");
-defaultPref("browser.shell.checkDefaultBrowser", false);
-//defaultPref("browser.startup.firstrunSkipsHomepage", false);
pref("browser.startup.homepage", "http://i2pd.i2p/");
pref("browser.tabs.closeWindowWithLastTab", false);
-lockPref("browser.tabs.crashReporting.sendReport", false);
pref("browser.tabs.loadInBackground", true);
-defaultPref("browser.uitour.enabled", false);
pref("browser.urlbar.filter.javascript", true);
pref("browser.urlbar.formatting.enabled", false);
pref("browser.urlbar.maxRichResults", 12);
-// pref("browser.urlbar.suggest.history", false);
-defaultPref("browser.urlbar.suggest.searches", false);
+pref("browser.urlbar.speculativeConnect.enabled", false);
pref("browser.urlbar.trimURLs", false);
-lockPref("browser.usedOnWindows10", false);
-lockPref("browser.usedOnWindows10.introURL", "");
-lockPref("camera.control.face_detection.enabled", false);
pref("canvas.capturestream.enabled", false);
pref("clipboard.autocopy", false);
-defaultPref("datareporting.healthreport.about.reportUrl", "");
-defaultPref("datareporting.healthreport.about.reportUrlUnified", "");
-defaultPref("datareporting.healthreport.documentServerURI", "");
-defaultPref("datareporting.healthreport.pendingDeleteRemoteData", true);
-lockPref("datareporting.healthreport.service.enabled", false);
-defaultPref("datareporting.healthreport.service.firstRun", false);
-defaultPref("datareporting.healthreport.uploadEnabled", false);
pref("datareporting.policy.dataSubmissionEnabled", false);
pref("datareporting.policy.dataSubmissionEnabled.v2", false);
pref("datareporting.policy.dataSubmissionPolicyAccepted", false);
pref("datareporting.policy.dataSubmissionPolicyBypassAcceptance", false);
pref("datareporting.policy.dataSubmissionPolicyNotifiedTime", "0");
-pref("datareporting.policy.dataSubmissionPolicyResponseType", "accepted-info-bar-dismissed");
pref("datareporting.policy.dataSubmissionPolicyResponseTime", "0");
+pref("datareporting.policy.dataSubmissionPolicyResponseType", "accepted-info-bar-dismissed");
pref("datareporting.policy.firstRunTime", "0");
pref("datareporting.sessions.current.clean", true);
pref("device.sensors.enabled", false);
pref("devtools.chrome.enabled", false);
-pref("devtools.debugger.remote-enabled", false);
pref("devtools.debugger.force-local", true);
-pref("devtools.webide.enabled", false);
+pref("devtools.debugger.remote-enabled", false);
pref("devtools.webide.autoinstallADBHelper", false);
pref("devtools.webide.autoinstallFxdtAdapters", false);
+pref("devtools.webide.enabled", false);
pref("dom.allow_cut_copy", false);
pref("dom.archivereader.enabled", false);
pref("dom.battery.enabled", false);
@@ -154,7 +255,7 @@ pref("dom.flyweb.enabled", false);
pref("dom.gamepad.enabled", false);
pref("dom.ipc.plugins.flash.subprocess.crashreporter.enabled", false);
pref("dom.ipc.plugins.reportCrashURL", false);
-// pref("dom.indexedDB.enabled", false);
+pref("dom.maxHardwareConcurrency", 2);
pref("dom.mozTCPSocket.enabled", false);
pref("dom.netinfo.enabled", false);
pref("dom.network.enabled", false);
@@ -165,9 +266,9 @@ pref("dom.vr.enabled", false);
pref("dom.webaudio.enabled", false);
pref("dom.webnotifications.enabled", false);
pref("dom.workers.enabled", false);
-pref("experiments.supported", false);
pref("experiments.enabled", false);
pref("experiments.manifest.uri", "");
+pref("experiments.supported", false);
pref("extensions.autoDisableScopes", 0);
pref("extensions.blocklist.enabled", false);
pref("extensions.blocklist.url", "");
@@ -178,128 +279,57 @@ pref("extensions.pocket.enabled", false);
pref("extensions.shownSelectionUI", true);
pref("extensions.ui.lastCategory", "addons://list/extension");
pref("extensions.update.autoUpdateDefault", false);
-defaultPref("extensions.update.enabled", false);
pref("full-screen-api.approval-required", false);
pref("full-screen-api.warning.timeout", 0);
pref("general.buildID.override", "19700101");
pref("general.warnOnAboutConfig", false);
-defaultPref("geo.enabled", false);
-defaultPref("geo.wifi.uri", "");
-lockPref("geo.wifi.logging.enabled", false);
-// pref("gfx.font_rendering.opentype_svg.enabled", false);
-lockPref("identity.fxaccounts.enabled", false);
-defaultPref("intl.locale.matchOS", true);
-// pref("javascript.options.asmjs", false);
pref("javascript.use_us_english_locale", true);
pref("keyword.enabled", false);
pref("lightweightThemes.update.enabled", false);
-defaultPref("media.eme.enabled", false);
-defaultPref("media.getusermedia.screensharing.enabled", false);
-defaultPref("media.getusermedia.audiocapture.enabled", false);
+pref("loop.logDomains", false);
pref("media.gmp-eme-adobe.enabled", false);
pref("media.gmp-gmpopenh264.enabled", false);
pref("media.gmp-gmpopenh264.provider.enabled", false);
pref("media.gmp-manager.url", "");
-// pref("media.gmp-provider.enabled", false);
-defaultPref("media.navigator.enabled", false);
-defaultPref("media.navigator.video.enabled", false);
-defaultPref("media.peerconnection.enabled", false);
-defaultPref("media.peerconnection.ice.no_host", true);
-defaultPref("media.video_stats.enabled", false);
-defaultPref("media.webspeech.recognition.enable", false);
-defaultPref("media.webspeech.synth.enabled", false);
+pref("media.peerconnection.ice.default_address_only", true);
+pref("media.peerconnection.identity.timeout", 1);
+pref("media.peerconnection.turn.disable", true);
+pref("media.peerconnection.use_document_iceservers", false);
pref("network.allow-experiments", false);
-// pref("network.cookie.cookieBehavior", 1);
-// PREF: Cookies expires at the end of the session (when the browser closes)
-// pref("network.cookie.lifetimePolicy", 2);
pref("network.cookie.prefsMigrated", true);
-// pref("network.cookie.thirdparty.sessionOnly", true);
-// pref("network.dns.blockDotOnion", true);
-defaultPref("network.dns.disableIPv6", true);
-defaultPref("network.dns.disableprefetch", true);
-defaultPref("network.dns.disableprefetchFromHTTPS", true);
-defaultPref("network.dns.disablePrefetch", true);
-defaultPref("network.dns.disablePrefetchFromHTTPS", true);
-// pref("network.http.referer.spoofSource", true);
-// pref("network.http.referer.XOriginPolicy", 2);
pref("network.http.speculative-parallel-limit", 0);
pref("network.IDN_show_punycode", true);
pref("network.jar.open-unsafe-types", false);
pref("network.manage-offline-status", false);
pref("network.negotiate-auth.allow-insecure-ntlm-v1", false);
pref("network.predictor.enabled", false);
-defaultPref("network.prefetch-next", false);
-pref("network.protocol-handler.warn-external-default", true);
-pref("network.protocol-handler.external.http", false);
-pref("network.protocol-handler.external.https", false);
-pref("network.protocol-handler.external.javascript", false);
-pref("network.protocol-handler.external.moz-extension", false);
-pref("network.protocol-handler.external.ftp", false);
-pref("network.protocol-handler.external.file", false);
-pref("network.protocol-handler.external.about", false);
pref("network.protocol-handler.expose-all", false);
+pref("network.protocol-handler.expose.about", true);
+pref("network.protocol-handler.expose.file", true);
+pref("network.protocol-handler.expose.ftp", true);
pref("network.protocol-handler.expose.http", true);
pref("network.protocol-handler.expose.https", true);
pref("network.protocol-handler.expose.javascript", true);
pref("network.protocol-handler.expose.moz-extension", true);
-pref("network.protocol-handler.expose.ftp", true);
-pref("network.protocol-handler.expose.file", true);
-pref("network.protocol-handler.expose.about", true);
-lockPref("network.proxy.backup.ftp", "127.0.0.1");
-lockPref("network.proxy.backup.ftp_port", 4444);
-lockPref("network.proxy.backup.socks", "127.0.0.1");
-lockPref("network.proxy.backup.socks_port", 4444);
-lockPref("network.proxy.backup.ssl", "127.0.0.1");
-lockPref("network.proxy.backup.ssl_port", 4444);
-lockPref("network.proxy.ftp", "127.0.0.1");
-lockPref("network.proxy.ftp_port", 4444);
-lockPref("network.proxy.http", "127.0.0.1");
-lockPref("network.proxy.http_port", 4444);
-lockPref("network.proxy.share_proxy_settings", true);
-lockPref("network.proxy.socks", "127.0.0.1");
-lockPref("network.proxy.socks_port", 4444);
-lockPref("network.proxy.socks_remote_dns", true);
-lockPref("network.proxy.ssl", "127.0.0.1");
-lockPref("network.proxy.ssl_port", 4444);
-lockPref("network.proxy.type", 1);
-pref("network.cookie.prefsMigrated", true);
-pref("pdfjs.disabled", true);
-pref("pdfjs.enableWebGL", false);
-defaultPref("permissions.default.camera", 2);
-defaultPref("permissions.default.desktop-notification", 2);
-defaultPref("permissions.default.geo", 2);
-defaultPref("permissions.default.microphone", 2);
-defaultPref("plugin.default_plugin_disabled", true);
-// pref("plugin.state.flash", 0);
-pref("plugin.state.java", 0);
-pref("plugin.state.libgnome-shell-browser-plugin", 0);
-pref("plugins.click_to_play", true);
-pref("plugins.load_appdir_plugins", false);
-pref("plugins.update.notifyUser", false);
-pref("plugins.update.url", "");
-// PREF: Clear history when Firefox closes
-// pref("privacy.sanitize.sanitizeOnShutdown", true);
-// pref("privacy.clearOnShutdown.cache", true);
-// pref("privacy.clearOnShutdown.cookies", true);
-// pref("privacy.clearOnShutdown.downloads", true);
-// pref("privacy.clearOnShutdown.formdata", true);
-// pref("privacy.clearOnShutdown.history", true);
-// pref("privacy.clearOnShutdown.offlineApps", true);
-// pref("privacy.clearOnShutdown.sessions", true);
-// pref("privacy.clearOnShutdown.openWindows", true);
-pref("privacy.cpd.offlineApps", true);
+pref("network.protocol-handler.external.about", false);
+pref("network.protocol-handler.external.file", false);
+pref("network.protocol-handler.external.ftp", false);
+pref("network.protocol-handler.external.http", false);
+pref("network.protocol-handler.external.https", false);
+pref("network.protocol-handler.external.javascript", false);
+pref("network.protocol-handler.external.moz-extension", false);
+pref("network.protocol-handler.warn-external-default", true);
+pref("network.proxy.no_proxies_on", "localhost, 127.0.0.1");
pref("privacy.cpd.cache", true);
pref("privacy.cpd.cookies", true);
pref("privacy.cpd.downloads", true);
pref("privacy.cpd.formdata", true);
pref("privacy.cpd.history", true);
+pref("privacy.cpd.offlineApps", true);
pref("privacy.cpd.sessions", true);
-pref("privacy.donottrackheader.enabled", true);
+pref("privacy.firstparty.isolate", true);
pref("privacy.resistFingerprinting", true);
pref("privacy.sanitize.timeSpan", 0);
-defaultPref("privacy.spoof_english", 2);
-pref("privacy.trackingprotection.enabled", true);
-pref("privacy.trackingprotection.pbmode.enabled", true);
pref("privacy.userContext.enabled", true);
pref("reader.parse-on-load.enabled", false);
pref("reader.parse-on-load.force-enabled", false);
@@ -307,55 +337,106 @@ pref("security.csp.enable", true);
pref("security.csp.experimentalEnabled", true);
pref("security.dialog_enable_delay", 1000);
pref("security.fileuri.strict_origin_policy", true);
-pref("security.insecure_field_warning.contextual.enabled", false);
-// PREF: Enable insecure password warnings (login forms in non-HTTPS pages)
-pref("security.insecure_password.ui.enabled", false);
pref("security.mixed_content.block_active_content", true);
pref("security.mixed_content.block_display_content", true);
-pref("services.blocklist.update_enabled", false);
pref("security.sri.enable", true);
pref("security.ssl.errorReporting.automatic", false);
pref("security.ssl.errorReporting.enabled", false);
-lockPref("services.sync.enabled", false);
pref("services.sync.prefs.sync.browser.download.manager.scanWhenDone", false);
pref("services.sync.prefs.sync.browser.safebrowsing.enabled", false);
-defaultPref("services.sync.prefs.sync.browser.search.update", false);
-defaultPref("services.sync.prefs.sync.extensions.update.enabled", false);
-// pref("shumway.disabled", true);
pref("signon.autofillForms", false);
-// PREF: Disable password manager
pref("signon.rememberSignons", false);
-defaultPref("startup.homepage_welcome_url", "http://i2pd.i2p/");
pref("startup.homepage_welcome_url.additional", "about:blank");
-pref("toolkit.telemetry.archive.enabled", false);
-lockPref("toolkit.telemetry.enabled", false);
-pref("toolkit.telemetry.optoutSample", false);
-defaultPref("toolkit.telemetry.reportingpolicy.firstRun", false);
-lockPref("toolkit.telemetry.server", "");
-defaultPref("toolkit.telemetry.unified", false);
-pref("toolkit.telemetry.unifiedIsOptIn", true);
-pref("webgl.disabled", true);
-pref("webgl.disable-extensions", true);
-pref("webgl.disable-fail-if-major-performance-caveat", true);
-pref("webgl.enable-debug-renderer-info", false);
-pref("webgl.min_capability_mode", true);
-// Ensure domain logging is disabled
-pref("loop.logDomains", false);
-// Spoof to dual-core cpu
-pref("dom.maxHardwareConcurrency", 2);
-// Disable offline cache
-pref("browser.cache.offline.enable", false);
-// Prevent tracking over multiple domains
-pref("privacy.firstparty.isolate", true);
-pref("network.proxy.no_proxies_on", "localhost, 127.0.0.1");
-// In relation to webrtc
-pref("media.peerconnection.turn.disable", true);
-pref("media.peerconnection.use_document_iceservers", false);
-pref("media.peerconnection.identity.timeout", 1);
-pref("media.peerconnection.ice.default_address_only", true);
-// Disable url prefetch
-pref("browser.urlbar.speculativeConnect.enabled", false);
-// Set platform, user-agent and locale to same values as Tor Browser 7.0.10
-pref("general.useragent.override", "Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0");
-pref("general.useragent.locale", "en-US");
-pref("general.platform.override", "Win32");
+
+var config = {
+ "cckVersion": "2.2.9",
+ "name": "I2Pd Browser",
+ "description": "Preconfigured for use with I2P browser",
+ "version": "1.2.8",
+ "homePage": "http://i2pd.i2p/",
+ "welcomePage": "http://i2pd.i2p/",
+ "titlemodifier": "I2Pd Browser",
+ "extension": {
+ "name": "I2Pd Browser"
+ },
+ "noWelcomePage": true,
+ "noUpgradePage": true,
+ "removeSetDesktopBackground": true,
+ "removeSafeModeMenu": true,
+ "noGetAddons": true,
+ "noAddonCompatibilityCheck": true,
+ "disableSearchEngineInstall": true,
+ "removeDefaultSearchEngines": false,
+ "displayBookmarksToolbar": true,
+ "removeSmartBookmarks": true,
+ "removeDefaultBookmarks": true,
+ "removeDuplicateBookmarkNames": true,
+ "dontCheckDefaultBrowser": true,
+ "dontUseDownloadDir": true,
+ "disableFormFill": true,
+ "disableSync": true,
+ "disableCrashReporter": true,
+ "disableTelemetry": true,
+ "disableFirefoxHealthReportUpload": true,
+ "disableFirefoxHealthReport": true,
+ "disableFirefoxUpdates": true,
+ "removeSnippets": true,
+ "disableResetFirefox": true,
+ "disableWebApps": true,
+ "disableHello": true,
+ "disableSharePage": true,
+ "disableForget": true,
+ "disableHeartbeat": true,
+ "disablePocket": true,
+ "disableAboutSupport": true,
+ "disableAboutProfiles": true,
+ "showSearchBar": true,
+ "autoconfig": {
+ "disableProfileMigrator": true
+ },
+ "id": "i2pdbrowser",
+ "hiddenUI": [
+ "#defaultBrowserBox",
+ "#enableSearchUpdate",
+ "#dataCollectionCategory",
+ "#dataCollectionGroup",
+ ".help-button",
+ "#onboarding-overlay-button",
+ ".prefs-modal-inner-wrapper > section:nth-child(6)"
+ ],
+ "searchplugins": {
+ "YaCy 'legwork'": "http://legwork.i2p/opensearchdescription.xml"
+ },
+ "defaultSearchEngine": "YaCy 'legwork'",
+ "certs": {
+ "ca": [
+ {
+ "url": "resource://cck2_i2pdbrowser/certs/purplei2p_ca.pem",
+ "trust": "CTc,CTc,CTc"
+ }
+ ]
+ }
+};
+
+var io = Components.classes["@mozilla.org/network/io-service;1"]
+ .getService(Components.interfaces.nsIIOService);
+var resource = io.getProtocolHandler("resource")
+ .QueryInterface(Components.interfaces.nsIResProtocolHandler);
+
+var greDir = Components.classes["@mozilla.org/file/directory_service;1"]
+ .getService(Components.interfaces.nsIProperties)
+ .get("GreD", Components.interfaces.nsIFile);
+var cck2ModuleDir = greDir.clone();
+cck2ModuleDir.append("cck2");
+cck2ModuleDir.append("modules");
+var cck2Alias = io.newFileURI(cck2ModuleDir);
+resource.setSubstitution("cck2", cck2Alias);
+
+var configModuleDir = greDir.clone();
+configModuleDir.append("cck2");
+configModuleDir.append("resources");
+var configAlias = io.newFileURI(configModuleDir);
+resource.setSubstitution("cck2_i2pdbrowser", configAlias);
+
+Components.utils.import("resource://cck2/CCK2.jsm");
+CCK2.init(config, "ä"[0], "ä");
diff --git a/linux/i2pd/addressbook/addresses.csv b/linux/i2pd/addressbook/addresses.csv
index 54316f7..fd00b65 100644
--- a/linux/i2pd/addressbook/addresses.csv
+++ b/linux/i2pd/addressbook/addresses.csv
@@ -1,307 +1,190 @@
-02ch.i2p,6k3irsqo5v536bs45t5hn5f3s5pi7a3bp5nuxc6y72svjqp6vymq
-0chan.i2p,ah7wvpwga7hlwa2f7gnnxuqycnng5j5bkglhfm5ychejpnjucmka
-0chanrunet.i2p,3q7mdphwa7cmdjvxxrmbnvpy4dnei4hb4kyo2wvdhuvct3pclyvq
-0thers.i2p,f3osaqktj55iedisoabrd7uergxbpljovbwcr6hihmxmjdc6oafa
+00.i2p,zmzpltxslembpaupg3srh4bbhv5txgh5jmms6sfj4hzsvlv3xugq
+0xcc.i2p,gawouxh2sg32cluwlqsnpy3dwedvoqtfroi4evvdvm2pfv7tdadq
1.fcp.freenet.i2p,cuxbeputgxn75ak4nr7ltp7fjktnzl5sul3wstwnsoytbbpb4ixq
102chan.i2p,xxu3lso4h2rh6wmrxiou3ax7r7la7x6dhoepnku3jvrlwp35pefq
-1553b.i2p,2vhlowhistigqlu3vingiyv66jq43rhvn4qa75gtzpcjmcbvclta
+1st.i2p,rduua7bhest6rwsmmyttzssfdw3p4eu6bgl3mb4hin32qo3x5zfq
2.fcp.freenet.i2p,ndsznnipoeyapnsg3gj3yi2dzsqduxwalmujm5mzjm7e6x374tta
-258.i2p,dunea3q6whmbtf4vomdiv3si3grtqy7fqftdslk4piin4j5tkdka
-2chan.i2p,xnmlqiwaio6bg6dtbjqb63rtoznvgeud5acxklccomv5yytefmda
+2rqv7nn2.i2p,2rqv7nn2j4q3wcxe5lsrqpf73k4rmtutweft3dvbc2w245vpkdva
+31337.i2p,ydlngh3dd52av3aalpd3uqi5iuvmby7nxpkwclan4xqjsttz4fbq
333.i2p,ctvfe2fimcsdfxmzmd42brnbf7ceenwrbroyjx3wzah5eudjyyza
55cancri.i2p,b4iqenefh2fr4xtuq6civfc6nhnia6e2yo36pf7vcgdvrwmh7xua
a-zine-repo.i2p,zt6okylza25s2ppso7ngqbz2ybeteatxezxqemvucwhbb5ajot7a
-abhishek.i2p,rthkq2epkzgkqpqqg4b5elasnqydiwmlgzcb66fg77i2eujicdpa
-abvc.i2p,wsq3gg5t6kbvoxoo3pitreikdr4wyckh2svraor4esdop4mua25q
-acestream.i2p,2ojd3s4rb73d6qvwz36x4ysjzqbnkzluemdbxhuuuf7qbbfew26a
adab.i2p,pxjr6f2cig6v7v7ekam3smdnkqgmgseyy5cdwrozdyejm7jknkha
-admin.open4you.i2p,hnlryqjvk52hsze2ixnz4qbuki4tf6qvygi25mf5bkllmbett2oa
-admin2.open4you.i2p,d62hjvhu7yqd23m766dvs4tupxpvrsa2hzd2r5rdpm5apsmtmc6a
-agora.anarplex.i2p,ydaal5nbvxmydnncny5esb3ipxupmpgkensow7yvhp6u7uioujna
-agora.i2p,nvslgzpyqhxldfik5uwua7eqse5adqon5h4dbzqepw7ringod44q
-ajomyqxciuehvxaa.i2p,4goi34hmq3g7foequzr6ofa242myjmntyvxgg6tcgom2jam6gs2q
-ajomyqxciuehvxaa2.i2p,fk3nyhwu4iul6epeb53j2faai7afeqb3wrg7wbuohl7zj4sgbtiq
-ajs.i2p,qnqkn6a7r5sxokwfil3s4mwbpvvbkeqifitl2qzmwtui3wf5l7ga
-alacast.i2p,sdlcbhe5jffgdsmzaharudzbzhipw4pth24ivy7m3nqm5paxgtuq
+agaming468.i2p,4svcmhjnijtnclv2vdgf3ipdvzizgeyllysjfl6vu3xkqwa3w6sq
+aktie.i2p,4qwhpshwlp6ndzvtiwvf7myc3lll3vizqcdvvuxrzgaxv4g2qogq
alice.i2p,iq26r2ls2qlkhbn62cvgb6a4iib7m5lkoulohdua5z6uvzlovjtq
-allgemeinplaetzchen.i2p,5u4buto5wfret356iqzukcf5avqkadpg3up4hngsfkd37modlo7q
-allsprk.i2p,uyyakverb5mxbmobdqmzjnpy7lqszzlmexes3hxkunceyz53otfq
-alterchan.i2p,6o6tlcrs3nj2vks5w4fehtbk7263dinlwd3brsbk3vdefsqkddda
-alternet.i2p,fxpygpgimhktfmf2zhb23qqzu642eivazn7nfmmjhv562xb7i5da
-alttechdenizen.i2p,a6doke6sicgf6kktwe6dxnpft5agsouvqnuqw2abfo7eyjbylzxa
always.i2p,wp43sdtuxum6gxbjvyeor35r5yvgtkp3dcu7dv47lx22zeb3relq
-amaq.i2p,txpcthypt4ou7cgygqw2h5kjenyuirknmso3akiiv6h24royotua
amazone.i2p,e6kq73lsxaeyiwpmykdbdo3uy4ppj64bl7y3viegp6mqrilqybqa
-amidoinitrite.i2p,onr7e32g3rgigvibygcjwytoypo2s6eusn7zdwc7nmr5fuxy45va
amiga.i2p,edy2xappzjjh7bxqounevji4wd2binqkv7gft4usrkan45xhbk5q
amobius.i2p,rj6432agdprun5baai2hj62xfhb4l75uvzl55dhj6z5zzoxv3htq
-anarplex.i2p,4qingryacppi5ed2vk2626qipri3d7c2v6iw3vr55zy6c2uc66za
andmp.i2p,rv6zugykqdhmwwsuglv7j6ktjojdbf5fqta66hixejg33qb2su3q
-anews.i2p,f7nnjswxq5yyehuzzed65ut4jz47p76vxp4xrw5cyog3jijsrcuq
animal.i2p,5iedafy32swqq4t2wcmjb4fvg3onscng7ct7wb237jkvrclaftla
anodex.i2p,25cb5kixhxm6i6c6wequrhi65mez4duc4l5qk6ictbik3tnxlu6a
-anomix.i2p,ptlpjzvcjl54yl7wdhlk2fd5moytixstshdz7rr5hsfsumodto2q
-anon-box.i2p,kbv3jc2f4efmq2q4lj66p6xjkgmfhaed3jl7uzaml6y3oqc4jfpq
-anonarchive.i2p,vblifonpbegzggx5mgev6wtgtfpkz5ykv5awgrzsqv2lcknjp7ea
anoncoin.i2p,nmi3loretkk4zbili32t2e5wyznwoxcsgzmd2z4ll3msgndyqpfa
anongw.i2p,owrnciwubb3f3dctvlmnaknb6tjdxtlzvv7klocb45mmhievdjhq
-anonname.i2p,h4mms4mtafykm6ftehxss6sv6hiu2a7gtoflf4pxy6bv4mlyj6kq
-anonsearch.i2p,33bbahrpqfyf5yywwnamzdexxw3bkiqtsap454qm4deiuvq2wsfa
anonsfw.i2p,ir6hzi66izmvqx3usjl6br3nndkpazonlckrzt3gtltqcy5ralyq
anonymnet.i2p,77ouyl2ane7ffgydosd4ye42g67aomtc4jrusmi76lds5qonlffa
anonynanny.i2p,l2lnhq2dynnmf3m46tcbpcmbbn4kifjgt26go6n2hlapy4drhyja
anonyradio.i2p,cbobsax3rhoyjbk7ii2nd2fnl5bxh3x7bbearokyxgvmudn7o5bq
-anotherblog.i2p,shkgse3sc3v7dlpxdt74dqsc5lxrfk3qw6tyrl2sodbq7bsd5mcq
antipiracyagency.i2p,by4kcmklz7xnkai6ndfio47kts3rndm6wwleegtxghllimikdapq
antipiratbyran.i2p,y2qbhrvuciifbszaqqwxd5t75bomp7kzdqx4yxsrkaq542t75k3a
-antirius.i2p,4l353ourymat7gzxu6gmo72vinsqvggmrtqizdaj4ord3zzy3doa
-aperi.i2p,2qk4ofkb6hlx456aeqjz6rvbcqwdhntjq5uhaww4irnwulyho6yq
-aplus.i2p,h67lym6btfqinjs5ye272fo6uze2uvjk6t7qabibocjedfcv5fva
-aport.i2p,uvpczf5ljaptviombwxi6vmqxpzh6zpthyhvczzp57ihwfzrxnhq
-apt.mirror.i2p,kazqug7jqkfokjuyfstok4s2wnhtk3pueoaiuucashwzjqgsvpra
arc2.i2p,rnmosuwvtftfcrk5sk7zoyhyadh2g4dhe2mif5ml7qjisgkyw2na
-archbsdmirror.i2p,35nnm55r53mu2f4kkgl5xtlr35uwhvmhlzegbrllefmpk2bffl4a
+archaicbinarybbs.i2p,t7o2tw36cffedgfr6kahewpkrntofnliuapji2e4rucl3os55epa
archiv.tutorials.i2p,lldr2miowq6353fxy44pnxfk37d6yn2f6kaivzecbmvvnnf5exyq
archive.i2p,x54d5st3dl6mwgfxj6raiekqkypo5pdvuex3n62szwju7hgefiyq
archive.syndie.i2p,abbyu5n3mh3nj7pe3b6byldrxswvva5ttxcafsnnseidanurq3kq
-archlinux.i2p,22n34pf7xrgbiaexaevndk6hdn4or4skqshkj6ezmgvo4rnnkpua
ardor-wallet.i2p,tm23k5ny3umhf6vf3kghnnwacli5zywq5wrr3xcqowbcofuyr4gq
ardvark.i2p,jcmw2sol3hruwc6rfinonx4e23pjkukkg7lg7xt7xb2gpiyyraiq
+arecords.i2p,pkp26u32ea6xrd4o53lzwm6pxzphu5heyrvyra37drfvn6vli7yq
+arf.i2p,o46lsq4u7udxg3qqlidrmpj4lb4nr7ldxmbb2x53nftndaeyxqeq
arkan.i2p,7o5y2lyyrjx5tf6l4fyumywui7msjv5azaaheatvw5sqj7mxbuvq
-arkwright.i2p,ebovdlxw47kodamth7p33nenfxy5kqsyu7usp2c3ni3dyfrbbvpa
-armada.i2p,26qxgmyqczulza5ym3jij5er3onclacejyqzecuhjllwun3kxuzq
-arslonga.i2p,evmelbak3htxtkakhzrzdubbkglffiv2reyg3xeuno3rnbcts4sq
asciiwhite.i2p,itbzny5ktuenhjwjfqx3jravolhlj5wullhhr2m4qr6k2emnm5dq
-asmith.i2p,vwkvflbd2divnm4twz7w2ged4uo2lmc3vr6zbi4sf4mnwcpgec5a
aspnet.i2p,tsb7zqru57p4q2a7cto2lko4w5cg4lieglwm6t27c44fkphqmf2a
-assiya.i2p,67ld2vpoq56edqjl44sreskxx5v7pr77uq4lnznxcpxyppisml5q
asylum.i2p,p45ejjw4p2q6nq3mzi6cm6ep35grtzshboidj2lojmrmic22noha
+atesi2p.i2p,hlahr4wgobvhegluufw3ckzulr4etamxxborktgz3dkefok232ga
+auchan.i2p,6vxz4yp3vhjwbkmxajj7wiikxafwujig63gkhjknbq6xh4rqpm5a
aum.i2p,ohdfneqxapfd3fwfbum4tut7z6k3rnr7rrguoxdrrfe2tln2kpbq
-aurous.i2p,cbwn6bfpmrwnqn7s7ummhvtcr5lpzrl6svwzakk63qajxbfpurka
awup.i2p,v6g32duzrkacnrezfbll3pza5u37h7lnukr2wbsk6rqen6prhbga
-axahj.i2p,fk7wfzjsn2rfx2w7sx4dl4exgbu2ocaannkrmfsvs4x2gzgvxhga
b.i2p,272kt3gcx6wjurunzaiiwld7s5p4mpjewfubzmlcvw2vie62ckpq
-babylonastronaut.i2p,t7xrcwnbbmf24mwr4n5l2blzsmrieawporojjx72m3yjvczqw6mq
bacardi.i2p,hivhnx2v47vh234c7coi2urj5cyvbl4bu3ypjr7snklortyqeljq
backup.i2p,kepphem42whle3rkfv26wcksmnegdbg6rdp6t3oobdkc2fmzrdkq
badfish.i2p,f6v26gyr4eipy3a7pi2voulw5qvob6dg7zij6xpo2ywbi5tvbu6a
badtoyz.i2p,3qz6ubtwlt2c4iasofjirkckq43u5fgkzyg7mlutcsym5gzhijna
+balrogbroadcasting.i2p,pqgjjmr2jgvr4rtjyscgbh3hby2qpuoiibldddwxied2f7flvika
barry.i2p,4kyahq53ol52n23l44tefgeaxqpp3cbb632t5k3umdvqcooevdzq
bash.i2p,s3wouoilbl3mrefxjhp4qoyujgok34e7y6vmpbu6hx4342ivqo4q
-bbs.catrat.i2p,3e2fes3hmo5jkhf7cyjji2gfhymw7mx76ulkekaw2o6iv5wdq42a
+bbs.tokachi.i2p,m2cjkyckmcib2pu65zdply5faymuewrq4b4yy5lajxoqivny2iia
bdl.i2p,kp6fnuulenbjm7r26pfbmjcq3u7c7kvxeajodvgr5flcnskdgi5a
bdsm.i2p,pa7fxql5jljegg7j5tglhnnaod2sptq3gxvdn3ji6muqyhgn3poq
betaguru.i2p,d7cduwwhrcc2voameqfkvd66u3advu4jw2p6pysgax35vq6ovriq
beyond.i2p,uaicfqlrpjtitqbqkpfujanj5dollzfzee5glsuls67ekw6hlpoa
-bfclan.i2p,73oc3du6vdhzsa6mkxtr2mw3xrjnqmoxsg5cq2dntx4d4et7c6xa
-biblioteca.i2p,wklqkggiwnzhotwoy6gxqbgkt6hic2rqovtdkteqlur7xyt6ahtq
bigbrother.i2p,tnxiifs6uticzyg6ac4lhv2l5luwi6xra7yngocro56ive5e4jsq
-bing.i2p,xmn674kxxsmrl3rvu6wcexk66l4stns7rjgccsggniclrrz2dkma
-bios.i2p,ugc57rc7ygmjwzectakl66x2jfmxzywducwjqto5gqeqtsoxuw7a
bitlox.i2p,lqw5khxcdntlv3u4vhn53upcqirplvnc4etjlmoytrzs66ytettq
-bitmoney.i2p,sd7asgdgnicjyj6lkaavux77u4vyvhv62pm3dfmluoc4xuivxb4a
-bitslair.i2p,q3k4tsw4fgw7wvm4ufpbstuw44rd6g6k6aymqvkij7fwehldecpq
bittorrent.i2p,pgax2vz572i4zsp6u6paox5xubmjrkqohq6g4hvlp6ruzzy56l5q
bk1k.i2p,nlyegmtyfffo5jfgg5h4dxxnlmqko2g36gpaye5a7vd3is35xxfq
bl.i2p,e73d6uhnfbylza6wqkhxejmqeyfb7thkzw35gn5ojmna64jzyk2a
+blach.i2p,khjfx7pdxt4oqxqcgk6zupqvmelpjkpiafzjefe75sl3qxu5hcua
black.i2p,sjwueu62qpe6dtv5b322k3f23fl4uz3w6qe6wcrwauiwpnymypfq
-blackdragon.i2p,yj7fa7i4malizkewvvzufwgig4dypuig2o3ysfxtewpxs2eqaq5q
-blackexchange.i2p,ztgr5kghkyn43fhhkuycroxgfti6cojo3vg4wdd3usqonyvrla5q
-blackmetal.i2p,xhcyocs3t4ifexiktqyld5t4ownetrm2oquhee57dgenwn6w2fjq
+blacklong.i2p,dx2jfxy7pwj6bbmcnshunjgfyranab4xy2dmaid65cpxwt6idiba
blog.curiosity.i2p,yiz6jec5k7ccxdgnh7msqa4ze52bqqmf6rpq6bqdyojra2erd4ta
blog.polecat.i2p,orlccceubewvxo3fbdyydq6e4uuidbs4xd5u2gyqbculnowo3ehq
+blog.tinlans.i2p,ylkch2nkrwehakx4z6wiyjbeqwlgasknukdkex6r6yq4xusrjnda
bluebeam.i2p,lvxp3cbcfwtol57d5pmrsck32t7ndutlxubjb4smaf32bynhlk6a
blueheron.i2p,anfb5jrhixjmvkyxctqwkezqer7dbob22wge2bh6wsewbhgnftfa
bmw.i2p,6naudpj2zozw6aiiqusv6znfzyprwitrufauz3zuejtdbotp6mxq
bmworc.i2p,w254y65la47elcmf6mo7xc2caamm3ikeusmjjfknwsavwsy4whzq
-board.hiddengate.i2p,zojmbo7fz2gxdk3zzovvjittzokdgwmtztf7t457544zt6m6zova
bob.i2p,i76m7dwm5hnapljendbie6fc5y3mjlkdlduo3tvbwiwmvhxbpyaa
bobcat.i2p,ftuukjtcquuvppt726w37boit7gp5hf2yxwfop35prx3grzzzxlq
bobthebuilder.i2p,qlahgthqhr4uojkkwahnper2cl3ro5f5gtzy5t4lzapbzo4osy6q
boerse.i2p,7633w56hd53sesr6b532r5qlbdnvyl5bnvama6ign6xryaxol4rq
bofh.i2p,auvuinzogu6gc4pwsgbjijuszxgcjygciu2wy53pfz7mo5nfpc5a
books.manveru.i2p,eb2tisc2vr5jvjqrixrozcujiucwxg4m722stxwho5666ipl67zq
-borderlands.i2p,qx7p6kevvetj4unyy3gfysksqlwpflqwwpe3z7l3xcctdqafueja
bote.i2p,bhjhc3lsdqzoyhxwzyrd63kvyg4br6n2337d74blyintae66mr2a
-boxthecompass.i2p,vqal5tlqr4lwgr22tweplff26agmbw57gw3xydbb6razak2eohla
bozo.i2p,7a2d23h6htprhzrol36vgwgklsbqrnuya4tbaaaspmaeaodt57iq
-brchan.i2p,wizbnurl2xzvrfsnbuhv3pyu3cfwos4jpoue5f5ellz4bv3px4da
brittanyworld.i2p,e76umhhic3474sdxiuax25ixyfg7y3z7oojj4fmxvhgv3ruet6aa
-bs.i2p,bcr355ziz6uupqzsmfffa6zbk4bdte4yvkk3qy4xryy7hmw5axzq
-bt-club.ws.i2p,2w656i43u2xjiuzbxxajl4ynez2c7ukjvmnbzkc2tbfjvc73jdya
bt.i2p,uhkuu54pg47zey76h45tnvsdtpkf5bthbtrjgnaloi5m54h4hlaq
bt.nnm-club.i2p,bmqz3v5ulhkvyqeahmp7co76ea4mwrxvb5nmtuclltpthm4mb47a
-btt-tracker.i2p,adsa5hhvulkv2zo6flv5glmnw5mf7e7sx37vuila5mtxpzxxfwcq
-bttracker.i2p,spjpsgdhy764p2tgk5uffvzwhr2tnojdedyooglwgjvf3izz2yaa
-buddy.i2p,bh5jfboctslsxapasfb54yvjgxv3mc4xq5ampfheowmxnedupeda
-burningcold.i2p,7sw4p3rhzl5q2olfcxwig54huc3rhhoqgqsz5cdpy7k5tlwfsriq
-burntout.i2p,lkep3fd7tjvxrs25crr2c3jy7xm4s7bqiua5r327zgpw37sgyerq
+bugfuzz.i2p,ubszn4gsf22vga67rvzzlg4qj2bfcq6o52fmxz46xruawqm6z7rq
+busyrider.i2p,sv7ksbdjctuhuf3ddcuj72ypepcfpy6tqolkokz3gd2jgbm4bjxa
bytepay.i2p,7amc4ztwkzu3cgsaaaw3223ohuihn5hlsqc6gpf2rxdyptdkyugq
-cacapo.i2p,y7hb4kzomfzzhekib2mby72ydlntiexmuafuwtlxrxyigtnd63la
-carding.i2p,l5crcmcrkspnn6o7pyypho4t2hrdknapzysiefpxnw7ubu3yhfuq
cases.i2p,kmpmk2fmineaiwublteqlifg4fkmewnhmxqlcgg7qwecz6daj43a
-castelpbf.i2p,xt6dd4cqf6m7uf7cv234lhg6ct4n3u4uq3qgb7rgmjt75rs5qleq
-castor.i2p,nynqxsr27owq74a4wqxvokudclkuzn2kx6fmjl455lmeoib5t3dq
-catgirls.i2p,taxqiyvy24hk67dadf3hzdsj4jtzjadljs57wdfgaujt46qeujbq
+cash.i2p,6qscc7avdla6lzs6u2nzbppoxndhioh5krmoauolpwixfeuylo2q
cathugger.i2p,vq43xjjcnejqpzfprws5qzrea2siieshu4tglpdepql2w3w3bpba
-catrat.i2p,3ha4vnxtirlerv3g34j675r3b5xyylajffvqmpcj3plplq3nqchq
-cats.i2p,ma773liy6ascw44gfnkt73fn2bnjjwcojn2xv5zdx5iigigiup7a
-cbs.i2p,u3lp7wazvq6opodzwjg5sc5w5kwxehmxd4wcdpt4s4j2k4dx4apq
cerapadus.i2p,zroed2cxga5zeuu6rcvmp2yfi77nzduw7yhdplbeuqkuyxwbrzaq
cerebrum.i2p,u5gtsfn267udwfh2uq35jiabkufifvcbgv456zz34cydutsiw2eq
cgan.i2p,43z65gdr52xe3fxmkumwp3dzhedu4tu4rdtzr24hz5b4awcpfbqa
-chan.i2p,fer3oxecsu3tknnnqsqlta3sy62pzsbqrqgr56xzyu6ezxbeqttq
chaoswebs.i2p,fz7l3tv3urnnhjvlrdylbd4uhxpglmm2i3xfvuqrhksjccdfzx6q
-charismazero.i2p,yqjyitvld4frrcipsclo4ceyetkjeyqg6u4juqd722g7tweq7sva
-chat.hashshop.i2p,nfqzckvh5kruzo6h53biio5ojiekoxsytn7ed4d3esc6lgby6x2a
chat.i2p,ollpwnp6yidc3obbb3famgt6rw5jg5w3k3a6z7hhaegj6gcohiuq
-chat.volatile.i2p,o2zogadvui65kr52h2sqeh2d67l4rx5qhd7gj53hkqbsj7y75wrq
-chatfreedom.i2p,mxwg6hn6dicaziccpxvejfjj7ycrldp6vkvfaplfny3jxilq5cnq
check.kovri.i2p,7uea4hzuqwbow5c6hm3ghkr7mvyb5vafoo473wrcaa4rmua2d7pq
-chen.i2p,l7fr75pvy3o66isse7bb4bdsy6coq2eb4irjkrsdlugbjanxqzzq
chess.fillament.i2p,tv6wbanei647yf5bie4dhg2wmybkjurezlpdfwftc5ajqlfswwya
chess.i2p,sbnoqznp5yzxals3vs6nzyqaj2fetvonys4e3b3x4ktmfeus54sa
china.i2p,wit6f2zx6dtuqqze6nhbykrds3idppfirxvhf2f7ydqoqf4xdzeq
-chishir.i2p,gd3ijpmfcmcukfjgxupuepckitmx52vii35kt7monsv35ljmbkbq
+chinese.i2p,vvbwsllobaiugvwksrqyhaigbdwkmtnqmdrelzcxjutnnlmcqoqq
chitanka.i2p,u4s3jneepk3akoez46kqiwikoezi6zyj2ibjkjyi4uuvsbcojzba
-christian.i2p,7atkjb6iiru3z4dtb6q3k2hmcyhe4tigbgy55pqi5wwg33h6jwma
ciaran.i2p,2r3645eete6xwbfu62ogonudcrcgqq25sbnij5v4geru74yrscna
+cicada3301.i2p,o24fedov6xocshjcksd2nimzww2iyjk65zamm6c5dm4vx4nfovkq
+ciphercraft.i2p,7s5pkqbpbfdkxtwuu2e2iwstbikyewvvscy76lij4x5pfbygbjca
city.i2p,q3x6msrirtu5gy5vilpki7afqlgrduvs3f6ywixu3qt5q6qc6sca
-cloakbuffer.i2p,rxjexx7dole53hiuaoqqjyq2nljknmnjfws5hwyfoc7jmmhmwrpa
closedshop.i2p,6fg67mbw2okopzyonsck4bsy3cy7l2fame56uiysr2cezhjhzdbq
cneal.i2p,g4za73ffigv3ht4jnhzy4dae52djjq7lqcguqsfg3w5cxzqm7nba
co.i2p,3mvo5eifcwplcsoubtvqkzdahwo2sdhfygfdde7lj2glybk4q22q
-coalicionespanola.i2p,qwmwl3oxelkrr4omz5cjn52ky4wq53aedqbmllut2io4vehpf3pa
codevoid.i2p,2mukrqwtinsw27uoejtrz74zxtilyhnnfdyso7j3yo6vaa6nzlaa
-cokeandcoffee.i2p,2e4cjl64viaks675d6kso3cwkfaae6eqd35crjj3kfdz7oazofla
colombo-bt.i2p,cyr75zgiu2uuzap5zeosforbgvpfbqos2g6spe4qfulvzpyhnzxa
complication.i2p,x2av6rwj5e5tp64yhdmifdyleo4wblw4ncrrcrabxwscuevpdv7a
comwiz.i2p,6p7zqfotzbd66etl5xqy3p6xvr5ijucru3am2xqa7wmnj6vf3djq
confessions.i2p,lh5vitshufxpmyr44zgyymebo5elc42eda7pxvn5lmtes47c7rxa
connelly.i2p,5yrris3nigb3fapvzrlrcaew6cdmzdknzvgrc7y2jpn3ntqurweq
-conobs.i2p,sbapt37ybk2pkprqnkucu4thvtnhs6b7swrhtq4ddopateqt7pqq
-conspiraciones.i2p,7gzrrcy4ilatcinirarpyhorhfkzktnfl4zevuu77gvidiexdwfq
-copyright.i2p,73ul6db3pk2fr2bwk2fewvpuxwiyetnh6heptroagamrchfq7kja
-costeira.i2p,abhty5xlmnyab2kqdxcd56352kcescxoux3p6dbqdrghggyygnxa
cowsay.i2p,q4ghzfpah4ffvm3bhc6fdkrznk5f6jxfjm2daytlparznai5d54q
-cronos.i2p,27sdshufrqpgto7b6ko7ahfk4r2mtqnqtgzf2ncx4gtvrne6zwhq
-croquemort.i2p,j6damyqss2msf47sdxgc6dq7axz6wocqp5utjhn5wifdgabkwhfq
crstrack.i2p,mm3zx3besctrx6peq5wzzueil237jdgscuvn5ugwilxrwzyuajja
-crumax.i2p,xg6ffstp3lnknou2ayhvnoc6nwdhic7fstzphy6idnjnner2wxnq
-crypt.i2p,4xpb7orp7xmhxyiwvdvjm36dzp23h6jxxvagr6xuldodqto2hcqq
-cryptdesign.i2p,ekfldb7x7hgmznu7wnw5d7ziryizyqr3dfhgjcnzshmbyn27zruq
-cryption.i2p,hdfyl5jvzvlkamuz4fp5wokh7rzsmsnidr2qfoocke6myqgpxw2a
-cryptobank.i2p,cv2ccppauuoc5lq4drvbs6wdxzsa6iswnrxqf7idie36rxbqp6ra
-cryptofreedom.i2p,uflpfypin7vzybsui2qk6z4cundhhenixjtkrmnhrxedfoaokefa
+crypthost.i2p,zywhrxtnkjc3rxxvxbocom7ml4hnutomgtuvqrwyf3rhuupnq5ca
curiosity.i2p,eomeif4xrykxlzhawc3icdilje5iammijos6tyizwhrfh3j7qdvq
-cut.i2p,uk5jarq7yvogeuxnbmntdkheyoh56mqbbqeysphdzcllnkvz5e2a
cvs.i2p,yd6k7dzpsa2tnlzx4q7xqkmd4qsjk5xk5hbiqpiarwbeyvxaxgba
-d3bug.i2p,c7tdscxwbhjpgcjz6zle3uhj2gonvy6e3yvloce6ekpmwltbibra
-dallashackers.i2p,lzkthydgao725tev3rsqdgy526t3rfae7q5xjxbmvy4huimlkiiq
-dankest.i2p,t3xtjrbxfehmg3hnqf2mewezirny75mfgzflonhkd24sky4am75a
+daniella.i2p,543gbm3qfbb4nhwnl25dhunasx6q2fxy4h573lj45m2na5lbvucq
danwin1210.i2p,eoqdf4no5dxn4tw5n256kkd4lzz3uk4p47np4mepsykpsdzrnvba
-darkhardwarelab.i2p,hdzxaxt5y5owwvg42s46ygxncshiaha5ec6kvczo62conzuh3pja
-darknet-products.i2p,xatbsnkatiravmh26kpb3qj4nq5lwxyze4q5uax4mme6yv23tzkq
-darknet.i2p,xrxbhjjolxz5mlkycicpdcgerw2dljdbguhq7hdscfeo3j42oiaa
+darklord1802.i2p,jnu3endfmzzf5t3gb6vdj745cl7yp3rmyqckqus77cki6a3lgoya
darkrealm.i2p,gbh4eerxdsph7etxsxznfhvmuiz54trlkenakqep343u4xcoekzq
-darksoapbox.i2p,jlp6a5wubjorjxwqfzfub34kvpcybbkndo3lc37zcs3rryrq3a7q
darrob.i2p,hz2xhtpeo6btgiwi6od4qj2575ml5o2246rd5orarruyjhd63zja
dashninja.i2p,dzjzoefy7fx57h5xkdknikvfv3ckbxu2bx5wryn6taud343g2jma
davidkra.i2p,nq7ca2egm563nir3xegfv52ocgmxstpz56droji4jgnzfoosk45a
dcherukhin.i2p,qa4boq364ndjdgow4kadycr5vvch7hofzblcqangh3nobzvyew7a
-ddw.i2p,wlyy7ees7cumw7ggrs7ksp3uzld6holwopqr6qikncqjgj3vngka
de-ebook-archiv.i2p,6mhurvyn6b6j6xa4a3wpuz7ovpsejbuncvyl6rnhepasfgdgmn7q
de-ebooks.i2p,epqdyuuhtydkg5muwwq47n7jvr66pq4jheve7ky5euls6klzwuyq
dead.i2p,7ko27dxvicr2sezvykkrfiktlghx5y5onup3f2bas5ipocy6ibvq
deadgod.i2p,63bveyh7wefb44hlia7wtxxb3jal3r67thd6jekmwrtq4ulaaksa
deb-mirror.i2p,l6ly7szjqvbffz7hacvjxqsbvpxoguh34ypkddtgse6bq3fljayq
-debian-multimedia.i2p,cylxxz2y35x6cvyrl57wu3brckurtexatyi2i5awz3eeamqwjspq
decadence.i2p,pw5ys7k2grjb5myydpv6ohikm6nna7y6u2dro44i4rucgulu3ikq
-deepdankmemes.i2p,ht4cn7mltt3bn7fm5uvbuvtnuc5laxyiimxza47xi3wffra2ehkq
deepwebradio.i2p,2nait2gdeozkgf6gyhzjfij6mwldwkxxwcvtxobb4b5q5cvtm5la
-def.i2p,qon42l7zzzzylw7q2hxcwz67ada7lijqrzzwqqrrspff2qyycita
-delos.i2p,zhq5z2ohg5ikrobdqacfwaqts6fylnq26veblksl7m7olmk3vj6q
-denofsubmission.i2p,ybk35cmsj3ip3mzyzrtd4pzq5w4qkhywigp2kzy4vcns7fyqe3nq
-deploy.i2p,ujzspsqkbz5z272eozsrdv4ukl434h3fuliwrfxxnab74jmd7e6a
+def2.i2p,cepsrw27kdegwo7ihzouwvgcvw2obswwjs23ollgj7hk2yrce3da
+def3.i2p,xbf3ots2purqun7orn72ypkpjmrzbfrkj3u654zfe77hbrbow6la
+def4.i2p,yyzdq4fwwmnlojp23drfpfqujln2vcjozjrfzfeuriuqzdq7g4mq
+det.i2p,y6d4fs3rpqrctuv77ltfajf5m4tl4kzcu7rtwhxgiohylfxxow4q
detonate.i2p,nykapdsjjswdkjov7x3jzslhg4ig3cpkhmshxqzijuhbisx25jja
-detra.i2p,nluwxqolosgyly5nzicm7dmjdnxj4e4d7mlfilef7qu5u7eqf3ma
-deutschland.i2p,dypqhruytjyjafxe277ok7xuls3vh6v7kmwd3fnzd7jpozlbjdzq
dev.i2p,cfscxpnm3w3qxnlv3oikewxm4qrot4u6dwp52ec2iuo6m7xb5mna
-devfs.i2p,3olqlrn3jutjmry5aaxndt6m7diktaf66zwp5fbrks6qf5ax5e4a
-devulgar.i2p,4mahjuyvnuinlzocrhrxo35xsdbwb6rcj2wxoakc253bpwhijqva
-dg2.i2p,sjnqo3saada5pfldxmsvszns2rosi24uy5m54k7z6wqimewbke6a
di.i2p,3irnooyt5spqiem66upksabez4f3yyrvvjwkmwyzlbealg64mgxa
diasporg.i2p,edvccoobtjukjgw2os5eetywanbb2mpag5aknkrpia5qx2koksua
-dieso.i2p,j4wpvotizkxpbljaptcvfs2eylofym6ftyavgvhbm7k5g3qlpcaq
diftracker.i2p,m4mer767ipj7mq6l7gdrmrq37yzvsj3kzezd7n7nsfuctntjseka
-digger.i2p,abkurcjh734b77blgj4ngvxzgfkxafprb3lxj62b22zy4myc5lzq
-digitalconcerns.i2p,7k4w3cttjgmand6ely2srvgfc4vbwltrzyrardubojf42altdylq
-dimqua.i2p,ao264bhdyp3cimoiagzw7rpa2vakgudf27hfmucsd5ibcg5xkooa
-dlms.i2p,krsbxsaw3lnb6ctdpydygm2gqobjcpm4pf367ddo5hylbscnynmq
dm.i2p,heysbdivyeugdbggpscco5wje3dsvwgcpp5ot4sopooebnmiqvtq
-dna.i2p,fcnogd6go3zrwggy5s3ec62dfv6jfnstqwntar5f2k2umy4ordzq
-dnca-anarplex.i2p,szdgwbm7utjqoawfnwtlmqtqemhycjucbvrxx46d3u2yecoicj3q
-dnp.i2p,46xuw53lvmjontyaodc3zqddgzozkmybmnyagnthquuiqqphfb6a
-dnpchat.i2p,34dwlvhzlcvq7lxld3f3dz26gt27gijerqje6otziiyityuiedaa
docs.i2p2.i2p,las5l45ulwwf5i72nht6vk33sfkidcpr2okpf5b6mvgbk3a2ujna
-documentheaven.i2p,3kbrghggbvqawdmxeesbnpqjtq7645evesf4dggj6hzbgvkzng2a
-dollchan.i2p,hvmnvcq6xv7ok2efmllyxl6lei7ugidtkr3slgmcns2fjj3cytwa
-doom.i2p,yvnq6yyiluav647i7qc3hpjkprrbx7x4hb7e6djgwflu46vwqodq
-download.ipredia.i2p,nbzqubihyfrdd5pfmggzx4cmtoxtcrbkr2cxjvgnn7g7janntlva
+domenica.i2p,hbnbggujfnwnjjy2zg2e54gypwy432t25tb4nn2ydk3xbuslgiba
downloads.legion.i2p,xpmxdpuuptlekyhs7mmdwkvry7h2jbvpqpzsijqe3a5ctxgodesq
dox.i2p,vk27cjdrtegfdnrjqutebgxkpyrfj42trdfbsupl5zn2kp34wb3a
duck.i2p,3u2mqm3mvcyc27yliky3xnr4khpgfd4eeadhwwjneaqhj25a65ua
-dudos.i2p,i7fv4cizrwylahm3mqhvkrltaeepwjj5mvl6nin4k36kybvluf3q
dumpteam.i2p,2fwlpuouwxlk2nj4xklvm43m52tqyhqnu2fcfiuv7clvf3wd5nwa
dust.i2p,u6xgh6zhhhvdvefbqksfljfs3nyjvqcrmyamp5bryz5f4injmniq
dvdr-core.i2p,fg6l2ej6qrk5rkyfzdptxx5xkcm4kvdla4gg2tun7z7fm5cxxw5q
dyad.i2p,7n2ljphvp2dep7imoujvydxp4myuxfld3axwfgcny5xc5x6jj6ka
e-reading.i2p,z54dnry6rxtmzcg7e6y3qtsig5yf5fmehuvakcg5wnuahx3iafuq
-eagle-net.i2p,kqkshpoytjq5zzpulvq74ifu5ubkga7qwvdip2ivcjcdroazfi4q
+easy.i2p,ndg6v7fw26bzjex3huvcxfyavpfbig2bdmfus5t2qnk2qte3wz7q
+easygpg2.i2p,bwxry5alzx5ihgrd3glah4eotddblzhalvpheppnw4zcajzqoora
easysoft.i2p,ecbhsjzyt3pjp6zv6btqin5cbhlwqsgritljgyx5tc4aoarojeva
-eblan254.i2p,gt7ktjaccfl47mbiuehrruogte4ytppbkr2v37q6ppwbjajbbqqa
-eboochka.i2p,ou7g64d5in4sugv5fgmmzwnunuw5hloixio7puthmrvrkwrp6egq
ebooks.i2p,bvpy6xf6ivyws6mshhqmdmr36pruh2hvoceznzeag52mpu647nzq
echelon.i2p,afvtspvugtd32rsalxircjglh3fhcjzk7gxrm3gw4s2yrpvzk6wq
echo.baffled.i2p,bfr3lyicr72psxvt2umqfb562rtex66w6q3hi3tktzkoyane2iha
-eclectic.i2p,33xxjd2z2poeqklufqnk6d6xrrmbebmlh4yabg4snvk7vur6iila
eco.i2p,2dq2o5h6c6a674qaduipp55mid5iktumjbswuwmpsrcqaeowdvwa
-eddysblog.i2p,ieac3ub4g5sy3wuhsbqfembnpp7f3a37xgcx537ytzsmgfzexnbq
edge.i2p,aknsl5wmzjmwyc4wxutfdwy2w5vgd3vcx52mqx647hcgvyurmqta
-eeeiue.i2p,ilzqzqvzpclqdhhrog5oycul2aaxtwb7ndy325aphsfg3oefluqq
eepdot.i2p,t6edyotbxmxvy56fofdvmragvsj65te2gkhvzv5qnblicutyvgoa
-eepme.i2p,i2dhxxmowponghj3tlxq43z7b2oqnht7pkxa5esoq2zcn4odussa
-eepsitelist.i2p,kplek3im5b4uad5qfi34tlfcrcu2pn2ph72gyood2zefygv36m4q
+eepshare-project.i2p,sn26kom4qyuzouppv4lwnk6bqabdydcegtrilybviibwiq2s4nfq
eepsites.i2p,isskhl4ak3g7qevrarlmblddgr4ugnn3ckalwpjcvxafk5rjgypq
-eldelirante.i2p,xgh6ke745jg2jwyreiua54oih3bjt5dpub225aw3ijj2fsw2czpq
electrico.i2p,65yj7dwjbne26e7pfvf4grwn3ohttvxtsbt5l5kyr3v67rjucyya
elf.i2p,duz6ey27ohpcp3llylklzdb63lylolzcixad6bh7rt5tkq42qqpa
elgoog.i2p,z6hrgkg2ajmuzlrddjlffrgctx7x7fkipm6c4hdzmohyn5wkr4ya
-eliza.i2p,2c5xvunc3y3xvtt7f3glwm2bdqfep7ydyshygcxmecheeezmzs5a
-elportal.i2p,26azjncf7esizipsyyfh65zy6boejxglanzguwuaheiox2nglmra
-emc.i2p,535p7yu2i365ffgrdku73jtzo6iqnsskicwtb7vc2pt5smjfl2mq
-emercoin.i2p,o6aga5qbgi555rulkuerbjzmmibupcpywownhuokl7b5s3ktmbsa
ems.i2p,734zw4jsegdf55zl3z6s22tqkbxcghu4qvk6q2wevjfmx7xhbn6q
-endchan.i2p,crdjt54gtdj2twfc4oxur2jwqc5u5mtzo44q57bfju33d2mbomna
-engruchat.i2p,zw3f44qty3nihjoc3kdgsmw6nbsx5cycom335s3rqzykfdn5s4iq
-epsilon.i2p,ze4bgohowgjzhoacnkuhb26stjktimoffyvt5nbfiuqis77fxgoa
epub-eepsite.i2p,yxvzjwd4vin6pnjauekdufh7lxaijal3kqe2bhakuf47g5zkb6xa
es.hiddenanswers.i2p,cw7ge5ey4ekp5iep2kaw6j54boebtqytpcbnvio2bfpccd5ejzfa
eschaton.i2p,xe75f5hzmrq6rkhsef2geslmi2v2yfngdiysmlmxvh7b4pyyjk4q
-eucent.i2p,64qe3xnofn3ah6ghjkaq3a5vk4eurmgraptnphpdhaoxkjchg36q
+esuwiki.i2p,cwxuiwcpymb72vm5vluba66ofhugyf5qeevvwo7e2fqrxl243coa
evil.i2p,ljfl7cujtmxfffcydq77pgkqfxhgbikbc6qxjgkvcpn4wzd73a4a
exch.i2p,vsyjsbbf2pyggtilpqwqnhgcc7mymjxblamarmxe5hmbxaxvcndq
exchange.gostcoin.i2p,n33uthzyqsbozl2qh5zii2bq2nnvbz6g6c4ew3mwp6uukk6u7wva
exchanged.i2p,ylmulgfskl6uiwac4hw4ecwqdzd3oxtwaemzj25zc6k5q4rkexra
-exe.i2p,varccyu3ythxext5xtb6u4j4pwl7neu3mh3nurwb2bpit4e2t6na
+exitpoint.i2p,5zmjurq3enudcenegnxu5hqmfmayz4lxvnik6ulch4xssa2ithta
exotrack.i2p,blbgywsjubw3d2zih2giokakhe3o2cko7jtte4risb3hohbcoyva
-f4u.i2p,seosrxtycclc7emif4etsv4kzmsmhzptg2ta237brbudq6rdizpa
+explorer.gostcoin.i2p,ktoacmumifddtqdw6ewns3szxths2hq2fat2o7xnwq4y3auga3za
fa.i2p,6n6p3aj6xqhevfojj36dixwbl4reopkhymxmatz7ai5sroh75rka
-fa1c0n.i2p,o5m4ckiiea3wv7qgb3iwvf6f3tr4rlaysitdxbgp2erhon6qmcra
+faksoc.i2p,l3lu7irgr2s24ot7eeqgutldoil33mv44qi5qdxwhwh6w5lyxcoa
false.i2p,77mpz4z6s4eenjexleclqb36uxvqjtztqikjfqa4sovojh6gwwha
+false2.i2p,j5i2tfumh3ti5sdtafwzzbpupmlcbg5drysfay2kxbdpsaljrosa
fantasy-worlds.i2p,62a4xcyyhvfrcq2bkckb7ia37fmrssrgx467tlkxp32fjpq577wq
-favicon.i2p,yp5jqyqanin5e3skwum2hmblkfgbbj3nssp6bvhlr5kw3xvyzcma
-fb2book.i2p,3a24ytysvevkcgtssyd6fjgy6efck3bfonkanh7bphal65fthfvq
fcp.entropy.i2p,de6h6ti5z3mcbdcwucu45vplikqyoeddsu3rqy7s2zy5i47j3peq
fcp.i2p,ndsznnipoeyapnsg3gj3yi2dzsqduxwalmujm5mzjm7e6x374tta
fedo.i2p,zoamh7e3k2vf2g6pfy46ho4taujk2f4mxqqsv3gbg554fxbvyfqq
@@ -309,131 +192,84 @@ feedspace.i2p,kvtnpx4jylgeyojfhix4x462sqn5uork3roml4sfzotkxx62i4wa
ferret.i2p,kkqie5qmja7bkf3iad4zxhrdarwj7kbrx2m3etn5kmba3shgwj4q
fido.r4sas.i2p,i522xmu63hfbaw2k54cthffcoqmeao6urjyq3jg4hddf6wf57p3q
fifi4all.i2p,v2stz6bsot7sbjzix5tky5dm5ej7gidmjnkvzqjju5xvz5sz6fwa
-filehub.i2p,rsbtaakwwfvodxa6xyn7ea6tmi2andrfmlhdcasgy2xx32no2cpa
-fileproxyxmpp.undefined.i2p,oc6caemyolql5xwav6y7kputwcb357qk2matzevmrlyrm3y7f5pa
files.hypercubus.i2p,qfglq25jwieszgyt7muz6dambzqsrmjhhszygzzx2ttubc77sffa
files.i2p,w2sy74xe6oqnuz6sfh5fhkzu7boholgzd5f3anhj47srxwpj2vaa
files.nickster.i2p,yil7dp2hg5pbqyovsiwb2ig6zjsq4tize3fnwemmqdrr6j5itdtq
fillament.i2p,udj2kiino4cylstsj4edpz2jsls77e32jvffn2a4knjn4222s2oq
-fireaxe.i2p,ov3ev5dplhdz6ipy442ftb4kzz4dembm3ifs2jo25qhiyw6f4ogq
firerabbit.i2p,awqh7n3wskzl3epyvkdwgarmfybsncm7vye6psg4tpkmplh3mj2q
-first-world.i2p,w35uyqjcbdrohmtwgk7pf36djxelyiq5gs76hzyrwovpnmkv2gcq
-flakka.i2p,dvqfprgxtomk5xk7yr3irjpowrhcixew7wyxw6ppilbgxrx66b5q
flibs.i2p,ocdm33e3h5tdml3yyholj4objdwsrhlugfqjnqgdkslmgdzb6b3a
flibusta.i2p,zmw2cyw2vj7f6obx3msmdvdepdhnw2ctc4okza2zjxlukkdfckhq
flipkick.i2p,aso5rzc4ym6g2bcbxjy2n573bmbenkjawva2jg7fhyqhwtwgu6lq
flock.i2p,hflpi33ko5bi2655lx6bpzstdnjqgzrz23inovqjx5zpntyzyb3q
-floff.i2p,umcssecfk4esz6fyr7gotsgcnbcxpf6atim5uqkxrxb62ky4iatq
floureszination.i2p,vitpvfb25sikuk3crgcvtcdi7hajxnnq2t6weay3no7ulur2wwwq
-fluxdirect.i2p,kudvuk4mc2rfqoi2f3khn5mz6af3hdaq4wx4bnvohut7hktoumua
-fmnet.i2p,zveaklfzb6xmcayvmmkdvqnboibmcddnk7tvcw56l4au5zuyrkqq
-forum.anoncoin.i2p,sytfn37x3exrre77ctjuo3g7nhnky32bqgpcn6jr7e5lijz75nuq
forum.fr.i2p,onvelkowkbuwrglhw2cnocggvbdudi75sll5mfirde3cbopjqivq
-forum.hiddengate.i2p,gsuejshp4433zxbrb4yg7sdxw4ln3b3n57i2gpzij4ddazed7tka
forum.i2p,33pebl3dijgihcdxxuxm27m3m4rgldi5didiqmjqjtg4q6fla6ya
forum.rus.i2p,zd37rfivydhkiyvau27qxwzmerlzbqtthsa5ohtcww62zrygjaga
forums.i2p,tmlxlzag7lmkgwf6g2msygby3qttxvm6ixlfkq6s6cpgwubp33ya
+foxatomic.i2p,obdyolrmtaxt4i2aeouun5shl7wqtxgbnkesty3sr5ofmhae32qq
fproxy.i2p,keknios3gm6kh6onez6x2bm2t7stv54oanvltuagphgdfjdw5e2a
fproxy.tino.i2p,fpaituvuvyxp6xdjnv3i27alnj2ifzcvqdweqb6yj5uybotzvyha
fproxy2.i2p,r4lgw4wmza25g7j5fjocjbwzwthfg4ymcbm52ref3hh2hogskcza
fr.i2p,ia6xlsnygorllplx2owokahtrkospukvsmysz7i7bzw3vejc4hdq
-freebel.i2p,itir2seplkvrcgvlcw4v7jp6zkzdhmu4tbu2kcev2zkn3foi77yq
-freech.i2p,upld2ui3i7iylcqt7j64s6rpwssbvlxiuxsellrg5br6ksikiwwq
freeciv.nightblade.i2p,rluupsgxbvw5t7jno3apyzlrdirjkljft4gdoy4mxxh4fmd4xzta
freedomarchives.i2p,4ck6oliqfjz3sccpya2q4rh5xkj5xdxkqs76ieml37537nfhwd2q
freedomforum.i2p,abzmusjcm3p3llj4z7b5kkkexpsxcnsylikokouk5txfim3evqua
-freedominthedeepweb.i2p,jajc3urxerox3f2gfpfdgcvwcghnpppyvurh4uo2wwue7yebhxoa
freefallheavens.i2p,giqnkltyugfmsb4ot5ywpvf3ievuswfurk6bjie4hxi2hh2axajq
+freemind.i2p,6kjq2ohdni4fgqcypcfgi42lz573juf3inzeievm3euxklq4qeuq
freenet.eco.i2p,2kf7ovb35ztqkrurkm76y34jfpwi6go25xj7peznnmxrl7aieo7a
-freenet.h0rde.i2p,2viwn35pgbotojfv2lky6c3tzxqd5reiujjxebisncykd236u76q
-freenode.i2p,f3wg7rq6mzlpef4mb675gpaohmbicmeu64jsgn7iahijljjpflva
-freeworld.i2p,c6jgsi4fqvu63flxdq3qq7e6whpyqpdmy25k65b4se7vjafow3va
-frenchsharingforce.i2p,jgj72ptq43shnabzljbza2o3kx7qryrpjqhotscalllr7yqiq3ga
freshcoffee.i2p,sscuukigp6alcb3ylhkcugoejjfw5jqgtqbsbafw4hyku42lgc3q
+fri3nds.i2p,y2s7xlezekt5ie5ij3mxhywol3rpo6hsu7velnh35vbdl25tj2ra
frooze.i2p,m6ofa5dmyse4b4jg7kfmluuuc4pw5jqu6zh4qnboin4vropxepja
frosk.i2p,63naq7zb3hvbcppj2ng7qwf6ztusp4kwpyrzbt4ptafcdbu4pfjq
frostmirror.i2p,ycz3imuz6yte2zhlapmsm3bsvc46senvc2jxzwsbfdct5c72qulq
fs.i2p,ah4r4vzunzfa67atljlbrdgtg3zak5esh7ablpm6xno6fhqij35q
-fsec.i2p,z432orw3ba45bxy2adkb7bdycva5xrraqu4fbzki5bnluxiqtvsa
fsoc.i2p,vaqc4jm2trq7lx2kkglve7rkzxhhaptcwwl32uicx4ehf5k3hx6q
-ftp.open4you.i2p,4ek4ltehr35aicnduha5gl3tiu6acnbk7v63yicjyd5sx6mzs5yq
-ftp65000.open4you.i2p,vzv2sjdkcgzyb47u7ump63sqgli75za5qcgilnzpt5cyvpyez5va
-ftp65001.open4you.i2p,e7sqiurf3njnhwbkeen5wjoqgfdhdpehcqgwyfpm62oew7c4lyzq
-fuubar.i2p,ptekidraefaa2k3333kyogg563jx7htwem7lova3tt5eqebpiebq
-fym.i2p,ecouprtbumzdn27s3qeg3bosoemgtp775bq3zgkkzvkwdxiz72na
+furry.i2p,nsp4dwzfkdldtly3z6fewmicrurncrie277catksd7mpt6xjmbna
galen.i2p,4weo7zkxscxbcouiqx4mlnb35uwl2lromikzk33er3fljktyvi2q
-gallery.i2p,2ps7wt3v67ni2d535lwaubpsuuhxsg3igifsy7qlzolbrxaimunq
games.nine.i2p,ov27guhkdyhgdkqcsi7ipxsbudytn7bj3qp6ovwk6ih2wwu6sl3q
gaming.i2p,rfxberwod6st2zc6gblqswxjl57nucgc3xrbwss43pe3dvqqzj4q
-gamnovik.i2p,ueukotwgp5xn2y4dh7rspe3q7rfcdpoo7r2xbpvrkx6n2niii2qq
garden.i2p,qkk2dqx6nocycgt3vinsoc76cxkb4jreybcpgz3fcps2dbe4rowq
gaytorrents.i2p,fnggbr2t2aulr6rvlo4aehotx6wecfob7u3k2nxsnvtm4xex424q
-gcopy.i2p,3pa2pmbix7cy6ihlydjohqudnwz5ssk6jvwqiouoc2lq2p77a5eq
-gdd.i2p,ddlxcqyifaajcshyzy7d5rw5ziqil362gljf33gjlstbkroaxi7q
-geekycritic.i2p,yaqnhwfrs7u5he3cwd76feocjxafqekj25hl7dngr3xwuti57tta
-gelboorumirror.i2p,lgjfssrj7sznvli7ebtadzo2leefvxi7uzyt7aprtgxyh3xmi2cq
+geekcraft.i2p,g2xbibxoskudufabbgwe3hdpy54vb4l5jq2tr4om5rmmzyutmsua
general.i2p,5fklrsztdqpl3hkkwwrrw2rdowrq7wwhwb6h7avvk4fhansp4vvq
gernika.i2p,wpzqv3lxpecdsvcaadvbmrhhwlc7kp4n2mijdv2qjw3zr3ye232a
-ghostsh.i2p,pp7p7ww7ug7qwkirgfrnwyxplp4cmyv3aksk2mroplterz4p6axa
ginnegappen.i2p,kbhfkzx5jeqhfgss4xixnf4cb3jpuo432l3hxc32feelcmnr3yja
git-ssh.crypthost.i2p,llcp7jvz3hgtt3yzkdgjolwobisgvhv4xqa5a4oddejllyozur5a
git.crypthost.i2p,7frihhdcisdcyrzdbax6jzvx5gvtgwsm7m6kcem2tlaw4jtahbqa
-git.devfs.i2p,yklo4bsbwi66r2wlbug5jrkpx6tlquo34knzaopsboiz5dnxn5rq
-git.nazgul.i2p,2o45uut7k4wdmup3nzncyjh4zuzwi4rm6xrucsf7b24zhlkoir2a
git.psi.i2p,em763732l4b7b7zhaolctpt6wewwr7zw3nsxfchr6qmceizzmgpa
git.repo.i2p,vsd2vtgtuua2vwqsal2mpmxm2b2cpn3qzmqjoeumrrw2p4aot7uq
-git.volatile.i2p,gwqdodo2stgwgwusekxpkh3hbtph5jjc3kovmov2e2fbfdxg3woq
glog.i2p,ciaqmqmd2wnws3hcpyboqymauyz4dbwmkb3gm2eckklgvdca4rgq
gloinsblog.i2p,zqazjq6ttjtbf2psrtmmjthjeuxaubi742ujrk2eptcsaoam4k7a
-glunews.i2p,2bka7rmfn75ollbwq2cgzf35yxx3qz3lttmwi7i5t7iptlj74yja
go.i2p,ll6q4lsirhwkln4dqxwqkh2xu4mu3jiy546b4uhe4fypyb4vvx2q
-gomi.i2p,wne265y2p6xuaefqnhk2rb4gfhfiw7udvilnujev33f7tlux42ja
gonzo2000.i2p,nogsv7okydhbvrewv6hb4xdojncvhkusnyib4lglluc4uw67a37a
google.i2p,4p3ajq4cotnflmuv7fhef3ptop5qpm3uzzgp5bahxif3nc4w3ffq
-gospelflicks.i2p,iz5ms5ta2gm53w4avunj4q22o67vfuz2yr5lcd3ehqwles35vzla
gostcoin.i2p,4gzcllfxktrqzv3uys5k4vgkzbth4gqednwhfpt755yivm3davuq
gott.i2p,dqows7dpftxxl2bd4bgcpkck6knrysdun6mtqy4ms5dxobbvg3ja
greenflog.i2p,zny5ftmhzxulxzyczmeat53qjnue2xtqv2clisc7dg76lwfceecq
-grimore.i2p,ij4lpzuyyng6cc4jw5mxibcyjv4rx4uk6x5jijoduglkgjh7mmya
-gsatdesk.i2p,yfcliyat7jjuj3qfdbaunlbt25icteuilkmru7unl2tdmq5lxaba
-gsn.i2p,r6o3boq27rhrnoc5xzt2l5azmnirnldt6lvpgs2xfybeb3caju6q
gstbtc.i2p,n33uthzyqsbozl2qh5zii2bq2nnvbz6g6c4ew3mwp6uukk6u7wva
gusion.i2p,4qyfdhizjixe2psu7wcvqufix5wlijocehpb2futurcmlhlktrta
guttersnipe.i2p,kizkhzes2bzp45widihremo6geepfk7dl6juourkvzuvlc6y3spq
-h.i2p,cdnb77zmuqudreubv5trohs5mx5qkg6rmue3wvkfcqmccpeciloq
-h0rde.i2p,m5w3ysm5yjwyhmtnx5wmp7y4undauilishz7pb5ls3jy3kn5buma
+h-f-j-i2p-site.i2p,bjtxnbci25zix2ydunmsin7cwsffleirat2aab7a7heksosdagha
h13.i2p,tozb4vssixoccyqtgnpaatkg2ql52kkjwnsdo3dltezges2na4bq
+hackerculture.i2p,pl4pccq65gaee64zgo2slvn3ggjui56ewrcgxkmfuua5p7dwek2q
hagen.i2p,e2t6rqd2ysbvs53t5nnaf7drllkgk6kfriq3lfuz6mip6xfg644q
-haisse.i2p,rqcuzhlqyxyi336rx42h5ve3bhapzgifkepob3u4mo4vcikvg4hq
-hansa.i2p,4yql32dohkor4kilyxk3ole4xajgo7eb25thxasfimoffsgebmxa
-hashshop.i2p,ltrposvzibc5ahwbcjgyk7akq52udeuetprotyy5sbclxp6v6yaq
+hax0r.i2p,brvsdtvx5vdjai7sxapgksivsamty4dvrpw7g6qc52hqtvpjznpq
heisenberg.i2p,jz4quyw7zt63tmw65jfp76fblwadjss4iyi4puqdg3dye7oaqlvq
-helikron.i2p,nuql7jdr3qw6n3n6rwcktuoboglh3cppk67rohlwwufbciv4n7iq
hello2600.i2p,khpazz3f747z5zet72s6g3dccw53bfdqyhxt5da4sv7ouve5veuq
-hellobs.i2p,e2ceaajfc6w3ts24rnschqc2cxhqqbr37klmwk7b5kwgbevbe2ca
-helpforyou012.i2p,qzvqga56u3oupv7ndhsj7zrc5yngysgg5ayyqbjtkj5maw23ibqa
-helpu.i2p,3rs5qlv5bdpvwmsxhnh4gjw7yrta7eoe6wjcrny6fudzottnxmua
-heron.i2p,wru22ps7g6xgv2ommt7p4ctxwmpddejqvh3gkti6ys47wtf5e22q
hidden.i2p,iqodhhqo473qv5gwhjcs2bsrbhlqtpzgpnuumpastfiyhuwb2kyq
hiddenanswers.i2p,kj2kbzt27naifij4ki6bklsa2qfewxnkzbkgvximr4ecm7y4ojdq
hiddenbooru.i2p,zma5du344hy2ip5xcu6xmt4c7dgibnlv5jm4c2fre5nxv44sln3q
hiddenchan.i2p,6y4tltjdgqwfdcz6tqwc7dxhhuradop2vejatisu64nwjzh5tuwa
hiddengate.i2p,rvblcu54jvkkfffp3fobhunsvpgfc6546crcgzielzwe2s5m5hbq
-hikiko.i2p,jwifa3ysjbrygc6szxchn2bck5zonnihhxwrotly24se5xob6p3q
home.duck.i2p,jsh7yfvm2t5urdcnmfzdy4n6vegqskdtlwem53chgxli4ipfmuma
hopekiller.i2p,kcaelbgsvrkiwpx36b4wxofebrl3njx7rgm5amzfmqwbomt44cxa
-hosting.i2p,ice6ax5qrzwfwzsy64bctffj6zlzpuzdr5np65zsxlbt7hztyc6a
+hostedtech.i2p,ja6nnovaq6j6umtzano54tvxq2zd5vwasymfad3av3ceixzxblea
hotline.i2p,6cczi27iuxkm3aivazaemzltdqgh42ljzurqp43uclbz2lid2uqq
+hound.i2p,ovh4pszqnqhperfwn5rboxljkjemx7dymecl35sxa3dpdsz5f5va
hq.postman.i2p,27ivgyi2xhbwjyqmnx3ufjvc2slg6mv7767hxct74cfwzksjemaq
-hsdn.i2p,3tndu37wufiazfoo5cbbtcxe42dhpjv6f7sho44vvlak6sexolla
http.entropy.i2p,ytu7kz5bdoc26nkpw2hajwt3q7n5rcbg2eokyefhmkxmmslimbdq
-http.i2p,ygzrfsuuytq6chx26qtdd5a3z5as3ylymqy7hxjnn4xaxisw4x6q
human.i2p,nrtcelq3humyfvoxmzmngpka6tmyifweouku5mbi5av4lc43hzaa
-humanresources.i2p,pwm7w5z44w7xblqpod5ou3nfvw3izybfrw5waeqa3vuvzwl6xhjq
-hypogeum.i2p,wryo5vzllas5g4hxjhofzmvp2cnrv6flpof7pwd7lrrdxeazb6tq
i.i2p,5lpdk3gft3wccs4npmadb5mh3hwb7uh63ehym2x5rdre77xtfleq
-i2chan.i2p,fu3imms3gjyroh3phqsehq6c32zszvyg6qrundumhuieiyjc3sza
-i2fund.i2p,ibtuscldyp6zog3dqxw43p5gcy57jfvmvaczohwqbydlj3rdf7dq
i2host.i2p,awdf3nnmxxup5q2i6dobhozgcbir7fxpccejwruqcde2ptld443q
i2jump.i2p,633kqgmwzzu6vhkevwvbf2pfyejt3gkes34i6upa4og57fgdfcxa
i2p-bt.postman.i2p,jeudwnx7mekjcowpqo6xpkwn7263c57y5piurrjrdzinjziu4fla
@@ -444,86 +280,63 @@ i2p-scene.i2p,cc6z3xuw67d2mpq5horgu4mpk7hybmhutotmwvmzzpvoudggifuq
i2pbote.i2p,tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a
i2pbuggenie.i2p,bioq5jbcnfopqwvk7qssaxcl7avzeta6mu72jmxjeowflpcrhf6q
i2pchan.i2p,tduxyvfs7fzi26znvph3mu2d2ewaess7emomfci22wvownajphuq
-i2pcocaine.i2p,s7bq7b7o4z3pcl2pej3dgzkk4zhtounnw2q6dab4vmb24k67laya
-i2pcollective.i2p,yhug4bpdj5mlmwlidnarhdjbn2owet4u4x7npqd2bbpt2p3jx5mq
i2pd.i2p,4bpcp4fmvyr46vb4kqjvtxlst6puz4r3dld24umooiy5mesxzspa
i2pdocs.str4d.i2p,yfvbtrhjac3jutdsqzugog6mbz3jtyhpwovrt2mqc5mzv534y7cq
-i2pdproject.i2p,5a7tngsj4ewoz3ufqoklzaxchyg26qojmoivoj2ianiokebri6ba
i2peek-a-boo.i2p,qgv64klyy4tgk4ranaznet5sjgi7ccsrawtjx3j5tvekvvfl67aa
+i2pforum.i2p,tmipbl5d7ctnz3cib4yd2yivlrssrtpmuuzyqdpqkelzmnqllhda
i2pjump.i2p,2mwcgdjvfvd3xwumzqzqntual3l57h3zo7lwdmkjboeraudpkyka
-i2pleaks.i2p,koi6osleq2ervyhkc26gwqr57x3gxbqzvwqkdlz73jmtjnmiykdq
i2plugins.i2p,bb63kmnmbpitsdu45ez54kmogvvljn3yudksurcxiyq7dn5abt7a
i2pnews.i2p,tc73n4kivdroccekirco7rhgxdg5f3cjvbaapabupeyzrqwv5guq
i2podisy.i2p,3c2jzypzjpxuq2ncr3wn3swn5d4isxlulqgccb6oq5f6zylcrvcq
-i2pr0xy.i2p,jgs274mwwt4zvwzk6nthbjpqsencoz75ujoceh3bisxyt4khyvsq
i2push.i2p,mabdiml4busx53hjh4el5wlyn4go5mgji2dxsfyelagi4v5mzjxq
-i2pvideo.i2p,n2ejmbpvf3ocisxmqeknrkzesyaoxaowsoltwc32qytios33g43q
i2pwiki.i2p,nrbnshsndzb6homcipymkkngngw4s6twediqottzqdfyvrvjw3pq
-i2vpn.i2p,bduw26oby3cjuwihuxbf6ruhyydupu43bpr4su23pdzugsnhh4ha
-icu812.i2p,bxgqwfsnr3bgnr6adn62anjcin5nuthqglotb3wn3dgynsfofeva
+iamevil.i2p,au7jhslyt4cxkjp365bvqvend3hhykrrhbohtjqlgoqrlijbezja
id3nt.i2p,ufuqdzsxltiz224vq5gnuslt3a3t72dhy5kq6i2xway53m6pzv6q
identiguy.i2p,3mzmrus2oron5fxptw7hw2puho3bnqmw2hqy7nw64dsrrjwdilva
-idlerpg.i2p,ghw3xixix5dk2y3pzjsvmlput7d3z6pawkwe6hme5jddxmzqkama
-ihands.i2p,c6qxr35an7xzxzymuismym2buwbkoi7rajchcljmiw6t2xkujsaq
ilcosmista.i2p,6u2rfuq3cyeb7ytjzjxgbfa73ipzpzen5wx3tihyast2f2oeo24q
ilita.i2p,isxls447iuumsb35pq5r3di6xrxr2igugvshqwhi5hj5gvhwvqba
imhotep.i2p,qegmmhy52bdes2wqot4kfyqyg7xnxm5jzbafdb42rfoafadj2q7a
in.i2p,r5vbv2akbp6txy5amkftia757klgdy44s6cglqhmstpg65xycyjq
-inach.i2p,nzusnipqsecluzj2ctbq5xywnfebcyg3e3i6ustodgk3kplnfeda
-inbox.i2p,rw6um4xv56eggo4bb2yzn7epdkyhggyjjc2rskx5nkqg55w2jq2q
inclib.i2p,ux6prousphswf56bym7yo7kst4ybh45y2z2wrnw7dujmrz56hq4q
-infamoussec.i2p,k5nlxksp2vrfj3ber3gvmt3wbsmxkirsywkoub6rqqbiozp44clq
infosecurity.i2p,v3gkh5kqzawn2l3uzhw6xnszsh6w3nztjmlwil7p4kyrwrsm2dba
infoserver.i2p,jd3agbakybnhfvkeoxrx7t33iln6suzomv3kxkxf77j7rkonch6q
-inlux.i2p,umhctznpitt7syzeto4rpsklqyzi7atzdbsvurwpv6wkqipr57da
inproxy.tino.i2p,ex5yf6eqqmjkrzxnkn6cgvefgne24qxsskqnpmarmajoit43pgma
inr.i2p,joajgazyztfssty4w2on5oaqksz6tqoxbduy553y34mf4byv6gpq
-interfray.i2p,qdlrga6er72kfbzwm7qrpq6m3c25ufu327gjamgfzwto544l7fza
-ioku.i2p,x45hrjo5ibm2gojbfbac3wi5kytp2bywms4houedo4pwdce4jviq
-ipfs-gw.i2p,6ox7c4vu2dwezfxbtlv62owd6n6ijgcpl66vv26q4sslfcp7yaxq
-ipfsgw.i2p,uxqdckmpvrvgz4rkudi7ndgnhcz2xgm6msbql6dwpyqwg6zgdyva
-ipredia.i2p,xnrx3wxiatblnustrikohrodrtddve36zsqaubtlf4wh2zazxgma
+insanity.i2p,j7c45wpdoxxu2f3kfsvi2vr7bi4tc6femnycqi24qde2uucqurkq
+io.i2p,tx22i6crnorzuti3x6va4mijsbhoqswy2cfdxjbvprgsq4eerg7q
+irc.00.i2p,bvcja52pppgfspp2ueuipoysjnvvoyblz2h6smpxcmanjquogirq
irc.arcturus.i2p,5nywlbn35p2nwsymwpfmicu6fxono6g64vwusxbsvmm2qwz6vupq
irc.baffled.i2p,5zmtoopscym6qagkvpgyn7jnkp6dwnfai745xevkxlou77c2fsjq
irc.carambar.i2p,hxzbpivxqxy6nuae4t6fnkhcgnhs4c72vt6mmsqfmfhrkn2ca6gq
irc.cerapadus.i2p,e4ckznxcxvgyikzjmjsu72i2dbj2d76ogexyukklbjvpcnhp6zzq
-irc.chatfreedom.i2p,n2y56bfettc7lyfdiw4uojt3ok3zfcgudwzispwj2a5po2k4gfxq
-irc.devfs.i2p,2tnl43crujj7gfko6ln4gp64zl5fkh4djvcjx2piyjvvsl76c5ba
+irc.chatfreedom.i2p,qaufwx3c47bnjyave4y2mpk7d4vsayxpz7tdi2kwpv6lykj2znja
irc.dg.i2p,fvp3pkcw4uvijqabwtekcdilklp73gyasuek67wdcs2mucep4caq
irc.duck.i2p,chdpmm4gxffyn24xx5dhxvfd5httu42i5gtoe6cctjlsf4mbofeq
irc.echelon.i2p,ez2czsvej5p3z5bquue5q3thujcodfze7ptybctqhnqc7hms5uzq
-irc.floff.i2p,5feedunnrtirrs4nqgo4jo5g6lhal4bxb3riok2523x7khoysunq
+irc.foxatomic.i2p,mkyylu5pmwvjo6koojlfcex3orjtbtoxaeelaybsb57ykub5hw5a
irc.freshcoffee.i2p,ubiu2ehtfnrleemgpzsqkahwnvzuaifqa3u4wmaz5maaisd5ycfa
irc.ilita.i2p,5xeoyfvtddmo5k3kxzv7b3d5risil6333ntqrr3yvx3yubz5tk3a
irc.ircbnc.i2p,4rqcsqd7xif6r4v55blqvmqu5er6due4eyene3mjorfkts4o3rxa
irc.killyourtv.i2p,wre4majmg2vnbi6id27et7yw6lnpf56wkbm6ftnlwpvxnktq73hq
-irc.kitsune.i2p,cpesprosbsuycn4ui3neidqdtqz5ufekthob7cobl3p7bcuaoh3q
-irc.kovri.i2p,o4hfe2fyc74rjfo6o36h4vcif2l23rv45l5v3h2sjtfa4lpxd2eq
-irc.nazgul.i2p,uot6nezrp2o5eabprnf4dzgtc3plfqy7yvdnowokzw7x5yhwvjza
irc.nickster.i2p,dhq3fhd5scw3jqhj5ge7kqfpprfolcgxfjbaw24obohaiqjtdu7a
irc.orz.i2p,7gifacog4aoons3syybojbbnyqqaaqijhngrehn2xlq3eucuyjcq
-irc.plain.i2p,y7f3c5s2n44j5pnsxncqpasluv6k7i5jtnhjfs5mfulcgcas6sqq
+irc.pacman.i2p,ckxfx7oo5qbufui2i7tshzs5hef4yafgpw4jsogsyetcgk5tbn7a
irc.postman.i2p,mpvr7qmek2yz2ekegp5rur573z7e77vp3xqt2lfbco5i6nkfppcq
irc.r4sas.i2p,hodhusp73gltozgrnianlbploon3rrvhrzfn5mf2g46o7aaau5la
-irc.undefined.i2p,t6phciy5wytbthyi6fxwz5towjtae44iqsgtlp56ygx725tetmhq
-irc.walker.i2p,epownolfv227hhzogufiieiofi53za3qctgim7xobsevvntuxiqq
-irc.welterde.i2p,424n5ty6bryfsn3m3buckx4njs4vaw2qch7drfdq32btsyycbflq
-irc2p-qdb.i2p,j6k3cqiviwqlr2oudf3pezowtpd44gm3jgg2wg6c6d4m5gq6jweq
-ircdnp.i2p,yraqgyioird5hrzwhruqdgkykurgrme4nt3g2vxvfeyhfkujvpva
+irc.trollirc.i2p,hci35hmgxc5xdieoqexyjgsbgsqlsoogxyhwnfkx6aioxkf2le6a
ircssl.cerapadus.i2p,4x2i745i4w52ss3he2kse6tzwt64pr62yvrcb72lgvrb63fup6ea
irongeeks.i2p,ecduxoion5uc5hnvzjxff6iiwhdwph6gse3dknyvlo7e6gaeho7a
-ironhawk.i2p,d5c3tbjvsyvlqqnkgofvssmdr546ccjfcy3c7kaeniu3hwhacewq
-ismismis.i2p,5bgjw3l4unhq2suqjosefozpbxlqfcb2ebuqmfh4awazgp6hr44q
-isonomia.i2p,dkuoddjlafw436wathmwvubtxmfxe22gpqglgytwsaukdnh5aa3a
+iscofsi.i2p,enjgdxs4um2dmhdb2ajff2egrdijkjji3g47m6unb74swbrqsddq
isotoxin.i2p,wue3ycaccf4texikza3fh6p5yrmtgnooisuypnepo5mo67lmpcqq
-itcooky.i2p,fpprghfrrwc4sbvnuzmnruk2es5mhhf7gkh3jha4cczwd2rl7sgq
itemname.i2p,o35ut7hgywy35okvgkjkv3ufzv2ejv4luap4oytwbyy2jqy6u4vq
ivorytower.i2p,fpwrfvidfexsz7dspofkwtkmmizm7lyralfz5kvykffk7gubvxsq
j.i2p,kjxvohlsf5sdrzxzfcrmvquccnoevi6ytbl63mstsru5wt2dx3ea
jabber-2.i2p,pvnmzgemetkwcuvt45omgowmeznwk5xw3nc3ygeoz7yekqxy57na
jabber.duck.i2p,rhdzvvzraqzzm67zpyegb7knpfrjeffitixqzeyymdoz56uh2rtq
+jabber.i2p,32dft3x7pnwmgmc24yzl22r7kevefk22k66ms2dssd4w3skcgzqq
jake.i2p,v2axvy6pqefnla7gun5fmqs4lqe4xfyqovgzcundhxrpcdvfd7cq
jar.i2p,2fthkmujup3xiiu3yple24n6g4emzdiiimbuqwvpdddtsr3c4nrq
+jaruga.i2p,bcqiblik2ccvhnjzammiujiluqzp2wz2bggp6o2vxmtivpmtq5nq
jazzy.i2p,ha5c3zafwkt6mwqwjcf4oqwvbwz473652ljjadiwrj4gfkfkjofa
jdot.i2p,kw4jr5qw4bhnj33avkwankjdh3zi7wtahlmgkjwvsv2isskkzgpq
jhor.i2p,c6rnm7oemydhuwzmhwwwxphkzanez5rnn7fkcs3lpgu6gkgtssoa
@@ -531,304 +344,205 @@ jikx.i2p,aazr55itvyns4lwppvx5njyx5tjdwemw4w6jbmpegdunznod2ieq
jisko.i2p,jxgfvr663uhr6m65hrgkscshysfshkq32ywdubc4ed7zda3e2pca
jmg.i2p,oglpnq7zungdukmk6gk5fzj5jp6wibuoihqgks453wztrwos4ggq
jnymo.i2p,nbfplxgykyfutyadlfko2rmizdsxox2pee2ahboj5mju4s3putda
-john000doe.i2p,5u6jikwqg445gd6uhmmc547qv5yrreuxevjyub5bsla6rxdpjknq
jrandom.dev.i2p,htynimemonyzqmn76gworxyfkmqtsa7zcprbrd3i5cxqqm75tuzq
jrandom.i2p,dqows7dpftxxl2bd4bgcpkck6knrysdun6mtqy4ms5dxobbvg3ja
-jrrecology.i2p,qxi24gpbum3w3kesuxvheyu3p5u5o6tuvoypaolub2gnvbld57xq
-js3.i2p,wlcagt4vcjzux45dfnvjlj6pyt2itkz4xlyrc733lwnsiub6x4ba
jwebcache.i2p,xdffxnxtjd6ji2zig3cgva7igvl2tiapyjoc7ylbzwqhxudbmvfa
k1773r.i2p,zam7u6vslhemddz347uusuzjdk5wma4h5hcmcqlng4ybbpdbjhnq
kaji.i2p,z5ic7gvm2k4doczphtrnrspl2w5sfbss2de4z3ihjijhtjw67ydq
kaji2.i2p,4lscgc6napekfx7ay5fdcjofeja4fnl7tqcd3fek63t4saavur2a
-karman.i2p,zkx46wwkic45cquosj6mnzrtzeyjpic26fxw4mwpq3lxapigkf2a
-kaufmich.i2p,xkbkyfgsfvbqhpcofqzwv4ekhyadrjzlrszghjajvv7uuyad2rsa
-kehaar.i2p,awzzfuvi7rrq3ue2qoiuso5n6s2cgm5zevsycg6qv7tcipok4eya
+kellett.i2p,cmhgn2lsgvfrhrgo5l2fqxkzpngrl2potp2v3jw7juti3jrr2rhq
keys.echelon.i2p,mwfpkdmjur5ytq4og36ym3ychinv36b2a57f4rmgqmtrwepq3fva
keys.i2p,6qv4x7ltaxckd4vbay5s4ntqqflq4efk6oke2d5yzicqrmk443ba
keyserver.sigterm.i2p,isoxvnflrdn7cm76yjlfg5tbcugoito2hur7eidbqmo33xmwz5ga
-kha0s.i2p,pgyrawdmaysc7fqfi4tn4uziv4izekgcndlw5wjcsshbekuzizvq
-kibykarni.i2p,xowcvzbeq72slpbrwmjl3zy6xkrkb2ncctpkkskeqts63vedtg7a
killyourtv.i2p,aululz24ugumppq56jsaw3d7mkbmcgo7dl2lgeanvpniyk2cbrda
-kitsune.i2p,mubckotdo3ju3fof4z6t4hh6a6rhzmkexclh4vfhddfyo6tkqtta
-knotwork.i2p,2yocdbcjiyfaqgxb4l6oenrrrrie6nydgmbnbfulqg7cik6bozxq
-kobato.i2p,l4kzozq64uv7azieh2ggmsb22biqdv2lodbxbb2tlbnozyxfyzya
kohaar.i2p,qchpjehbhqjbxdo7w3m55jbkrtsneb7oqoxcr24qttiq6j5g3z5q
-korea.i2p,eadov57a3jaj5x73ljhaxxltifv7xboujbwkrxdx552cqfjpygwq
-kovri.i2p,j3hdkil4juppzdz2z3hiybauoagcq4rz3lcqygge5tmg2ea7vs3q
krabs.i2p,3yamyk5bgfgovg6zpvtvpdjk37ivjj2wog2w7wha5agzgxxkqaca
-ksafe.i2p,wdu5eqgh2p3j4qbmnwvtaquk2wqqeogvnjxh6oaxvtd4f3bwgfmq
-kunik.i2p,yyx5p3f2l6njgwjabsg373g3euyiyltkzlwpp73ks6xomuehau7a
kuroneko.i2p,wbit2huhhwlyqp2j4undccuyrodh6qcmzdeyuaoy5o4ym7g5gdgq
-lainchan.i2p,7rov2od4lmtfswthoy7tziiuixupugkrexpdvyso5yj5pgicxvga
-larvalstage.i2p,h6de62jrrpn7s7omf3y5n666fyzwyzolkctsatrgshgp4juozeja
-lawiki.i2p,ddwc3z7tm6yuvh4mzmqne2ifn7qglbz73zyqxtkewlpzl7kpmqzq
-lawiki.mirror.i2p,4bgtexyhrbl5n2ah65tcpkup6kkur2qmflx45seozuq5btuigtrq
-lawiki2p.i2p,dkb5f63obsb6wmzcgilebjvmgvw4wmcgzbkczu3sntgckmtzweza
+kycklingar.i2p,gctswdhp4447yibxfbqg3uq2bvx63qjeqnaoaux75zw73leakyva
lazyguy.i2p,ia6xlsnygorllplx2owokahtrkospukvsmysz7i7bzw3vejc4hdq
legion.i2p,5oirascyhwfy2tr2horw6mixozsre7z6s7jfq7qbnj523q3bkebq
-legitimate.i2p,rjeymxhm76gabjcsdggyjaeskttt2kxnu5cba4j66hpkep6nleuq
lenta.i2p,nevfjzoo3eeef3lbj2nqsuwj5qh3veiztiw6gzeu2eokcowns3ra
-lg.i2p,3xqs2da7pnsqzmxqudsiq26vu6fcmd4ok7nsdytwyovz6omrggla
-lib.i2p,nqolhhg7wtr3wyjsxszjhjgh45uztj3xlrtydagwi4fi7ftnbqsq
libertor.i2p,7gajvk4dnnob6wlkoo2zcws7nor3gunvoi7ofalcps5lc76wruuq
library.i2p,brqqaq44vbeagesj5o3sxcnkc5yivkwouafyxa77ciu7l644ei2a
-library.openaccess.i2p,a4kb6pcm4er7r2j35z4vmfdu77qkl5m42nqj5x3moackbscmnjyq
-libretto.i2p,pa2osj63tq57g56dfn2ql2yhxbn6pwe2vra6qw4prw3drny5di5a
lifebox.i2p,pyqjnycm55cuxow22voqj62qysrjdnb6nbyladaiaiirqi7vp2yq
-lifeware.i2p,3rqm2yt4dre3ztabc7pksgle7rqryd3y7hq7tontaq5iytpfruoa
-linkz.i2p,x3layud2n2p5doors6c3xki6jzxbtqqrqrwra3f3oh4ubbu2b2kq
+linoleum.i2p,wvxi6vdf3jv75k2ib3cdzjuai7gxsxh36faf5y4tlk2jwiy2unua
linuxagent.i2p,ap5riaikrjq2uv5qvy7klzhhqywvqi7wqscyipsewcun7w2eynlq
lists.i2p2.i2p,vmfwbic2brek2ez223j6fc6bl5mmouzqvbsch45msvyyzih3iqua
lm.i2p,yeyar743vuwmm6fpgf3x6bzmj7fxb5uxhuoxx4ea76wqssdi4f3q
lodikon.i2p,u3f67staiwhqxpacya3clmvurdwd2kp7qcthzhstqnhrmlwc2g4a
-loinen.i2p,fhlhdpvi6mag7k3ojtmjcwbmkkvhdz5qidjepdcjfs6mkgia425q
lolicatgirls.i2p,a4lzmjyba7aq7hl6okqpds7znnwymolqnr7xhvno2wraqb7uhfla
-lolicore.i2p,houswh44wgppohpcr42jydnsqrngvwuwqs2z6jjoh3letwfg4tna
+lolifox.i2p,7fd2clkiotjnaoeigdtxlkkb24eik675ovezjf67x26ysham4zca
longhorn.i2p,pohcihzxzttjclrazhs3p76wt3ih737egb5bovqb6ym3du6z3o7a
-lostfaithinhumanity.i2p,xjv2xlfbipbyjptzgisescucanns7txvovq3ibntkc2cgzttftha
-lotnv.i2p,ziwehd4aooxlcdoixbb6xxlgd2s3snmalffca3pzwc6tmuf2sftq
-lotteryconnect.i2p,pic52h2sghmghyx4yhv3jmfwshslzumqbgc3dzlqjjxaekdbo7ua
-lowerorbit.i2p,s247h5gshsjab2yoviei7bftr37r7hrdqaljjgxnheivbs45pona
lp.i2p,jiklbujn3cbfikf4pca526jgmorx6mxhil3twqmfoteaplx6ddwq
+lua.i2p,kq33wpfdocw6sf5r3k36723tgjodb6csjnrthdsul7gsnmtay46a
lucky.i2p,wx36m3wnpt2y6bngdpg3ifrarvtkpwnluarx377bllpgvkuhybaa
luckypunk.i2p,y4t6cujjxnnrtln3rgmfbgbh46hic7wkef57krd7opitbgngohka
lunokhod.i2p,3yc6sp7xic4grmpfecbwuij6z3dp5kdgoo362pszaco7io42mnwa
-lurker.i2p,jb3ac7svh77v5e7p4wlrsex55anfio623ny3y7syzmdz4x3shcca
lyra.i2p,xfinw5aapff3ajbm3vnk4t5wor3lzcuwtq73rxz4yb7umlnmyl3q
-m3w2.i2p,pe2yxmkgemhg5gbum3guhagf7jj63injfdezus5sfmulnvddt5iq
mac7.i2p,3yjowssqzydciwa5zx55kazgf7q7w6g7rkocr7bngy35ii44t34q
-madfrog.i2p,madkultsfghzjsdbfi6qk2s5s5oqsuz5agg7jeiymhjdyywvgtuq
madman2003.i2p,a2sam2xbhxbzmeyobphbxrkdwlppoerewq5qvibbyk3ftsr643qq
+magix.i2p,cgfnyxv62msfynsfbv3kju22j2mt6tfnopshhmrcmpcrxyts6xwq
magnets.i2p,snz46nez6hrrpg6336neinflw56l3vwatk6bzzytwu77xmsfsoca
-makeworld.i2p,pcvzbhbqendkprcj3qfb35cgnmnqdl4bm573gixltdaxz7hifpia
+make.i2p,yr7r4o4ijrz5w4movfmfsn3yrlox2mjofrgiartn2qna7us7pd3q
manas.i2p,6qolj62ikkoq6wdn3hbvcbdmlvf2rcyv432kgi5uy7mvrczmjtba
-manofperdition.i2p,wy3gcnlkpgirkqnlv6gdo3jx6sh7wqxxudi4cklhmfvytojvxoya
manveru.i2p,pbmbofs76wpjnxi55eqtwg4y6ltyij72o4fm4sxfjol3y57ze5sq
-mapkin.i2p,tgvm3kgikmjxadymcwvnzt7wqxku7vse2nkoyuccho5accsmpsta
-maps.i2p,bve2bhqp3r4kfsdzmfrp7pue2osanqlwamo6mqqpzhn7vr7a4gaa
-mara.i2p,6ejek6q35k36gwvt37wli7abnlatjmxob2oe7rhl7rz6bexxknqq
marcos.i2p,vpo36bsil2voqaou53zshuegssqaroa5mbrzxfmhjywlbojckalq
marlin23732.i2p,wfpkmtqz5fzlkh4wpft2aei3itithbhthp5peyavx6zn3napipgq
marshmallow.i2p,svdqd6j3y3gwryufcl4fkzpmcujgvrvphvk2oy4r7m75xs327e2q
me.i2p,dbpegthe42sx2yendpesxgispuohjixm4bds7ts5gjxzni5nu6na
+mediabox.i2p,fpymagqfyjdcel3cddrj447fgic6ke3aztfkpwsg24gefoc62zvq
meeh.i2p,4oes3rlgrpbkmzv4lqcfili23h3cvpwslqcfjlk6vvguxyggspwa
-mei.i2p,ta6fwpneavr2lzwrguwx6y6v4l7ttjbih3eclkieblrogqvwl6lq
mesh.firerabbit.i2p,3x5wokr4bjy5z3ynji4fyhvwzv4fvgry3xafi5df5h75doezjytq
messageinabottle.i2p,avfhe3kvrrv7utxn2vre65lg7damxzzsewq3vukwie4llitd254a
metrics.i2p,z45ieamhex2ihqv7oowk5fz4qq47rbvxhhhbaaiinpajbhuevtpq
-metrohttp.i2p,lqp2pley42h2yxg7clrlnbacpq7kq5qnunln6wrtaab6u3vf7iea
microbleu.i2p,mtapervgibruizniems2yyr47pin2wpysyh7m632rigl26vjc6qa
microsoft.i2p,hvaqr5idszdyrjph34amb4mjosqd3ynggoxlnj7ciqhnx7q6plza
-mig.i2p,6npfff3ensyo3hcfqtkf3wcbbz3mp4vstrwcgor7g4apsdsvb73a
-milf.i2p,5qjobqgbnfe2lfl7jy2qjzoj4u3vazppadkzjeibcjpktho7akxq
-milis.i2p,73674l7jzhbkzzea2df6xhhqmkv5fzshex7ubkkp4clhlug5urua
-mincoop.i2p,wnhe3mehjos6iowxt32o276soshvyxra7gqj6hhyaeulzilq63ua
mindisl0st.i2p,u7rnqhvsuyxd3fabm4kyzn7brgz3i3cporj2emk2jmbpcmltyf7a
mindspore.i2p,uuh5dd3y2rqa7x2jpggm4p2pg6znarm5uanwsvybe4tk36ymwr4q
-minecraft.undefined.i2p,oynvlg4vyyvzttklbccgktj4xkbx5w4pah2bnjrqjtvy3jrghhba
-mirknig.i2p,daambhdto5cn7lhnb32l4laankzv55jpprlaghw2nxscvsyqifoa
-mirror.i2p,dfcysmvxvovmrhipxca3q4e3quz6akc3ls6q2zzputvo6sv4fcrq
-mirror1.lawiki2p.i2p,fzeuhovlrmtqim34337hqn65tsfiz6sxpo7ehfg7lnkqyaigx7ua
-misaka.i2p,4r6wonyrpjnuz6kpa2whyrbp7osfks6p44xrd4ucp2n7w4l5y4uq
-mochimochi.i2p,nijkdoagv343xps2pm5z2cjujz6pmrozrokrcyhhz3aeje3tfzqq
-modernmarx.i2p,tl3y4p7fbeycjymio4fj6zyr3n3gqa2cbk3jdvqgoylkbqhlhbgq
+miraiex.i2p,mbdyxyxj4tliyvcc54xknkyg7ficigoyvfnfesevr64nytr33tiq
modulus.i2p,ctz3o6hdefrzwt3hlg6rjhdcbjk6irppbndq32u6jnn4lz72f62a
+moeyoo.i2p,co6oemqjwvy563l7gar7ybb4nva3k6mnifakyk6bt4idfr2kjwka
monero-build.i2p,wc7qzr43g2o33wsluagjhhd4rvrcx7h5hhhtfwl6i42kk3iuouja
-monero-repo.i2p,rrhjp2h4665m2vydnqetyz7h4ic267woyneguczbz572nmtygzza
monerotools.i2p,5bal7dngxde2ddmhuzbtfken6w5nmxmixtjlrlmxt3wbhnemv73q
-moneroworld.i2p,dyuij25b2gxzq3hfvobwmrtcrdel2nuorntpuyngwr2lvv2kv2ma
-moonknight.i2p,gza3w4cf5pvdbvuah6fpop54qtg26m4n3v7ogn2u6thwvqfm4s3a
-morket.i2p,aofuard3ltrd4h7uq6qp23u3f35dxjbi6l4xfc6cfe7swljtzx2q
morph.i2p,iovyp2dao5rta6g5v6hke2s4ugx2btkpcljddak2yhxfrx3l4dqa
mosbot.i2p,5bhmrp43mjwlzf4x64xgdrkwmw4luvng6eq5waa663a7vnkp732a
mosfet.i2p,s5ynkgagndmpxpf2kmnenv4x72io664gzd2x3qef54ilammnte3q
-motorcycle.i2p,sfmytaey7ssmxsnvvgjw5q55ptnzqqnegfiq4topy6gxbkewcf7q
moxonom.i2p,gcjdrvnlobgexh7ebv276pwmnoj3yoyaqm3w4vmmdha4lgxfinqq
mp3.aum.i2p,n7bmu5dwux7f6gedmdik6zrm77bnls4lkzo2vo3bf4bwegk7vkjq
mp3.tc.i2p,w3ied5s7ldjcvnhxu2gyofe3oogzbplkyxshzfkhspiy2526snsa
mpaa.i2p,m6cqnglo7xlytwxkdsmwf3d23d6lq5r446c3tktb2tdmuah36zya
+mr-fox.i2p,kjxtkdcqqde2fvtrhrkpkpejth4vt2cudavqdjhnuglhlboups4a
mrbamboo.i2p,tmpmkx6wlbbrgsnexrqlrib7laoegpbfeop7bnyezegii7hecpxa
-mrbyte.i2p,6swunwgixw555gvpgehunlkyhovbbpjkz46v5wupiwq33ninjofq
mrflibble.i2p,u7k2qcmkrril6yvudvwxjqz7k3dzgp3jdejjjeapej7liselj3eq
mrplod.i2p,fjn5hxtybxyfyvdf6u5v5seg2sjd47hb5by6sa6ais4w3xnrxwyq
-mryuk.i2p,razf6cyxwygg5um3zud4zjvbc7pholxrma7jbzxinn4ewncv72da
mtn.i2p,xisk3h6sku3iqj52uriogaajmnku7pwjux7wa4omx2zloamuw6eq
mtn.i2p-projekt.i2p,f52x5fp6uhq53f5zle5d6rq5un34xgmxgazvilvmzcby37xcmsfa
mtn.i2p2.i2p,l6kuhtmgvbp57d7jwalj5nksi6nr4gfzbz4oit62lxgipb3llt5a
mtn.meeh.i2p,h7ylrsuzzynrxp3jql7anoozyqblavj7eqces6o3wngvuuxhs2la
mud.i2p,qcjtmicd3ow3q26iwcs62m5zu3dceu6emo3afezulh4c3fsgrkia
-mudgaard.i2p,yz32lk42gtoesknesfolq3tt4erxxcejcote5pontaeqev3bj2kq
-multiserver-console.i2p,fiuhzll4uw2xlkwtzw42o5ouhtj42y5ifpgajcxsgj372nopieua
-multiserver-torrents.i2p,hvtf7lw3kmtozlripp6kzhxzkbeorcg5pwmrfmeey2xohfzsnv4a
-murzilka.i2p,wu5ukmavxtb5334ncr6oi5a6fqutpurhmhzqtgl5ktkhycgq4s7q
mush.zeit.i2p,dk3sg23kljawxqp3cb6xz5mnzjlyckzvq5jhqs5gnvdsv7wqn6ha
music.i2p,akamh76yi6p7xxbvl3qv3yhaockne57yfuh77acogbgpjmwypvia
-musicfile.i2p,vyp42nsgzhb4wuf4rraeu2dd574cc5goskxcwh75uokqn4u3z7yq
mysterious.i2p,p66g2a4nzfkvidd3l7nwphcnfa3ttyu5kiolcb4czec2rn2kvwsq
mystery.i2p,ccea4jybmr3xbfiykaoagfw7ezbvzyhtg44x2jgwhv7wscsxaa7a
mywastedlife.i2p,ceumy3puvvsrru5bmfmtgsajsx5qyehqac7l7a23xpwtfs2bvcgq
nacl.i2p,bm2fib3tumer72lopjh4nmqomwvqu2sdfyb2hmr6lnk7jbw3vvia
-namesite.i2p,2uviv3enxrtwvrysyuzomh7yccvfnmryzzyqddzcyh7aqlrwo3oa
nano.i2p,ex5ssv7s3hj6jp7hvadxfw3wvbjbvnczxr4pbk7qw26ihiorjmba
-nastycomics.i2p,npws2lm55kcrdfk4fkaynxqzihduegwm5hlomhmhkaolie27vjrq
-nazgul.i2p,m6hx3udcpiabcx4mm6z3coqyyyjihkrypwrn7du6lum4wpnvvhsq
+nastycomics.i2p,rq4nabt5yzlkqfzqc7aqh6dex63pf4v6ip6tunb24jkqsh26ez4a
neodome.i2p,5hkhjehj3ct2pvcah7dcylwef2oti3xij5myxbv3pd7rocio5vkq
news.neodome.i2p,trhwcnygfkeqjj6g4xhmrdp4gsjqsye47lsxshbmwbten4ywt5oq
news.underscore.i2p,rl7t3kspoktuatjcu7gf7xleu7y6biibs4fspzo24kll6n7hbq4q
newsbyte.i2p,gsk3rgsejxxrfabjxu5w5plplxsu47aoeoke22vvhlwwllzosnxq
-newua.i2p,sl4dw7gpg3ravvmz4fsmj3mweaxyqpqdmb2aadqcxp3vozm4ticq
nibble.i2p,jmdxcpdzqafedn3clc4y7u6o56qocfiffrzbzncmtggqtio5qjpa
nic.i2p,vzu5ymab6klevpcdudv4ypisjqaznmt44e6lcg7dwiuza4saibxq
nickster.i2p,zkwsa6kvq2wdhovw5g5wqakpb7rlaylyhfriwmurots5pvwbqauq
nickster2.i2p,eofzi7npzpk4p5gb4qper4hmwgxo6kepo3dheeblakewedxj2bwq
nickyb.i2p,gmpxk4tje7mnud32kg2kjmf36f6cpwqakzc2dxuzjnnz4qr5w4sa
-niconiconi.i2p,p5h4klccaaldvphjw7fllgj3x5tfy7thqnqu5yr6py7dofemeqiq
nightblade.i2p,p4gkon7ytswxrbwkl7vruw6mg7kfw5aofovqjgt4c7tnqmbq6lha
-nightfort.i2p,6vth72b6i65jjbjvxvqxgsydpoy2i3hvn3rjcp73pvdm3l5xwevq
-niipp.i2p,uiob477tc7uktrfmj6tvkf6uq62xg2olwdys2vzzki2mbmwxtkfa
nine.i2p,gniusiswp2zhjwh6bxdlyzk2ocg2cx6xxjwcmih4mohjs5sokqsa
ninja.i2p,q6dg6hlb3egzdqz352ri5rc4fx4gcrdeu3tpiyfxlv73yfjgrhya
+nisankhacharjya.i2p,63env37dvsdtbcwh3kcskfkln7awly7hv42io6vsi6g4gmepqhma
+njust.i2p,gz7a3bgarghus4xaf4t7fgqvklrdwixxfzyexqrzp7g2b4cq6x3a
nm.i2p,3itdpqzyn3ii7sivppo4sxxwhvgtpskzkbokrdibim6gqpvlw5ya
nnm-club.i2p,xkk5fzxdmjra4xlijoa43h5cfcbusdjc6dbfplulvouxdbztokwq
-nnmclub.i2p,bntvsagecjxyrdpl7jshdrbh5m52gq7xt7sdtwxijofjwxrnae3a
-nntp-overchan.i2p,mqllejokgwjpp5kc2bl5x3alormjefpgvmosvf3kvzs2mhmddpta
+nnmc.i2p,7xizivpjkrpkb76x3yf2yktxscax3wf5vrpofwqgp3wcrnuru53a
nntp.baffled.i2p,kc6muo2tih5mttbpzecteegvtonuysjidk3emcy4cm4yifzild2a
nntp.duck.i2p,gvzzor4utsqxswvf6jaglfks7yxudlz2s326ftrk56i4lpd2s47q
nntp.fr.i2p,npoztnqadfnu4vrokoh6rusoi3yne47s6jurc3lzhcrzzia5eqva
nntp.i2p,wwdzmeyler4djegvyt2bxmkwrckfgg3epkkwowyb75s47he6df6q
no.i2p,lpsg4x4gdrf7antxcdy47cl6abcqei5ommgzt55retq7go5ku3ba
-noname56.i2p,oiyoslismzyxuw7ehxoigmtkdj35idim6flmlplddxuiiif6msfa
-nonick.i2p,rmzbmxr4nrsbs2qewmmcbld4qjhzkgnjh7c6qgusvwm2wn62zvqa
-noone.i2p,6w73w226acl4csyhancwk5jcxp5hk7dqosf5uo5d5bfvq57osboq
nop.i2p,ssag45lathm4gqp46si7c4w4tioyvjpcza5uvz5x2zuljnplylca
normal.i2p,j5fex634r2altzb3kjvu35qekt2r3hgsqzg5qxoy7dp53heu5pma
+nothingburger.i2p,tesfpn757ysc7nih7mxher2b3jstkc3l5fhfcyb5kxhzhvv52trq
+nothingspecial.i2p,wzrwqrp52bilqijrlboclynuev4kzpjzfzlvzl5aqxqt5fdnpbga
novospice.i2p,ukqap24nwac4gns77s4zy7j5cagt7l7syb5zo7eukfg3zn5gg5qq
-nozzlefish.i2p,qdxnthwyzynzl6kx2gbo2nkibyjhlpbieymz5gd7tfcu6voltd6a
-nuthxorzcl.i2p,d3ywc3epzry6kox4d74hmncd2jkovsscr4swwmu6wedb5k6hlaea
+noxan.i2p,yses7dxf262wxdwq4plpfv4eu5vb3pqijjkqw77ee3craudlefvq
+nsa.i2p,nsetvbclpomqxfcit4mghn6z7vdhnza6jdzczby4crnto32uykga
nvspc.i2p,anlncoi2fzbsadbujidqmtji7hshfw3nrkqvbgdleepbxx3d5xra
nxt-wallet.i2p,33pp74k4ivy67z332qpyl3qlcqmi6gxqumrow4bldkblxxlxqq5a
-obmen.i2p,vodkv54jaetjw7q2t2iethc4cbi4gjdrmw2ovfmr43mcybt7ekxa
obscuratus.i2p,i4j37hcmfssokfb6w3npup77v6v4awdxzxa65ranu34urjs4cota
-off.i2p,vvnuaoqhasmed44ml7oc3mew6y2ge6wrwpcn4w7ugz4y4apbg2na
-offair.i2p,7iyu7qscmm6gjmoqwuaadwto6bave2jk4gqzo7zgfnsw5ffwx6ya
ogg.aum.i2p,wchgsx6d6p3czloeqvna2db5jr7odw4v4kqrn4gr4qiipfyrbh5q
ogg.baffled.i2p,tfbvj2xal6lcuxv3hzuw7cw4g3whguombcv2zuotzvul4qtrimgq
ol.i2p,bnb46culzbssz6aipcjkuytanflz6dtndyhmlaxn3pfiv6zqrohq
-olanet.i2p,ymcs6sgtayeu72okqhxwstu6a47lkvzoyupifmfnduncrat34sbq
-omega-i2vpn.i2p,vjrjbpibj5hampiaailvhunltcslp7wxdz33a7isqvmegyabkkmq
onelon.i2p,irkvgdnlc6tidoqomre4qr7q4w4qcjfyvbovatgyolk6d4uvcyha
+onhax.i2p,m7i6oe4i3bygx6pn44vn22pgf5kzikw7edr2y5t4cpe5gnqpt3ta
+onhere.i2p,vwjowg5exhxxsmt4uhjeumuecf5tvticndq2qilfnhzrdumcnuva
oniichan.i2p,nnkikjorplul4dlytwfovkne66lwo7ln26xzuq33isvixw3wu3yq
onionforum.i2p,yadam2bp6hccgy7uvcigf5cabknovj5hrplcqxnufcu4ey33pu5q
ooo.i2p,iqp5wt326fyai5jajsa3vkkk5uk56ofn4anocgpe5iwlpisq6l7a
-op-faithless-electors.i2p,mrpdxxpafr6qrfgbsd7abhx4tnfi4373mpwv7iughasxgpdeglca
-op10.i2p,s6cjjt6zbikp4rj7ayprfp5b5zhom6nl35k6th65dtbzh552uwwq
opal.i2p,li5kue3hfaqhhvaoxiw2ollhhkw765myhwcijgock5rs4erdqdaa
-open-opera.i2p,r6enzfd6egyrlslcqaxbaw7bsvopsou54pa467bemooufceqp6ua
open4you.i2p,ice6ax5qrzwfwzsy64bctffj6zlzpuzdr5np65zsxlbt7hztyc6a
-openaccess.i2p,a5fjpssbkv7h6ygjugkfucyitx267y45cvgh2ygeo5cvurs3wdgq
-openarea.i2p,nmju26n2m7tyqbuis6ghykekrslqmpfwd6fspd4lvm2riqmtojnq
opendiftracker.i2p,bikpeyxci4zuyy36eau5ycw665dplun4yxamn7vmsastejdqtfoq
openforums.i2p,lho7cvuuzddql24utu7x6mzfsdmxqq7virxp5bcqsxzry2vmwj5q
-openspace.i2p,uy65dhftzexjgdncmpa64i4ndt3ztua3oq3fm6fxeenjqaqq4upq
opentracker.dg2.i2p,w7tpbzncbcocrqtwwm3nezhnnsw4ozadvi2hmvzdhrqzfxfum7wa
-opsec.i2p,rlsjbyy5beucaiedaggyo2tpbq75ituqwnfx4a4qghyifpdk3rra
orc.i2p,orcnge47kqnpdj4wb22bg6aqcv5v6yu7kmjf5ll3htvseiqayntq
-organizedresistance.i2p,kpspvipmqbfe3dft2sgl27km5ncalvugpphewnyde3yyup6q5pca
-orgasmic.i2p,yf5hcksrso2dj7etxonum63ijmk2gamp6m3ql3xpxh4q4f35afsq
-orignal.i2p,vrff7piadf5coa7za5r5zzu6pa5pfs55mza4yjz6g3veranbew6a
orion.i2p,5vntdqqckjex274sma3uqckwqep2czxs5zew25zlntwoofxk3sga
orz.i2p,oxomqkekybmyk6befjlouesit5mhstonzvzd2xnvsk7i6uyrqsfq
-ot.knotwork.i2p,cxhvvfkbp2qbv5qojph7zb46molpe2ffanghnerjag3xdmy6ltxq
+outproxy-tor.an0n.i2p,hpa7ojiz6wdjowwpaegzuczmufnaydggk5qw7vj6utakggkcd2kq
outproxy-tor.meeh.i2p,77igjr2pbg73ox5ngqy5ohzvrnur3ezqcogtl4vpuqtrcl3irsqq
outproxy.h2ik.i2p,nwgvfpfarpnyjjl4pwsxr2zdsppcx5we3kos2vlwicbiukopgaza
-outproxyhighanonymous.i2p,tujgzpy4yq3yoenbgybivrvsrzh4cmj67j2j43kik55dnpqlbhcq
outproxyng.h2ik.i2p,v32zse2zczzgegelwxbx7n5i2lm2xhh2avltg76h6fz5tb53sfxq
overchan.oniichan.i2p,g7c54d4b7yva4ktpbaabqeu2yx6axalh4gevb44afpbwm23xuuya
-p2pm.i2p,s7555tvon34lg5qjsp7w6vflqnsq65ms4wzdslow4crm3r4ochea
p4bl0.i2p,lkgdfm4w6e2kkjhcdzr4ahhz26s3aunhrn6t2or436o73qh4z7ga
-p4p.i2p,cdnb77zmuqudreubv5trohs5mx5qkg6rmue3wvkfcqmccpeciloq
+pacman.i2p,hlkzt7mbciez64gf325u5ko3353hfxseblbj7bu4loti3lk2zfha
pants.i2p,xez3clscjfafkqwk6f473ccp3yvac4kh6rdp6dptwxa2lhixizgq
papel.i2p,mxskjqntn2d34q4ovsnd5mud7cgde734tdjldd3lt4hczh2645zq
-parazite2.i2p,s2kgme5ye22woyzlrxbpoo63uzxnnlohmy3g4t6mdcnugvbiiieq
-passive.i2p,bncpjc4pylcdqezu5j77hgsqldpjzhfzt2lvwtupyksdy652ekea
passwd.i2p,ojugl3kbejhzcmyq7x52ms5lraxsig4ofkhvbgzleraer4zczroa
pasta-nojs.i2p,dkkl3ab6iovxfqnp44wsjgqaabznvu7u3hugpzyagbeqlxgvx3la
+paste.crypthost.i2p,2zaj4u4s4l3lgas2h5p6c6pvzr2dckylkrh5ngabursj4oh25ozq
paste.i2p2.i2p,b2gizskfea4sjxlw6ru2tb6kdrj47dsjc77cijsf5mzh4ogbmfvq
paste.r4sas.i2p,csen43keji3qiw6uobsgzysxyjd225g6446ylq5uuz6ur2glkzaa
pastebin.i2p,mnicncxrg2qqi55qftigiitaheugnj4rpysbk7zabdrirgktelqa
pastethis.i2p,erkqiwnjl7vtysqd3wvddv6tfvnhswarqkbn4blhdlhfxn7cf2ha
pdforge.i2p,wzeg3ehf6d2mqjqji3sd3rns776thvhe2vam2r6gjlmsqis2dctq
-pelicans.i2p,m2ob4u6fm7kayiy7dbkdtwnf4ssyalmvsh2ik2jjuc72h6fvgpha
-pepepaco.i2p,kkbfftddfu3qjk54k2kw3f5v4jfmqqr5jvrrj4mq3zut2jitb3xq
-permalink.i2p,vq5jx5cnmwu2bbvcwkv435i6hxb5qrhidaqmrpcurbqckm7mwxoa
perv.i2p,f3k3wm4ae7t7ottfjd4hu6is7zsls73izl2gm2qynzficxcdsiwq
pgp.duck.i2p,wujajyxj3cgsfsbtr3g7g7npv5ft3de6pcstxlav26zq6cxdjmha
phonebooth.i2p,noxia7rv6uvamoy2fkcgyj4ssjpdt4io6lzgx6jl6wujpufxedrq
photo.i2p,fqhuy77ugd5htnubzkyy5guvwboqn6goahtmn2g7feewvdj7k3iq
-phpsadness.i2p,7kjaywpkfmfg2xshgnebdv2g3pz345s4ih2livqk27dp6tc37daa
-pictureframeofthings.i2p,x76obr2xmp4s2feg25xoxs3fs2odthqeyyluqu4rq5mflj6jqo2a
piespy.i2p,vzusfjzcu5ntnvobcvyzc4dcu4j6ommtnpmba2puk3kexgdzrl7a
-pinkcloud.i2p,ah2vd6gmhkaivoshix56pxe3myk4yu5llug76wpzmjovojdn6tia
-pinkpaste.i2p,o5zdq6iuire5eatwehhhylj7vbsdfedhm7wkd2hoejh7wxwfbqnq
-pis.i2p,xwgyr3pqaxx6aromrhm266ptcigcegggosk4h4khms2g23cddbtq
pisekot.i2p,7yzdwhy723fodqz4onp6k3nyvixra2sa6dl45tcblhmyoa7i36nq
pizdabol.i2p,5vik2232yfwyltuwzq7ht2yocla46q76ioacin2bfofgy63hz6wa
-plain.i2p,y7f3c5s2n44j5pnsxncqpasluv6k7i5jtnhjfs5mfulcgcas6sqq
planet.i2p,y45f23mb2apgywmftrjmfg35oynzfwjed7rxs2mh76pbdeh4fatq
-plazsekta.i2p,ha25hr5qvs5eclqt4bq4fl4w7dc3p3d7cfbstkglcv4tf645lfxa
plugins.i2p,wwgtflbaa7od2fxbw4u7q7uugmdclxf56alddvizugwcz5edjgia
-plutonia.i2p,iisguuyvimvuwbrtehk2ufxxabimaz4ckx3jasbrnrb62ivuy63a
-pmail.i2p,4vuq2eku25cehr6yk5ly7ed2j2atliwhpzwnibxk7lpguunzk4ya
-podcast.i2p,yxxlvtvuiopr4u2rnk5hydkol6tf2kzv7izp34jz7q4orewzqsoa
-poladoircserverhttp.i2p,ir5qee4pzze3x7ztf5xs6dvhfkoawzkcmq4v6wicrvev747lcspa
polecat.i2p,het5jrdn35nhkanxmom5mjyggyvmn2wdj2agyqlrv4mhzhtmavwq
politguy.i2p,6dkkh3wnlwlr6k7wnlp4dbtf7pebjrph5afra2vqgfjnbihdglkq
pomoyka.i2p,omt56v4jxa4hurbwk44vqbbcwn3eavuynyc24c25cy7grucjh24q
pool.gostcoin.i2p,m4f4k3eeaj7otbc254ccj7d5hivguqgnohwelkibr4ddk43qhywa
-pools.plazsekta.i2p,ima2b6s3yjyvkab5qycexgsnkkvrhg57awjln4ctz6a5au4thqcq
pop.mail.i2p,bup6pmac7adgzkb5r6eknk2juczkxigolkwqkbmenawkes5s5qfq
pop.postman.i2p,ipkiowj7x4yjj7jc35yay3c6gauynkkl64gzzyxra3wmyhtfxlya
-ppif.i2p,gl4xn7yfnboymeiv6dwpc6y6gafaz3k56ee3cryf4zl6buvrhcua
+popeye.i2p,pbvpqyrtxe65flkry32fhms4ztq5y5yh4i6mecze53ykqk36wzua
pravtor.i2p,2sr27o5x2v2pyqro7wl5nl6krrsbizwrzsky5y7pkohwh24gn6xq
-preppers.i2p,nv3zav3qgmpc5bpdp6zdtlkgcxtb4h6w2ftg2ocg27btnoy2tuiq
+prepperse.i2p,tjyy6zebjp5ckkkriqcwv5vlrgyhs3wohzngzqmh6brrqo7ewiuq
pris.i2p,ahiwycgzuutdxvfqu3wseqffdnhy675nes57s4it2uysy5pxmz6a
-privacyhawk.i2p,qnfdfjfrcycygz5p7drylkv6pde7b5ehxemefjt63blqtal4cpaa
-privacysolutions.i2p,4m626tvfr4skzunz7tri6oti3alinbxnoglnvqeqmf4mwvdzyaeq
-privacytools.i2p,wfewiqkdt5bvowfp3igmkaksjvcvwj7bag2smqpqyu5x4hges2qa
-privatebin.i2p,anyvefii6vwgyrftdgzcqgeonjzeeje37ypt5ipf4tym5edyvdha
-progrider.i2p,t6aaazt7qrlw5z2ehlyddwxooc2jutmd5frxy2nq3v43dkuunnnq
+priv.i2p,h4asmxnsw2xz2ve43qt22mhoua7icerhx66ujog5msk6cretnaoq
project-future.i2p,ivqynpfwxzl746gxf376lxqvgktql2lqshzwnwjk2twut6xq7xta
+projectencrypt.i2p,lduaunhyg2ohkqth7srhwitnosnaq2dajfafgkhtvz7esluh7mha
+projectencrypt2.i2p,fiiwjpya6gewxnzw3n2s4uc3smfe5cty4ujyaf5p65kwjmkoggwa
projectmayhem2012-086.i2p,ehkjj4ptsagxlo27wpv4a5dk4zxqf4kg4p6fh35xrlz4y6mhe4eq
protokol.i2p,f4xre35ehc5l6ianjvt3zcktxkjlyp2iwdje65qnu2j6vurhy6nq
-pseudopolis.i2p,ungmgjs2w6dmugyc73k2tppwebp5xxeiw37xbbxmmxuyxz7nuwsa
psi.i2p,avviiexdngd32ccoy4kuckvc3mkf53ycvzbz6vz75vzhv4tbpk5a
-psp.i2p,2nfqfabeahfl3eeqxuum2sapzfedu4kkyydivlqjmp5ipvvqvmzq
+psy.i2p,s3elzoj3wo6v6wqu5ehd56vevpz2vrhhjc5m6mxoazicrl43y62q
pt.hiddenanswers.i2p,o5jlxbbnx3byzgmihqye3kysop5jgl3unsrkmurbtr2nrnl2y74a
ptm.i2p,7dna5745ynxgogpjermnq26hwrqyjdlsibpjfmjxlwig247bjisa
ptt.i2p,q7r32j7lc3xgrcw2ym33wv4lfgqbez7vtm4lts7n34qfe3iygeha
publicwww.i2p,oitoja234mwfbeuhtuibnxn6hd5v4nbtf7oxfgdhk5igrg6wkiqq
pull.git.repo.i2p,3so7htzxzz6h46qvjm3fbd735zl3lrblerlj2xxybhobublcv67q
push.git.repo.i2p,jef4g5vxnqybm4zpouum3lzbl6ti6456q57nbyj5kfyldkempm3a
-py-i2phosts.i2p,3tex4wm37lbtnbjolege3yiopmfi3ahj65vu6kmnjhwzgrcyf5ga
pycache.awup.i2p,w45lkxdnqhil4sgzanmxce62sv3q4szeowcjb2e72a5y5vbhm4ra
-r.i2p,pqajparec44p74uvpxvxhpd5u3neuqs2t4awwd6bcieku3juhwwa
-r0b3rd.i2p,bxnj37oz3lsuraivx7axas5e436aqxgir3u4mxfbsb6njvtl63ma
r4sas.i2p,2gafixvoztrndawkmhfxamci5lgd3urwnilxqmlo6ittu552cndq
radio.r4sas.i2p,cv72xsje5ihg6e24atitmhyk2cbml6eggi6b6fjfh2vgw62gdpla
ragnarok.i2p,jpzw6kbuzz3ll2mfi3emcaan4gidyt7ysdhu62r5k5xawrva7kca
-ratcat.i2p,lmur6cgjp2txuaor4zso2w6tvg54btb7iup552yp6qvnrlvw3rzq
-rblcom.i2p,dysjyfzd3pd7i6lp54mt6hv33xpdvcblvr7nnzy7bfc3lyo4vaiq
+ramsay.i2p,svezv4xrp4l57ankyhu6qisd5jnk423n7oa5as3zd2554aaz6lkq
+rasputin-sucks.i2p,fdozdbyak4rul4jwpqfisbkcx4xbrkuvf2o5r6fd3xryyrjgvjiq
rebel.i2p,nch2arl45crkyk6bklyk2hrdwjf5nztyxdtoshy6llhwqgxho5jq
-redpanda.i2p,3wcnp6afz4cikqzdu2ktb5wfz7hb3ejdbpn7ocpy7fmeqyzbaiea
+red.i2p,fzbdltgsg7jrpz7gmjfvhpcdnw5yrglwspnxqp4zoym3bglntzfa
redzara.i2p,ty7bt62rw5ryvk44dd3v5sua6c7wnbpxxqb6v4dohajmwmezi7va
reefer.i2p,4cde25mrrnt5n4nvp5tl62gej33nekfvq2viubmx4xdakhm5pfaa
-reg.r4sas.i2p,shx5vqsw7usdaunyzr2qmes2fq37oumybpudrd4jjj4e4vk4uusa
reg.rus.i2p,k2r2wda4eavt4hoq5hptprqfmixusirq3gi5bl3z2pqzcd6felwa
relatelist.i2p,utrer5zgnou72hs4eztmk37pmzdtfw3d6s23wwl7nk3lkqpzbdiq
-rep.i2pdproject.i2p,rexmpwqbkjzietrp6aabxdih6ek2imqhrn6hu3crym3mqce2v5zq
repo.i2p,uxe3lqueuuyklel23sf5h25zwgqgjwsofrqchhnptd5y6pedzbxa
repo.r4sas.i2p,ymzx5zgt6qzdg6nhxnecdgbqjd34ery6mpqolnbyo5kcwxadnodq
reseed.i2p,j7xszhsjy7orrnbdys7yykrssv5imkn4eid7n5ikcnxuhpaaw6cq
+retrobbs-nntp.i2p,fkyzl24oxcxvjzkx74t3533x7qjketzmvzk6bwn3d6hj5t7hlw6q
retrobbs.i2p,mnn77stihntxdoade3ca2vcf456w6vhhvdsfepdvq5qggikvprxq
retrobbs2.i2p,ejff7jtyaus37slkwgeqrrcmyhpj26carp7n27f5h6s5vlbeiy6q
revo-ua.i2p,hpojpumki22xjwhmhe6zkiy44oanyn7u4ctcfe3in2ibwm5l32hq
@@ -838,143 +552,108 @@ romster.i2p,eaf2stdqdbepylt53egvixdi34g2usvgi7a4oixsja6atkran43a
rootd.i2p,mzbe5wofwn7eaqq4yefrmxizqaxoslwqxrv5qcv2opx5lnhg64dq
rospravosudie.i2p,z55khrnlj6bzhs5zielutm6ae6t2bbhfuiujwlrp3teubqyc4w7q
rotten.i2p,j4bm3rvezlejnb44elniagi5v2gazh7jaqrzhbod2pbxmgeb2frq
+rpi.i2p,56p5qxsrvo5ereibevetw2qbj5bronmos7wxunku27g2s4kpbnlq
+rs-freenet.i2p,jhpvnnhfrozore2wlhi5m5bzggz5jcz5uwhou4w62ylkewtoxqba
+rs-tor.i2p,zv2etzurnqjuuajmeb5gg3sjhfdcotxvlae6igxbfyahkjhhsx4a
+rslight.i2p,bitag46q3465nylvzuikfwjcj7ewi4gjkjtvuxhn73f6vsxffyiq
rsync.thetower.i2p,w4brpcdod7wnfqhwqrxyt4sbf2acouqfk5wyosfpq4mxq4s35kqa
ru.hiddenanswers.i2p,o6rmndvggfwnuvxwyq54y667fmmurgveerlzufyrhub6w3vkagva
ru.i2p,m7fqktjgtmsb3x7bvfrdx4tf7htnhytnz5qi2ujjcnph33u3hnja
-ruanonirc.i2p,epownolfv227hhzogufiieiofi53za3qctgim7xobsevvntuxiqq
rufurus.i2p,7msryymfdta3ssyz34qur6gi4jyfkvca5iyfmnceviipwu7g2wca
rus.i2p,gh6655arkncnbrzq5tmq4xpn36734d4tdza6flbw5xppye2dt6ga
ruslibgen.i2p,kk566cv37hivbjafiij5ryoui2ebxnm7b25gb3troniixopaj6nq
+rust.i2p,xbl2dh2qugfgoobebkvkjje3ovp5owhqdlu3l4briiqnhyuihjwa
rutor.i2p,tro5tvvtd2qg34naxhvqp4236it36jjaipbda5vnjmggp55navdq
rutracker.i2p,ujyqbawolalwvdpy33v2wjuaspnu4ym3fsl3fd6mldjblzzqlvlq
s.i2p,bnpc454fvuzqk22ywguqb4m4vkhrcfj3pydrbfw4esqklymd7t3a
-s01.0chan.i2p,v2ymvk4suxl2zghx6bhjn3yz32echagnxqwrkklul4iynmoqydrq
-s02.0chan.i2p,znn2mmwnypu4hrwo75nzoibe5dzj6napwcmzzic5yqty7wnqfyya
-s03.0chan.i2p,af2penimq2z3xprlnhpzkssc45bplfg73osqjcfezobgnwqcqfcq
-s04.0chan.i2p,kpxqwmwciyz4q7dfsawmgdotwrv525cmc3n5cet3je4ngtact37q
-s4src.i2p,of647qmuhpfo42hlisedifu5jydihyd22hshtynsjf63p736nrwa
-safegram.i2p,a22lv2ls2qg3ilx7znjy5ojwpiobttvvmbtkh7xn7iqh35a3kadq
salt.i2p,6aflphlze6btsbez5cm4x53ydrmwhqrkxsud535d3qjh4wq62rxq
-sam.i2p,w2nzdyx7ppkjg7alcehqymsxbg2rlwgqvhdcw6rpuwcfhhpntfqq
sasquotch.i2p,p6535uyfk2y6etc3t47vd3oqxydznqior5jxcvq5bdxe5kw5th6q
-schematics.i2p,tv7tcsa2gdzw4zj2yepmvsv22usouaqdgilerd54gbbooyucn6kq
schwarzwald.i2p,4gokilzy73mmudufy3pohgatm42fcstx7uzg5hjvnfyphxpnphuq
sciencebooks.i2p,ypftjpgck75swz3bnsu4nw7rmrlr2vqsn4mwivwt3zcc3rxln5cq
scp.duck.i2p,ghbpsolpnveizxu4wbs7jbs2vj3kntnsexfcdleyhpqdhfpxleda
-scussuni.i2p,f6mb7qcd72i3e4hec57nvysifeza5lmklhokpkrf554avv7johvq
search.i2p,nz4qj6xaw5fda3rsmsax6yjthqy4c7uak2j3dzcehtkgyso4q46q
searx.i2p,lcjxhuo5lbrol3e5ijj3ga4gdhhelzdyslc7bm4blw6jy6cx4p5a
-secondrealm.i2p,ykkgrp4u6kmcqiyefiahcbcc5bxkutwketp4n4dmgkgawwitcolq
+secretchat.i2p,cl3j2zxhpw6u6jevny45i557ojhwfxn4g375nnuqhy6lp27mry2q
secure.thetinhat.i2p,4q3qyzgz3ub5npbmt3vqqege5lg4zy62rhbgage4lpvnujwfpala
-securedebian.i2p,qewoxexwtvub5xdwpzqaj6mofflymidpojzppmqcyiqoi5mwblla
seeker.i2p,ipll7sit24oyhnwawpvokz5u7dabq6klveuqpx3sbi6o5qemy2bq
-senorcontento.i2p,g7f7vufsaam3yoehrb5s5lyq5g57zk5nxayqqczhxjxi7jfxlqna
-sentralintellijenzeigency.i2p,kqq6r6z7twhz5nmqpy3hdqo5iifzaz2urker3zscs7m5mt77llta
+sendyourdreamswherenobodyhides.i2p,jvdg3yqjqthtcfjitzqdp2cc3zjloit46xafprevl3bhpeqxf5pq
seomon.i2p,5mvpsy4h45w4fx7upen7ay3vkrs5klphz5nptmtcqvc3fsajsm4q
septu.i2p,5lqvih7yzbqacfi63hwnmih57dxopu5g2o5o4e2aorq7bt4ooyra
serien.i2p,3z5k3anbbk32thinvwcy4g5al7dmb75fagcm3zgh4rzrt3maphda
ses.i2p,5qfoz6qfgbo7z5sdi26naxstpi2xiltamkcdbhmj6y6q2bo4inja
-sfor.i2p,75kjzjxnxiwcqlygfv33ev7b5dlriaagtau2enrikxcde5yit23a
-sglg.i2p,5sybuxmdtmzseu5svpitrm3pvxcfjdz7lzwyajih7sd65yjbt7qq
-shades.i2p,ydgygpmvypw2liyqvldnv7v36etddvpr6ndwiheoc6n6ybhqt4fa
-shadowlife.i2p,jme44x4m5k3ikzwk3sopi6huyp5qsqzr27plno2ds65cl4nv2b4a
shiftfox.i2p,wpvnuzslu7hjy4gujvnphtyckchdoxccrlhbyomsmjizykczyseq
shoieq3.i2p,3fjk4nfk3mccch4hdreghnyijcvovsi3yucjz3qzj5sxngqk5j6q
shoronil.i2p,7shqzgmb6tabiwrnwlasruq7pswy2d3emvfhaitehkqgod7i62sa
-sigterm.i2p,5tuw3uj6x4p5xousgqg53ygbsi5ixozxnnkgzzwdqlhtoe2fbzqa
silc2p.i2p,wt4mvbvnpqniywcpkrrjubvcwyskskujxjkhk24xmhrojdeisoja
-silentbob.i2p,yskw76bdsncszta3cp7cs4kcj3fub5h5i6zshvukoxnwjxoqln3q
+silence.i2p,v4oc37covf4tze2wjhtgn3xkpgg4cx6oam44xvnpw2snhtvpslyq
sion.i2p,lcbmmw2tvplvqh2dq5lmpxl3vnd5o4j3bdul5moa23deakjrso5q
sirup.i2p,aohdp4yajnkitrtw7v2mo3sp7swuqhjfwlsi5xwd7dudzftumsma
site.games.i2p,zeuczucfxeev3k7tvqlfcdpfbnqggheiknyyb5r2q4utn3d2auja
skank.i2p,qiii4iqrj3fwv4ucaji2oykcvsob75jviycv3ghw7dhzxg2kq53q
-sky-rc.i2p,hzd4piu7ds7rggelc3qiuy5hhe2guzdw7orjcwykehx33kyyjjja
-skypippo.i2p,puuscuxwvt7b4fsfth56mcxx2ghqudqaakycy2l6yetp2iccclbq
slack.i2p,gfcsh2yrb2tx7hyvmobriv52skz7qoobn7n7y7n6xaehhh4rpbja
slacker.i2p,wq7m2wdguzweleb666ygv3bmfhha63zj74rub76vfesbyhsyk6iq
-sleepwalker.i2p,d6x3d3yyck5etn4qao6kcucbqnlshyrrgfinhleruhmoho7rkztq
-slump.i2p,pzo24fb6lfum67ovmyjd32ohthy7h35tk2puneqeilndtyr44mfa
smeghead.i2p,ojf4czveeuekxqkjvkszvv7eiop5dg7x2p6rgfzl4ng4xrjk6lja
-smlr-torrent.i2p,clwvfegt2avmf3uyxkojtbdalbsf3gahpf6rjxjn5l7l7aciyuhq
-smlr-tracker.i2p,nhha4d47uddnb7lvsjxk4dxd7jcqenuixh3c3rk4t7gwfqyxxlsq
smtp.mail.i2p,kdn7zx7fgoe4bn5abaaj5cb3e4ql22fklb5veui5yajpj4cxapya
smtp.postman.i2p,jj7pt6chsziz6oxxnzpqj7mzhxm2xfhcrbh7dl3tegifb577vx5q
-snowflake.i2p,tjo44eqilj6ygjl7etqzvx7gopkrw4jvcea55qlrkotpq7pzmvsa
-society.i2p,d6atkbmzbvh3tqflgieqe6pa2sma5x24q2nsz6mzdl3x5qhzreea
+snscib.i2p,x2jvcrskymvnfxnrtpji5orivskmltl3ochad4cedxe4ceklc4va
socks1.tor.i2p,sifawcdexgdmoc3krv46pvvz74nzd6fkju2vzykjxsx3egqsb6wq
-somosanon.i2p,gaekqon34xidtzqyzsgirq3lkv3avclo22v6464w6hjuf4bwzkua
sonax.i2p,jmuxdhlok5ggojehesfjlit2e2q3fhzwwfxjndts7vzdshucbjjq
sponge.i2p,o5hu7phy7udffuhts6w5wn5mw3sepwe3hyvw6kthti33wa2xn5tq
squid.i2p,r4ll5zkbokgxlttqc2lrojvvey5yar4xr5prnndvnmggnqzjaeoq
squid2.i2p,hum4wlwizbsckbudcklflei66qxhpxsdkyo4l2rn256smmjleila
-sr-ocho.i2p,7my7fc6glh2mwxtdup33gni3gzwycu7avsg2paschpcj54c7n2ka
+sqz.i2p,3jvbwc7sy4lnhj25nj7yepx7omli4ulqirnawv3mz6qlhgokjgzq
ssh.i2p,xpvdadaouc4qr75pteymyozc7mcsynjfkuqqkkla542lpcsqionq
-startdash.i2p,q7ed6xshnz5y3ch634rqitshg6cmsknqwl6nbkrpwmcaq2db3wba
stasher.i2p,6ilgpudnba4kroleunc2weh5txgoxys5yucij5gla6pjyki4oewa
-static.stealth.i2p,vwzhvxtomztdzg6wkzsz7iv2snnjzcfcka2ujv3kd7qq6bkw4dnq
stats.i2p,7tbay5p4kzeekxvyvbf6v7eauazemsnnl2aoyqhg5jzpr5eke7tq
status.str4d.i2p,ycyyjo3psqbo45nuz243xvgvwnmzlanzqbzxv3kh6gyjztv7425q
-stealth.i2p,wa43xn4jws2oy34i4wazuolaiknghow7zdhvnlnw2q3qtq5tnf5a
-sto-man.i2p,rg4eilfpe24ws6nctix63qw2dlvd2tqgwdcgdxzji6l5bc4dc7aa
-stoliczek.i2p,2gj54r434fvpbzf3opbqnshrdew63qa3sswmbwvgfpqqul65do6q
str4d.i2p,wrrwzdgsppwl2g2bdohhajz3dh45ui6u3y7yuop5ivvfzxtwnipa
stream.i2p,prmbv3xm63ksoetnhbzqg4nzu2lhqdnqytgsydb7u3quxfrg7rna
striker.i2p,4gswsrfpbd44hwjoj33jbqfbwzxfkwpuplb3ydq5zm7nfu2pxvdq
+studentbookshop.i2p,d2ejfxjt3n2nsj6hlkepwjgxua5jg766znrxz65d5eixsmiwvr3q
subrosa.i2p,g3lnglrnoual7wyabnwwv37uwhadgbxiqz36pf3f5cwfuxsx4mxq
subterra.i2p,vdmhe4u26unzgd7ysq6w36ubjncms5wzbhzr2gq576sq4xut5zwq
sugadude.i2p,yzjn76iyqard64wgggfrnywkxi7tbfkw7mjhpviqz3p2dguey4yq
+suicidal.i2p,yfamynllow5xiqbbca7eh5xn733wtnuti5bi4ovc7dwycntqmiuq
+sun.i2p,33mt3psjrtauk6wzt35ke7w4bkyizesnsjlal45fbosja2j5i74q
sungo.i2p,h67s3jw56rwfyoxqxj3fngrluybsgxc2meendngkehzqowxnpj3q
-sunspotblog.i2p,mwtki4x66lgadduuvmtbrgwm3vteldo7tv647ls7aopljxwpi4va
surrender.adab.i2p,jgz7xglgfgnjfklrytyn427np2ubipztlm5bxrtbiucayglukrta
susi.i2p,qc6g2qfi2ccw7vjwpst6rwuofgzbeoewsb2usv7rubutf4gzqveq
-svs.i2p,zys6mammgvbu7h7n3gxp4dxnxs5u3u3giadgrq7vthjq5lwnkntq
syncline.i2p,5kcqmhislu3lmr7llgmdl72yu3efhyriljdc6wp774ftpwlcs5ra
syndie-project.i2p,xa63tpfoaqt3zru2ehxjjfbpadwj4ha6qsdvtcqtyr3b7hmt4iaq
syndie.echelon.i2p,vwrl2qmcif722fdkn3ldxcgz76df5cq4qypbndzthxwgmykyewta
syndie.i2p,7lm3yzpuejhpl4tt4l7o4ndqlu7hgijohofh7oaydx7q7kelenbq
-syndie.meeh.i2p,tautkpuqt3qa2u66ghprubljks4hkfvopvrjjtec5etanz5xvlba
syndiemedia.i2p,4lrbbblclodhobn3jadt5bf2yab2pxzoz4ey4a2cvrl44tdv3jma
+t3chkommie.i2p,o5avgwuwjdyefw4xddn77jxaljs5gg3adg3gnpu26s2hijnrfvca
tabak.i2p,y5o2vwb6kart7ivpnbpk4yte3i7kf2dsx7fy3i6w7htqtxhmbzia
-tahoe.fatsvin.i2p,jf2g5hus6gp2jfgk7zgc2cxtzeedxbstr3ju374amtoaq6p2ax6a
tahoeserve.i2p,yhs7tsjeznxdenmdho5gjmk755wtredfzipb5t272oi5otipfkoa
-takepage.i2p,aavaxdlgfm5cn3ztircmotdmzb4xd5fwyzmyhhpcukut7idox27a
-tandasbackend.i2p,trodg6o522t4ywcijvdoxpaeksnunvya33xbbsesd4ophhvl7lwq
+tbofh.i2p,lmj2gu6d27pgrknbxxsyapjxnlprau4ayamcam6csljzlupr2rtq
tc.i2p,qkv2yk6rof3rh7n3eelg5niujae6cmdzcpqbv3wsttedxtqqqj7a
-techno.i2p,dx444pxqxytqdltutvjdydrasvta3if4djptrojidgenxybcauaa
-tecsoc.i2p,kng3ri7scfoqdogy6pkschn5son2ls7z4kpwgnosi7zknit7lr2q
-telegraph.i2p,iai263cdubvmfedc3uxedt4tzula62nnbjaxeeyqhaahgemmm4wq
+telegram.i2p,i6jow7hymogz2s42xq62gqgej2zdm4xtnmpc6vjcwktdxpdoupja
templar.i2p,zxeralsujowfpyi2ynyjooxy222pzz4apc2qcwrfx5ikhf64et7q
-tenic.i2p,lkvzspewzfbk2mfo2mionmlxzdzuhypzkddwk7exxcub3re7njsa
-terextools.i2p,3yglb32qhjlrettzgdlxi6o4hpe7jwxpxkfmkmf6bg3cwcbmgk3a
+templeofmetal.i2p,cwtbmqx3cg7ae3jcrzgjzwcilpypnyz2biojrn4ca7ry5gukaixa
terror.i2p,wsijm6aqz4qtuyn2jedpx6imar5uq4yuhjdgtfqumxbqww47vbnq
-test.tino.i2p,fijhlcnzjnkxmmclua32nlgohd3kfxbwboltkjcdlhmcoaxcir6a
-theblackbay.i2p,kmo6ainnf2k5begl66qqq7mh3nteb3kki735mc5memnurw5pmrpa
thebland.i2p,oiviukgwapzxsrwxsoucpqa47s3wt6nfuhfjxvgbqsyrze2mwrda
thebreton.i2p,woutbsflcrlgppx4y7ag2kawlqijyenvlwrhbbvbkoaksuhf2hkq
+theclonedome.i2p,jyezrlobwwbhar2xbntf2d64yugcje6z2d3oxb5addyho72co2gq
thedarkside.i2p,fxt3z33nzkrg5kjrk7bp5vvmu7w2vsn4i6jo6cily3hsm6u664ca
-thefilehub.i2p,fsojgg55w6vvpzcuw3e7nflmhublfdlb3mspnebuvjwgrvdwcz2q
theland.i2p,26ppxbseda6xmim37ksarccdb4q5ctdagfmt2u5aba6xjh452zsa
-theslackpipe.i2p,hxw6ncycnyd7gttrsnushggmcerozrfybsqqvxe4h5casbck5fxq
-thetinhat.i2p,udvz7opxck6knhsww5ii6dgufbstxzctilwnenzhw4iaxfdeia2a
+thematrix.i2p,kgh3va66n5fqrtlhqsen2km6x7k2362hn5edk5o5q5dcr72nnajq
+therealprojectencrypt.i2p,vrdaftozwabkzy26adg77adhszpyil4xbswkogbituhkhsl7tlzq
thetower.i2p,3xqa5nype64y6fxgqjq6r5w2qpiqftoraj2niebumseat4cj654a
-thewanderer.i2p,d5mautqn2zrvq3ex3caoeihljurp7y2amf6bdicttyozra2ysrha
-theyosh.i2p,ixd2ygz4xnfwu6cajexlguit2t72wdfpevgl5bbgn5g37jkt5amq
+thisthingimade.i2p,bga2ae2ff3s5p2nskg2l37ns2ad6smczpvgjhm2olgxequogepja
thornworld.i2p,vinz4ygmodxarocntyjlfwk2wjpvzndlf4hxss2w2t3fk52oplva
+thoughtfoundryblog.i2p,beoipfwqq5ebx2ywh2rcjwi7th5diaax23mvktppl4gk2pddrf5a
tino.i2p,e4bfnhvaofu4s67ztcgiskos2mqyhskid64dvlqexxs2c2bno3iq
tinyurl.i2p,mc4oxv3v7dnyzpvok7v5qxkwtgjprgyz6w7x3tag4fipsen6rdwa
tipped8.i2p,5l2mzforxf5kok7ndc6m53nfxve75m5tozb37m6eg2xsaf6hdlmq
tome.i2p,qktkxwawgixrm5lzofnj5n24zspbnzxy4pvjm7uvaxvmgwrsuvgq
-tomsseite.i2p,pfs53432q5qwaincyjemcn6xfku6nhod6vzdukc7qoazya6rebpa
+tooman.i2p,auo7cuq4dovgniwojq5fbwyjuvmks3zv7aopu5f6onsckuihsdpa
top4ek.i2p,hm3fpmxchlvqc3p4atnu7igwbenqpn7f3czbptnnqataemputl4q
-topkek.i2p,3f3rgvhbiccckgsktvdwn5xifinpap32uwitlkvwqbpryecswwgq
tor-gw.meeh.i2p,ounrqi7cfemnt66yhnhigt2u27fkctbvct527cp2522ozy3btjza
tor-www-proxy.i2p,xov45rvjks5fe4ofmpblkj23bnwxgslbypbgvchbr7yul2ujej2q
torapa.i2p,eejqjtpko6mdd4opvntbpsuandstrebxpbymfhix7avp5obrw5ta
-torcache.i2p,fwzuwkk5pgnbhc2bl4ouqunznqifpnezj4vkfeu7kfxe3wvaania
-torcache.sam.i2p,sd7x44s4fe25eem44wi22hx55gcg3vvydmhckllvr5acdcfb3yra
-tori2p.i2p,6xonfs3xvpowy3rbhaezyhlyhct3ndm5eflspw3kwkuajphvassa
+tordox.i2p,3wv6wn3h5tr57evns5bgf2rbwivai7zhajlgt5fr3blxvp6bybbq
torrentfinder.i2p,mpc73okj7wq2xl6clofl64cn6v7vrvhpmi6d524nrsvbeuvjxalq
-torrezno.i2p,ewtlezlikyspoc5xq2hpnbq2utolvil6euz5wfe6vxjq5ofirh5q
torrfreedom.i2p,nfrjvknwcw47itotkzmk6mdlxmxfxsxhbhlr5ozhlsuavcogv4hq
trac.i2p,kyioa2lgdi2za2fwfwajnb3ljz6zwlx7yzjdpnxnch5uw3iqn6ca
trac.i2p2.i2p,i43xzkihpdq34f2jlmtgiyyay5quafg5rebog7tk7xil2c6kbyoa
@@ -982,7 +661,6 @@ tracker-fr.i2p,qfrvqrfoqkistgzo2oxpfduz4ktkhtqopleozs3emblmm36fepea
tracker.awup.i2p,dl47cno335ltvqm6noi5zcij5hpvbj7vjkzuofu262efvu6yp6cq
tracker.crypthost.i2p,ri5a27ioqd4vkik72fawbcryglkmwyy4726uu5j3eg6zqh2jswfq
tracker.fr.i2p,rzwqr7pfibq5wlcq4a7akm6ohfyhz7hchmy4wz5t55lhd7dwao5q
-tracker.h0rde.i2p,25jvwmgenm3erf5f2uaapephpqijwrpuyer2oovvl37dpjv72hja
tracker.i2p,lsjcplya2b4hhmezz2jy5gqh6zlk3nskisjkhhwapy3jjly4ds5q
tracker.lodikon.i2p,q2a7tqlyddbyhxhtuia4bmtqpohpp266wsnrkm6cgoahdqrjo3ra
tracker.mastertracker.i2p,tiwurhqvaaguwpz2shdahqmcfze5ejre52ed2rmoadnjkkilskda
@@ -992,61 +670,40 @@ tracker.thebland.i2p,s5ikrdyjwbcgxmqetxb3nyheizftms7euacuub2hic7defkh3xhq
tracker.welterde.i2p,cfmqlafjfmgkzbt4r3jsfyhgsr5abgxryl6fnz3d3y5a365di5aa
tracker2.postman.i2p,ahsplxkbhemefwvvml7qovzl5a2b5xo5i7lyai7ntdunvcyfdtna
traditio.i2p,wkpjjloylf6jopu2itgpktr45t2xvpjijxilxd5tq4i7wkqgwhhq
-transrants.i2p,kyhfice4vw3jn7k6tgbipxgdd3ifmulwcwfm5pwqu7nsuahc3c6a
-trash.i2p,tmuf4rit5kv2z64ttdb7vg6gijceo4ijmvpjlwqr74h6vczoklua
-treason.i2p,cuwirmyojwrer65et3cphhqpr6hdh3juyyar4b6mlshrfewuzs3a
trevorreznik.i2p,wc2z6o5fxm2saqzpfcawr63lejwccvzkysmgtfudkrigqopzfdma
true.i2p,pdilhl5vmefyzrrnmak5bnmxqxk2pmw7rpy4f7wbaeppqu2vvugq
-truevoiceman.i2p,ae4xaz7bv76wwkuggdbz77ejb2hjgotganyo6bkpayzqukvxsaoa
trumpusa.i2p,vopyffqj3il2uapcvfxq2zkcdybf7ekmpvnrt6d4dbeuecbvs2ea
trwcln.i2p,evml6jiiujhulsgxkdu3wcmkwbokxlv4is6w5qj46tp3ajz3hqzq
ts.i2p,nebcjgfx3f7q4wzihqmguwcdeopaf7f6wyk2dojw4bcuku472zxq
ttc.i2p,wb4tsfyvfv4idgrultsq6o7inza4fxkc7dijsfpncbx7zko4cdlq
ttp.i2p,uuczclxejmetohwf2vqewovx3qcumdfh5zecjb3xkcdmk6e5j72a
-tumbach.i2p,u6pciacxnpbsq7nwc3tgutywochfd6aysgayijr7jxzoysgxklvq
tutorials.i2p,zy37tq6ynucp3ufoyeegswqjaeofmj57cpm5ecd7nbanh2h6f2ja
ugha.i2p,z3f3owc72awbywk4p6qb5l2mxgitvs6ejztggbpn2a3ddmymfjda
uk.i2p,vydbychnep3mzkzhg43ptewp242issy47whamfbxodc4ma6wc63a
-ukraine.i2p,msk6mls32w6nh65r7ke5bjozf2r3z563ti7iwewts72jtkxhq4oq
-undefined.i2p,ui33hsq7r3vhh3l3lu43n3b7o7icf5mympp33rvsyi7mrbbwygja
+ukiyo.i2p,ytd3loo226pogdcx3ajdtew6vl5rsidppqzh6phbo5vlmigdxclq
underground.i2p,dlnuthb6tpw3kchlb7xoztyspy4ehlggjhl44l64vbcrulrfeica
underscore.i2p,3gmezyig6gvsjbpkq2kihoskpuqpkfrajmhhm7hpyrjuvtasgepa
+unqueued.i2p,3gvn4kwd7z74jxc2sn4ucx52dpvpscxbzjluux3ul4t3eu5g64xq
up.i2p,25it5olgdo7pht25z6buzd32sw7jvc65oziqeuocfozfhgua655q
update.dg.i2p,iqj6ysfh3wl26m4buvyna73yhduifv523l7bwuexxak4mgldexja
update.killyourtv.i2p,gqdfg25jlqtm35qnmt4b7r53d6u2vep4ob23fwd42iyy4j6cvdqq
update.postman.i2p,u5rbu6yohfafplp6lgbbmmcuip34s7g3zqdd63cp27dl3nbd7gtq
-uprprc.i2p,j4xh4zamxxawkgfszyhmm63uximohqqbt5vtnwbdkaqn3eauesfq
-useful.i2p,h7jovk5wflhcpvulddundjbeqrwencbd5klplfutfnvwmgeykfaa
utansans.i2p,u2oyre7ygqv4qs5xjjijfg3x7ddwtod6nqwgbomuuzljzvnq4rda
v2mail.i2p,4gg7fykcqe7oaqt4w5fmlarnia7vtmwkv3h45zzgoj6o6crryg5a
vadino.i2p,aalttzlt3z25ktokesceweabm5yyhhvml2z3rfotndgpfyh6myra
-verge.i2p,wjpt2blspvkqzp6hcpv4u73j6ni4mxhbgh26i4qdhgi4w3xzq57q
-verifiablethoughts.i2p,htam5mq6teacna7h74dtmuyp6tjuzjogkgac3mwcypbvzz2enwma
-virus.i2p,zgd4u2vci4urne2bcvkqwk6wrutamfqggaj6nby2skn6k43mzp7a
visibility.i2p,pwgma3snbsgkddxgb54mrxxkt3l4jzchrtp52vxmw7rbkjygylxq
-vivaladedsec.i2p,2djqflzynva6g4ofxohzlxullzhzwb44s6hsrwrgj7wctq5aklmq
-vivalarevolucion.i2p,p3cvte4ggxzdomm5habok2ib3joowdqlphzx3y6tixylocqr4lzq
-volatile.i2p,q6rve733tvhgyys57jfw4fymqf3xsnza6dqailcdjcq7w4fa5m3a
+vpnbest.i2p,ov5f74ndsy5rfkuyps56waf42vxncufqu5rzm3vsnxkdtogccaea
w.i2p,j2xorlcb3qxubnthzqu7lt4fvxqn63it4ikwmze55yjkzeeampuq
wa11ed.city.i2p,7mxwtmala3ycg2sybjwwfil7s6dqck2fbemeutghhwu73rznmqoa
wahoo.i2p,vqe5vkpe5wbda7lwekcd2jaj44ar3rawgv54u5rcolezbg5f5vwa
-wait.i2p,slcobyp6eorbpef4qx7vb256du5p3uxdynisl6fhlrkyqv7d57fq
-walker.i2p,mv4vrczqpiq27qzzfdepefxhfkl7p45ep5nm4wvbh4i6cb5xhr4a
wallet.gostcoin.i2p,reuvum7lgetglafn72chypesvto773oy53zumagrpigkckybrwda
wallsgetbombed.i2p,tzhea5d65fllm4263wztghgw4ijdgibsca5xsecp6lk4xlsbdeuq
-wanderer.i2p,zhzpf7bugq3rspkjw46yjqhufqrontrdudq4fas5i47zttrn6xwa
webviewer.aktie.i2p,gvofjbuvkl65f2npmyyig6wmi4ryvzdyli2pj4ufu56vtabc5pmq
-who.i2p,ttzbmkgg4m6gntu37j2h37v2dwwssz4pkeu2onaqfqkwow4yyijq
-whoopboo.i2p,7i4err7ik6r5sno33sfmanmu4x7tsbqc6a7dmg3ijel57zhoosma
wiht.i2p,yojmpj3sh76g3i6ogzgsf7eouipdgdij5o2blcpdgmu5oyjk5xca
wiki.fr.i2p,lrqa7hw52uxjb5q3pedmjs6hzos5zrod4y6a4e25hu7vcjhohvxq
wiki.ilita.i2p,r233yskmowqe4od4he4b37wydr5fqzvj3z77v5fdei2etp2kg34a
-wiki.meeh.i2p,df47gapq2gftoy25cqoldvgp5v7c4aaz5x3exee6jdulun3tim3q
wintermute.i2p,4gvlfrdy2rkmem33c342tjntpvqik65wekcvm4275qbkuwotoila
-wizwhite.i2p,odzp77icxjf3xw662h43vjhzozyk3ug6qnjjprqcehrlz5zrvpsq
-wlrs.i2p,43j5ziu3w5bhlwaay53e5fbst36kjr44uerd7p4lh2mqsvvw5cba
wspucktracker.i2p,ubd2txda3kllumx7ftg4unzgqy536cn6dd2ax6mlhodczfas7rgq
-wvf.i2p,zzr4nntctf3u7piwqvbxvusov7v2wp6kwg5yxdegh2kjb3tbd4oq
www.aum.i2p,3xolizygkzkqrldncjqsb734szznw2u36lliceuacqnbs2n65aeq
www.baffled.i2p,lqrsfslwu4xnubkk2hofhmuvvr4dia2zevxefinbzdsjurvehtqq
www.fr.i2p,rmkgvlfwo3vkb3xrr6epoypxasdzzuilv3sckcqbo6c4os5jo2ea
@@ -1056,42 +713,24 @@ www.imule.i2p,657xcllunctawyjtar5kgh3wpt6z4l7ba6mmam5rf7hev5w2lsvq
www.infoserver.i2p,fq7xhxkdcauhwn4loufcadiiy24zbei25elnup33a3gfrdzrtlyq
www.janonymous.i2p,vosqx5qw22hwrzcgsm4ib7hymf5ryovsbtaexqrzmnzshy5bhakq
www.mail.i2p,nctas6ioo7aaekfstv3o45yh6ywzwa3vznrdae52ouupzke5pyba
-www.mud.i2p,rsp476ktqgewy6fadpotcxr7jf6shlu4zkbf5f2hvtvt3ye3hcxa
www.nntp.i2p,kly3o7zmetuwyz7xonnhttw4lj2244pkbibjz26uflyfte3b3dka
www.postman.i2p,rb3srw2gaooyw63q62cp4udrxxa6molr2irbkgrloveylpkkblhq
www.syndie.i2p,vojgy5ep4wffmtpjmpnbpa4gq64bgn4yicuw6qmhbm6nqa2ysrva
www1.squid.i2p,vbh3bltd2duwbukafgj6f6vfi6aigwso7snucp5zohnf66a2hkpa
-wwwasw.i2p,5i52aunacpixsenexdu4gk2tjc5fa7eurxedvx2osekwsxyt5hwq
-xakaton.i2p,ehue6yjbhiei7ihwas4aqyxeqcvj2ykgkv5wda7kia533dpgyv6a
-xecut.i2p,y5mbioxpa5gocffimnhjudv7lq5rggh4njkvovur7mrcmfcxxloq
+xc.i2p,mt45a2z3sb2iyy2mwauj4rwa2lwu4peanfy6gx6ybidwnbasusyq
xeha.i2p,oartgetziabrdemxctowp7bbeggc7ktmj7tr4qgk5y5jcz4prbtq
-xico.i2p,x7nppmjae37nh3n6l5btnrg3e655thnidbse2ts3tgarpuktyzwq
xilog.i2p,eoc5i5q52hutnmsmq56edvooulutaxfikddgdz27otmgtsxmiloq
-xl33tvill3.i2p,5u74czg4t3x7l6ttvn7cmuhpo3xlq4k2mlssedx5lxdehadoiriq
-xmpp.hashshop.i2p,kidikkdex4yesfmh6cymtoycgxukftqu5kbtsi67lw3nqocndpra
-xmpp.helpu.i2p,j6utejalk3mglymq3zaurbuxgpmiuoupr6px3lszy4mbreio7tfq
-xmpp.shades.i2p,csvynxul3xgddeoknc3ndqfkdymnmx6zwv2vqwwbgczu7l5ij62a
-xmpp.undefined.i2p,i7ihpnio5keiakl6i55ub26lxnpdo6yoguzikbamwhuoewi7e4dq
-xmppfree.i2p,axzxqfmir6ixkx6np5zh3uuzoca27beonuaxhxhwdl2xt7ufjzaa
-xmr.i2p,uxiiiqlehaojb2kcghjzzladdeg6wohubbz4pvhptkptjl6epjza
+xmpp.crypthost.i2p,ittkqpjuliwsdewdugkhvgzstejr2jp5tzou7p332lxx4xw7srba
+xmpp.rpi.i2p,3yv65pfwiwfuv4ciwtx34clqps6o2mc3vtyltcbqdkcki6untbca
+xn--l2bl5aw.i2p,d2epikjh5crt2l5xjmtceqw2ho44hzp6x3u7hgjrd4mi4wywikwa
xolotl.i2p,rwr6rrlmrotxfkxt22mah42cycliy2g5k7hgxyxkpcyyxkd2bgwq
xotc.i2p,gqgvzum3xdgtaahkjfw3layb33vjrucmw5btyhrppm463cz3c5oq
-xpx.i2p,oeesnqdgzp33rb4j5t3r2cik6yh4v4nantv2mfrh4cjk6zbxe6yq
xpyxpy.i2p,vwzdbqs7p4z5i6zob4gqrl7kejnkaxfo7haabowdq6tjqwltatuq
-yankie.i2p,2xezu6yhbzo46fd574lm7eeqwmja4vygu2pehft5ldiznbrk74wa
-yfambt.i2p,fh5w6sui6soh3upen75dkhs4ktgs4tat4yedhfrqm7gw244s25ja
-yfcbl.i2p,gq2k6uklykeoxhfkz7opvhe3zahu6jho42kvyhnpcywqzbzaecma
-yfus.i2p,ihpvzf4llwqmc2wfdsu2dxtxwvlhiqcu7vxhcvfujyq65fxjyv5a
-yo7vdz5evrktdl7a.i2p,xahfwygq6ozmhdxjsxqhv5vrh6o7lgw6dglklg6mnozc2dwivh2q
-yobyrf.i2p,suomfhdrqoedznx3dsc2vxve34bqm6j4broc4e5prgeysx4vu43q
yottabyte.i2p,zsdqh2ozauksuyeiaqypgcxus5ldmxgxxgz4yp76pglrjxzzu2ra
-zankyou.i2p,hfzprhla6lcy5xajwk4rr6v7yo6ykcuw2v2zfvdri7o7egie3ckq
-zazil.i2p,izvmzwxuy3geaq6dekhlvu3bo4aasavj24ekfnaqlhjsdwi7rvpa
+zab.i2p,n4xen5sohufgjhv327ex4qra77f4tpqohlcyoa3atoboknzqazeq
zcash.i2p,zcashmliuw3yd2ptfyd5sadatcpyxj4ldiqahtjzg73cgoevxp4q
-zerlina.i2p,lf4bjjww2gnon3qdk327yu55tgxu5c3wgi7q42irhq7pajhfnkaq
zerobin.i2p,3564erslxzaoucqasxsjerk4jz2xril7j2cbzd4p7flpb4ut67hq
-zerolag.i2p,d5om6pvuzfb7czbkxrd7gv22ejw5fzoa4wcwxzrpehg464w4p7fq
+zeroman.i2p,gq77fmto535koofcd53f6yzcc5y57ccrxg3pb6twhcodc7v5dutq
zeronet.i2p,fe6pk5sibhkr64veqxkfochdfptehyxrrbs3edwjs5ckjbjn4bna
znc.str4d.i2p,ufkajv3stxpxlwgwwb2ae6oixdjircnbwog77qxpxv7nt67rpcxq
-zootopia.i2p,evlpg2m7n3nnqtu3jjy52zxhglj52teqgl4cgei7egccxjg3shva
zzz.i2p,ukeu3k5oycgaauneqgtnvselmt4yemvoilkln7jpvamvfx7dnkdq
diff --git a/linux/i2pd/i2pd.conf b/linux/i2pd/i2pd.conf
index 5a46a78..dcdca1a 100644
--- a/linux/i2pd/i2pd.conf
+++ b/linux/i2pd/i2pd.conf
@@ -21,7 +21,7 @@ name = I2Pd
verify = true
[addressbook]
-subscriptions = http://inr.i2p/export/alive-hosts.txt
+subscriptions = http://inr.i2p/export/alive-hosts.txt,http://identiguy.i2p/hosts.txt,http://stats.i2p/cgi-bin/newhosts.txt,http://i2p-projekt.i2p/hosts.txt
[http]
enabled = true
@@ -42,3 +42,8 @@ port = 4447
enabled = true
address = 127.0.0.1
port = 7656
+
+[ntcp]
+enabled = true
+#publish = false
+#port =
diff --git a/osx/build/build b/osx/build/build
index d9a1d6a..6116ffd 100755
--- a/osx/build/build
+++ b/osx/build/build
@@ -15,7 +15,7 @@ cd $dir
arch=$(uname -m)
language=$(osascript -e 'user locale of (get system info)')
version="60.1.0esr"
-i2pdversion="2.19.0"
+i2pdversion="2.20.0"
ftpmirror="https://ftp.mozilla.org/pub/firefox/releases/${version}"
diff --git a/osx/build/i2pd/addressbook/addresses.csv b/osx/build/i2pd/addressbook/addresses.csv
index 54316f7..fd00b65 100644
--- a/osx/build/i2pd/addressbook/addresses.csv
+++ b/osx/build/i2pd/addressbook/addresses.csv
@@ -1,307 +1,190 @@
-02ch.i2p,6k3irsqo5v536bs45t5hn5f3s5pi7a3bp5nuxc6y72svjqp6vymq
-0chan.i2p,ah7wvpwga7hlwa2f7gnnxuqycnng5j5bkglhfm5ychejpnjucmka
-0chanrunet.i2p,3q7mdphwa7cmdjvxxrmbnvpy4dnei4hb4kyo2wvdhuvct3pclyvq
-0thers.i2p,f3osaqktj55iedisoabrd7uergxbpljovbwcr6hihmxmjdc6oafa
+00.i2p,zmzpltxslembpaupg3srh4bbhv5txgh5jmms6sfj4hzsvlv3xugq
+0xcc.i2p,gawouxh2sg32cluwlqsnpy3dwedvoqtfroi4evvdvm2pfv7tdadq
1.fcp.freenet.i2p,cuxbeputgxn75ak4nr7ltp7fjktnzl5sul3wstwnsoytbbpb4ixq
102chan.i2p,xxu3lso4h2rh6wmrxiou3ax7r7la7x6dhoepnku3jvrlwp35pefq
-1553b.i2p,2vhlowhistigqlu3vingiyv66jq43rhvn4qa75gtzpcjmcbvclta
+1st.i2p,rduua7bhest6rwsmmyttzssfdw3p4eu6bgl3mb4hin32qo3x5zfq
2.fcp.freenet.i2p,ndsznnipoeyapnsg3gj3yi2dzsqduxwalmujm5mzjm7e6x374tta
-258.i2p,dunea3q6whmbtf4vomdiv3si3grtqy7fqftdslk4piin4j5tkdka
-2chan.i2p,xnmlqiwaio6bg6dtbjqb63rtoznvgeud5acxklccomv5yytefmda
+2rqv7nn2.i2p,2rqv7nn2j4q3wcxe5lsrqpf73k4rmtutweft3dvbc2w245vpkdva
+31337.i2p,ydlngh3dd52av3aalpd3uqi5iuvmby7nxpkwclan4xqjsttz4fbq
333.i2p,ctvfe2fimcsdfxmzmd42brnbf7ceenwrbroyjx3wzah5eudjyyza
55cancri.i2p,b4iqenefh2fr4xtuq6civfc6nhnia6e2yo36pf7vcgdvrwmh7xua
a-zine-repo.i2p,zt6okylza25s2ppso7ngqbz2ybeteatxezxqemvucwhbb5ajot7a
-abhishek.i2p,rthkq2epkzgkqpqqg4b5elasnqydiwmlgzcb66fg77i2eujicdpa
-abvc.i2p,wsq3gg5t6kbvoxoo3pitreikdr4wyckh2svraor4esdop4mua25q
-acestream.i2p,2ojd3s4rb73d6qvwz36x4ysjzqbnkzluemdbxhuuuf7qbbfew26a
adab.i2p,pxjr6f2cig6v7v7ekam3smdnkqgmgseyy5cdwrozdyejm7jknkha
-admin.open4you.i2p,hnlryqjvk52hsze2ixnz4qbuki4tf6qvygi25mf5bkllmbett2oa
-admin2.open4you.i2p,d62hjvhu7yqd23m766dvs4tupxpvrsa2hzd2r5rdpm5apsmtmc6a
-agora.anarplex.i2p,ydaal5nbvxmydnncny5esb3ipxupmpgkensow7yvhp6u7uioujna
-agora.i2p,nvslgzpyqhxldfik5uwua7eqse5adqon5h4dbzqepw7ringod44q
-ajomyqxciuehvxaa.i2p,4goi34hmq3g7foequzr6ofa242myjmntyvxgg6tcgom2jam6gs2q
-ajomyqxciuehvxaa2.i2p,fk3nyhwu4iul6epeb53j2faai7afeqb3wrg7wbuohl7zj4sgbtiq
-ajs.i2p,qnqkn6a7r5sxokwfil3s4mwbpvvbkeqifitl2qzmwtui3wf5l7ga
-alacast.i2p,sdlcbhe5jffgdsmzaharudzbzhipw4pth24ivy7m3nqm5paxgtuq
+agaming468.i2p,4svcmhjnijtnclv2vdgf3ipdvzizgeyllysjfl6vu3xkqwa3w6sq
+aktie.i2p,4qwhpshwlp6ndzvtiwvf7myc3lll3vizqcdvvuxrzgaxv4g2qogq
alice.i2p,iq26r2ls2qlkhbn62cvgb6a4iib7m5lkoulohdua5z6uvzlovjtq
-allgemeinplaetzchen.i2p,5u4buto5wfret356iqzukcf5avqkadpg3up4hngsfkd37modlo7q
-allsprk.i2p,uyyakverb5mxbmobdqmzjnpy7lqszzlmexes3hxkunceyz53otfq
-alterchan.i2p,6o6tlcrs3nj2vks5w4fehtbk7263dinlwd3brsbk3vdefsqkddda
-alternet.i2p,fxpygpgimhktfmf2zhb23qqzu642eivazn7nfmmjhv562xb7i5da
-alttechdenizen.i2p,a6doke6sicgf6kktwe6dxnpft5agsouvqnuqw2abfo7eyjbylzxa
always.i2p,wp43sdtuxum6gxbjvyeor35r5yvgtkp3dcu7dv47lx22zeb3relq
-amaq.i2p,txpcthypt4ou7cgygqw2h5kjenyuirknmso3akiiv6h24royotua
amazone.i2p,e6kq73lsxaeyiwpmykdbdo3uy4ppj64bl7y3viegp6mqrilqybqa
-amidoinitrite.i2p,onr7e32g3rgigvibygcjwytoypo2s6eusn7zdwc7nmr5fuxy45va
amiga.i2p,edy2xappzjjh7bxqounevji4wd2binqkv7gft4usrkan45xhbk5q
amobius.i2p,rj6432agdprun5baai2hj62xfhb4l75uvzl55dhj6z5zzoxv3htq
-anarplex.i2p,4qingryacppi5ed2vk2626qipri3d7c2v6iw3vr55zy6c2uc66za
andmp.i2p,rv6zugykqdhmwwsuglv7j6ktjojdbf5fqta66hixejg33qb2su3q
-anews.i2p,f7nnjswxq5yyehuzzed65ut4jz47p76vxp4xrw5cyog3jijsrcuq
animal.i2p,5iedafy32swqq4t2wcmjb4fvg3onscng7ct7wb237jkvrclaftla
anodex.i2p,25cb5kixhxm6i6c6wequrhi65mez4duc4l5qk6ictbik3tnxlu6a
-anomix.i2p,ptlpjzvcjl54yl7wdhlk2fd5moytixstshdz7rr5hsfsumodto2q
-anon-box.i2p,kbv3jc2f4efmq2q4lj66p6xjkgmfhaed3jl7uzaml6y3oqc4jfpq
-anonarchive.i2p,vblifonpbegzggx5mgev6wtgtfpkz5ykv5awgrzsqv2lcknjp7ea
anoncoin.i2p,nmi3loretkk4zbili32t2e5wyznwoxcsgzmd2z4ll3msgndyqpfa
anongw.i2p,owrnciwubb3f3dctvlmnaknb6tjdxtlzvv7klocb45mmhievdjhq
-anonname.i2p,h4mms4mtafykm6ftehxss6sv6hiu2a7gtoflf4pxy6bv4mlyj6kq
-anonsearch.i2p,33bbahrpqfyf5yywwnamzdexxw3bkiqtsap454qm4deiuvq2wsfa
anonsfw.i2p,ir6hzi66izmvqx3usjl6br3nndkpazonlckrzt3gtltqcy5ralyq
anonymnet.i2p,77ouyl2ane7ffgydosd4ye42g67aomtc4jrusmi76lds5qonlffa
anonynanny.i2p,l2lnhq2dynnmf3m46tcbpcmbbn4kifjgt26go6n2hlapy4drhyja
anonyradio.i2p,cbobsax3rhoyjbk7ii2nd2fnl5bxh3x7bbearokyxgvmudn7o5bq
-anotherblog.i2p,shkgse3sc3v7dlpxdt74dqsc5lxrfk3qw6tyrl2sodbq7bsd5mcq
antipiracyagency.i2p,by4kcmklz7xnkai6ndfio47kts3rndm6wwleegtxghllimikdapq
antipiratbyran.i2p,y2qbhrvuciifbszaqqwxd5t75bomp7kzdqx4yxsrkaq542t75k3a
-antirius.i2p,4l353ourymat7gzxu6gmo72vinsqvggmrtqizdaj4ord3zzy3doa
-aperi.i2p,2qk4ofkb6hlx456aeqjz6rvbcqwdhntjq5uhaww4irnwulyho6yq
-aplus.i2p,h67lym6btfqinjs5ye272fo6uze2uvjk6t7qabibocjedfcv5fva
-aport.i2p,uvpczf5ljaptviombwxi6vmqxpzh6zpthyhvczzp57ihwfzrxnhq
-apt.mirror.i2p,kazqug7jqkfokjuyfstok4s2wnhtk3pueoaiuucashwzjqgsvpra
arc2.i2p,rnmosuwvtftfcrk5sk7zoyhyadh2g4dhe2mif5ml7qjisgkyw2na
-archbsdmirror.i2p,35nnm55r53mu2f4kkgl5xtlr35uwhvmhlzegbrllefmpk2bffl4a
+archaicbinarybbs.i2p,t7o2tw36cffedgfr6kahewpkrntofnliuapji2e4rucl3os55epa
archiv.tutorials.i2p,lldr2miowq6353fxy44pnxfk37d6yn2f6kaivzecbmvvnnf5exyq
archive.i2p,x54d5st3dl6mwgfxj6raiekqkypo5pdvuex3n62szwju7hgefiyq
archive.syndie.i2p,abbyu5n3mh3nj7pe3b6byldrxswvva5ttxcafsnnseidanurq3kq
-archlinux.i2p,22n34pf7xrgbiaexaevndk6hdn4or4skqshkj6ezmgvo4rnnkpua
ardor-wallet.i2p,tm23k5ny3umhf6vf3kghnnwacli5zywq5wrr3xcqowbcofuyr4gq
ardvark.i2p,jcmw2sol3hruwc6rfinonx4e23pjkukkg7lg7xt7xb2gpiyyraiq
+arecords.i2p,pkp26u32ea6xrd4o53lzwm6pxzphu5heyrvyra37drfvn6vli7yq
+arf.i2p,o46lsq4u7udxg3qqlidrmpj4lb4nr7ldxmbb2x53nftndaeyxqeq
arkan.i2p,7o5y2lyyrjx5tf6l4fyumywui7msjv5azaaheatvw5sqj7mxbuvq
-arkwright.i2p,ebovdlxw47kodamth7p33nenfxy5kqsyu7usp2c3ni3dyfrbbvpa
-armada.i2p,26qxgmyqczulza5ym3jij5er3onclacejyqzecuhjllwun3kxuzq
-arslonga.i2p,evmelbak3htxtkakhzrzdubbkglffiv2reyg3xeuno3rnbcts4sq
asciiwhite.i2p,itbzny5ktuenhjwjfqx3jravolhlj5wullhhr2m4qr6k2emnm5dq
-asmith.i2p,vwkvflbd2divnm4twz7w2ged4uo2lmc3vr6zbi4sf4mnwcpgec5a
aspnet.i2p,tsb7zqru57p4q2a7cto2lko4w5cg4lieglwm6t27c44fkphqmf2a
-assiya.i2p,67ld2vpoq56edqjl44sreskxx5v7pr77uq4lnznxcpxyppisml5q
asylum.i2p,p45ejjw4p2q6nq3mzi6cm6ep35grtzshboidj2lojmrmic22noha
+atesi2p.i2p,hlahr4wgobvhegluufw3ckzulr4etamxxborktgz3dkefok232ga
+auchan.i2p,6vxz4yp3vhjwbkmxajj7wiikxafwujig63gkhjknbq6xh4rqpm5a
aum.i2p,ohdfneqxapfd3fwfbum4tut7z6k3rnr7rrguoxdrrfe2tln2kpbq
-aurous.i2p,cbwn6bfpmrwnqn7s7ummhvtcr5lpzrl6svwzakk63qajxbfpurka
awup.i2p,v6g32duzrkacnrezfbll3pza5u37h7lnukr2wbsk6rqen6prhbga
-axahj.i2p,fk7wfzjsn2rfx2w7sx4dl4exgbu2ocaannkrmfsvs4x2gzgvxhga
b.i2p,272kt3gcx6wjurunzaiiwld7s5p4mpjewfubzmlcvw2vie62ckpq
-babylonastronaut.i2p,t7xrcwnbbmf24mwr4n5l2blzsmrieawporojjx72m3yjvczqw6mq
bacardi.i2p,hivhnx2v47vh234c7coi2urj5cyvbl4bu3ypjr7snklortyqeljq
backup.i2p,kepphem42whle3rkfv26wcksmnegdbg6rdp6t3oobdkc2fmzrdkq
badfish.i2p,f6v26gyr4eipy3a7pi2voulw5qvob6dg7zij6xpo2ywbi5tvbu6a
badtoyz.i2p,3qz6ubtwlt2c4iasofjirkckq43u5fgkzyg7mlutcsym5gzhijna
+balrogbroadcasting.i2p,pqgjjmr2jgvr4rtjyscgbh3hby2qpuoiibldddwxied2f7flvika
barry.i2p,4kyahq53ol52n23l44tefgeaxqpp3cbb632t5k3umdvqcooevdzq
bash.i2p,s3wouoilbl3mrefxjhp4qoyujgok34e7y6vmpbu6hx4342ivqo4q
-bbs.catrat.i2p,3e2fes3hmo5jkhf7cyjji2gfhymw7mx76ulkekaw2o6iv5wdq42a
+bbs.tokachi.i2p,m2cjkyckmcib2pu65zdply5faymuewrq4b4yy5lajxoqivny2iia
bdl.i2p,kp6fnuulenbjm7r26pfbmjcq3u7c7kvxeajodvgr5flcnskdgi5a
bdsm.i2p,pa7fxql5jljegg7j5tglhnnaod2sptq3gxvdn3ji6muqyhgn3poq
betaguru.i2p,d7cduwwhrcc2voameqfkvd66u3advu4jw2p6pysgax35vq6ovriq
beyond.i2p,uaicfqlrpjtitqbqkpfujanj5dollzfzee5glsuls67ekw6hlpoa
-bfclan.i2p,73oc3du6vdhzsa6mkxtr2mw3xrjnqmoxsg5cq2dntx4d4et7c6xa
-biblioteca.i2p,wklqkggiwnzhotwoy6gxqbgkt6hic2rqovtdkteqlur7xyt6ahtq
bigbrother.i2p,tnxiifs6uticzyg6ac4lhv2l5luwi6xra7yngocro56ive5e4jsq
-bing.i2p,xmn674kxxsmrl3rvu6wcexk66l4stns7rjgccsggniclrrz2dkma
-bios.i2p,ugc57rc7ygmjwzectakl66x2jfmxzywducwjqto5gqeqtsoxuw7a
bitlox.i2p,lqw5khxcdntlv3u4vhn53upcqirplvnc4etjlmoytrzs66ytettq
-bitmoney.i2p,sd7asgdgnicjyj6lkaavux77u4vyvhv62pm3dfmluoc4xuivxb4a
-bitslair.i2p,q3k4tsw4fgw7wvm4ufpbstuw44rd6g6k6aymqvkij7fwehldecpq
bittorrent.i2p,pgax2vz572i4zsp6u6paox5xubmjrkqohq6g4hvlp6ruzzy56l5q
bk1k.i2p,nlyegmtyfffo5jfgg5h4dxxnlmqko2g36gpaye5a7vd3is35xxfq
bl.i2p,e73d6uhnfbylza6wqkhxejmqeyfb7thkzw35gn5ojmna64jzyk2a
+blach.i2p,khjfx7pdxt4oqxqcgk6zupqvmelpjkpiafzjefe75sl3qxu5hcua
black.i2p,sjwueu62qpe6dtv5b322k3f23fl4uz3w6qe6wcrwauiwpnymypfq
-blackdragon.i2p,yj7fa7i4malizkewvvzufwgig4dypuig2o3ysfxtewpxs2eqaq5q
-blackexchange.i2p,ztgr5kghkyn43fhhkuycroxgfti6cojo3vg4wdd3usqonyvrla5q
-blackmetal.i2p,xhcyocs3t4ifexiktqyld5t4ownetrm2oquhee57dgenwn6w2fjq
+blacklong.i2p,dx2jfxy7pwj6bbmcnshunjgfyranab4xy2dmaid65cpxwt6idiba
blog.curiosity.i2p,yiz6jec5k7ccxdgnh7msqa4ze52bqqmf6rpq6bqdyojra2erd4ta
blog.polecat.i2p,orlccceubewvxo3fbdyydq6e4uuidbs4xd5u2gyqbculnowo3ehq
+blog.tinlans.i2p,ylkch2nkrwehakx4z6wiyjbeqwlgasknukdkex6r6yq4xusrjnda
bluebeam.i2p,lvxp3cbcfwtol57d5pmrsck32t7ndutlxubjb4smaf32bynhlk6a
blueheron.i2p,anfb5jrhixjmvkyxctqwkezqer7dbob22wge2bh6wsewbhgnftfa
bmw.i2p,6naudpj2zozw6aiiqusv6znfzyprwitrufauz3zuejtdbotp6mxq
bmworc.i2p,w254y65la47elcmf6mo7xc2caamm3ikeusmjjfknwsavwsy4whzq
-board.hiddengate.i2p,zojmbo7fz2gxdk3zzovvjittzokdgwmtztf7t457544zt6m6zova
bob.i2p,i76m7dwm5hnapljendbie6fc5y3mjlkdlduo3tvbwiwmvhxbpyaa
bobcat.i2p,ftuukjtcquuvppt726w37boit7gp5hf2yxwfop35prx3grzzzxlq
bobthebuilder.i2p,qlahgthqhr4uojkkwahnper2cl3ro5f5gtzy5t4lzapbzo4osy6q
boerse.i2p,7633w56hd53sesr6b532r5qlbdnvyl5bnvama6ign6xryaxol4rq
bofh.i2p,auvuinzogu6gc4pwsgbjijuszxgcjygciu2wy53pfz7mo5nfpc5a
books.manveru.i2p,eb2tisc2vr5jvjqrixrozcujiucwxg4m722stxwho5666ipl67zq
-borderlands.i2p,qx7p6kevvetj4unyy3gfysksqlwpflqwwpe3z7l3xcctdqafueja
bote.i2p,bhjhc3lsdqzoyhxwzyrd63kvyg4br6n2337d74blyintae66mr2a
-boxthecompass.i2p,vqal5tlqr4lwgr22tweplff26agmbw57gw3xydbb6razak2eohla
bozo.i2p,7a2d23h6htprhzrol36vgwgklsbqrnuya4tbaaaspmaeaodt57iq
-brchan.i2p,wizbnurl2xzvrfsnbuhv3pyu3cfwos4jpoue5f5ellz4bv3px4da
brittanyworld.i2p,e76umhhic3474sdxiuax25ixyfg7y3z7oojj4fmxvhgv3ruet6aa
-bs.i2p,bcr355ziz6uupqzsmfffa6zbk4bdte4yvkk3qy4xryy7hmw5axzq
-bt-club.ws.i2p,2w656i43u2xjiuzbxxajl4ynez2c7ukjvmnbzkc2tbfjvc73jdya
bt.i2p,uhkuu54pg47zey76h45tnvsdtpkf5bthbtrjgnaloi5m54h4hlaq
bt.nnm-club.i2p,bmqz3v5ulhkvyqeahmp7co76ea4mwrxvb5nmtuclltpthm4mb47a
-btt-tracker.i2p,adsa5hhvulkv2zo6flv5glmnw5mf7e7sx37vuila5mtxpzxxfwcq
-bttracker.i2p,spjpsgdhy764p2tgk5uffvzwhr2tnojdedyooglwgjvf3izz2yaa
-buddy.i2p,bh5jfboctslsxapasfb54yvjgxv3mc4xq5ampfheowmxnedupeda
-burningcold.i2p,7sw4p3rhzl5q2olfcxwig54huc3rhhoqgqsz5cdpy7k5tlwfsriq
-burntout.i2p,lkep3fd7tjvxrs25crr2c3jy7xm4s7bqiua5r327zgpw37sgyerq
+bugfuzz.i2p,ubszn4gsf22vga67rvzzlg4qj2bfcq6o52fmxz46xruawqm6z7rq
+busyrider.i2p,sv7ksbdjctuhuf3ddcuj72ypepcfpy6tqolkokz3gd2jgbm4bjxa
bytepay.i2p,7amc4ztwkzu3cgsaaaw3223ohuihn5hlsqc6gpf2rxdyptdkyugq
-cacapo.i2p,y7hb4kzomfzzhekib2mby72ydlntiexmuafuwtlxrxyigtnd63la
-carding.i2p,l5crcmcrkspnn6o7pyypho4t2hrdknapzysiefpxnw7ubu3yhfuq
cases.i2p,kmpmk2fmineaiwublteqlifg4fkmewnhmxqlcgg7qwecz6daj43a
-castelpbf.i2p,xt6dd4cqf6m7uf7cv234lhg6ct4n3u4uq3qgb7rgmjt75rs5qleq
-castor.i2p,nynqxsr27owq74a4wqxvokudclkuzn2kx6fmjl455lmeoib5t3dq
-catgirls.i2p,taxqiyvy24hk67dadf3hzdsj4jtzjadljs57wdfgaujt46qeujbq
+cash.i2p,6qscc7avdla6lzs6u2nzbppoxndhioh5krmoauolpwixfeuylo2q
cathugger.i2p,vq43xjjcnejqpzfprws5qzrea2siieshu4tglpdepql2w3w3bpba
-catrat.i2p,3ha4vnxtirlerv3g34j675r3b5xyylajffvqmpcj3plplq3nqchq
-cats.i2p,ma773liy6ascw44gfnkt73fn2bnjjwcojn2xv5zdx5iigigiup7a
-cbs.i2p,u3lp7wazvq6opodzwjg5sc5w5kwxehmxd4wcdpt4s4j2k4dx4apq
cerapadus.i2p,zroed2cxga5zeuu6rcvmp2yfi77nzduw7yhdplbeuqkuyxwbrzaq
cerebrum.i2p,u5gtsfn267udwfh2uq35jiabkufifvcbgv456zz34cydutsiw2eq
cgan.i2p,43z65gdr52xe3fxmkumwp3dzhedu4tu4rdtzr24hz5b4awcpfbqa
-chan.i2p,fer3oxecsu3tknnnqsqlta3sy62pzsbqrqgr56xzyu6ezxbeqttq
chaoswebs.i2p,fz7l3tv3urnnhjvlrdylbd4uhxpglmm2i3xfvuqrhksjccdfzx6q
-charismazero.i2p,yqjyitvld4frrcipsclo4ceyetkjeyqg6u4juqd722g7tweq7sva
-chat.hashshop.i2p,nfqzckvh5kruzo6h53biio5ojiekoxsytn7ed4d3esc6lgby6x2a
chat.i2p,ollpwnp6yidc3obbb3famgt6rw5jg5w3k3a6z7hhaegj6gcohiuq
-chat.volatile.i2p,o2zogadvui65kr52h2sqeh2d67l4rx5qhd7gj53hkqbsj7y75wrq
-chatfreedom.i2p,mxwg6hn6dicaziccpxvejfjj7ycrldp6vkvfaplfny3jxilq5cnq
check.kovri.i2p,7uea4hzuqwbow5c6hm3ghkr7mvyb5vafoo473wrcaa4rmua2d7pq
-chen.i2p,l7fr75pvy3o66isse7bb4bdsy6coq2eb4irjkrsdlugbjanxqzzq
chess.fillament.i2p,tv6wbanei647yf5bie4dhg2wmybkjurezlpdfwftc5ajqlfswwya
chess.i2p,sbnoqznp5yzxals3vs6nzyqaj2fetvonys4e3b3x4ktmfeus54sa
china.i2p,wit6f2zx6dtuqqze6nhbykrds3idppfirxvhf2f7ydqoqf4xdzeq
-chishir.i2p,gd3ijpmfcmcukfjgxupuepckitmx52vii35kt7monsv35ljmbkbq
+chinese.i2p,vvbwsllobaiugvwksrqyhaigbdwkmtnqmdrelzcxjutnnlmcqoqq
chitanka.i2p,u4s3jneepk3akoez46kqiwikoezi6zyj2ibjkjyi4uuvsbcojzba
-christian.i2p,7atkjb6iiru3z4dtb6q3k2hmcyhe4tigbgy55pqi5wwg33h6jwma
ciaran.i2p,2r3645eete6xwbfu62ogonudcrcgqq25sbnij5v4geru74yrscna
+cicada3301.i2p,o24fedov6xocshjcksd2nimzww2iyjk65zamm6c5dm4vx4nfovkq
+ciphercraft.i2p,7s5pkqbpbfdkxtwuu2e2iwstbikyewvvscy76lij4x5pfbygbjca
city.i2p,q3x6msrirtu5gy5vilpki7afqlgrduvs3f6ywixu3qt5q6qc6sca
-cloakbuffer.i2p,rxjexx7dole53hiuaoqqjyq2nljknmnjfws5hwyfoc7jmmhmwrpa
closedshop.i2p,6fg67mbw2okopzyonsck4bsy3cy7l2fame56uiysr2cezhjhzdbq
cneal.i2p,g4za73ffigv3ht4jnhzy4dae52djjq7lqcguqsfg3w5cxzqm7nba
co.i2p,3mvo5eifcwplcsoubtvqkzdahwo2sdhfygfdde7lj2glybk4q22q
-coalicionespanola.i2p,qwmwl3oxelkrr4omz5cjn52ky4wq53aedqbmllut2io4vehpf3pa
codevoid.i2p,2mukrqwtinsw27uoejtrz74zxtilyhnnfdyso7j3yo6vaa6nzlaa
-cokeandcoffee.i2p,2e4cjl64viaks675d6kso3cwkfaae6eqd35crjj3kfdz7oazofla
colombo-bt.i2p,cyr75zgiu2uuzap5zeosforbgvpfbqos2g6spe4qfulvzpyhnzxa
complication.i2p,x2av6rwj5e5tp64yhdmifdyleo4wblw4ncrrcrabxwscuevpdv7a
comwiz.i2p,6p7zqfotzbd66etl5xqy3p6xvr5ijucru3am2xqa7wmnj6vf3djq
confessions.i2p,lh5vitshufxpmyr44zgyymebo5elc42eda7pxvn5lmtes47c7rxa
connelly.i2p,5yrris3nigb3fapvzrlrcaew6cdmzdknzvgrc7y2jpn3ntqurweq
-conobs.i2p,sbapt37ybk2pkprqnkucu4thvtnhs6b7swrhtq4ddopateqt7pqq
-conspiraciones.i2p,7gzrrcy4ilatcinirarpyhorhfkzktnfl4zevuu77gvidiexdwfq
-copyright.i2p,73ul6db3pk2fr2bwk2fewvpuxwiyetnh6heptroagamrchfq7kja
-costeira.i2p,abhty5xlmnyab2kqdxcd56352kcescxoux3p6dbqdrghggyygnxa
cowsay.i2p,q4ghzfpah4ffvm3bhc6fdkrznk5f6jxfjm2daytlparznai5d54q
-cronos.i2p,27sdshufrqpgto7b6ko7ahfk4r2mtqnqtgzf2ncx4gtvrne6zwhq
-croquemort.i2p,j6damyqss2msf47sdxgc6dq7axz6wocqp5utjhn5wifdgabkwhfq
crstrack.i2p,mm3zx3besctrx6peq5wzzueil237jdgscuvn5ugwilxrwzyuajja
-crumax.i2p,xg6ffstp3lnknou2ayhvnoc6nwdhic7fstzphy6idnjnner2wxnq
-crypt.i2p,4xpb7orp7xmhxyiwvdvjm36dzp23h6jxxvagr6xuldodqto2hcqq
-cryptdesign.i2p,ekfldb7x7hgmznu7wnw5d7ziryizyqr3dfhgjcnzshmbyn27zruq
-cryption.i2p,hdfyl5jvzvlkamuz4fp5wokh7rzsmsnidr2qfoocke6myqgpxw2a
-cryptobank.i2p,cv2ccppauuoc5lq4drvbs6wdxzsa6iswnrxqf7idie36rxbqp6ra
-cryptofreedom.i2p,uflpfypin7vzybsui2qk6z4cundhhenixjtkrmnhrxedfoaokefa
+crypthost.i2p,zywhrxtnkjc3rxxvxbocom7ml4hnutomgtuvqrwyf3rhuupnq5ca
curiosity.i2p,eomeif4xrykxlzhawc3icdilje5iammijos6tyizwhrfh3j7qdvq
-cut.i2p,uk5jarq7yvogeuxnbmntdkheyoh56mqbbqeysphdzcllnkvz5e2a
cvs.i2p,yd6k7dzpsa2tnlzx4q7xqkmd4qsjk5xk5hbiqpiarwbeyvxaxgba
-d3bug.i2p,c7tdscxwbhjpgcjz6zle3uhj2gonvy6e3yvloce6ekpmwltbibra
-dallashackers.i2p,lzkthydgao725tev3rsqdgy526t3rfae7q5xjxbmvy4huimlkiiq
-dankest.i2p,t3xtjrbxfehmg3hnqf2mewezirny75mfgzflonhkd24sky4am75a
+daniella.i2p,543gbm3qfbb4nhwnl25dhunasx6q2fxy4h573lj45m2na5lbvucq
danwin1210.i2p,eoqdf4no5dxn4tw5n256kkd4lzz3uk4p47np4mepsykpsdzrnvba
-darkhardwarelab.i2p,hdzxaxt5y5owwvg42s46ygxncshiaha5ec6kvczo62conzuh3pja
-darknet-products.i2p,xatbsnkatiravmh26kpb3qj4nq5lwxyze4q5uax4mme6yv23tzkq
-darknet.i2p,xrxbhjjolxz5mlkycicpdcgerw2dljdbguhq7hdscfeo3j42oiaa
+darklord1802.i2p,jnu3endfmzzf5t3gb6vdj745cl7yp3rmyqckqus77cki6a3lgoya
darkrealm.i2p,gbh4eerxdsph7etxsxznfhvmuiz54trlkenakqep343u4xcoekzq
-darksoapbox.i2p,jlp6a5wubjorjxwqfzfub34kvpcybbkndo3lc37zcs3rryrq3a7q
darrob.i2p,hz2xhtpeo6btgiwi6od4qj2575ml5o2246rd5orarruyjhd63zja
dashninja.i2p,dzjzoefy7fx57h5xkdknikvfv3ckbxu2bx5wryn6taud343g2jma
davidkra.i2p,nq7ca2egm563nir3xegfv52ocgmxstpz56droji4jgnzfoosk45a
dcherukhin.i2p,qa4boq364ndjdgow4kadycr5vvch7hofzblcqangh3nobzvyew7a
-ddw.i2p,wlyy7ees7cumw7ggrs7ksp3uzld6holwopqr6qikncqjgj3vngka
de-ebook-archiv.i2p,6mhurvyn6b6j6xa4a3wpuz7ovpsejbuncvyl6rnhepasfgdgmn7q
de-ebooks.i2p,epqdyuuhtydkg5muwwq47n7jvr66pq4jheve7ky5euls6klzwuyq
dead.i2p,7ko27dxvicr2sezvykkrfiktlghx5y5onup3f2bas5ipocy6ibvq
deadgod.i2p,63bveyh7wefb44hlia7wtxxb3jal3r67thd6jekmwrtq4ulaaksa
deb-mirror.i2p,l6ly7szjqvbffz7hacvjxqsbvpxoguh34ypkddtgse6bq3fljayq
-debian-multimedia.i2p,cylxxz2y35x6cvyrl57wu3brckurtexatyi2i5awz3eeamqwjspq
decadence.i2p,pw5ys7k2grjb5myydpv6ohikm6nna7y6u2dro44i4rucgulu3ikq
-deepdankmemes.i2p,ht4cn7mltt3bn7fm5uvbuvtnuc5laxyiimxza47xi3wffra2ehkq
deepwebradio.i2p,2nait2gdeozkgf6gyhzjfij6mwldwkxxwcvtxobb4b5q5cvtm5la
-def.i2p,qon42l7zzzzylw7q2hxcwz67ada7lijqrzzwqqrrspff2qyycita
-delos.i2p,zhq5z2ohg5ikrobdqacfwaqts6fylnq26veblksl7m7olmk3vj6q
-denofsubmission.i2p,ybk35cmsj3ip3mzyzrtd4pzq5w4qkhywigp2kzy4vcns7fyqe3nq
-deploy.i2p,ujzspsqkbz5z272eozsrdv4ukl434h3fuliwrfxxnab74jmd7e6a
+def2.i2p,cepsrw27kdegwo7ihzouwvgcvw2obswwjs23ollgj7hk2yrce3da
+def3.i2p,xbf3ots2purqun7orn72ypkpjmrzbfrkj3u654zfe77hbrbow6la
+def4.i2p,yyzdq4fwwmnlojp23drfpfqujln2vcjozjrfzfeuriuqzdq7g4mq
+det.i2p,y6d4fs3rpqrctuv77ltfajf5m4tl4kzcu7rtwhxgiohylfxxow4q
detonate.i2p,nykapdsjjswdkjov7x3jzslhg4ig3cpkhmshxqzijuhbisx25jja
-detra.i2p,nluwxqolosgyly5nzicm7dmjdnxj4e4d7mlfilef7qu5u7eqf3ma
-deutschland.i2p,dypqhruytjyjafxe277ok7xuls3vh6v7kmwd3fnzd7jpozlbjdzq
dev.i2p,cfscxpnm3w3qxnlv3oikewxm4qrot4u6dwp52ec2iuo6m7xb5mna
-devfs.i2p,3olqlrn3jutjmry5aaxndt6m7diktaf66zwp5fbrks6qf5ax5e4a
-devulgar.i2p,4mahjuyvnuinlzocrhrxo35xsdbwb6rcj2wxoakc253bpwhijqva
-dg2.i2p,sjnqo3saada5pfldxmsvszns2rosi24uy5m54k7z6wqimewbke6a
di.i2p,3irnooyt5spqiem66upksabez4f3yyrvvjwkmwyzlbealg64mgxa
diasporg.i2p,edvccoobtjukjgw2os5eetywanbb2mpag5aknkrpia5qx2koksua
-dieso.i2p,j4wpvotizkxpbljaptcvfs2eylofym6ftyavgvhbm7k5g3qlpcaq
diftracker.i2p,m4mer767ipj7mq6l7gdrmrq37yzvsj3kzezd7n7nsfuctntjseka
-digger.i2p,abkurcjh734b77blgj4ngvxzgfkxafprb3lxj62b22zy4myc5lzq
-digitalconcerns.i2p,7k4w3cttjgmand6ely2srvgfc4vbwltrzyrardubojf42altdylq
-dimqua.i2p,ao264bhdyp3cimoiagzw7rpa2vakgudf27hfmucsd5ibcg5xkooa
-dlms.i2p,krsbxsaw3lnb6ctdpydygm2gqobjcpm4pf367ddo5hylbscnynmq
dm.i2p,heysbdivyeugdbggpscco5wje3dsvwgcpp5ot4sopooebnmiqvtq
-dna.i2p,fcnogd6go3zrwggy5s3ec62dfv6jfnstqwntar5f2k2umy4ordzq
-dnca-anarplex.i2p,szdgwbm7utjqoawfnwtlmqtqemhycjucbvrxx46d3u2yecoicj3q
-dnp.i2p,46xuw53lvmjontyaodc3zqddgzozkmybmnyagnthquuiqqphfb6a
-dnpchat.i2p,34dwlvhzlcvq7lxld3f3dz26gt27gijerqje6otziiyityuiedaa
docs.i2p2.i2p,las5l45ulwwf5i72nht6vk33sfkidcpr2okpf5b6mvgbk3a2ujna
-documentheaven.i2p,3kbrghggbvqawdmxeesbnpqjtq7645evesf4dggj6hzbgvkzng2a
-dollchan.i2p,hvmnvcq6xv7ok2efmllyxl6lei7ugidtkr3slgmcns2fjj3cytwa
-doom.i2p,yvnq6yyiluav647i7qc3hpjkprrbx7x4hb7e6djgwflu46vwqodq
-download.ipredia.i2p,nbzqubihyfrdd5pfmggzx4cmtoxtcrbkr2cxjvgnn7g7janntlva
+domenica.i2p,hbnbggujfnwnjjy2zg2e54gypwy432t25tb4nn2ydk3xbuslgiba
downloads.legion.i2p,xpmxdpuuptlekyhs7mmdwkvry7h2jbvpqpzsijqe3a5ctxgodesq
dox.i2p,vk27cjdrtegfdnrjqutebgxkpyrfj42trdfbsupl5zn2kp34wb3a
duck.i2p,3u2mqm3mvcyc27yliky3xnr4khpgfd4eeadhwwjneaqhj25a65ua
-dudos.i2p,i7fv4cizrwylahm3mqhvkrltaeepwjj5mvl6nin4k36kybvluf3q
dumpteam.i2p,2fwlpuouwxlk2nj4xklvm43m52tqyhqnu2fcfiuv7clvf3wd5nwa
dust.i2p,u6xgh6zhhhvdvefbqksfljfs3nyjvqcrmyamp5bryz5f4injmniq
dvdr-core.i2p,fg6l2ej6qrk5rkyfzdptxx5xkcm4kvdla4gg2tun7z7fm5cxxw5q
dyad.i2p,7n2ljphvp2dep7imoujvydxp4myuxfld3axwfgcny5xc5x6jj6ka
e-reading.i2p,z54dnry6rxtmzcg7e6y3qtsig5yf5fmehuvakcg5wnuahx3iafuq
-eagle-net.i2p,kqkshpoytjq5zzpulvq74ifu5ubkga7qwvdip2ivcjcdroazfi4q
+easy.i2p,ndg6v7fw26bzjex3huvcxfyavpfbig2bdmfus5t2qnk2qte3wz7q
+easygpg2.i2p,bwxry5alzx5ihgrd3glah4eotddblzhalvpheppnw4zcajzqoora
easysoft.i2p,ecbhsjzyt3pjp6zv6btqin5cbhlwqsgritljgyx5tc4aoarojeva
-eblan254.i2p,gt7ktjaccfl47mbiuehrruogte4ytppbkr2v37q6ppwbjajbbqqa
-eboochka.i2p,ou7g64d5in4sugv5fgmmzwnunuw5hloixio7puthmrvrkwrp6egq
ebooks.i2p,bvpy6xf6ivyws6mshhqmdmr36pruh2hvoceznzeag52mpu647nzq
echelon.i2p,afvtspvugtd32rsalxircjglh3fhcjzk7gxrm3gw4s2yrpvzk6wq
echo.baffled.i2p,bfr3lyicr72psxvt2umqfb562rtex66w6q3hi3tktzkoyane2iha
-eclectic.i2p,33xxjd2z2poeqklufqnk6d6xrrmbebmlh4yabg4snvk7vur6iila
eco.i2p,2dq2o5h6c6a674qaduipp55mid5iktumjbswuwmpsrcqaeowdvwa
-eddysblog.i2p,ieac3ub4g5sy3wuhsbqfembnpp7f3a37xgcx537ytzsmgfzexnbq
edge.i2p,aknsl5wmzjmwyc4wxutfdwy2w5vgd3vcx52mqx647hcgvyurmqta
-eeeiue.i2p,ilzqzqvzpclqdhhrog5oycul2aaxtwb7ndy325aphsfg3oefluqq
eepdot.i2p,t6edyotbxmxvy56fofdvmragvsj65te2gkhvzv5qnblicutyvgoa
-eepme.i2p,i2dhxxmowponghj3tlxq43z7b2oqnht7pkxa5esoq2zcn4odussa
-eepsitelist.i2p,kplek3im5b4uad5qfi34tlfcrcu2pn2ph72gyood2zefygv36m4q
+eepshare-project.i2p,sn26kom4qyuzouppv4lwnk6bqabdydcegtrilybviibwiq2s4nfq
eepsites.i2p,isskhl4ak3g7qevrarlmblddgr4ugnn3ckalwpjcvxafk5rjgypq
-eldelirante.i2p,xgh6ke745jg2jwyreiua54oih3bjt5dpub225aw3ijj2fsw2czpq
electrico.i2p,65yj7dwjbne26e7pfvf4grwn3ohttvxtsbt5l5kyr3v67rjucyya
elf.i2p,duz6ey27ohpcp3llylklzdb63lylolzcixad6bh7rt5tkq42qqpa
elgoog.i2p,z6hrgkg2ajmuzlrddjlffrgctx7x7fkipm6c4hdzmohyn5wkr4ya
-eliza.i2p,2c5xvunc3y3xvtt7f3glwm2bdqfep7ydyshygcxmecheeezmzs5a
-elportal.i2p,26azjncf7esizipsyyfh65zy6boejxglanzguwuaheiox2nglmra
-emc.i2p,535p7yu2i365ffgrdku73jtzo6iqnsskicwtb7vc2pt5smjfl2mq
-emercoin.i2p,o6aga5qbgi555rulkuerbjzmmibupcpywownhuokl7b5s3ktmbsa
ems.i2p,734zw4jsegdf55zl3z6s22tqkbxcghu4qvk6q2wevjfmx7xhbn6q
-endchan.i2p,crdjt54gtdj2twfc4oxur2jwqc5u5mtzo44q57bfju33d2mbomna
-engruchat.i2p,zw3f44qty3nihjoc3kdgsmw6nbsx5cycom335s3rqzykfdn5s4iq
-epsilon.i2p,ze4bgohowgjzhoacnkuhb26stjktimoffyvt5nbfiuqis77fxgoa
epub-eepsite.i2p,yxvzjwd4vin6pnjauekdufh7lxaijal3kqe2bhakuf47g5zkb6xa
es.hiddenanswers.i2p,cw7ge5ey4ekp5iep2kaw6j54boebtqytpcbnvio2bfpccd5ejzfa
eschaton.i2p,xe75f5hzmrq6rkhsef2geslmi2v2yfngdiysmlmxvh7b4pyyjk4q
-eucent.i2p,64qe3xnofn3ah6ghjkaq3a5vk4eurmgraptnphpdhaoxkjchg36q
+esuwiki.i2p,cwxuiwcpymb72vm5vluba66ofhugyf5qeevvwo7e2fqrxl243coa
evil.i2p,ljfl7cujtmxfffcydq77pgkqfxhgbikbc6qxjgkvcpn4wzd73a4a
exch.i2p,vsyjsbbf2pyggtilpqwqnhgcc7mymjxblamarmxe5hmbxaxvcndq
exchange.gostcoin.i2p,n33uthzyqsbozl2qh5zii2bq2nnvbz6g6c4ew3mwp6uukk6u7wva
exchanged.i2p,ylmulgfskl6uiwac4hw4ecwqdzd3oxtwaemzj25zc6k5q4rkexra
-exe.i2p,varccyu3ythxext5xtb6u4j4pwl7neu3mh3nurwb2bpit4e2t6na
+exitpoint.i2p,5zmjurq3enudcenegnxu5hqmfmayz4lxvnik6ulch4xssa2ithta
exotrack.i2p,blbgywsjubw3d2zih2giokakhe3o2cko7jtte4risb3hohbcoyva
-f4u.i2p,seosrxtycclc7emif4etsv4kzmsmhzptg2ta237brbudq6rdizpa
+explorer.gostcoin.i2p,ktoacmumifddtqdw6ewns3szxths2hq2fat2o7xnwq4y3auga3za
fa.i2p,6n6p3aj6xqhevfojj36dixwbl4reopkhymxmatz7ai5sroh75rka
-fa1c0n.i2p,o5m4ckiiea3wv7qgb3iwvf6f3tr4rlaysitdxbgp2erhon6qmcra
+faksoc.i2p,l3lu7irgr2s24ot7eeqgutldoil33mv44qi5qdxwhwh6w5lyxcoa
false.i2p,77mpz4z6s4eenjexleclqb36uxvqjtztqikjfqa4sovojh6gwwha
+false2.i2p,j5i2tfumh3ti5sdtafwzzbpupmlcbg5drysfay2kxbdpsaljrosa
fantasy-worlds.i2p,62a4xcyyhvfrcq2bkckb7ia37fmrssrgx467tlkxp32fjpq577wq
-favicon.i2p,yp5jqyqanin5e3skwum2hmblkfgbbj3nssp6bvhlr5kw3xvyzcma
-fb2book.i2p,3a24ytysvevkcgtssyd6fjgy6efck3bfonkanh7bphal65fthfvq
fcp.entropy.i2p,de6h6ti5z3mcbdcwucu45vplikqyoeddsu3rqy7s2zy5i47j3peq
fcp.i2p,ndsznnipoeyapnsg3gj3yi2dzsqduxwalmujm5mzjm7e6x374tta
fedo.i2p,zoamh7e3k2vf2g6pfy46ho4taujk2f4mxqqsv3gbg554fxbvyfqq
@@ -309,131 +192,84 @@ feedspace.i2p,kvtnpx4jylgeyojfhix4x462sqn5uork3roml4sfzotkxx62i4wa
ferret.i2p,kkqie5qmja7bkf3iad4zxhrdarwj7kbrx2m3etn5kmba3shgwj4q
fido.r4sas.i2p,i522xmu63hfbaw2k54cthffcoqmeao6urjyq3jg4hddf6wf57p3q
fifi4all.i2p,v2stz6bsot7sbjzix5tky5dm5ej7gidmjnkvzqjju5xvz5sz6fwa
-filehub.i2p,rsbtaakwwfvodxa6xyn7ea6tmi2andrfmlhdcasgy2xx32no2cpa
-fileproxyxmpp.undefined.i2p,oc6caemyolql5xwav6y7kputwcb357qk2matzevmrlyrm3y7f5pa
files.hypercubus.i2p,qfglq25jwieszgyt7muz6dambzqsrmjhhszygzzx2ttubc77sffa
files.i2p,w2sy74xe6oqnuz6sfh5fhkzu7boholgzd5f3anhj47srxwpj2vaa
files.nickster.i2p,yil7dp2hg5pbqyovsiwb2ig6zjsq4tize3fnwemmqdrr6j5itdtq
fillament.i2p,udj2kiino4cylstsj4edpz2jsls77e32jvffn2a4knjn4222s2oq
-fireaxe.i2p,ov3ev5dplhdz6ipy442ftb4kzz4dembm3ifs2jo25qhiyw6f4ogq
firerabbit.i2p,awqh7n3wskzl3epyvkdwgarmfybsncm7vye6psg4tpkmplh3mj2q
-first-world.i2p,w35uyqjcbdrohmtwgk7pf36djxelyiq5gs76hzyrwovpnmkv2gcq
-flakka.i2p,dvqfprgxtomk5xk7yr3irjpowrhcixew7wyxw6ppilbgxrx66b5q
flibs.i2p,ocdm33e3h5tdml3yyholj4objdwsrhlugfqjnqgdkslmgdzb6b3a
flibusta.i2p,zmw2cyw2vj7f6obx3msmdvdepdhnw2ctc4okza2zjxlukkdfckhq
flipkick.i2p,aso5rzc4ym6g2bcbxjy2n573bmbenkjawva2jg7fhyqhwtwgu6lq
flock.i2p,hflpi33ko5bi2655lx6bpzstdnjqgzrz23inovqjx5zpntyzyb3q
-floff.i2p,umcssecfk4esz6fyr7gotsgcnbcxpf6atim5uqkxrxb62ky4iatq
floureszination.i2p,vitpvfb25sikuk3crgcvtcdi7hajxnnq2t6weay3no7ulur2wwwq
-fluxdirect.i2p,kudvuk4mc2rfqoi2f3khn5mz6af3hdaq4wx4bnvohut7hktoumua
-fmnet.i2p,zveaklfzb6xmcayvmmkdvqnboibmcddnk7tvcw56l4au5zuyrkqq
-forum.anoncoin.i2p,sytfn37x3exrre77ctjuo3g7nhnky32bqgpcn6jr7e5lijz75nuq
forum.fr.i2p,onvelkowkbuwrglhw2cnocggvbdudi75sll5mfirde3cbopjqivq
-forum.hiddengate.i2p,gsuejshp4433zxbrb4yg7sdxw4ln3b3n57i2gpzij4ddazed7tka
forum.i2p,33pebl3dijgihcdxxuxm27m3m4rgldi5didiqmjqjtg4q6fla6ya
forum.rus.i2p,zd37rfivydhkiyvau27qxwzmerlzbqtthsa5ohtcww62zrygjaga
forums.i2p,tmlxlzag7lmkgwf6g2msygby3qttxvm6ixlfkq6s6cpgwubp33ya
+foxatomic.i2p,obdyolrmtaxt4i2aeouun5shl7wqtxgbnkesty3sr5ofmhae32qq
fproxy.i2p,keknios3gm6kh6onez6x2bm2t7stv54oanvltuagphgdfjdw5e2a
fproxy.tino.i2p,fpaituvuvyxp6xdjnv3i27alnj2ifzcvqdweqb6yj5uybotzvyha
fproxy2.i2p,r4lgw4wmza25g7j5fjocjbwzwthfg4ymcbm52ref3hh2hogskcza
fr.i2p,ia6xlsnygorllplx2owokahtrkospukvsmysz7i7bzw3vejc4hdq
-freebel.i2p,itir2seplkvrcgvlcw4v7jp6zkzdhmu4tbu2kcev2zkn3foi77yq
-freech.i2p,upld2ui3i7iylcqt7j64s6rpwssbvlxiuxsellrg5br6ksikiwwq
freeciv.nightblade.i2p,rluupsgxbvw5t7jno3apyzlrdirjkljft4gdoy4mxxh4fmd4xzta
freedomarchives.i2p,4ck6oliqfjz3sccpya2q4rh5xkj5xdxkqs76ieml37537nfhwd2q
freedomforum.i2p,abzmusjcm3p3llj4z7b5kkkexpsxcnsylikokouk5txfim3evqua
-freedominthedeepweb.i2p,jajc3urxerox3f2gfpfdgcvwcghnpppyvurh4uo2wwue7yebhxoa
freefallheavens.i2p,giqnkltyugfmsb4ot5ywpvf3ievuswfurk6bjie4hxi2hh2axajq
+freemind.i2p,6kjq2ohdni4fgqcypcfgi42lz573juf3inzeievm3euxklq4qeuq
freenet.eco.i2p,2kf7ovb35ztqkrurkm76y34jfpwi6go25xj7peznnmxrl7aieo7a
-freenet.h0rde.i2p,2viwn35pgbotojfv2lky6c3tzxqd5reiujjxebisncykd236u76q
-freenode.i2p,f3wg7rq6mzlpef4mb675gpaohmbicmeu64jsgn7iahijljjpflva
-freeworld.i2p,c6jgsi4fqvu63flxdq3qq7e6whpyqpdmy25k65b4se7vjafow3va
-frenchsharingforce.i2p,jgj72ptq43shnabzljbza2o3kx7qryrpjqhotscalllr7yqiq3ga
freshcoffee.i2p,sscuukigp6alcb3ylhkcugoejjfw5jqgtqbsbafw4hyku42lgc3q
+fri3nds.i2p,y2s7xlezekt5ie5ij3mxhywol3rpo6hsu7velnh35vbdl25tj2ra
frooze.i2p,m6ofa5dmyse4b4jg7kfmluuuc4pw5jqu6zh4qnboin4vropxepja
frosk.i2p,63naq7zb3hvbcppj2ng7qwf6ztusp4kwpyrzbt4ptafcdbu4pfjq
frostmirror.i2p,ycz3imuz6yte2zhlapmsm3bsvc46senvc2jxzwsbfdct5c72qulq
fs.i2p,ah4r4vzunzfa67atljlbrdgtg3zak5esh7ablpm6xno6fhqij35q
-fsec.i2p,z432orw3ba45bxy2adkb7bdycva5xrraqu4fbzki5bnluxiqtvsa
fsoc.i2p,vaqc4jm2trq7lx2kkglve7rkzxhhaptcwwl32uicx4ehf5k3hx6q
-ftp.open4you.i2p,4ek4ltehr35aicnduha5gl3tiu6acnbk7v63yicjyd5sx6mzs5yq
-ftp65000.open4you.i2p,vzv2sjdkcgzyb47u7ump63sqgli75za5qcgilnzpt5cyvpyez5va
-ftp65001.open4you.i2p,e7sqiurf3njnhwbkeen5wjoqgfdhdpehcqgwyfpm62oew7c4lyzq
-fuubar.i2p,ptekidraefaa2k3333kyogg563jx7htwem7lova3tt5eqebpiebq
-fym.i2p,ecouprtbumzdn27s3qeg3bosoemgtp775bq3zgkkzvkwdxiz72na
+furry.i2p,nsp4dwzfkdldtly3z6fewmicrurncrie277catksd7mpt6xjmbna
galen.i2p,4weo7zkxscxbcouiqx4mlnb35uwl2lromikzk33er3fljktyvi2q
-gallery.i2p,2ps7wt3v67ni2d535lwaubpsuuhxsg3igifsy7qlzolbrxaimunq
games.nine.i2p,ov27guhkdyhgdkqcsi7ipxsbudytn7bj3qp6ovwk6ih2wwu6sl3q
gaming.i2p,rfxberwod6st2zc6gblqswxjl57nucgc3xrbwss43pe3dvqqzj4q
-gamnovik.i2p,ueukotwgp5xn2y4dh7rspe3q7rfcdpoo7r2xbpvrkx6n2niii2qq
garden.i2p,qkk2dqx6nocycgt3vinsoc76cxkb4jreybcpgz3fcps2dbe4rowq
gaytorrents.i2p,fnggbr2t2aulr6rvlo4aehotx6wecfob7u3k2nxsnvtm4xex424q
-gcopy.i2p,3pa2pmbix7cy6ihlydjohqudnwz5ssk6jvwqiouoc2lq2p77a5eq
-gdd.i2p,ddlxcqyifaajcshyzy7d5rw5ziqil362gljf33gjlstbkroaxi7q
-geekycritic.i2p,yaqnhwfrs7u5he3cwd76feocjxafqekj25hl7dngr3xwuti57tta
-gelboorumirror.i2p,lgjfssrj7sznvli7ebtadzo2leefvxi7uzyt7aprtgxyh3xmi2cq
+geekcraft.i2p,g2xbibxoskudufabbgwe3hdpy54vb4l5jq2tr4om5rmmzyutmsua
general.i2p,5fklrsztdqpl3hkkwwrrw2rdowrq7wwhwb6h7avvk4fhansp4vvq
gernika.i2p,wpzqv3lxpecdsvcaadvbmrhhwlc7kp4n2mijdv2qjw3zr3ye232a
-ghostsh.i2p,pp7p7ww7ug7qwkirgfrnwyxplp4cmyv3aksk2mroplterz4p6axa
ginnegappen.i2p,kbhfkzx5jeqhfgss4xixnf4cb3jpuo432l3hxc32feelcmnr3yja
git-ssh.crypthost.i2p,llcp7jvz3hgtt3yzkdgjolwobisgvhv4xqa5a4oddejllyozur5a
git.crypthost.i2p,7frihhdcisdcyrzdbax6jzvx5gvtgwsm7m6kcem2tlaw4jtahbqa
-git.devfs.i2p,yklo4bsbwi66r2wlbug5jrkpx6tlquo34knzaopsboiz5dnxn5rq
-git.nazgul.i2p,2o45uut7k4wdmup3nzncyjh4zuzwi4rm6xrucsf7b24zhlkoir2a
git.psi.i2p,em763732l4b7b7zhaolctpt6wewwr7zw3nsxfchr6qmceizzmgpa
git.repo.i2p,vsd2vtgtuua2vwqsal2mpmxm2b2cpn3qzmqjoeumrrw2p4aot7uq
-git.volatile.i2p,gwqdodo2stgwgwusekxpkh3hbtph5jjc3kovmov2e2fbfdxg3woq
glog.i2p,ciaqmqmd2wnws3hcpyboqymauyz4dbwmkb3gm2eckklgvdca4rgq
gloinsblog.i2p,zqazjq6ttjtbf2psrtmmjthjeuxaubi742ujrk2eptcsaoam4k7a
-glunews.i2p,2bka7rmfn75ollbwq2cgzf35yxx3qz3lttmwi7i5t7iptlj74yja
go.i2p,ll6q4lsirhwkln4dqxwqkh2xu4mu3jiy546b4uhe4fypyb4vvx2q
-gomi.i2p,wne265y2p6xuaefqnhk2rb4gfhfiw7udvilnujev33f7tlux42ja
gonzo2000.i2p,nogsv7okydhbvrewv6hb4xdojncvhkusnyib4lglluc4uw67a37a
google.i2p,4p3ajq4cotnflmuv7fhef3ptop5qpm3uzzgp5bahxif3nc4w3ffq
-gospelflicks.i2p,iz5ms5ta2gm53w4avunj4q22o67vfuz2yr5lcd3ehqwles35vzla
gostcoin.i2p,4gzcllfxktrqzv3uys5k4vgkzbth4gqednwhfpt755yivm3davuq
gott.i2p,dqows7dpftxxl2bd4bgcpkck6knrysdun6mtqy4ms5dxobbvg3ja
greenflog.i2p,zny5ftmhzxulxzyczmeat53qjnue2xtqv2clisc7dg76lwfceecq
-grimore.i2p,ij4lpzuyyng6cc4jw5mxibcyjv4rx4uk6x5jijoduglkgjh7mmya
-gsatdesk.i2p,yfcliyat7jjuj3qfdbaunlbt25icteuilkmru7unl2tdmq5lxaba
-gsn.i2p,r6o3boq27rhrnoc5xzt2l5azmnirnldt6lvpgs2xfybeb3caju6q
gstbtc.i2p,n33uthzyqsbozl2qh5zii2bq2nnvbz6g6c4ew3mwp6uukk6u7wva
gusion.i2p,4qyfdhizjixe2psu7wcvqufix5wlijocehpb2futurcmlhlktrta
guttersnipe.i2p,kizkhzes2bzp45widihremo6geepfk7dl6juourkvzuvlc6y3spq
-h.i2p,cdnb77zmuqudreubv5trohs5mx5qkg6rmue3wvkfcqmccpeciloq
-h0rde.i2p,m5w3ysm5yjwyhmtnx5wmp7y4undauilishz7pb5ls3jy3kn5buma
+h-f-j-i2p-site.i2p,bjtxnbci25zix2ydunmsin7cwsffleirat2aab7a7heksosdagha
h13.i2p,tozb4vssixoccyqtgnpaatkg2ql52kkjwnsdo3dltezges2na4bq
+hackerculture.i2p,pl4pccq65gaee64zgo2slvn3ggjui56ewrcgxkmfuua5p7dwek2q
hagen.i2p,e2t6rqd2ysbvs53t5nnaf7drllkgk6kfriq3lfuz6mip6xfg644q
-haisse.i2p,rqcuzhlqyxyi336rx42h5ve3bhapzgifkepob3u4mo4vcikvg4hq
-hansa.i2p,4yql32dohkor4kilyxk3ole4xajgo7eb25thxasfimoffsgebmxa
-hashshop.i2p,ltrposvzibc5ahwbcjgyk7akq52udeuetprotyy5sbclxp6v6yaq
+hax0r.i2p,brvsdtvx5vdjai7sxapgksivsamty4dvrpw7g6qc52hqtvpjznpq
heisenberg.i2p,jz4quyw7zt63tmw65jfp76fblwadjss4iyi4puqdg3dye7oaqlvq
-helikron.i2p,nuql7jdr3qw6n3n6rwcktuoboglh3cppk67rohlwwufbciv4n7iq
hello2600.i2p,khpazz3f747z5zet72s6g3dccw53bfdqyhxt5da4sv7ouve5veuq
-hellobs.i2p,e2ceaajfc6w3ts24rnschqc2cxhqqbr37klmwk7b5kwgbevbe2ca
-helpforyou012.i2p,qzvqga56u3oupv7ndhsj7zrc5yngysgg5ayyqbjtkj5maw23ibqa
-helpu.i2p,3rs5qlv5bdpvwmsxhnh4gjw7yrta7eoe6wjcrny6fudzottnxmua
-heron.i2p,wru22ps7g6xgv2ommt7p4ctxwmpddejqvh3gkti6ys47wtf5e22q
hidden.i2p,iqodhhqo473qv5gwhjcs2bsrbhlqtpzgpnuumpastfiyhuwb2kyq
hiddenanswers.i2p,kj2kbzt27naifij4ki6bklsa2qfewxnkzbkgvximr4ecm7y4ojdq
hiddenbooru.i2p,zma5du344hy2ip5xcu6xmt4c7dgibnlv5jm4c2fre5nxv44sln3q
hiddenchan.i2p,6y4tltjdgqwfdcz6tqwc7dxhhuradop2vejatisu64nwjzh5tuwa
hiddengate.i2p,rvblcu54jvkkfffp3fobhunsvpgfc6546crcgzielzwe2s5m5hbq
-hikiko.i2p,jwifa3ysjbrygc6szxchn2bck5zonnihhxwrotly24se5xob6p3q
home.duck.i2p,jsh7yfvm2t5urdcnmfzdy4n6vegqskdtlwem53chgxli4ipfmuma
hopekiller.i2p,kcaelbgsvrkiwpx36b4wxofebrl3njx7rgm5amzfmqwbomt44cxa
-hosting.i2p,ice6ax5qrzwfwzsy64bctffj6zlzpuzdr5np65zsxlbt7hztyc6a
+hostedtech.i2p,ja6nnovaq6j6umtzano54tvxq2zd5vwasymfad3av3ceixzxblea
hotline.i2p,6cczi27iuxkm3aivazaemzltdqgh42ljzurqp43uclbz2lid2uqq
+hound.i2p,ovh4pszqnqhperfwn5rboxljkjemx7dymecl35sxa3dpdsz5f5va
hq.postman.i2p,27ivgyi2xhbwjyqmnx3ufjvc2slg6mv7767hxct74cfwzksjemaq
-hsdn.i2p,3tndu37wufiazfoo5cbbtcxe42dhpjv6f7sho44vvlak6sexolla
http.entropy.i2p,ytu7kz5bdoc26nkpw2hajwt3q7n5rcbg2eokyefhmkxmmslimbdq
-http.i2p,ygzrfsuuytq6chx26qtdd5a3z5as3ylymqy7hxjnn4xaxisw4x6q
human.i2p,nrtcelq3humyfvoxmzmngpka6tmyifweouku5mbi5av4lc43hzaa
-humanresources.i2p,pwm7w5z44w7xblqpod5ou3nfvw3izybfrw5waeqa3vuvzwl6xhjq
-hypogeum.i2p,wryo5vzllas5g4hxjhofzmvp2cnrv6flpof7pwd7lrrdxeazb6tq
i.i2p,5lpdk3gft3wccs4npmadb5mh3hwb7uh63ehym2x5rdre77xtfleq
-i2chan.i2p,fu3imms3gjyroh3phqsehq6c32zszvyg6qrundumhuieiyjc3sza
-i2fund.i2p,ibtuscldyp6zog3dqxw43p5gcy57jfvmvaczohwqbydlj3rdf7dq
i2host.i2p,awdf3nnmxxup5q2i6dobhozgcbir7fxpccejwruqcde2ptld443q
i2jump.i2p,633kqgmwzzu6vhkevwvbf2pfyejt3gkes34i6upa4og57fgdfcxa
i2p-bt.postman.i2p,jeudwnx7mekjcowpqo6xpkwn7263c57y5piurrjrdzinjziu4fla
@@ -444,86 +280,63 @@ i2p-scene.i2p,cc6z3xuw67d2mpq5horgu4mpk7hybmhutotmwvmzzpvoudggifuq
i2pbote.i2p,tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a
i2pbuggenie.i2p,bioq5jbcnfopqwvk7qssaxcl7avzeta6mu72jmxjeowflpcrhf6q
i2pchan.i2p,tduxyvfs7fzi26znvph3mu2d2ewaess7emomfci22wvownajphuq
-i2pcocaine.i2p,s7bq7b7o4z3pcl2pej3dgzkk4zhtounnw2q6dab4vmb24k67laya
-i2pcollective.i2p,yhug4bpdj5mlmwlidnarhdjbn2owet4u4x7npqd2bbpt2p3jx5mq
i2pd.i2p,4bpcp4fmvyr46vb4kqjvtxlst6puz4r3dld24umooiy5mesxzspa
i2pdocs.str4d.i2p,yfvbtrhjac3jutdsqzugog6mbz3jtyhpwovrt2mqc5mzv534y7cq
-i2pdproject.i2p,5a7tngsj4ewoz3ufqoklzaxchyg26qojmoivoj2ianiokebri6ba
i2peek-a-boo.i2p,qgv64klyy4tgk4ranaznet5sjgi7ccsrawtjx3j5tvekvvfl67aa
+i2pforum.i2p,tmipbl5d7ctnz3cib4yd2yivlrssrtpmuuzyqdpqkelzmnqllhda
i2pjump.i2p,2mwcgdjvfvd3xwumzqzqntual3l57h3zo7lwdmkjboeraudpkyka
-i2pleaks.i2p,koi6osleq2ervyhkc26gwqr57x3gxbqzvwqkdlz73jmtjnmiykdq
i2plugins.i2p,bb63kmnmbpitsdu45ez54kmogvvljn3yudksurcxiyq7dn5abt7a
i2pnews.i2p,tc73n4kivdroccekirco7rhgxdg5f3cjvbaapabupeyzrqwv5guq
i2podisy.i2p,3c2jzypzjpxuq2ncr3wn3swn5d4isxlulqgccb6oq5f6zylcrvcq
-i2pr0xy.i2p,jgs274mwwt4zvwzk6nthbjpqsencoz75ujoceh3bisxyt4khyvsq
i2push.i2p,mabdiml4busx53hjh4el5wlyn4go5mgji2dxsfyelagi4v5mzjxq
-i2pvideo.i2p,n2ejmbpvf3ocisxmqeknrkzesyaoxaowsoltwc32qytios33g43q
i2pwiki.i2p,nrbnshsndzb6homcipymkkngngw4s6twediqottzqdfyvrvjw3pq
-i2vpn.i2p,bduw26oby3cjuwihuxbf6ruhyydupu43bpr4su23pdzugsnhh4ha
-icu812.i2p,bxgqwfsnr3bgnr6adn62anjcin5nuthqglotb3wn3dgynsfofeva
+iamevil.i2p,au7jhslyt4cxkjp365bvqvend3hhykrrhbohtjqlgoqrlijbezja
id3nt.i2p,ufuqdzsxltiz224vq5gnuslt3a3t72dhy5kq6i2xway53m6pzv6q
identiguy.i2p,3mzmrus2oron5fxptw7hw2puho3bnqmw2hqy7nw64dsrrjwdilva
-idlerpg.i2p,ghw3xixix5dk2y3pzjsvmlput7d3z6pawkwe6hme5jddxmzqkama
-ihands.i2p,c6qxr35an7xzxzymuismym2buwbkoi7rajchcljmiw6t2xkujsaq
ilcosmista.i2p,6u2rfuq3cyeb7ytjzjxgbfa73ipzpzen5wx3tihyast2f2oeo24q
ilita.i2p,isxls447iuumsb35pq5r3di6xrxr2igugvshqwhi5hj5gvhwvqba
imhotep.i2p,qegmmhy52bdes2wqot4kfyqyg7xnxm5jzbafdb42rfoafadj2q7a
in.i2p,r5vbv2akbp6txy5amkftia757klgdy44s6cglqhmstpg65xycyjq
-inach.i2p,nzusnipqsecluzj2ctbq5xywnfebcyg3e3i6ustodgk3kplnfeda
-inbox.i2p,rw6um4xv56eggo4bb2yzn7epdkyhggyjjc2rskx5nkqg55w2jq2q
inclib.i2p,ux6prousphswf56bym7yo7kst4ybh45y2z2wrnw7dujmrz56hq4q
-infamoussec.i2p,k5nlxksp2vrfj3ber3gvmt3wbsmxkirsywkoub6rqqbiozp44clq
infosecurity.i2p,v3gkh5kqzawn2l3uzhw6xnszsh6w3nztjmlwil7p4kyrwrsm2dba
infoserver.i2p,jd3agbakybnhfvkeoxrx7t33iln6suzomv3kxkxf77j7rkonch6q
-inlux.i2p,umhctznpitt7syzeto4rpsklqyzi7atzdbsvurwpv6wkqipr57da
inproxy.tino.i2p,ex5yf6eqqmjkrzxnkn6cgvefgne24qxsskqnpmarmajoit43pgma
inr.i2p,joajgazyztfssty4w2on5oaqksz6tqoxbduy553y34mf4byv6gpq
-interfray.i2p,qdlrga6er72kfbzwm7qrpq6m3c25ufu327gjamgfzwto544l7fza
-ioku.i2p,x45hrjo5ibm2gojbfbac3wi5kytp2bywms4houedo4pwdce4jviq
-ipfs-gw.i2p,6ox7c4vu2dwezfxbtlv62owd6n6ijgcpl66vv26q4sslfcp7yaxq
-ipfsgw.i2p,uxqdckmpvrvgz4rkudi7ndgnhcz2xgm6msbql6dwpyqwg6zgdyva
-ipredia.i2p,xnrx3wxiatblnustrikohrodrtddve36zsqaubtlf4wh2zazxgma
+insanity.i2p,j7c45wpdoxxu2f3kfsvi2vr7bi4tc6femnycqi24qde2uucqurkq
+io.i2p,tx22i6crnorzuti3x6va4mijsbhoqswy2cfdxjbvprgsq4eerg7q
+irc.00.i2p,bvcja52pppgfspp2ueuipoysjnvvoyblz2h6smpxcmanjquogirq
irc.arcturus.i2p,5nywlbn35p2nwsymwpfmicu6fxono6g64vwusxbsvmm2qwz6vupq
irc.baffled.i2p,5zmtoopscym6qagkvpgyn7jnkp6dwnfai745xevkxlou77c2fsjq
irc.carambar.i2p,hxzbpivxqxy6nuae4t6fnkhcgnhs4c72vt6mmsqfmfhrkn2ca6gq
irc.cerapadus.i2p,e4ckznxcxvgyikzjmjsu72i2dbj2d76ogexyukklbjvpcnhp6zzq
-irc.chatfreedom.i2p,n2y56bfettc7lyfdiw4uojt3ok3zfcgudwzispwj2a5po2k4gfxq
-irc.devfs.i2p,2tnl43crujj7gfko6ln4gp64zl5fkh4djvcjx2piyjvvsl76c5ba
+irc.chatfreedom.i2p,qaufwx3c47bnjyave4y2mpk7d4vsayxpz7tdi2kwpv6lykj2znja
irc.dg.i2p,fvp3pkcw4uvijqabwtekcdilklp73gyasuek67wdcs2mucep4caq
irc.duck.i2p,chdpmm4gxffyn24xx5dhxvfd5httu42i5gtoe6cctjlsf4mbofeq
irc.echelon.i2p,ez2czsvej5p3z5bquue5q3thujcodfze7ptybctqhnqc7hms5uzq
-irc.floff.i2p,5feedunnrtirrs4nqgo4jo5g6lhal4bxb3riok2523x7khoysunq
+irc.foxatomic.i2p,mkyylu5pmwvjo6koojlfcex3orjtbtoxaeelaybsb57ykub5hw5a
irc.freshcoffee.i2p,ubiu2ehtfnrleemgpzsqkahwnvzuaifqa3u4wmaz5maaisd5ycfa
irc.ilita.i2p,5xeoyfvtddmo5k3kxzv7b3d5risil6333ntqrr3yvx3yubz5tk3a
irc.ircbnc.i2p,4rqcsqd7xif6r4v55blqvmqu5er6due4eyene3mjorfkts4o3rxa
irc.killyourtv.i2p,wre4majmg2vnbi6id27et7yw6lnpf56wkbm6ftnlwpvxnktq73hq
-irc.kitsune.i2p,cpesprosbsuycn4ui3neidqdtqz5ufekthob7cobl3p7bcuaoh3q
-irc.kovri.i2p,o4hfe2fyc74rjfo6o36h4vcif2l23rv45l5v3h2sjtfa4lpxd2eq
-irc.nazgul.i2p,uot6nezrp2o5eabprnf4dzgtc3plfqy7yvdnowokzw7x5yhwvjza
irc.nickster.i2p,dhq3fhd5scw3jqhj5ge7kqfpprfolcgxfjbaw24obohaiqjtdu7a
irc.orz.i2p,7gifacog4aoons3syybojbbnyqqaaqijhngrehn2xlq3eucuyjcq
-irc.plain.i2p,y7f3c5s2n44j5pnsxncqpasluv6k7i5jtnhjfs5mfulcgcas6sqq
+irc.pacman.i2p,ckxfx7oo5qbufui2i7tshzs5hef4yafgpw4jsogsyetcgk5tbn7a
irc.postman.i2p,mpvr7qmek2yz2ekegp5rur573z7e77vp3xqt2lfbco5i6nkfppcq
irc.r4sas.i2p,hodhusp73gltozgrnianlbploon3rrvhrzfn5mf2g46o7aaau5la
-irc.undefined.i2p,t6phciy5wytbthyi6fxwz5towjtae44iqsgtlp56ygx725tetmhq
-irc.walker.i2p,epownolfv227hhzogufiieiofi53za3qctgim7xobsevvntuxiqq
-irc.welterde.i2p,424n5ty6bryfsn3m3buckx4njs4vaw2qch7drfdq32btsyycbflq
-irc2p-qdb.i2p,j6k3cqiviwqlr2oudf3pezowtpd44gm3jgg2wg6c6d4m5gq6jweq
-ircdnp.i2p,yraqgyioird5hrzwhruqdgkykurgrme4nt3g2vxvfeyhfkujvpva
+irc.trollirc.i2p,hci35hmgxc5xdieoqexyjgsbgsqlsoogxyhwnfkx6aioxkf2le6a
ircssl.cerapadus.i2p,4x2i745i4w52ss3he2kse6tzwt64pr62yvrcb72lgvrb63fup6ea
irongeeks.i2p,ecduxoion5uc5hnvzjxff6iiwhdwph6gse3dknyvlo7e6gaeho7a
-ironhawk.i2p,d5c3tbjvsyvlqqnkgofvssmdr546ccjfcy3c7kaeniu3hwhacewq
-ismismis.i2p,5bgjw3l4unhq2suqjosefozpbxlqfcb2ebuqmfh4awazgp6hr44q
-isonomia.i2p,dkuoddjlafw436wathmwvubtxmfxe22gpqglgytwsaukdnh5aa3a
+iscofsi.i2p,enjgdxs4um2dmhdb2ajff2egrdijkjji3g47m6unb74swbrqsddq
isotoxin.i2p,wue3ycaccf4texikza3fh6p5yrmtgnooisuypnepo5mo67lmpcqq
-itcooky.i2p,fpprghfrrwc4sbvnuzmnruk2es5mhhf7gkh3jha4cczwd2rl7sgq
itemname.i2p,o35ut7hgywy35okvgkjkv3ufzv2ejv4luap4oytwbyy2jqy6u4vq
ivorytower.i2p,fpwrfvidfexsz7dspofkwtkmmizm7lyralfz5kvykffk7gubvxsq
j.i2p,kjxvohlsf5sdrzxzfcrmvquccnoevi6ytbl63mstsru5wt2dx3ea
jabber-2.i2p,pvnmzgemetkwcuvt45omgowmeznwk5xw3nc3ygeoz7yekqxy57na
jabber.duck.i2p,rhdzvvzraqzzm67zpyegb7knpfrjeffitixqzeyymdoz56uh2rtq
+jabber.i2p,32dft3x7pnwmgmc24yzl22r7kevefk22k66ms2dssd4w3skcgzqq
jake.i2p,v2axvy6pqefnla7gun5fmqs4lqe4xfyqovgzcundhxrpcdvfd7cq
jar.i2p,2fthkmujup3xiiu3yple24n6g4emzdiiimbuqwvpdddtsr3c4nrq
+jaruga.i2p,bcqiblik2ccvhnjzammiujiluqzp2wz2bggp6o2vxmtivpmtq5nq
jazzy.i2p,ha5c3zafwkt6mwqwjcf4oqwvbwz473652ljjadiwrj4gfkfkjofa
jdot.i2p,kw4jr5qw4bhnj33avkwankjdh3zi7wtahlmgkjwvsv2isskkzgpq
jhor.i2p,c6rnm7oemydhuwzmhwwwxphkzanez5rnn7fkcs3lpgu6gkgtssoa
@@ -531,304 +344,205 @@ jikx.i2p,aazr55itvyns4lwppvx5njyx5tjdwemw4w6jbmpegdunznod2ieq
jisko.i2p,jxgfvr663uhr6m65hrgkscshysfshkq32ywdubc4ed7zda3e2pca
jmg.i2p,oglpnq7zungdukmk6gk5fzj5jp6wibuoihqgks453wztrwos4ggq
jnymo.i2p,nbfplxgykyfutyadlfko2rmizdsxox2pee2ahboj5mju4s3putda
-john000doe.i2p,5u6jikwqg445gd6uhmmc547qv5yrreuxevjyub5bsla6rxdpjknq
jrandom.dev.i2p,htynimemonyzqmn76gworxyfkmqtsa7zcprbrd3i5cxqqm75tuzq
jrandom.i2p,dqows7dpftxxl2bd4bgcpkck6knrysdun6mtqy4ms5dxobbvg3ja
-jrrecology.i2p,qxi24gpbum3w3kesuxvheyu3p5u5o6tuvoypaolub2gnvbld57xq
-js3.i2p,wlcagt4vcjzux45dfnvjlj6pyt2itkz4xlyrc733lwnsiub6x4ba
jwebcache.i2p,xdffxnxtjd6ji2zig3cgva7igvl2tiapyjoc7ylbzwqhxudbmvfa
k1773r.i2p,zam7u6vslhemddz347uusuzjdk5wma4h5hcmcqlng4ybbpdbjhnq
kaji.i2p,z5ic7gvm2k4doczphtrnrspl2w5sfbss2de4z3ihjijhtjw67ydq
kaji2.i2p,4lscgc6napekfx7ay5fdcjofeja4fnl7tqcd3fek63t4saavur2a
-karman.i2p,zkx46wwkic45cquosj6mnzrtzeyjpic26fxw4mwpq3lxapigkf2a
-kaufmich.i2p,xkbkyfgsfvbqhpcofqzwv4ekhyadrjzlrszghjajvv7uuyad2rsa
-kehaar.i2p,awzzfuvi7rrq3ue2qoiuso5n6s2cgm5zevsycg6qv7tcipok4eya
+kellett.i2p,cmhgn2lsgvfrhrgo5l2fqxkzpngrl2potp2v3jw7juti3jrr2rhq
keys.echelon.i2p,mwfpkdmjur5ytq4og36ym3ychinv36b2a57f4rmgqmtrwepq3fva
keys.i2p,6qv4x7ltaxckd4vbay5s4ntqqflq4efk6oke2d5yzicqrmk443ba
keyserver.sigterm.i2p,isoxvnflrdn7cm76yjlfg5tbcugoito2hur7eidbqmo33xmwz5ga
-kha0s.i2p,pgyrawdmaysc7fqfi4tn4uziv4izekgcndlw5wjcsshbekuzizvq
-kibykarni.i2p,xowcvzbeq72slpbrwmjl3zy6xkrkb2ncctpkkskeqts63vedtg7a
killyourtv.i2p,aululz24ugumppq56jsaw3d7mkbmcgo7dl2lgeanvpniyk2cbrda
-kitsune.i2p,mubckotdo3ju3fof4z6t4hh6a6rhzmkexclh4vfhddfyo6tkqtta
-knotwork.i2p,2yocdbcjiyfaqgxb4l6oenrrrrie6nydgmbnbfulqg7cik6bozxq
-kobato.i2p,l4kzozq64uv7azieh2ggmsb22biqdv2lodbxbb2tlbnozyxfyzya
kohaar.i2p,qchpjehbhqjbxdo7w3m55jbkrtsneb7oqoxcr24qttiq6j5g3z5q
-korea.i2p,eadov57a3jaj5x73ljhaxxltifv7xboujbwkrxdx552cqfjpygwq
-kovri.i2p,j3hdkil4juppzdz2z3hiybauoagcq4rz3lcqygge5tmg2ea7vs3q
krabs.i2p,3yamyk5bgfgovg6zpvtvpdjk37ivjj2wog2w7wha5agzgxxkqaca
-ksafe.i2p,wdu5eqgh2p3j4qbmnwvtaquk2wqqeogvnjxh6oaxvtd4f3bwgfmq
-kunik.i2p,yyx5p3f2l6njgwjabsg373g3euyiyltkzlwpp73ks6xomuehau7a
kuroneko.i2p,wbit2huhhwlyqp2j4undccuyrodh6qcmzdeyuaoy5o4ym7g5gdgq
-lainchan.i2p,7rov2od4lmtfswthoy7tziiuixupugkrexpdvyso5yj5pgicxvga
-larvalstage.i2p,h6de62jrrpn7s7omf3y5n666fyzwyzolkctsatrgshgp4juozeja
-lawiki.i2p,ddwc3z7tm6yuvh4mzmqne2ifn7qglbz73zyqxtkewlpzl7kpmqzq
-lawiki.mirror.i2p,4bgtexyhrbl5n2ah65tcpkup6kkur2qmflx45seozuq5btuigtrq
-lawiki2p.i2p,dkb5f63obsb6wmzcgilebjvmgvw4wmcgzbkczu3sntgckmtzweza
+kycklingar.i2p,gctswdhp4447yibxfbqg3uq2bvx63qjeqnaoaux75zw73leakyva
lazyguy.i2p,ia6xlsnygorllplx2owokahtrkospukvsmysz7i7bzw3vejc4hdq
legion.i2p,5oirascyhwfy2tr2horw6mixozsre7z6s7jfq7qbnj523q3bkebq
-legitimate.i2p,rjeymxhm76gabjcsdggyjaeskttt2kxnu5cba4j66hpkep6nleuq
lenta.i2p,nevfjzoo3eeef3lbj2nqsuwj5qh3veiztiw6gzeu2eokcowns3ra
-lg.i2p,3xqs2da7pnsqzmxqudsiq26vu6fcmd4ok7nsdytwyovz6omrggla
-lib.i2p,nqolhhg7wtr3wyjsxszjhjgh45uztj3xlrtydagwi4fi7ftnbqsq
libertor.i2p,7gajvk4dnnob6wlkoo2zcws7nor3gunvoi7ofalcps5lc76wruuq
library.i2p,brqqaq44vbeagesj5o3sxcnkc5yivkwouafyxa77ciu7l644ei2a
-library.openaccess.i2p,a4kb6pcm4er7r2j35z4vmfdu77qkl5m42nqj5x3moackbscmnjyq
-libretto.i2p,pa2osj63tq57g56dfn2ql2yhxbn6pwe2vra6qw4prw3drny5di5a
lifebox.i2p,pyqjnycm55cuxow22voqj62qysrjdnb6nbyladaiaiirqi7vp2yq
-lifeware.i2p,3rqm2yt4dre3ztabc7pksgle7rqryd3y7hq7tontaq5iytpfruoa
-linkz.i2p,x3layud2n2p5doors6c3xki6jzxbtqqrqrwra3f3oh4ubbu2b2kq
+linoleum.i2p,wvxi6vdf3jv75k2ib3cdzjuai7gxsxh36faf5y4tlk2jwiy2unua
linuxagent.i2p,ap5riaikrjq2uv5qvy7klzhhqywvqi7wqscyipsewcun7w2eynlq
lists.i2p2.i2p,vmfwbic2brek2ez223j6fc6bl5mmouzqvbsch45msvyyzih3iqua
lm.i2p,yeyar743vuwmm6fpgf3x6bzmj7fxb5uxhuoxx4ea76wqssdi4f3q
lodikon.i2p,u3f67staiwhqxpacya3clmvurdwd2kp7qcthzhstqnhrmlwc2g4a
-loinen.i2p,fhlhdpvi6mag7k3ojtmjcwbmkkvhdz5qidjepdcjfs6mkgia425q
lolicatgirls.i2p,a4lzmjyba7aq7hl6okqpds7znnwymolqnr7xhvno2wraqb7uhfla
-lolicore.i2p,houswh44wgppohpcr42jydnsqrngvwuwqs2z6jjoh3letwfg4tna
+lolifox.i2p,7fd2clkiotjnaoeigdtxlkkb24eik675ovezjf67x26ysham4zca
longhorn.i2p,pohcihzxzttjclrazhs3p76wt3ih737egb5bovqb6ym3du6z3o7a
-lostfaithinhumanity.i2p,xjv2xlfbipbyjptzgisescucanns7txvovq3ibntkc2cgzttftha
-lotnv.i2p,ziwehd4aooxlcdoixbb6xxlgd2s3snmalffca3pzwc6tmuf2sftq
-lotteryconnect.i2p,pic52h2sghmghyx4yhv3jmfwshslzumqbgc3dzlqjjxaekdbo7ua
-lowerorbit.i2p,s247h5gshsjab2yoviei7bftr37r7hrdqaljjgxnheivbs45pona
lp.i2p,jiklbujn3cbfikf4pca526jgmorx6mxhil3twqmfoteaplx6ddwq
+lua.i2p,kq33wpfdocw6sf5r3k36723tgjodb6csjnrthdsul7gsnmtay46a
lucky.i2p,wx36m3wnpt2y6bngdpg3ifrarvtkpwnluarx377bllpgvkuhybaa
luckypunk.i2p,y4t6cujjxnnrtln3rgmfbgbh46hic7wkef57krd7opitbgngohka
lunokhod.i2p,3yc6sp7xic4grmpfecbwuij6z3dp5kdgoo362pszaco7io42mnwa
-lurker.i2p,jb3ac7svh77v5e7p4wlrsex55anfio623ny3y7syzmdz4x3shcca
lyra.i2p,xfinw5aapff3ajbm3vnk4t5wor3lzcuwtq73rxz4yb7umlnmyl3q
-m3w2.i2p,pe2yxmkgemhg5gbum3guhagf7jj63injfdezus5sfmulnvddt5iq
mac7.i2p,3yjowssqzydciwa5zx55kazgf7q7w6g7rkocr7bngy35ii44t34q
-madfrog.i2p,madkultsfghzjsdbfi6qk2s5s5oqsuz5agg7jeiymhjdyywvgtuq
madman2003.i2p,a2sam2xbhxbzmeyobphbxrkdwlppoerewq5qvibbyk3ftsr643qq
+magix.i2p,cgfnyxv62msfynsfbv3kju22j2mt6tfnopshhmrcmpcrxyts6xwq
magnets.i2p,snz46nez6hrrpg6336neinflw56l3vwatk6bzzytwu77xmsfsoca
-makeworld.i2p,pcvzbhbqendkprcj3qfb35cgnmnqdl4bm573gixltdaxz7hifpia
+make.i2p,yr7r4o4ijrz5w4movfmfsn3yrlox2mjofrgiartn2qna7us7pd3q
manas.i2p,6qolj62ikkoq6wdn3hbvcbdmlvf2rcyv432kgi5uy7mvrczmjtba
-manofperdition.i2p,wy3gcnlkpgirkqnlv6gdo3jx6sh7wqxxudi4cklhmfvytojvxoya
manveru.i2p,pbmbofs76wpjnxi55eqtwg4y6ltyij72o4fm4sxfjol3y57ze5sq
-mapkin.i2p,tgvm3kgikmjxadymcwvnzt7wqxku7vse2nkoyuccho5accsmpsta
-maps.i2p,bve2bhqp3r4kfsdzmfrp7pue2osanqlwamo6mqqpzhn7vr7a4gaa
-mara.i2p,6ejek6q35k36gwvt37wli7abnlatjmxob2oe7rhl7rz6bexxknqq
marcos.i2p,vpo36bsil2voqaou53zshuegssqaroa5mbrzxfmhjywlbojckalq
marlin23732.i2p,wfpkmtqz5fzlkh4wpft2aei3itithbhthp5peyavx6zn3napipgq
marshmallow.i2p,svdqd6j3y3gwryufcl4fkzpmcujgvrvphvk2oy4r7m75xs327e2q
me.i2p,dbpegthe42sx2yendpesxgispuohjixm4bds7ts5gjxzni5nu6na
+mediabox.i2p,fpymagqfyjdcel3cddrj447fgic6ke3aztfkpwsg24gefoc62zvq
meeh.i2p,4oes3rlgrpbkmzv4lqcfili23h3cvpwslqcfjlk6vvguxyggspwa
-mei.i2p,ta6fwpneavr2lzwrguwx6y6v4l7ttjbih3eclkieblrogqvwl6lq
mesh.firerabbit.i2p,3x5wokr4bjy5z3ynji4fyhvwzv4fvgry3xafi5df5h75doezjytq
messageinabottle.i2p,avfhe3kvrrv7utxn2vre65lg7damxzzsewq3vukwie4llitd254a
metrics.i2p,z45ieamhex2ihqv7oowk5fz4qq47rbvxhhhbaaiinpajbhuevtpq
-metrohttp.i2p,lqp2pley42h2yxg7clrlnbacpq7kq5qnunln6wrtaab6u3vf7iea
microbleu.i2p,mtapervgibruizniems2yyr47pin2wpysyh7m632rigl26vjc6qa
microsoft.i2p,hvaqr5idszdyrjph34amb4mjosqd3ynggoxlnj7ciqhnx7q6plza
-mig.i2p,6npfff3ensyo3hcfqtkf3wcbbz3mp4vstrwcgor7g4apsdsvb73a
-milf.i2p,5qjobqgbnfe2lfl7jy2qjzoj4u3vazppadkzjeibcjpktho7akxq
-milis.i2p,73674l7jzhbkzzea2df6xhhqmkv5fzshex7ubkkp4clhlug5urua
-mincoop.i2p,wnhe3mehjos6iowxt32o276soshvyxra7gqj6hhyaeulzilq63ua
mindisl0st.i2p,u7rnqhvsuyxd3fabm4kyzn7brgz3i3cporj2emk2jmbpcmltyf7a
mindspore.i2p,uuh5dd3y2rqa7x2jpggm4p2pg6znarm5uanwsvybe4tk36ymwr4q
-minecraft.undefined.i2p,oynvlg4vyyvzttklbccgktj4xkbx5w4pah2bnjrqjtvy3jrghhba
-mirknig.i2p,daambhdto5cn7lhnb32l4laankzv55jpprlaghw2nxscvsyqifoa
-mirror.i2p,dfcysmvxvovmrhipxca3q4e3quz6akc3ls6q2zzputvo6sv4fcrq
-mirror1.lawiki2p.i2p,fzeuhovlrmtqim34337hqn65tsfiz6sxpo7ehfg7lnkqyaigx7ua
-misaka.i2p,4r6wonyrpjnuz6kpa2whyrbp7osfks6p44xrd4ucp2n7w4l5y4uq
-mochimochi.i2p,nijkdoagv343xps2pm5z2cjujz6pmrozrokrcyhhz3aeje3tfzqq
-modernmarx.i2p,tl3y4p7fbeycjymio4fj6zyr3n3gqa2cbk3jdvqgoylkbqhlhbgq
+miraiex.i2p,mbdyxyxj4tliyvcc54xknkyg7ficigoyvfnfesevr64nytr33tiq
modulus.i2p,ctz3o6hdefrzwt3hlg6rjhdcbjk6irppbndq32u6jnn4lz72f62a
+moeyoo.i2p,co6oemqjwvy563l7gar7ybb4nva3k6mnifakyk6bt4idfr2kjwka
monero-build.i2p,wc7qzr43g2o33wsluagjhhd4rvrcx7h5hhhtfwl6i42kk3iuouja
-monero-repo.i2p,rrhjp2h4665m2vydnqetyz7h4ic267woyneguczbz572nmtygzza
monerotools.i2p,5bal7dngxde2ddmhuzbtfken6w5nmxmixtjlrlmxt3wbhnemv73q
-moneroworld.i2p,dyuij25b2gxzq3hfvobwmrtcrdel2nuorntpuyngwr2lvv2kv2ma
-moonknight.i2p,gza3w4cf5pvdbvuah6fpop54qtg26m4n3v7ogn2u6thwvqfm4s3a
-morket.i2p,aofuard3ltrd4h7uq6qp23u3f35dxjbi6l4xfc6cfe7swljtzx2q
morph.i2p,iovyp2dao5rta6g5v6hke2s4ugx2btkpcljddak2yhxfrx3l4dqa
mosbot.i2p,5bhmrp43mjwlzf4x64xgdrkwmw4luvng6eq5waa663a7vnkp732a
mosfet.i2p,s5ynkgagndmpxpf2kmnenv4x72io664gzd2x3qef54ilammnte3q
-motorcycle.i2p,sfmytaey7ssmxsnvvgjw5q55ptnzqqnegfiq4topy6gxbkewcf7q
moxonom.i2p,gcjdrvnlobgexh7ebv276pwmnoj3yoyaqm3w4vmmdha4lgxfinqq
mp3.aum.i2p,n7bmu5dwux7f6gedmdik6zrm77bnls4lkzo2vo3bf4bwegk7vkjq
mp3.tc.i2p,w3ied5s7ldjcvnhxu2gyofe3oogzbplkyxshzfkhspiy2526snsa
mpaa.i2p,m6cqnglo7xlytwxkdsmwf3d23d6lq5r446c3tktb2tdmuah36zya
+mr-fox.i2p,kjxtkdcqqde2fvtrhrkpkpejth4vt2cudavqdjhnuglhlboups4a
mrbamboo.i2p,tmpmkx6wlbbrgsnexrqlrib7laoegpbfeop7bnyezegii7hecpxa
-mrbyte.i2p,6swunwgixw555gvpgehunlkyhovbbpjkz46v5wupiwq33ninjofq
mrflibble.i2p,u7k2qcmkrril6yvudvwxjqz7k3dzgp3jdejjjeapej7liselj3eq
mrplod.i2p,fjn5hxtybxyfyvdf6u5v5seg2sjd47hb5by6sa6ais4w3xnrxwyq
-mryuk.i2p,razf6cyxwygg5um3zud4zjvbc7pholxrma7jbzxinn4ewncv72da
mtn.i2p,xisk3h6sku3iqj52uriogaajmnku7pwjux7wa4omx2zloamuw6eq
mtn.i2p-projekt.i2p,f52x5fp6uhq53f5zle5d6rq5un34xgmxgazvilvmzcby37xcmsfa
mtn.i2p2.i2p,l6kuhtmgvbp57d7jwalj5nksi6nr4gfzbz4oit62lxgipb3llt5a
mtn.meeh.i2p,h7ylrsuzzynrxp3jql7anoozyqblavj7eqces6o3wngvuuxhs2la
mud.i2p,qcjtmicd3ow3q26iwcs62m5zu3dceu6emo3afezulh4c3fsgrkia
-mudgaard.i2p,yz32lk42gtoesknesfolq3tt4erxxcejcote5pontaeqev3bj2kq
-multiserver-console.i2p,fiuhzll4uw2xlkwtzw42o5ouhtj42y5ifpgajcxsgj372nopieua
-multiserver-torrents.i2p,hvtf7lw3kmtozlripp6kzhxzkbeorcg5pwmrfmeey2xohfzsnv4a
-murzilka.i2p,wu5ukmavxtb5334ncr6oi5a6fqutpurhmhzqtgl5ktkhycgq4s7q
mush.zeit.i2p,dk3sg23kljawxqp3cb6xz5mnzjlyckzvq5jhqs5gnvdsv7wqn6ha
music.i2p,akamh76yi6p7xxbvl3qv3yhaockne57yfuh77acogbgpjmwypvia
-musicfile.i2p,vyp42nsgzhb4wuf4rraeu2dd574cc5goskxcwh75uokqn4u3z7yq
mysterious.i2p,p66g2a4nzfkvidd3l7nwphcnfa3ttyu5kiolcb4czec2rn2kvwsq
mystery.i2p,ccea4jybmr3xbfiykaoagfw7ezbvzyhtg44x2jgwhv7wscsxaa7a
mywastedlife.i2p,ceumy3puvvsrru5bmfmtgsajsx5qyehqac7l7a23xpwtfs2bvcgq
nacl.i2p,bm2fib3tumer72lopjh4nmqomwvqu2sdfyb2hmr6lnk7jbw3vvia
-namesite.i2p,2uviv3enxrtwvrysyuzomh7yccvfnmryzzyqddzcyh7aqlrwo3oa
nano.i2p,ex5ssv7s3hj6jp7hvadxfw3wvbjbvnczxr4pbk7qw26ihiorjmba
-nastycomics.i2p,npws2lm55kcrdfk4fkaynxqzihduegwm5hlomhmhkaolie27vjrq
-nazgul.i2p,m6hx3udcpiabcx4mm6z3coqyyyjihkrypwrn7du6lum4wpnvvhsq
+nastycomics.i2p,rq4nabt5yzlkqfzqc7aqh6dex63pf4v6ip6tunb24jkqsh26ez4a
neodome.i2p,5hkhjehj3ct2pvcah7dcylwef2oti3xij5myxbv3pd7rocio5vkq
news.neodome.i2p,trhwcnygfkeqjj6g4xhmrdp4gsjqsye47lsxshbmwbten4ywt5oq
news.underscore.i2p,rl7t3kspoktuatjcu7gf7xleu7y6biibs4fspzo24kll6n7hbq4q
newsbyte.i2p,gsk3rgsejxxrfabjxu5w5plplxsu47aoeoke22vvhlwwllzosnxq
-newua.i2p,sl4dw7gpg3ravvmz4fsmj3mweaxyqpqdmb2aadqcxp3vozm4ticq
nibble.i2p,jmdxcpdzqafedn3clc4y7u6o56qocfiffrzbzncmtggqtio5qjpa
nic.i2p,vzu5ymab6klevpcdudv4ypisjqaznmt44e6lcg7dwiuza4saibxq
nickster.i2p,zkwsa6kvq2wdhovw5g5wqakpb7rlaylyhfriwmurots5pvwbqauq
nickster2.i2p,eofzi7npzpk4p5gb4qper4hmwgxo6kepo3dheeblakewedxj2bwq
nickyb.i2p,gmpxk4tje7mnud32kg2kjmf36f6cpwqakzc2dxuzjnnz4qr5w4sa
-niconiconi.i2p,p5h4klccaaldvphjw7fllgj3x5tfy7thqnqu5yr6py7dofemeqiq
nightblade.i2p,p4gkon7ytswxrbwkl7vruw6mg7kfw5aofovqjgt4c7tnqmbq6lha
-nightfort.i2p,6vth72b6i65jjbjvxvqxgsydpoy2i3hvn3rjcp73pvdm3l5xwevq
-niipp.i2p,uiob477tc7uktrfmj6tvkf6uq62xg2olwdys2vzzki2mbmwxtkfa
nine.i2p,gniusiswp2zhjwh6bxdlyzk2ocg2cx6xxjwcmih4mohjs5sokqsa
ninja.i2p,q6dg6hlb3egzdqz352ri5rc4fx4gcrdeu3tpiyfxlv73yfjgrhya
+nisankhacharjya.i2p,63env37dvsdtbcwh3kcskfkln7awly7hv42io6vsi6g4gmepqhma
+njust.i2p,gz7a3bgarghus4xaf4t7fgqvklrdwixxfzyexqrzp7g2b4cq6x3a
nm.i2p,3itdpqzyn3ii7sivppo4sxxwhvgtpskzkbokrdibim6gqpvlw5ya
nnm-club.i2p,xkk5fzxdmjra4xlijoa43h5cfcbusdjc6dbfplulvouxdbztokwq
-nnmclub.i2p,bntvsagecjxyrdpl7jshdrbh5m52gq7xt7sdtwxijofjwxrnae3a
-nntp-overchan.i2p,mqllejokgwjpp5kc2bl5x3alormjefpgvmosvf3kvzs2mhmddpta
+nnmc.i2p,7xizivpjkrpkb76x3yf2yktxscax3wf5vrpofwqgp3wcrnuru53a
nntp.baffled.i2p,kc6muo2tih5mttbpzecteegvtonuysjidk3emcy4cm4yifzild2a
nntp.duck.i2p,gvzzor4utsqxswvf6jaglfks7yxudlz2s326ftrk56i4lpd2s47q
nntp.fr.i2p,npoztnqadfnu4vrokoh6rusoi3yne47s6jurc3lzhcrzzia5eqva
nntp.i2p,wwdzmeyler4djegvyt2bxmkwrckfgg3epkkwowyb75s47he6df6q
no.i2p,lpsg4x4gdrf7antxcdy47cl6abcqei5ommgzt55retq7go5ku3ba
-noname56.i2p,oiyoslismzyxuw7ehxoigmtkdj35idim6flmlplddxuiiif6msfa
-nonick.i2p,rmzbmxr4nrsbs2qewmmcbld4qjhzkgnjh7c6qgusvwm2wn62zvqa
-noone.i2p,6w73w226acl4csyhancwk5jcxp5hk7dqosf5uo5d5bfvq57osboq
nop.i2p,ssag45lathm4gqp46si7c4w4tioyvjpcza5uvz5x2zuljnplylca
normal.i2p,j5fex634r2altzb3kjvu35qekt2r3hgsqzg5qxoy7dp53heu5pma
+nothingburger.i2p,tesfpn757ysc7nih7mxher2b3jstkc3l5fhfcyb5kxhzhvv52trq
+nothingspecial.i2p,wzrwqrp52bilqijrlboclynuev4kzpjzfzlvzl5aqxqt5fdnpbga
novospice.i2p,ukqap24nwac4gns77s4zy7j5cagt7l7syb5zo7eukfg3zn5gg5qq
-nozzlefish.i2p,qdxnthwyzynzl6kx2gbo2nkibyjhlpbieymz5gd7tfcu6voltd6a
-nuthxorzcl.i2p,d3ywc3epzry6kox4d74hmncd2jkovsscr4swwmu6wedb5k6hlaea
+noxan.i2p,yses7dxf262wxdwq4plpfv4eu5vb3pqijjkqw77ee3craudlefvq
+nsa.i2p,nsetvbclpomqxfcit4mghn6z7vdhnza6jdzczby4crnto32uykga
nvspc.i2p,anlncoi2fzbsadbujidqmtji7hshfw3nrkqvbgdleepbxx3d5xra
nxt-wallet.i2p,33pp74k4ivy67z332qpyl3qlcqmi6gxqumrow4bldkblxxlxqq5a
-obmen.i2p,vodkv54jaetjw7q2t2iethc4cbi4gjdrmw2ovfmr43mcybt7ekxa
obscuratus.i2p,i4j37hcmfssokfb6w3npup77v6v4awdxzxa65ranu34urjs4cota
-off.i2p,vvnuaoqhasmed44ml7oc3mew6y2ge6wrwpcn4w7ugz4y4apbg2na
-offair.i2p,7iyu7qscmm6gjmoqwuaadwto6bave2jk4gqzo7zgfnsw5ffwx6ya
ogg.aum.i2p,wchgsx6d6p3czloeqvna2db5jr7odw4v4kqrn4gr4qiipfyrbh5q
ogg.baffled.i2p,tfbvj2xal6lcuxv3hzuw7cw4g3whguombcv2zuotzvul4qtrimgq
ol.i2p,bnb46culzbssz6aipcjkuytanflz6dtndyhmlaxn3pfiv6zqrohq
-olanet.i2p,ymcs6sgtayeu72okqhxwstu6a47lkvzoyupifmfnduncrat34sbq
-omega-i2vpn.i2p,vjrjbpibj5hampiaailvhunltcslp7wxdz33a7isqvmegyabkkmq
onelon.i2p,irkvgdnlc6tidoqomre4qr7q4w4qcjfyvbovatgyolk6d4uvcyha
+onhax.i2p,m7i6oe4i3bygx6pn44vn22pgf5kzikw7edr2y5t4cpe5gnqpt3ta
+onhere.i2p,vwjowg5exhxxsmt4uhjeumuecf5tvticndq2qilfnhzrdumcnuva
oniichan.i2p,nnkikjorplul4dlytwfovkne66lwo7ln26xzuq33isvixw3wu3yq
onionforum.i2p,yadam2bp6hccgy7uvcigf5cabknovj5hrplcqxnufcu4ey33pu5q
ooo.i2p,iqp5wt326fyai5jajsa3vkkk5uk56ofn4anocgpe5iwlpisq6l7a
-op-faithless-electors.i2p,mrpdxxpafr6qrfgbsd7abhx4tnfi4373mpwv7iughasxgpdeglca
-op10.i2p,s6cjjt6zbikp4rj7ayprfp5b5zhom6nl35k6th65dtbzh552uwwq
opal.i2p,li5kue3hfaqhhvaoxiw2ollhhkw765myhwcijgock5rs4erdqdaa
-open-opera.i2p,r6enzfd6egyrlslcqaxbaw7bsvopsou54pa467bemooufceqp6ua
open4you.i2p,ice6ax5qrzwfwzsy64bctffj6zlzpuzdr5np65zsxlbt7hztyc6a
-openaccess.i2p,a5fjpssbkv7h6ygjugkfucyitx267y45cvgh2ygeo5cvurs3wdgq
-openarea.i2p,nmju26n2m7tyqbuis6ghykekrslqmpfwd6fspd4lvm2riqmtojnq
opendiftracker.i2p,bikpeyxci4zuyy36eau5ycw665dplun4yxamn7vmsastejdqtfoq
openforums.i2p,lho7cvuuzddql24utu7x6mzfsdmxqq7virxp5bcqsxzry2vmwj5q
-openspace.i2p,uy65dhftzexjgdncmpa64i4ndt3ztua3oq3fm6fxeenjqaqq4upq
opentracker.dg2.i2p,w7tpbzncbcocrqtwwm3nezhnnsw4ozadvi2hmvzdhrqzfxfum7wa
-opsec.i2p,rlsjbyy5beucaiedaggyo2tpbq75ituqwnfx4a4qghyifpdk3rra
orc.i2p,orcnge47kqnpdj4wb22bg6aqcv5v6yu7kmjf5ll3htvseiqayntq
-organizedresistance.i2p,kpspvipmqbfe3dft2sgl27km5ncalvugpphewnyde3yyup6q5pca
-orgasmic.i2p,yf5hcksrso2dj7etxonum63ijmk2gamp6m3ql3xpxh4q4f35afsq
-orignal.i2p,vrff7piadf5coa7za5r5zzu6pa5pfs55mza4yjz6g3veranbew6a
orion.i2p,5vntdqqckjex274sma3uqckwqep2czxs5zew25zlntwoofxk3sga
orz.i2p,oxomqkekybmyk6befjlouesit5mhstonzvzd2xnvsk7i6uyrqsfq
-ot.knotwork.i2p,cxhvvfkbp2qbv5qojph7zb46molpe2ffanghnerjag3xdmy6ltxq
+outproxy-tor.an0n.i2p,hpa7ojiz6wdjowwpaegzuczmufnaydggk5qw7vj6utakggkcd2kq
outproxy-tor.meeh.i2p,77igjr2pbg73ox5ngqy5ohzvrnur3ezqcogtl4vpuqtrcl3irsqq
outproxy.h2ik.i2p,nwgvfpfarpnyjjl4pwsxr2zdsppcx5we3kos2vlwicbiukopgaza
-outproxyhighanonymous.i2p,tujgzpy4yq3yoenbgybivrvsrzh4cmj67j2j43kik55dnpqlbhcq
outproxyng.h2ik.i2p,v32zse2zczzgegelwxbx7n5i2lm2xhh2avltg76h6fz5tb53sfxq
overchan.oniichan.i2p,g7c54d4b7yva4ktpbaabqeu2yx6axalh4gevb44afpbwm23xuuya
-p2pm.i2p,s7555tvon34lg5qjsp7w6vflqnsq65ms4wzdslow4crm3r4ochea
p4bl0.i2p,lkgdfm4w6e2kkjhcdzr4ahhz26s3aunhrn6t2or436o73qh4z7ga
-p4p.i2p,cdnb77zmuqudreubv5trohs5mx5qkg6rmue3wvkfcqmccpeciloq
+pacman.i2p,hlkzt7mbciez64gf325u5ko3353hfxseblbj7bu4loti3lk2zfha
pants.i2p,xez3clscjfafkqwk6f473ccp3yvac4kh6rdp6dptwxa2lhixizgq
papel.i2p,mxskjqntn2d34q4ovsnd5mud7cgde734tdjldd3lt4hczh2645zq
-parazite2.i2p,s2kgme5ye22woyzlrxbpoo63uzxnnlohmy3g4t6mdcnugvbiiieq
-passive.i2p,bncpjc4pylcdqezu5j77hgsqldpjzhfzt2lvwtupyksdy652ekea
passwd.i2p,ojugl3kbejhzcmyq7x52ms5lraxsig4ofkhvbgzleraer4zczroa
pasta-nojs.i2p,dkkl3ab6iovxfqnp44wsjgqaabznvu7u3hugpzyagbeqlxgvx3la
+paste.crypthost.i2p,2zaj4u4s4l3lgas2h5p6c6pvzr2dckylkrh5ngabursj4oh25ozq
paste.i2p2.i2p,b2gizskfea4sjxlw6ru2tb6kdrj47dsjc77cijsf5mzh4ogbmfvq
paste.r4sas.i2p,csen43keji3qiw6uobsgzysxyjd225g6446ylq5uuz6ur2glkzaa
pastebin.i2p,mnicncxrg2qqi55qftigiitaheugnj4rpysbk7zabdrirgktelqa
pastethis.i2p,erkqiwnjl7vtysqd3wvddv6tfvnhswarqkbn4blhdlhfxn7cf2ha
pdforge.i2p,wzeg3ehf6d2mqjqji3sd3rns776thvhe2vam2r6gjlmsqis2dctq
-pelicans.i2p,m2ob4u6fm7kayiy7dbkdtwnf4ssyalmvsh2ik2jjuc72h6fvgpha
-pepepaco.i2p,kkbfftddfu3qjk54k2kw3f5v4jfmqqr5jvrrj4mq3zut2jitb3xq
-permalink.i2p,vq5jx5cnmwu2bbvcwkv435i6hxb5qrhidaqmrpcurbqckm7mwxoa
perv.i2p,f3k3wm4ae7t7ottfjd4hu6is7zsls73izl2gm2qynzficxcdsiwq
pgp.duck.i2p,wujajyxj3cgsfsbtr3g7g7npv5ft3de6pcstxlav26zq6cxdjmha
phonebooth.i2p,noxia7rv6uvamoy2fkcgyj4ssjpdt4io6lzgx6jl6wujpufxedrq
photo.i2p,fqhuy77ugd5htnubzkyy5guvwboqn6goahtmn2g7feewvdj7k3iq
-phpsadness.i2p,7kjaywpkfmfg2xshgnebdv2g3pz345s4ih2livqk27dp6tc37daa
-pictureframeofthings.i2p,x76obr2xmp4s2feg25xoxs3fs2odthqeyyluqu4rq5mflj6jqo2a
piespy.i2p,vzusfjzcu5ntnvobcvyzc4dcu4j6ommtnpmba2puk3kexgdzrl7a
-pinkcloud.i2p,ah2vd6gmhkaivoshix56pxe3myk4yu5llug76wpzmjovojdn6tia
-pinkpaste.i2p,o5zdq6iuire5eatwehhhylj7vbsdfedhm7wkd2hoejh7wxwfbqnq
-pis.i2p,xwgyr3pqaxx6aromrhm266ptcigcegggosk4h4khms2g23cddbtq
pisekot.i2p,7yzdwhy723fodqz4onp6k3nyvixra2sa6dl45tcblhmyoa7i36nq
pizdabol.i2p,5vik2232yfwyltuwzq7ht2yocla46q76ioacin2bfofgy63hz6wa
-plain.i2p,y7f3c5s2n44j5pnsxncqpasluv6k7i5jtnhjfs5mfulcgcas6sqq
planet.i2p,y45f23mb2apgywmftrjmfg35oynzfwjed7rxs2mh76pbdeh4fatq
-plazsekta.i2p,ha25hr5qvs5eclqt4bq4fl4w7dc3p3d7cfbstkglcv4tf645lfxa
plugins.i2p,wwgtflbaa7od2fxbw4u7q7uugmdclxf56alddvizugwcz5edjgia
-plutonia.i2p,iisguuyvimvuwbrtehk2ufxxabimaz4ckx3jasbrnrb62ivuy63a
-pmail.i2p,4vuq2eku25cehr6yk5ly7ed2j2atliwhpzwnibxk7lpguunzk4ya
-podcast.i2p,yxxlvtvuiopr4u2rnk5hydkol6tf2kzv7izp34jz7q4orewzqsoa
-poladoircserverhttp.i2p,ir5qee4pzze3x7ztf5xs6dvhfkoawzkcmq4v6wicrvev747lcspa
polecat.i2p,het5jrdn35nhkanxmom5mjyggyvmn2wdj2agyqlrv4mhzhtmavwq
politguy.i2p,6dkkh3wnlwlr6k7wnlp4dbtf7pebjrph5afra2vqgfjnbihdglkq
pomoyka.i2p,omt56v4jxa4hurbwk44vqbbcwn3eavuynyc24c25cy7grucjh24q
pool.gostcoin.i2p,m4f4k3eeaj7otbc254ccj7d5hivguqgnohwelkibr4ddk43qhywa
-pools.plazsekta.i2p,ima2b6s3yjyvkab5qycexgsnkkvrhg57awjln4ctz6a5au4thqcq
pop.mail.i2p,bup6pmac7adgzkb5r6eknk2juczkxigolkwqkbmenawkes5s5qfq
pop.postman.i2p,ipkiowj7x4yjj7jc35yay3c6gauynkkl64gzzyxra3wmyhtfxlya
-ppif.i2p,gl4xn7yfnboymeiv6dwpc6y6gafaz3k56ee3cryf4zl6buvrhcua
+popeye.i2p,pbvpqyrtxe65flkry32fhms4ztq5y5yh4i6mecze53ykqk36wzua
pravtor.i2p,2sr27o5x2v2pyqro7wl5nl6krrsbizwrzsky5y7pkohwh24gn6xq
-preppers.i2p,nv3zav3qgmpc5bpdp6zdtlkgcxtb4h6w2ftg2ocg27btnoy2tuiq
+prepperse.i2p,tjyy6zebjp5ckkkriqcwv5vlrgyhs3wohzngzqmh6brrqo7ewiuq
pris.i2p,ahiwycgzuutdxvfqu3wseqffdnhy675nes57s4it2uysy5pxmz6a
-privacyhawk.i2p,qnfdfjfrcycygz5p7drylkv6pde7b5ehxemefjt63blqtal4cpaa
-privacysolutions.i2p,4m626tvfr4skzunz7tri6oti3alinbxnoglnvqeqmf4mwvdzyaeq
-privacytools.i2p,wfewiqkdt5bvowfp3igmkaksjvcvwj7bag2smqpqyu5x4hges2qa
-privatebin.i2p,anyvefii6vwgyrftdgzcqgeonjzeeje37ypt5ipf4tym5edyvdha
-progrider.i2p,t6aaazt7qrlw5z2ehlyddwxooc2jutmd5frxy2nq3v43dkuunnnq
+priv.i2p,h4asmxnsw2xz2ve43qt22mhoua7icerhx66ujog5msk6cretnaoq
project-future.i2p,ivqynpfwxzl746gxf376lxqvgktql2lqshzwnwjk2twut6xq7xta
+projectencrypt.i2p,lduaunhyg2ohkqth7srhwitnosnaq2dajfafgkhtvz7esluh7mha
+projectencrypt2.i2p,fiiwjpya6gewxnzw3n2s4uc3smfe5cty4ujyaf5p65kwjmkoggwa
projectmayhem2012-086.i2p,ehkjj4ptsagxlo27wpv4a5dk4zxqf4kg4p6fh35xrlz4y6mhe4eq
protokol.i2p,f4xre35ehc5l6ianjvt3zcktxkjlyp2iwdje65qnu2j6vurhy6nq
-pseudopolis.i2p,ungmgjs2w6dmugyc73k2tppwebp5xxeiw37xbbxmmxuyxz7nuwsa
psi.i2p,avviiexdngd32ccoy4kuckvc3mkf53ycvzbz6vz75vzhv4tbpk5a
-psp.i2p,2nfqfabeahfl3eeqxuum2sapzfedu4kkyydivlqjmp5ipvvqvmzq
+psy.i2p,s3elzoj3wo6v6wqu5ehd56vevpz2vrhhjc5m6mxoazicrl43y62q
pt.hiddenanswers.i2p,o5jlxbbnx3byzgmihqye3kysop5jgl3unsrkmurbtr2nrnl2y74a
ptm.i2p,7dna5745ynxgogpjermnq26hwrqyjdlsibpjfmjxlwig247bjisa
ptt.i2p,q7r32j7lc3xgrcw2ym33wv4lfgqbez7vtm4lts7n34qfe3iygeha
publicwww.i2p,oitoja234mwfbeuhtuibnxn6hd5v4nbtf7oxfgdhk5igrg6wkiqq
pull.git.repo.i2p,3so7htzxzz6h46qvjm3fbd735zl3lrblerlj2xxybhobublcv67q
push.git.repo.i2p,jef4g5vxnqybm4zpouum3lzbl6ti6456q57nbyj5kfyldkempm3a
-py-i2phosts.i2p,3tex4wm37lbtnbjolege3yiopmfi3ahj65vu6kmnjhwzgrcyf5ga
pycache.awup.i2p,w45lkxdnqhil4sgzanmxce62sv3q4szeowcjb2e72a5y5vbhm4ra
-r.i2p,pqajparec44p74uvpxvxhpd5u3neuqs2t4awwd6bcieku3juhwwa
-r0b3rd.i2p,bxnj37oz3lsuraivx7axas5e436aqxgir3u4mxfbsb6njvtl63ma
r4sas.i2p,2gafixvoztrndawkmhfxamci5lgd3urwnilxqmlo6ittu552cndq
radio.r4sas.i2p,cv72xsje5ihg6e24atitmhyk2cbml6eggi6b6fjfh2vgw62gdpla
ragnarok.i2p,jpzw6kbuzz3ll2mfi3emcaan4gidyt7ysdhu62r5k5xawrva7kca
-ratcat.i2p,lmur6cgjp2txuaor4zso2w6tvg54btb7iup552yp6qvnrlvw3rzq
-rblcom.i2p,dysjyfzd3pd7i6lp54mt6hv33xpdvcblvr7nnzy7bfc3lyo4vaiq
+ramsay.i2p,svezv4xrp4l57ankyhu6qisd5jnk423n7oa5as3zd2554aaz6lkq
+rasputin-sucks.i2p,fdozdbyak4rul4jwpqfisbkcx4xbrkuvf2o5r6fd3xryyrjgvjiq
rebel.i2p,nch2arl45crkyk6bklyk2hrdwjf5nztyxdtoshy6llhwqgxho5jq
-redpanda.i2p,3wcnp6afz4cikqzdu2ktb5wfz7hb3ejdbpn7ocpy7fmeqyzbaiea
+red.i2p,fzbdltgsg7jrpz7gmjfvhpcdnw5yrglwspnxqp4zoym3bglntzfa
redzara.i2p,ty7bt62rw5ryvk44dd3v5sua6c7wnbpxxqb6v4dohajmwmezi7va
reefer.i2p,4cde25mrrnt5n4nvp5tl62gej33nekfvq2viubmx4xdakhm5pfaa
-reg.r4sas.i2p,shx5vqsw7usdaunyzr2qmes2fq37oumybpudrd4jjj4e4vk4uusa
reg.rus.i2p,k2r2wda4eavt4hoq5hptprqfmixusirq3gi5bl3z2pqzcd6felwa
relatelist.i2p,utrer5zgnou72hs4eztmk37pmzdtfw3d6s23wwl7nk3lkqpzbdiq
-rep.i2pdproject.i2p,rexmpwqbkjzietrp6aabxdih6ek2imqhrn6hu3crym3mqce2v5zq
repo.i2p,uxe3lqueuuyklel23sf5h25zwgqgjwsofrqchhnptd5y6pedzbxa
repo.r4sas.i2p,ymzx5zgt6qzdg6nhxnecdgbqjd34ery6mpqolnbyo5kcwxadnodq
reseed.i2p,j7xszhsjy7orrnbdys7yykrssv5imkn4eid7n5ikcnxuhpaaw6cq
+retrobbs-nntp.i2p,fkyzl24oxcxvjzkx74t3533x7qjketzmvzk6bwn3d6hj5t7hlw6q
retrobbs.i2p,mnn77stihntxdoade3ca2vcf456w6vhhvdsfepdvq5qggikvprxq
retrobbs2.i2p,ejff7jtyaus37slkwgeqrrcmyhpj26carp7n27f5h6s5vlbeiy6q
revo-ua.i2p,hpojpumki22xjwhmhe6zkiy44oanyn7u4ctcfe3in2ibwm5l32hq
@@ -838,143 +552,108 @@ romster.i2p,eaf2stdqdbepylt53egvixdi34g2usvgi7a4oixsja6atkran43a
rootd.i2p,mzbe5wofwn7eaqq4yefrmxizqaxoslwqxrv5qcv2opx5lnhg64dq
rospravosudie.i2p,z55khrnlj6bzhs5zielutm6ae6t2bbhfuiujwlrp3teubqyc4w7q
rotten.i2p,j4bm3rvezlejnb44elniagi5v2gazh7jaqrzhbod2pbxmgeb2frq
+rpi.i2p,56p5qxsrvo5ereibevetw2qbj5bronmos7wxunku27g2s4kpbnlq
+rs-freenet.i2p,jhpvnnhfrozore2wlhi5m5bzggz5jcz5uwhou4w62ylkewtoxqba
+rs-tor.i2p,zv2etzurnqjuuajmeb5gg3sjhfdcotxvlae6igxbfyahkjhhsx4a
+rslight.i2p,bitag46q3465nylvzuikfwjcj7ewi4gjkjtvuxhn73f6vsxffyiq
rsync.thetower.i2p,w4brpcdod7wnfqhwqrxyt4sbf2acouqfk5wyosfpq4mxq4s35kqa
ru.hiddenanswers.i2p,o6rmndvggfwnuvxwyq54y667fmmurgveerlzufyrhub6w3vkagva
ru.i2p,m7fqktjgtmsb3x7bvfrdx4tf7htnhytnz5qi2ujjcnph33u3hnja
-ruanonirc.i2p,epownolfv227hhzogufiieiofi53za3qctgim7xobsevvntuxiqq
rufurus.i2p,7msryymfdta3ssyz34qur6gi4jyfkvca5iyfmnceviipwu7g2wca
rus.i2p,gh6655arkncnbrzq5tmq4xpn36734d4tdza6flbw5xppye2dt6ga
ruslibgen.i2p,kk566cv37hivbjafiij5ryoui2ebxnm7b25gb3troniixopaj6nq
+rust.i2p,xbl2dh2qugfgoobebkvkjje3ovp5owhqdlu3l4briiqnhyuihjwa
rutor.i2p,tro5tvvtd2qg34naxhvqp4236it36jjaipbda5vnjmggp55navdq
rutracker.i2p,ujyqbawolalwvdpy33v2wjuaspnu4ym3fsl3fd6mldjblzzqlvlq
s.i2p,bnpc454fvuzqk22ywguqb4m4vkhrcfj3pydrbfw4esqklymd7t3a
-s01.0chan.i2p,v2ymvk4suxl2zghx6bhjn3yz32echagnxqwrkklul4iynmoqydrq
-s02.0chan.i2p,znn2mmwnypu4hrwo75nzoibe5dzj6napwcmzzic5yqty7wnqfyya
-s03.0chan.i2p,af2penimq2z3xprlnhpzkssc45bplfg73osqjcfezobgnwqcqfcq
-s04.0chan.i2p,kpxqwmwciyz4q7dfsawmgdotwrv525cmc3n5cet3je4ngtact37q
-s4src.i2p,of647qmuhpfo42hlisedifu5jydihyd22hshtynsjf63p736nrwa
-safegram.i2p,a22lv2ls2qg3ilx7znjy5ojwpiobttvvmbtkh7xn7iqh35a3kadq
salt.i2p,6aflphlze6btsbez5cm4x53ydrmwhqrkxsud535d3qjh4wq62rxq
-sam.i2p,w2nzdyx7ppkjg7alcehqymsxbg2rlwgqvhdcw6rpuwcfhhpntfqq
sasquotch.i2p,p6535uyfk2y6etc3t47vd3oqxydznqior5jxcvq5bdxe5kw5th6q
-schematics.i2p,tv7tcsa2gdzw4zj2yepmvsv22usouaqdgilerd54gbbooyucn6kq
schwarzwald.i2p,4gokilzy73mmudufy3pohgatm42fcstx7uzg5hjvnfyphxpnphuq
sciencebooks.i2p,ypftjpgck75swz3bnsu4nw7rmrlr2vqsn4mwivwt3zcc3rxln5cq
scp.duck.i2p,ghbpsolpnveizxu4wbs7jbs2vj3kntnsexfcdleyhpqdhfpxleda
-scussuni.i2p,f6mb7qcd72i3e4hec57nvysifeza5lmklhokpkrf554avv7johvq
search.i2p,nz4qj6xaw5fda3rsmsax6yjthqy4c7uak2j3dzcehtkgyso4q46q
searx.i2p,lcjxhuo5lbrol3e5ijj3ga4gdhhelzdyslc7bm4blw6jy6cx4p5a
-secondrealm.i2p,ykkgrp4u6kmcqiyefiahcbcc5bxkutwketp4n4dmgkgawwitcolq
+secretchat.i2p,cl3j2zxhpw6u6jevny45i557ojhwfxn4g375nnuqhy6lp27mry2q
secure.thetinhat.i2p,4q3qyzgz3ub5npbmt3vqqege5lg4zy62rhbgage4lpvnujwfpala
-securedebian.i2p,qewoxexwtvub5xdwpzqaj6mofflymidpojzppmqcyiqoi5mwblla
seeker.i2p,ipll7sit24oyhnwawpvokz5u7dabq6klveuqpx3sbi6o5qemy2bq
-senorcontento.i2p,g7f7vufsaam3yoehrb5s5lyq5g57zk5nxayqqczhxjxi7jfxlqna
-sentralintellijenzeigency.i2p,kqq6r6z7twhz5nmqpy3hdqo5iifzaz2urker3zscs7m5mt77llta
+sendyourdreamswherenobodyhides.i2p,jvdg3yqjqthtcfjitzqdp2cc3zjloit46xafprevl3bhpeqxf5pq
seomon.i2p,5mvpsy4h45w4fx7upen7ay3vkrs5klphz5nptmtcqvc3fsajsm4q
septu.i2p,5lqvih7yzbqacfi63hwnmih57dxopu5g2o5o4e2aorq7bt4ooyra
serien.i2p,3z5k3anbbk32thinvwcy4g5al7dmb75fagcm3zgh4rzrt3maphda
ses.i2p,5qfoz6qfgbo7z5sdi26naxstpi2xiltamkcdbhmj6y6q2bo4inja
-sfor.i2p,75kjzjxnxiwcqlygfv33ev7b5dlriaagtau2enrikxcde5yit23a
-sglg.i2p,5sybuxmdtmzseu5svpitrm3pvxcfjdz7lzwyajih7sd65yjbt7qq
-shades.i2p,ydgygpmvypw2liyqvldnv7v36etddvpr6ndwiheoc6n6ybhqt4fa
-shadowlife.i2p,jme44x4m5k3ikzwk3sopi6huyp5qsqzr27plno2ds65cl4nv2b4a
shiftfox.i2p,wpvnuzslu7hjy4gujvnphtyckchdoxccrlhbyomsmjizykczyseq
shoieq3.i2p,3fjk4nfk3mccch4hdreghnyijcvovsi3yucjz3qzj5sxngqk5j6q
shoronil.i2p,7shqzgmb6tabiwrnwlasruq7pswy2d3emvfhaitehkqgod7i62sa
-sigterm.i2p,5tuw3uj6x4p5xousgqg53ygbsi5ixozxnnkgzzwdqlhtoe2fbzqa
silc2p.i2p,wt4mvbvnpqniywcpkrrjubvcwyskskujxjkhk24xmhrojdeisoja
-silentbob.i2p,yskw76bdsncszta3cp7cs4kcj3fub5h5i6zshvukoxnwjxoqln3q
+silence.i2p,v4oc37covf4tze2wjhtgn3xkpgg4cx6oam44xvnpw2snhtvpslyq
sion.i2p,lcbmmw2tvplvqh2dq5lmpxl3vnd5o4j3bdul5moa23deakjrso5q
sirup.i2p,aohdp4yajnkitrtw7v2mo3sp7swuqhjfwlsi5xwd7dudzftumsma
site.games.i2p,zeuczucfxeev3k7tvqlfcdpfbnqggheiknyyb5r2q4utn3d2auja
skank.i2p,qiii4iqrj3fwv4ucaji2oykcvsob75jviycv3ghw7dhzxg2kq53q
-sky-rc.i2p,hzd4piu7ds7rggelc3qiuy5hhe2guzdw7orjcwykehx33kyyjjja
-skypippo.i2p,puuscuxwvt7b4fsfth56mcxx2ghqudqaakycy2l6yetp2iccclbq
slack.i2p,gfcsh2yrb2tx7hyvmobriv52skz7qoobn7n7y7n6xaehhh4rpbja
slacker.i2p,wq7m2wdguzweleb666ygv3bmfhha63zj74rub76vfesbyhsyk6iq
-sleepwalker.i2p,d6x3d3yyck5etn4qao6kcucbqnlshyrrgfinhleruhmoho7rkztq
-slump.i2p,pzo24fb6lfum67ovmyjd32ohthy7h35tk2puneqeilndtyr44mfa
smeghead.i2p,ojf4czveeuekxqkjvkszvv7eiop5dg7x2p6rgfzl4ng4xrjk6lja
-smlr-torrent.i2p,clwvfegt2avmf3uyxkojtbdalbsf3gahpf6rjxjn5l7l7aciyuhq
-smlr-tracker.i2p,nhha4d47uddnb7lvsjxk4dxd7jcqenuixh3c3rk4t7gwfqyxxlsq
smtp.mail.i2p,kdn7zx7fgoe4bn5abaaj5cb3e4ql22fklb5veui5yajpj4cxapya
smtp.postman.i2p,jj7pt6chsziz6oxxnzpqj7mzhxm2xfhcrbh7dl3tegifb577vx5q
-snowflake.i2p,tjo44eqilj6ygjl7etqzvx7gopkrw4jvcea55qlrkotpq7pzmvsa
-society.i2p,d6atkbmzbvh3tqflgieqe6pa2sma5x24q2nsz6mzdl3x5qhzreea
+snscib.i2p,x2jvcrskymvnfxnrtpji5orivskmltl3ochad4cedxe4ceklc4va
socks1.tor.i2p,sifawcdexgdmoc3krv46pvvz74nzd6fkju2vzykjxsx3egqsb6wq
-somosanon.i2p,gaekqon34xidtzqyzsgirq3lkv3avclo22v6464w6hjuf4bwzkua
sonax.i2p,jmuxdhlok5ggojehesfjlit2e2q3fhzwwfxjndts7vzdshucbjjq
sponge.i2p,o5hu7phy7udffuhts6w5wn5mw3sepwe3hyvw6kthti33wa2xn5tq
squid.i2p,r4ll5zkbokgxlttqc2lrojvvey5yar4xr5prnndvnmggnqzjaeoq
squid2.i2p,hum4wlwizbsckbudcklflei66qxhpxsdkyo4l2rn256smmjleila
-sr-ocho.i2p,7my7fc6glh2mwxtdup33gni3gzwycu7avsg2paschpcj54c7n2ka
+sqz.i2p,3jvbwc7sy4lnhj25nj7yepx7omli4ulqirnawv3mz6qlhgokjgzq
ssh.i2p,xpvdadaouc4qr75pteymyozc7mcsynjfkuqqkkla542lpcsqionq
-startdash.i2p,q7ed6xshnz5y3ch634rqitshg6cmsknqwl6nbkrpwmcaq2db3wba
stasher.i2p,6ilgpudnba4kroleunc2weh5txgoxys5yucij5gla6pjyki4oewa
-static.stealth.i2p,vwzhvxtomztdzg6wkzsz7iv2snnjzcfcka2ujv3kd7qq6bkw4dnq
stats.i2p,7tbay5p4kzeekxvyvbf6v7eauazemsnnl2aoyqhg5jzpr5eke7tq
status.str4d.i2p,ycyyjo3psqbo45nuz243xvgvwnmzlanzqbzxv3kh6gyjztv7425q
-stealth.i2p,wa43xn4jws2oy34i4wazuolaiknghow7zdhvnlnw2q3qtq5tnf5a
-sto-man.i2p,rg4eilfpe24ws6nctix63qw2dlvd2tqgwdcgdxzji6l5bc4dc7aa
-stoliczek.i2p,2gj54r434fvpbzf3opbqnshrdew63qa3sswmbwvgfpqqul65do6q
str4d.i2p,wrrwzdgsppwl2g2bdohhajz3dh45ui6u3y7yuop5ivvfzxtwnipa
stream.i2p,prmbv3xm63ksoetnhbzqg4nzu2lhqdnqytgsydb7u3quxfrg7rna
striker.i2p,4gswsrfpbd44hwjoj33jbqfbwzxfkwpuplb3ydq5zm7nfu2pxvdq
+studentbookshop.i2p,d2ejfxjt3n2nsj6hlkepwjgxua5jg766znrxz65d5eixsmiwvr3q
subrosa.i2p,g3lnglrnoual7wyabnwwv37uwhadgbxiqz36pf3f5cwfuxsx4mxq
subterra.i2p,vdmhe4u26unzgd7ysq6w36ubjncms5wzbhzr2gq576sq4xut5zwq
sugadude.i2p,yzjn76iyqard64wgggfrnywkxi7tbfkw7mjhpviqz3p2dguey4yq
+suicidal.i2p,yfamynllow5xiqbbca7eh5xn733wtnuti5bi4ovc7dwycntqmiuq
+sun.i2p,33mt3psjrtauk6wzt35ke7w4bkyizesnsjlal45fbosja2j5i74q
sungo.i2p,h67s3jw56rwfyoxqxj3fngrluybsgxc2meendngkehzqowxnpj3q
-sunspotblog.i2p,mwtki4x66lgadduuvmtbrgwm3vteldo7tv647ls7aopljxwpi4va
surrender.adab.i2p,jgz7xglgfgnjfklrytyn427np2ubipztlm5bxrtbiucayglukrta
susi.i2p,qc6g2qfi2ccw7vjwpst6rwuofgzbeoewsb2usv7rubutf4gzqveq
-svs.i2p,zys6mammgvbu7h7n3gxp4dxnxs5u3u3giadgrq7vthjq5lwnkntq
syncline.i2p,5kcqmhislu3lmr7llgmdl72yu3efhyriljdc6wp774ftpwlcs5ra
syndie-project.i2p,xa63tpfoaqt3zru2ehxjjfbpadwj4ha6qsdvtcqtyr3b7hmt4iaq
syndie.echelon.i2p,vwrl2qmcif722fdkn3ldxcgz76df5cq4qypbndzthxwgmykyewta
syndie.i2p,7lm3yzpuejhpl4tt4l7o4ndqlu7hgijohofh7oaydx7q7kelenbq
-syndie.meeh.i2p,tautkpuqt3qa2u66ghprubljks4hkfvopvrjjtec5etanz5xvlba
syndiemedia.i2p,4lrbbblclodhobn3jadt5bf2yab2pxzoz4ey4a2cvrl44tdv3jma
+t3chkommie.i2p,o5avgwuwjdyefw4xddn77jxaljs5gg3adg3gnpu26s2hijnrfvca
tabak.i2p,y5o2vwb6kart7ivpnbpk4yte3i7kf2dsx7fy3i6w7htqtxhmbzia
-tahoe.fatsvin.i2p,jf2g5hus6gp2jfgk7zgc2cxtzeedxbstr3ju374amtoaq6p2ax6a
tahoeserve.i2p,yhs7tsjeznxdenmdho5gjmk755wtredfzipb5t272oi5otipfkoa
-takepage.i2p,aavaxdlgfm5cn3ztircmotdmzb4xd5fwyzmyhhpcukut7idox27a
-tandasbackend.i2p,trodg6o522t4ywcijvdoxpaeksnunvya33xbbsesd4ophhvl7lwq
+tbofh.i2p,lmj2gu6d27pgrknbxxsyapjxnlprau4ayamcam6csljzlupr2rtq
tc.i2p,qkv2yk6rof3rh7n3eelg5niujae6cmdzcpqbv3wsttedxtqqqj7a
-techno.i2p,dx444pxqxytqdltutvjdydrasvta3if4djptrojidgenxybcauaa
-tecsoc.i2p,kng3ri7scfoqdogy6pkschn5son2ls7z4kpwgnosi7zknit7lr2q
-telegraph.i2p,iai263cdubvmfedc3uxedt4tzula62nnbjaxeeyqhaahgemmm4wq
+telegram.i2p,i6jow7hymogz2s42xq62gqgej2zdm4xtnmpc6vjcwktdxpdoupja
templar.i2p,zxeralsujowfpyi2ynyjooxy222pzz4apc2qcwrfx5ikhf64et7q
-tenic.i2p,lkvzspewzfbk2mfo2mionmlxzdzuhypzkddwk7exxcub3re7njsa
-terextools.i2p,3yglb32qhjlrettzgdlxi6o4hpe7jwxpxkfmkmf6bg3cwcbmgk3a
+templeofmetal.i2p,cwtbmqx3cg7ae3jcrzgjzwcilpypnyz2biojrn4ca7ry5gukaixa
terror.i2p,wsijm6aqz4qtuyn2jedpx6imar5uq4yuhjdgtfqumxbqww47vbnq
-test.tino.i2p,fijhlcnzjnkxmmclua32nlgohd3kfxbwboltkjcdlhmcoaxcir6a
-theblackbay.i2p,kmo6ainnf2k5begl66qqq7mh3nteb3kki735mc5memnurw5pmrpa
thebland.i2p,oiviukgwapzxsrwxsoucpqa47s3wt6nfuhfjxvgbqsyrze2mwrda
thebreton.i2p,woutbsflcrlgppx4y7ag2kawlqijyenvlwrhbbvbkoaksuhf2hkq
+theclonedome.i2p,jyezrlobwwbhar2xbntf2d64yugcje6z2d3oxb5addyho72co2gq
thedarkside.i2p,fxt3z33nzkrg5kjrk7bp5vvmu7w2vsn4i6jo6cily3hsm6u664ca
-thefilehub.i2p,fsojgg55w6vvpzcuw3e7nflmhublfdlb3mspnebuvjwgrvdwcz2q
theland.i2p,26ppxbseda6xmim37ksarccdb4q5ctdagfmt2u5aba6xjh452zsa
-theslackpipe.i2p,hxw6ncycnyd7gttrsnushggmcerozrfybsqqvxe4h5casbck5fxq
-thetinhat.i2p,udvz7opxck6knhsww5ii6dgufbstxzctilwnenzhw4iaxfdeia2a
+thematrix.i2p,kgh3va66n5fqrtlhqsen2km6x7k2362hn5edk5o5q5dcr72nnajq
+therealprojectencrypt.i2p,vrdaftozwabkzy26adg77adhszpyil4xbswkogbituhkhsl7tlzq
thetower.i2p,3xqa5nype64y6fxgqjq6r5w2qpiqftoraj2niebumseat4cj654a
-thewanderer.i2p,d5mautqn2zrvq3ex3caoeihljurp7y2amf6bdicttyozra2ysrha
-theyosh.i2p,ixd2ygz4xnfwu6cajexlguit2t72wdfpevgl5bbgn5g37jkt5amq
+thisthingimade.i2p,bga2ae2ff3s5p2nskg2l37ns2ad6smczpvgjhm2olgxequogepja
thornworld.i2p,vinz4ygmodxarocntyjlfwk2wjpvzndlf4hxss2w2t3fk52oplva
+thoughtfoundryblog.i2p,beoipfwqq5ebx2ywh2rcjwi7th5diaax23mvktppl4gk2pddrf5a
tino.i2p,e4bfnhvaofu4s67ztcgiskos2mqyhskid64dvlqexxs2c2bno3iq
tinyurl.i2p,mc4oxv3v7dnyzpvok7v5qxkwtgjprgyz6w7x3tag4fipsen6rdwa
tipped8.i2p,5l2mzforxf5kok7ndc6m53nfxve75m5tozb37m6eg2xsaf6hdlmq
tome.i2p,qktkxwawgixrm5lzofnj5n24zspbnzxy4pvjm7uvaxvmgwrsuvgq
-tomsseite.i2p,pfs53432q5qwaincyjemcn6xfku6nhod6vzdukc7qoazya6rebpa
+tooman.i2p,auo7cuq4dovgniwojq5fbwyjuvmks3zv7aopu5f6onsckuihsdpa
top4ek.i2p,hm3fpmxchlvqc3p4atnu7igwbenqpn7f3czbptnnqataemputl4q
-topkek.i2p,3f3rgvhbiccckgsktvdwn5xifinpap32uwitlkvwqbpryecswwgq
tor-gw.meeh.i2p,ounrqi7cfemnt66yhnhigt2u27fkctbvct527cp2522ozy3btjza
tor-www-proxy.i2p,xov45rvjks5fe4ofmpblkj23bnwxgslbypbgvchbr7yul2ujej2q
torapa.i2p,eejqjtpko6mdd4opvntbpsuandstrebxpbymfhix7avp5obrw5ta
-torcache.i2p,fwzuwkk5pgnbhc2bl4ouqunznqifpnezj4vkfeu7kfxe3wvaania
-torcache.sam.i2p,sd7x44s4fe25eem44wi22hx55gcg3vvydmhckllvr5acdcfb3yra
-tori2p.i2p,6xonfs3xvpowy3rbhaezyhlyhct3ndm5eflspw3kwkuajphvassa
+tordox.i2p,3wv6wn3h5tr57evns5bgf2rbwivai7zhajlgt5fr3blxvp6bybbq
torrentfinder.i2p,mpc73okj7wq2xl6clofl64cn6v7vrvhpmi6d524nrsvbeuvjxalq
-torrezno.i2p,ewtlezlikyspoc5xq2hpnbq2utolvil6euz5wfe6vxjq5ofirh5q
torrfreedom.i2p,nfrjvknwcw47itotkzmk6mdlxmxfxsxhbhlr5ozhlsuavcogv4hq
trac.i2p,kyioa2lgdi2za2fwfwajnb3ljz6zwlx7yzjdpnxnch5uw3iqn6ca
trac.i2p2.i2p,i43xzkihpdq34f2jlmtgiyyay5quafg5rebog7tk7xil2c6kbyoa
@@ -982,7 +661,6 @@ tracker-fr.i2p,qfrvqrfoqkistgzo2oxpfduz4ktkhtqopleozs3emblmm36fepea
tracker.awup.i2p,dl47cno335ltvqm6noi5zcij5hpvbj7vjkzuofu262efvu6yp6cq
tracker.crypthost.i2p,ri5a27ioqd4vkik72fawbcryglkmwyy4726uu5j3eg6zqh2jswfq
tracker.fr.i2p,rzwqr7pfibq5wlcq4a7akm6ohfyhz7hchmy4wz5t55lhd7dwao5q
-tracker.h0rde.i2p,25jvwmgenm3erf5f2uaapephpqijwrpuyer2oovvl37dpjv72hja
tracker.i2p,lsjcplya2b4hhmezz2jy5gqh6zlk3nskisjkhhwapy3jjly4ds5q
tracker.lodikon.i2p,q2a7tqlyddbyhxhtuia4bmtqpohpp266wsnrkm6cgoahdqrjo3ra
tracker.mastertracker.i2p,tiwurhqvaaguwpz2shdahqmcfze5ejre52ed2rmoadnjkkilskda
@@ -992,61 +670,40 @@ tracker.thebland.i2p,s5ikrdyjwbcgxmqetxb3nyheizftms7euacuub2hic7defkh3xhq
tracker.welterde.i2p,cfmqlafjfmgkzbt4r3jsfyhgsr5abgxryl6fnz3d3y5a365di5aa
tracker2.postman.i2p,ahsplxkbhemefwvvml7qovzl5a2b5xo5i7lyai7ntdunvcyfdtna
traditio.i2p,wkpjjloylf6jopu2itgpktr45t2xvpjijxilxd5tq4i7wkqgwhhq
-transrants.i2p,kyhfice4vw3jn7k6tgbipxgdd3ifmulwcwfm5pwqu7nsuahc3c6a
-trash.i2p,tmuf4rit5kv2z64ttdb7vg6gijceo4ijmvpjlwqr74h6vczoklua
-treason.i2p,cuwirmyojwrer65et3cphhqpr6hdh3juyyar4b6mlshrfewuzs3a
trevorreznik.i2p,wc2z6o5fxm2saqzpfcawr63lejwccvzkysmgtfudkrigqopzfdma
true.i2p,pdilhl5vmefyzrrnmak5bnmxqxk2pmw7rpy4f7wbaeppqu2vvugq
-truevoiceman.i2p,ae4xaz7bv76wwkuggdbz77ejb2hjgotganyo6bkpayzqukvxsaoa
trumpusa.i2p,vopyffqj3il2uapcvfxq2zkcdybf7ekmpvnrt6d4dbeuecbvs2ea
trwcln.i2p,evml6jiiujhulsgxkdu3wcmkwbokxlv4is6w5qj46tp3ajz3hqzq
ts.i2p,nebcjgfx3f7q4wzihqmguwcdeopaf7f6wyk2dojw4bcuku472zxq
ttc.i2p,wb4tsfyvfv4idgrultsq6o7inza4fxkc7dijsfpncbx7zko4cdlq
ttp.i2p,uuczclxejmetohwf2vqewovx3qcumdfh5zecjb3xkcdmk6e5j72a
-tumbach.i2p,u6pciacxnpbsq7nwc3tgutywochfd6aysgayijr7jxzoysgxklvq
tutorials.i2p,zy37tq6ynucp3ufoyeegswqjaeofmj57cpm5ecd7nbanh2h6f2ja
ugha.i2p,z3f3owc72awbywk4p6qb5l2mxgitvs6ejztggbpn2a3ddmymfjda
uk.i2p,vydbychnep3mzkzhg43ptewp242issy47whamfbxodc4ma6wc63a
-ukraine.i2p,msk6mls32w6nh65r7ke5bjozf2r3z563ti7iwewts72jtkxhq4oq
-undefined.i2p,ui33hsq7r3vhh3l3lu43n3b7o7icf5mympp33rvsyi7mrbbwygja
+ukiyo.i2p,ytd3loo226pogdcx3ajdtew6vl5rsidppqzh6phbo5vlmigdxclq
underground.i2p,dlnuthb6tpw3kchlb7xoztyspy4ehlggjhl44l64vbcrulrfeica
underscore.i2p,3gmezyig6gvsjbpkq2kihoskpuqpkfrajmhhm7hpyrjuvtasgepa
+unqueued.i2p,3gvn4kwd7z74jxc2sn4ucx52dpvpscxbzjluux3ul4t3eu5g64xq
up.i2p,25it5olgdo7pht25z6buzd32sw7jvc65oziqeuocfozfhgua655q
update.dg.i2p,iqj6ysfh3wl26m4buvyna73yhduifv523l7bwuexxak4mgldexja
update.killyourtv.i2p,gqdfg25jlqtm35qnmt4b7r53d6u2vep4ob23fwd42iyy4j6cvdqq
update.postman.i2p,u5rbu6yohfafplp6lgbbmmcuip34s7g3zqdd63cp27dl3nbd7gtq
-uprprc.i2p,j4xh4zamxxawkgfszyhmm63uximohqqbt5vtnwbdkaqn3eauesfq
-useful.i2p,h7jovk5wflhcpvulddundjbeqrwencbd5klplfutfnvwmgeykfaa
utansans.i2p,u2oyre7ygqv4qs5xjjijfg3x7ddwtod6nqwgbomuuzljzvnq4rda
v2mail.i2p,4gg7fykcqe7oaqt4w5fmlarnia7vtmwkv3h45zzgoj6o6crryg5a
vadino.i2p,aalttzlt3z25ktokesceweabm5yyhhvml2z3rfotndgpfyh6myra
-verge.i2p,wjpt2blspvkqzp6hcpv4u73j6ni4mxhbgh26i4qdhgi4w3xzq57q
-verifiablethoughts.i2p,htam5mq6teacna7h74dtmuyp6tjuzjogkgac3mwcypbvzz2enwma
-virus.i2p,zgd4u2vci4urne2bcvkqwk6wrutamfqggaj6nby2skn6k43mzp7a
visibility.i2p,pwgma3snbsgkddxgb54mrxxkt3l4jzchrtp52vxmw7rbkjygylxq
-vivaladedsec.i2p,2djqflzynva6g4ofxohzlxullzhzwb44s6hsrwrgj7wctq5aklmq
-vivalarevolucion.i2p,p3cvte4ggxzdomm5habok2ib3joowdqlphzx3y6tixylocqr4lzq
-volatile.i2p,q6rve733tvhgyys57jfw4fymqf3xsnza6dqailcdjcq7w4fa5m3a
+vpnbest.i2p,ov5f74ndsy5rfkuyps56waf42vxncufqu5rzm3vsnxkdtogccaea
w.i2p,j2xorlcb3qxubnthzqu7lt4fvxqn63it4ikwmze55yjkzeeampuq
wa11ed.city.i2p,7mxwtmala3ycg2sybjwwfil7s6dqck2fbemeutghhwu73rznmqoa
wahoo.i2p,vqe5vkpe5wbda7lwekcd2jaj44ar3rawgv54u5rcolezbg5f5vwa
-wait.i2p,slcobyp6eorbpef4qx7vb256du5p3uxdynisl6fhlrkyqv7d57fq
-walker.i2p,mv4vrczqpiq27qzzfdepefxhfkl7p45ep5nm4wvbh4i6cb5xhr4a
wallet.gostcoin.i2p,reuvum7lgetglafn72chypesvto773oy53zumagrpigkckybrwda
wallsgetbombed.i2p,tzhea5d65fllm4263wztghgw4ijdgibsca5xsecp6lk4xlsbdeuq
-wanderer.i2p,zhzpf7bugq3rspkjw46yjqhufqrontrdudq4fas5i47zttrn6xwa
webviewer.aktie.i2p,gvofjbuvkl65f2npmyyig6wmi4ryvzdyli2pj4ufu56vtabc5pmq
-who.i2p,ttzbmkgg4m6gntu37j2h37v2dwwssz4pkeu2onaqfqkwow4yyijq
-whoopboo.i2p,7i4err7ik6r5sno33sfmanmu4x7tsbqc6a7dmg3ijel57zhoosma
wiht.i2p,yojmpj3sh76g3i6ogzgsf7eouipdgdij5o2blcpdgmu5oyjk5xca
wiki.fr.i2p,lrqa7hw52uxjb5q3pedmjs6hzos5zrod4y6a4e25hu7vcjhohvxq
wiki.ilita.i2p,r233yskmowqe4od4he4b37wydr5fqzvj3z77v5fdei2etp2kg34a
-wiki.meeh.i2p,df47gapq2gftoy25cqoldvgp5v7c4aaz5x3exee6jdulun3tim3q
wintermute.i2p,4gvlfrdy2rkmem33c342tjntpvqik65wekcvm4275qbkuwotoila
-wizwhite.i2p,odzp77icxjf3xw662h43vjhzozyk3ug6qnjjprqcehrlz5zrvpsq
-wlrs.i2p,43j5ziu3w5bhlwaay53e5fbst36kjr44uerd7p4lh2mqsvvw5cba
wspucktracker.i2p,ubd2txda3kllumx7ftg4unzgqy536cn6dd2ax6mlhodczfas7rgq
-wvf.i2p,zzr4nntctf3u7piwqvbxvusov7v2wp6kwg5yxdegh2kjb3tbd4oq
www.aum.i2p,3xolizygkzkqrldncjqsb734szznw2u36lliceuacqnbs2n65aeq
www.baffled.i2p,lqrsfslwu4xnubkk2hofhmuvvr4dia2zevxefinbzdsjurvehtqq
www.fr.i2p,rmkgvlfwo3vkb3xrr6epoypxasdzzuilv3sckcqbo6c4os5jo2ea
@@ -1056,42 +713,24 @@ www.imule.i2p,657xcllunctawyjtar5kgh3wpt6z4l7ba6mmam5rf7hev5w2lsvq
www.infoserver.i2p,fq7xhxkdcauhwn4loufcadiiy24zbei25elnup33a3gfrdzrtlyq
www.janonymous.i2p,vosqx5qw22hwrzcgsm4ib7hymf5ryovsbtaexqrzmnzshy5bhakq
www.mail.i2p,nctas6ioo7aaekfstv3o45yh6ywzwa3vznrdae52ouupzke5pyba
-www.mud.i2p,rsp476ktqgewy6fadpotcxr7jf6shlu4zkbf5f2hvtvt3ye3hcxa
www.nntp.i2p,kly3o7zmetuwyz7xonnhttw4lj2244pkbibjz26uflyfte3b3dka
www.postman.i2p,rb3srw2gaooyw63q62cp4udrxxa6molr2irbkgrloveylpkkblhq
www.syndie.i2p,vojgy5ep4wffmtpjmpnbpa4gq64bgn4yicuw6qmhbm6nqa2ysrva
www1.squid.i2p,vbh3bltd2duwbukafgj6f6vfi6aigwso7snucp5zohnf66a2hkpa
-wwwasw.i2p,5i52aunacpixsenexdu4gk2tjc5fa7eurxedvx2osekwsxyt5hwq
-xakaton.i2p,ehue6yjbhiei7ihwas4aqyxeqcvj2ykgkv5wda7kia533dpgyv6a
-xecut.i2p,y5mbioxpa5gocffimnhjudv7lq5rggh4njkvovur7mrcmfcxxloq
+xc.i2p,mt45a2z3sb2iyy2mwauj4rwa2lwu4peanfy6gx6ybidwnbasusyq
xeha.i2p,oartgetziabrdemxctowp7bbeggc7ktmj7tr4qgk5y5jcz4prbtq
-xico.i2p,x7nppmjae37nh3n6l5btnrg3e655thnidbse2ts3tgarpuktyzwq
xilog.i2p,eoc5i5q52hutnmsmq56edvooulutaxfikddgdz27otmgtsxmiloq
-xl33tvill3.i2p,5u74czg4t3x7l6ttvn7cmuhpo3xlq4k2mlssedx5lxdehadoiriq
-xmpp.hashshop.i2p,kidikkdex4yesfmh6cymtoycgxukftqu5kbtsi67lw3nqocndpra
-xmpp.helpu.i2p,j6utejalk3mglymq3zaurbuxgpmiuoupr6px3lszy4mbreio7tfq
-xmpp.shades.i2p,csvynxul3xgddeoknc3ndqfkdymnmx6zwv2vqwwbgczu7l5ij62a
-xmpp.undefined.i2p,i7ihpnio5keiakl6i55ub26lxnpdo6yoguzikbamwhuoewi7e4dq
-xmppfree.i2p,axzxqfmir6ixkx6np5zh3uuzoca27beonuaxhxhwdl2xt7ufjzaa
-xmr.i2p,uxiiiqlehaojb2kcghjzzladdeg6wohubbz4pvhptkptjl6epjza
+xmpp.crypthost.i2p,ittkqpjuliwsdewdugkhvgzstejr2jp5tzou7p332lxx4xw7srba
+xmpp.rpi.i2p,3yv65pfwiwfuv4ciwtx34clqps6o2mc3vtyltcbqdkcki6untbca
+xn--l2bl5aw.i2p,d2epikjh5crt2l5xjmtceqw2ho44hzp6x3u7hgjrd4mi4wywikwa
xolotl.i2p,rwr6rrlmrotxfkxt22mah42cycliy2g5k7hgxyxkpcyyxkd2bgwq
xotc.i2p,gqgvzum3xdgtaahkjfw3layb33vjrucmw5btyhrppm463cz3c5oq
-xpx.i2p,oeesnqdgzp33rb4j5t3r2cik6yh4v4nantv2mfrh4cjk6zbxe6yq
xpyxpy.i2p,vwzdbqs7p4z5i6zob4gqrl7kejnkaxfo7haabowdq6tjqwltatuq
-yankie.i2p,2xezu6yhbzo46fd574lm7eeqwmja4vygu2pehft5ldiznbrk74wa
-yfambt.i2p,fh5w6sui6soh3upen75dkhs4ktgs4tat4yedhfrqm7gw244s25ja
-yfcbl.i2p,gq2k6uklykeoxhfkz7opvhe3zahu6jho42kvyhnpcywqzbzaecma
-yfus.i2p,ihpvzf4llwqmc2wfdsu2dxtxwvlhiqcu7vxhcvfujyq65fxjyv5a
-yo7vdz5evrktdl7a.i2p,xahfwygq6ozmhdxjsxqhv5vrh6o7lgw6dglklg6mnozc2dwivh2q
-yobyrf.i2p,suomfhdrqoedznx3dsc2vxve34bqm6j4broc4e5prgeysx4vu43q
yottabyte.i2p,zsdqh2ozauksuyeiaqypgcxus5ldmxgxxgz4yp76pglrjxzzu2ra
-zankyou.i2p,hfzprhla6lcy5xajwk4rr6v7yo6ykcuw2v2zfvdri7o7egie3ckq
-zazil.i2p,izvmzwxuy3geaq6dekhlvu3bo4aasavj24ekfnaqlhjsdwi7rvpa
+zab.i2p,n4xen5sohufgjhv327ex4qra77f4tpqohlcyoa3atoboknzqazeq
zcash.i2p,zcashmliuw3yd2ptfyd5sadatcpyxj4ldiqahtjzg73cgoevxp4q
-zerlina.i2p,lf4bjjww2gnon3qdk327yu55tgxu5c3wgi7q42irhq7pajhfnkaq
zerobin.i2p,3564erslxzaoucqasxsjerk4jz2xril7j2cbzd4p7flpb4ut67hq
-zerolag.i2p,d5om6pvuzfb7czbkxrd7gv22ejw5fzoa4wcwxzrpehg464w4p7fq
+zeroman.i2p,gq77fmto535koofcd53f6yzcc5y57ccrxg3pb6twhcodc7v5dutq
zeronet.i2p,fe6pk5sibhkr64veqxkfochdfptehyxrrbs3edwjs5ckjbjn4bna
znc.str4d.i2p,ufkajv3stxpxlwgwwb2ae6oixdjircnbwog77qxpxv7nt67rpcxq
-zootopia.i2p,evlpg2m7n3nnqtu3jjy52zxhglj52teqgl4cgei7egccxjg3shva
zzz.i2p,ukeu3k5oycgaauneqgtnvselmt4yemvoilkln7jpvamvfx7dnkdq
diff --git a/osx/build/i2pd/certificates/reseed/hottuna_at_mail.i2p.crt b/osx/build/i2pd/certificates/reseed/hottuna_at_mail.i2p.crt
new file mode 100644
index 0000000..d0ff7c3
--- /dev/null
+++ b/osx/build/i2pd/certificates/reseed/hottuna_at_mail.i2p.crt
@@ -0,0 +1,33 @@
+-----BEGIN CERTIFICATE-----
+MIIFxzCCA6+gAwIBAgIQZfqn0yiJL3dGgCjeOeWS6DANBgkqhkiG9w0BAQsFADBw
+MQswCQYDVQQGEwJYWDELMAkGA1UEBxMCWFgxCzAJBgNVBAkTAlhYMR4wHAYDVQQK
+ExVJMlAgQW5vbnltb3VzIE5ldHdvcmsxDDAKBgNVBAsTA0kyUDEZMBcGA1UEAwwQ
+aG90dHVuYUBtYWlsLmkycDAeFw0xNjExMDkwMzE1MzJaFw0yNjExMDkwMzE1MzJa
+MHAxCzAJBgNVBAYTAlhYMQswCQYDVQQHEwJYWDELMAkGA1UECRMCWFgxHjAcBgNV
+BAoTFUkyUCBBbm9ueW1vdXMgTmV0d29yazEMMAoGA1UECxMDSTJQMRkwFwYDVQQD
+DBBob3R0dW5hQG1haWwuaTJwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC
+AgEA21Bfgcc9VVH4l2u1YvYlTw2OPUyQb16X2IOW0PzdsUO5W78Loueu974BkiKi
+84lQZanLr0OwEopdfutGc6gegSLmwaWx5YCG5uwpLOPkDiObfX+nptH6As/B1cn+
+mzejYdVKRnWd7EtHW0iseSsILBK1YbGw4AGpXJ8k18DJSzUt2+spOkpBW6XqectN
+8y2JDSTns8yiNxietVeRN/clolDXT9ZwWHkd+QMHTKhgl3Uz1knOffU0L9l4ij4E
+oFgPfQo8NL63kLM24hF1hM/At7XvE4iOlObFwPXE+H5EGZpT5+A7Oezepvd/VMzM
+tCJ49hM0OlR393tKFONye5GCYeSDJGdPEB6+rBptpRrlch63tG9ktpCRrg2wQWgC
+e3aOE1xVRrmwiTZ+jpfsOCbZrrSA/C4Bmp6AfGchyHuDGGkRU/FJwa1YLJe0dkWG
+ITLWeh4zeVuAS5mctdv9NQ5wflSGz9S8HjsPBS5+CDOFHh4cexXRG3ITfk6aLhuY
+KTMlkIO4SHKmnwAvy1sFlsqj6PbfVjpHPLg625fdNxBpe57TLxtIdBB3C7ccQSRW
++UG6Cmbcmh80PbsSR132NLMlzLhbaOjxeCWWJRo6cLuHBptAFMNwqsXt8xVf9M0N
+NdJoKUmblyvjnq0N8aMEqtQ1uGMTaCB39cutHQq+reD/uzsCAwEAAaNdMFswDgYD
+VR0PAQH/BAQDAgKEMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNV
+HRMBAf8EBTADAQH/MBkGA1UdDgQSBBBob3R0dW5hQG1haWwuaTJwMA0GCSqGSIb3
+DQEBCwUAA4ICAQCibFV8t4pajP176u3jx31x1kgqX6Nd+0YFARPZQjq99kUyoZer
+GyHGsMWgM281RxiZkveHxR7Hm7pEd1nkhG3rm+d7GdJ2p2hujr9xUvl0zEqAAqtm
+lkYI6uJ13WBjFc9/QuRIdeIeSUN+eazSXNg2nJhoV4pF9n2Q2xDc9dH4GWO93cMX
+JPKVGujT3s0b7LWsEguZBPdaPW7wwZd902Cg/M5fE1hZQ8/SIAGUtylb/ZilVeTS
+spxWP1gX3NT1SSvv0s6oL7eADCgtggWaMxEjZhi6WMnPUeeFY8X+6trkTlnF9+r/
+HiVvvzQKrPPtB3j1xfQCAF6gUKN4iY+2AOExv4rl/l+JJbPhpd/FuvD8AVkLMZ8X
+uPe0Ew2xv30cc8JjGDzQvoSpBmVTra4f+xqH+w8UEmxnx97Ye2aUCtnPykACnFte
+oT97K5052B1zq+4fu4xaHZnEzPYVK5POzOufNLPgciJsWrR5GDWtHd+ht/ZD37+b
++j1BXpeBWUBQgluFv+lNMVNPJxc2OMELR1EtEwXD7mTuuUEtF5Pi63IerQ5LzD3G
+KBvXhMB0XhpE6WG6pBwAvkGf5zVv/CxClJH4BQbdZwj9HYddfEQlPl0z/XFR2M0+
+9/8nBfGSPYIt6KeHBCeyQWTdE9gqSzMwTMFsennXmaT8gyc7eKqKF6adqw==
+-----END CERTIFICATE-----
diff --git a/osx/build/i2pd/i2pd.conf b/osx/build/i2pd/i2pd.conf
index 5a46a78..dcdca1a 100644
--- a/osx/build/i2pd/i2pd.conf
+++ b/osx/build/i2pd/i2pd.conf
@@ -21,7 +21,7 @@ name = I2Pd
verify = true
[addressbook]
-subscriptions = http://inr.i2p/export/alive-hosts.txt
+subscriptions = http://inr.i2p/export/alive-hosts.txt,http://identiguy.i2p/hosts.txt,http://stats.i2p/cgi-bin/newhosts.txt,http://i2p-projekt.i2p/hosts.txt
[http]
enabled = true
@@ -42,3 +42,8 @@ port = 4447
enabled = true
address = 127.0.0.1
port = 7656
+
+[ntcp]
+enabled = true
+#publish = false
+#port =
diff --git a/osx/build/preferences/browser/defaults/profile/bookmarks.html b/osx/build/preferences/browser/defaults/profile/bookmarks.html
new file mode 100644
index 0000000..e69de29
diff --git a/osx/build/preferences/browser/override.ini b/osx/build/preferences/browser/override.ini
new file mode 100644
index 0000000..00d051e
--- /dev/null
+++ b/osx/build/preferences/browser/override.ini
@@ -0,0 +1,2 @@
+[XRE]
+EnableProfileMigrator=0
diff --git a/osx/build/preferences/cck2/chrome.manifest b/osx/build/preferences/cck2/chrome.manifest
new file mode 100644
index 0000000..b1b9a9b
--- /dev/null
+++ b/osx/build/preferences/cck2/chrome.manifest
@@ -0,0 +1 @@
+resource cck2 modules/
diff --git a/osx/build/preferences/cck2/modules/CAPSCheckLoadURIFramescript.js b/osx/build/preferences/cck2/modules/CAPSCheckLoadURIFramescript.js
new file mode 100644
index 0000000..806fb3c
--- /dev/null
+++ b/osx/build/preferences/cck2/modules/CAPSCheckLoadURIFramescript.js
@@ -0,0 +1,154 @@
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+const EXPORTED_SYMBOLS = [];
+
+var gForceExternalHandler = false;
+
+XPCOMUtils.defineLazyServiceGetter(this, "extProtocolSvc",
+ "@mozilla.org/uriloader/external-protocol-service;1", "nsIExternalProtocolService");
+
+var documentObserver = {
+ observe: function observe(subject, topic, data) {
+ if (subject instanceof Ci.nsIDOMWindow && topic == 'content-document-global-created') {
+ var doc = subject.document;
+ doc.addEventListener("DOMContentLoaded", function onLoad(event) {
+ event.target.removeEventListener("DOMContentLoaded", onLoad, false);
+ // If the parent document is a local file, don't do anything
+ // Links will just work
+ if (doc.location.href.indexOf("file://") == 0) {
+ return;
+ }
+ var links = event.target.getElementsByTagName("a");
+ for (var i=0; i < links.length; i++) {
+ var link = links[i];
+ if (link.href.indexOf("file://") != 0) {
+ continue;
+ }
+ link.addEventListener("click", function(link) {
+ return function(event) {
+ event.preventDefault();
+ if (gForceExternalHandler) {
+ extProtocolSvc.loadUrl(Services.io.newURI(link.href, null, null));
+ } else {
+ var target = "_self";
+ if (link.hasAttribute("target")) {
+ target = link.getAttribute("target");
+ }
+ // If we were told somewhere other than current (based on modifier keys), use it
+ var where = whereToOpenLink(event);
+ if (where != "current" || target == "_blank") {
+ sendAsyncMessage("cck2:open-url", {
+ "url": link.href,
+ "where": (target == "_blank") ? "tab" : where
+ });
+ return;
+ }
+ switch (target) {
+ case "_self":
+ link.ownerDocument.location = link.href;
+ break;
+ case "_parent":
+ link.ownerDocument.defaultView.parent.document.location = link.href;
+ break;
+ case "_top":
+ link.ownerDocument.defaultView.top.document.location = link.href;
+ break;
+ default:
+ // Attempt to find the iframe that this goes into
+ var iframes = doc.defaultView.parent.document.getElementsByName(target);
+ if (iframes.length > 0) {
+ iframes[0].contentDocument.location = link.href;
+ } else {
+ link.ownerDocument.location = link.href;
+ }
+ break;
+ }
+ }
+ }
+ }(link), false);
+ }
+ }, false);
+ }
+ }
+}
+
+// Don't do this check before Firefox 29
+if (Services.vc.compare(Services.appinfo.version, "29") > 0) {
+ try {
+ if (Services.prefs.getCharPref("capability.policy.default.checkloaduri.enabled") == "allAccess") {
+ gForceExternalHandler = !extProtocolSvc.isExposedProtocol('file');
+ Services.obs.addObserver(documentObserver, "content-document-global-created", false);
+ addEventListener("unload", function() {
+ Services.obs.removeObserver(documentObserver, "content-document-global-created", false);
+ })
+ }
+ } catch (e) {}
+}
+
+
+/* Copied from http://mxr.mozilla.org/mozilla-central/source/browser/base/content/utilityOverlay.js?raw=1 */
+
+function getBoolPref(prefname, def)
+{
+ try {
+ return Services.prefs.getBoolPref(prefname);
+ }
+ catch(er) {
+ return def;
+ }
+}
+
+/* whereToOpenLink() looks at an event to decide where to open a link.
+ *
+ * The event may be a mouse event (click, double-click, middle-click) or keypress event (enter).
+ *
+ * On Windows, the modifiers are:
+ * Ctrl new tab, selected
+ * Shift new window
+ * Ctrl+Shift new tab, in background
+ * Alt save
+ *
+ * Middle-clicking is the same as Ctrl+clicking (it opens a new tab).
+ *
+ * Exceptions:
+ * - Alt is ignored for menu items selected using the keyboard so you don't accidentally save stuff.
+ * (Currently, the Alt isn't sent here at all for menu items, but that will change in bug 126189.)
+ * - Alt is hard to use in context menus, because pressing Alt closes the menu.
+ * - Alt can't be used on the bookmarks toolbar because Alt is used for "treat this as something draggable".
+ * - The button is ignored for the middle-click-paste-URL feature, since it's always a middle-click.
+ */
+function whereToOpenLink( e, ignoreButton, ignoreAlt )
+{
+ Components.utils.import("resource://gre/modules/AppConstants.jsm");
+
+ // This method must treat a null event like a left click without modifier keys (i.e.
+ // e = { shiftKey:false, ctrlKey:false, metaKey:false, altKey:false, button:0 })
+ // for compatibility purposes.
+ if (!e)
+ return "current";
+
+ var shift = e.shiftKey;
+ var ctrl = e.ctrlKey;
+ var meta = e.metaKey;
+ var alt = e.altKey && !ignoreAlt;
+
+ // ignoreButton allows "middle-click paste" to use function without always opening in a new window.
+ var middle = !ignoreButton && e.button == 1;
+ var middleUsesTabs = true;
+
+ // Don't do anything special with right-mouse clicks. They're probably clicks on context menu items.
+
+ var metaKey = AppConstants.platform == "macosx" ? meta : ctrl;
+ if (metaKey || (middle && middleUsesTabs))
+ return shift ? "tabshifted" : "tab";
+
+ if (alt && getBoolPref("browser.altClickSave", false))
+ return "save";
+
+ if (shift || (middle && !middleUsesTabs))
+ return "window";
+
+ return "current";
+}
diff --git a/osx/build/preferences/cck2/modules/CAPSClipboardFramescript.js b/osx/build/preferences/cck2/modules/CAPSClipboardFramescript.js
new file mode 100644
index 0000000..ffadb9d
--- /dev/null
+++ b/osx/build/preferences/cck2/modules/CAPSClipboardFramescript.js
@@ -0,0 +1,183 @@
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+Cu.import("resource://gre/modules/Services.jsm");
+
+const EXPORTED_SYMBOLS = [];
+
+var gAllowedPasteSites = [];
+var gAllowedCutCopySites = [];
+var gDeniedPasteSites = [];
+var gDeniedCutCopySites = [];
+var gDefaultPastePolicy = false;
+var gDefaultCutCopyPolicy = false;
+
+function allowCutCopy(doc) {
+ var win = doc.defaultView;
+ if (win !== win.top) {
+ // It's an iframe. Use the top level window
+ // for security purposes
+ win = win.top;
+ }
+
+ if (gDefaultCutCopyPolicy == true) {
+ for (var i=0; i < gDeniedCutCopySites.length; i++) {
+ if (win.location.href.indexOf(gDeniedCutCopySites[i]) == 0) {
+ return false;
+ }
+ }
+ return true;
+ } else {
+ for (var i=0; i < gAllowedCutCopySites.length; i++) {
+ if (win.location.href.indexOf(gAllowedCutCopySites[i]) == 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
+function allowPaste(doc) {
+ var win = doc.defaultView;
+ if (win !== win.top) {
+ // It's an iframe. Use the top level window
+ // for security purposes
+ win = win.top;
+ }
+
+ if (gDefaultPastePolicy == true) {
+ for (var i=0; i < gDeniedPasteSites.length; i++) {
+ if (win.location.href.indexOf(gDeniedPasteSites[i]) == 0) {
+ return false;
+ break;
+ }
+ }
+ return true;
+ } else {
+ for (var i=0; i < gAllowedPasteSites.length; i++) {
+ if (win.location.href.indexOf(gAllowedPasteSites[i]) == 0) {
+ return true;
+ break;
+ }
+ }
+ return false;
+ }
+}
+
+function myExecCommand(doc, originalExecCommand) {
+ return function(aCommandName, aShowDefaultUI, aValueArgument) {
+ switch (aCommandName.toLowerCase()) {
+ case "cut":
+ case "copy":
+ if (allowCutCopy(doc)) {
+ var win = Services.wm.getMostRecentWindow("navigator:browser");
+ win.goDoCommand("cmd_" + aCommandName.toLowerCase());
+ return true;
+ }
+ break;
+ case "paste":
+ if (allowPaste(doc)) {
+ var win = Services.wm.getMostRecentWindow("navigator:browser");
+ win.goDoCommand("cmd_" + aCommandName.toLowerCase());
+ return true;
+ }
+ break;
+ }
+ return originalExecCommand.call(doc, aCommandName, aShowDefaultUI, aValueArgument);
+ }
+}
+
+function myQueryCommandSupported(doc, originalQueryCommandSupported) {
+ return function(aCommandName) {
+ switch (aCommandName.toLowerCase()) {
+ case "cut":
+ case "copy":
+ if (allowCutCopy(doc)) {
+ return true;
+ }
+ break;
+ case "paste":
+ if (allowPaste(doc)) {
+ return true;
+ }
+ break;
+ }
+ return originalQueryCommandSupported.call(doc, aCommandName, aShowDefaultUI, aValueArgument);
+ }
+}
+
+var documentObserver = {
+ observe: function observe(subject, topic, data) {
+ if (subject instanceof Ci.nsIDOMWindow && topic == 'content-document-global-created') {
+ var doc = subject.document;
+ var cutCopyAllowed = allowCutCopy(doc);
+ var pasteAllowed = allowPaste(doc);
+ if (!cutCopyAllowed && !pasteAllowed) {
+ return;
+ }
+ var originalExecCommand = Cu.waiveXrays(doc).execCommand;
+ Cu.exportFunction(myExecCommand(doc, originalExecCommand), doc, {defineAs: "execCommand"});
+ var originalQueryCommandSupported = Cu.waiveXrays(doc).queryCommandSupported;
+ Cu.exportFunction(myQueryCommandSupported(doc, originalQueryCommandSupported), doc, {defineAs: "queryCommandSupported"});
+ var originalQueryCommandEnabled = Cu.waiveXrays(doc).queryCommandEnabled;
+ Cu.exportFunction(myQueryCommandSupported(doc, originalQueryCommandEnabled), doc, {defineAs: "queryCommandEnabled"});
+ }
+ }
+}
+
+// Don't do this check before Firefox 29
+if (Services.vc.compare(Services.appinfo.version, "29") > 0) {
+ try {
+ if (Services.prefs.getCharPref("capability.policy.default.Clipboard.cutcopy") == "allAccess") {
+ gDefaultCutCopyPolicy = true;
+ }
+ } catch (e) {}
+ try {
+ if (Services.prefs.getCharPref("capability.policy.default.Clipboard.paste") == "allAccess") {
+ gDefaultPastePolicy = true;
+ }
+ } catch (e) {}
+ try {
+ var policies = [];
+ policies = Services.prefs.getCharPref("capability.policy.policynames").split(', ');
+ for (var i=0; i < policies.length; i++ ) {
+ try {
+ if (Services.prefs.getCharPref("capability.policy." + policies[i] + ".Clipboard.cutcopy") == "allAccess") {
+ var allowedCutCopySites = Services.prefs.getCharPref("capability.policy." + policies[i] + ".sites").split(" ");
+ for (var j=0; j < allowedCutCopySites.length; j++) {
+ gAllowedCutCopySites.push(allowedCutCopySites[j]);
+ }
+ }
+ } catch(e) {}
+ try {
+ if (Services.prefs.getCharPref("capability.policy." + policies[i] + ".Clipboard.cutcopy") == "noAccess") {
+ var deniedCutCopySites = Services.prefs.getCharPref("capability.policy." + policies[i] + ".sites").split(" ");
+ for (var j=0; j < deniedCutCopySites.length; j++) {
+ gDeniedCutCopySites.push(deniedCutCopySites[j]);
+ }
+ }
+ } catch(e) {}
+ try {
+ if (Services.prefs.getCharPref("capability.policy." + policies[i] + ".Clipboard.paste") == "allAccess") {
+ var allowedPasteSites = Services.prefs.getCharPref("capability.policy." + policies[i] + ".sites").split(" ");
+ for (var j=0; j < allowedPasteSites.length; j++) {
+ gAllowedPasteSites.push(allowedPasteSites[j]);
+ }
+ }
+ } catch(e) {}
+ try {
+ if (Services.prefs.getCharPref("capability.policy." + policies[i] + ".Clipboard.paste") == "noAccess") {
+ var deniedPasteSites = Services.prefs.getCharPref("capability.policy." + policies[i] + ".sites").split(" ");
+ for (var j=0; j < deniedPasteSites.length; j++) {
+ gDeniedPasteSites.push(deniedPasteSites[j]);
+ }
+ }
+ } catch(e) {}
+ }
+ } catch (e) {}
+ if (gDefaultCutCopyPolicy || gDefaultPastePolicy ||
+ gAllowedCutCopySites.length > 0 || gAllowedPasteSites> 0) {
+ Services.obs.addObserver(documentObserver, "content-document-global-created", false);
+ addEventListener("unload", function() {
+ Services.obs.removeObserver(documentObserver, "content-document-global-created", false);
+ })
+ }
+}
diff --git a/osx/build/preferences/cck2/modules/CCK2.jsm b/osx/build/preferences/cck2/modules/CCK2.jsm
new file mode 100644
index 0000000..2a63260
--- /dev/null
+++ b/osx/build/preferences/cck2/modules/CCK2.jsm
@@ -0,0 +1,1495 @@
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+var EXPORTED_SYMBOLS = ["CCK2"];
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/NetUtil.jsm");
+Cu.import("resource://gre/modules/FileUtils.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/PlacesUtils.jsm");
+try {
+ Cu.import("resource://gre/modules/Timer.jsm");
+} catch (ex) {
+ Cu.import("resource://cck2/Timer.jsm");
+}
+Cu.import("resource://cck2/Preferences.jsm");
+Cu.import("resource://cck2/CTPPermissions.jsm");
+Cu.import("resource:///modules/distribution.js");
+
+XPCOMUtils.defineLazyServiceGetter(this, "bmsvc",
+ "@mozilla.org/browser/nav-bookmarks-service;1", "nsINavBookmarksService");
+XPCOMUtils.defineLazyServiceGetter(this, "annos",
+ "@mozilla.org/browser/annotation-service;1", "nsIAnnotationService");
+XPCOMUtils.defineLazyServiceGetter(this, "override",
+ "@mozilla.org/security/certoverride;1", "nsICertOverrideService");
+XPCOMUtils.defineLazyServiceGetter(this, "uuid",
+ "@mozilla.org/uuid-generator;1", "nsIUUIDGenerator");
+
+Cu.importGlobalProperties(["XMLHttpRequest"]);
+
+/* Hack to work around bug that AutoConfig is loaded in the wrong charset */
+/* Not used for Firefox 44 and above (see CCK2.init) */
+let fixupUTF8 = function(str) {
+ if (!str) {
+ return null;
+ }
+ var out, i, len, c;
+ var char2, char3;
+
+ out = "";
+ len = str.length;
+ i = 0;
+ while(i < len) {
+ c = str.charCodeAt(i++);
+ switch(c >> 4)
+ {
+ case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
+ // 0xxxxxxx
+ out += str.charAt(i-1);
+ break;
+ case 12: case 13:
+ // 110x xxxx 10xx xxxx
+ char2 = str.charCodeAt(i++);
+ out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
+ break;
+ case 14:
+ // 1110 xxxx 10xx xxxx 10xx xxxx
+ char2 = str.charCodeAt(i++);
+ char3 = str.charCodeAt(i++);
+ out += String.fromCharCode(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0));
+ break;
+ }
+ }
+
+ return out;
+};
+
+/* Crazy hack to work around distribution.ini bug */
+/* Basically if the distribution can't be parsed, make it null */
+let dirSvc = Cc["@mozilla.org/file/directory_service;1"].
+ getService(Ci.nsIProperties);
+let iniFile = dirSvc.get("XREAppDist", Ci.nsIFile);
+iniFile.leafName = "distribution";
+iniFile.append("distribution.ini");
+if (iniFile.exists()) {
+ try {
+ let ini = Cc["@mozilla.org/xpcom/ini-parser-factory;1"].
+ getService(Ci.nsIINIParserFactory).
+ createINIParser(iniFile);
+ } catch (e) {
+ DistributionCustomizer.prototype.__defineGetter__("_iniFile", function() { return null;});
+ }
+}
+
+var networkPrefMapping = {
+ proxyType: "network.proxy.type",
+ proxyHTTP: "network.proxy.http",
+ proxyHTTPPort: "network.proxy.http_port",
+ proxySSL: "network.proxy.ssl",
+ proxySSLPort: "network.proxy.ssl_port",
+ proxyFTP: "network.proxy.ftp",
+ proxyFTPPort: "network.proxy.ftp_port",
+ proxySOCKS: "network.proxy.socks",
+ proxySOCKSPort: "network.proxy.socks_port",
+ proxySocksVersion: "network.proxy.socks_version",
+ proxyNone: "network.proxy.no_proxies_on",
+ proxyAutoConfig: "network.proxy.autoconfig_url",
+ shareAllProxies: "network.proxy.share_proxy_settings",
+ proxySOCKSRemoteDNS: "network.proxy.socks_remote_dns",
+ proxyAutologin: "signon.autologin.proxy"
+}
+
+
+function alert(string) {
+ Services.prompt.alert(Services.wm.getMostRecentWindow("navigator:browser"), "", string);
+}
+
+var gBundlePrefFiles = [];
+
+var CCK2 = {
+ configs: {},
+ firstrun: false,
+ upgrade: false,
+ installedVersion: null,
+ initialized: false,
+ aboutFactories: [],
+ init: function(config, a, b) {
+ if (a == b) {
+ /* See bugzilla 1193625/1137799 */
+ fixupUTF8 = function(str) { return str };
+ }
+ // Bring back default profiles for >= FF46
+ if (Services.vc.compare(Services.appinfo.version, "46") >= 0) {
+ // If it is a new profile
+ if (!Preferences.isSet("browser.startup.homepage_override.mstone")) {
+ var defaultProfileDir = Services.dirsvc.get("GreD", Ci.nsIFile);
+ defaultProfileDir.append("defaults");
+ defaultProfileDir.append("profile");
+ if (defaultProfileDir.exists()) {
+ var profileDir = Services.dirsvc.get("ProfD", Ci.nsIFile);
+ try {
+ copyDir(defaultProfileDir, profileDir);
+ } catch(e) {
+ Components.utils.reportError("Error copying default profile directory: " + e);
+ }
+ }
+ }
+ }
+ try {
+ for (var id in this.configs) {
+ if (id == config.id) {
+ // We've already processed this config
+ return;
+ }
+ }
+ if (!config) {
+ // Try to get config from default preference. If it is there, default
+ // preference always wins
+ var configJSON = Preferences.defaults.get("extensions.cck2.config");
+ if (!configJSON) {
+ configJSON = Preferences.defaults.get("extensions.cck2.config");
+ }
+ if (!configJSON) {
+ // Try something else. Grou policy?
+ }
+ try {
+ config = JSON.parse(configJSON);
+ } catch (ex) {
+ return;
+ }
+ }
+
+ if (!config)
+ return;
+ if (!config.id) {
+ alert("Missing ID in config");
+ }
+ config.firstrun = Preferences.get("extensions.cck2." + config.id + ".firstrun", true);
+ Preferences.set("extensions.cck2." + config.id + ".firstrun", false);
+ if (!config.firstrun) {
+ config.installedVersion = Preferences.get("extensions.cck2." + config.id + ".installedVersion");
+ config.upgrade = (config.installedVersion != config.version);
+ }
+ Preferences.set("extensions.cck2." + config.id + ".installedVersion", config.version);
+ Preferences.lock("distribution.id", config.id);
+ Preferences.lock("distribution.version", config.version + " (CCK2)");
+// Preferences.lock("distribution.about", String(config.id + " - " + config.version + " (CCK2)"));
+
+ if (config.removeDefaultSearchEngines) {
+ Services.io.getProtocolHandler("resource").QueryInterface(Components.interfaces.nsIResProtocolHandler)
+ .setSubstitution("search-plugins", null);
+ }
+ if (config.noAddonCompatibilityCheck) {
+ Preferences.reset("extensions.lastAppVersion");
+ }
+ if (config.preferences) {
+ for (var i in config.preferences) {
+ // For plugin.disable_full_page_plugin_for_types, there is
+ // a default user value (application/pdf).
+ // Because of this, setting the default value doesn't work.
+ // So if a user is trying to set the default value, we set
+ // the user value instead.
+ // But we only do that if it's set to application/pdf
+ // or not set (startup), or it's a CCK2 upgrade or first install
+ // As a side note, at Firefox install, application/pdf is added
+ // to the pref no matter what
+ if (i == "plugin.disable_full_page_plugin_for_types") {
+ if (!config.preferences[i].userset &&
+ !config.preferences[i].locked &&
+ !config.preferences[i].clear) {
+ if (Preferences.get(i) == "application/pdf" ||
+ !Preferences.get(i) || // firstrun
+ config.upgrade ||
+ config.firstrun) {
+ Preferences.set(i, config.preferences[i].value);
+ continue;
+ }
+ }
+ }
+ // Workaround bug where this pref is coming is as a string from import
+ if (i == "toolkit.telemetry.prompted") {
+ config.preferences[i].value = parseInt(config.preferences[i].value);
+ }
+ if (config.preferences[i].locked) {
+ Preferences.lock(i, config.preferences[i].value);
+ } else if (config.preferences[i].userset) {
+ Preferences.set(i, config.preferences[i].value);
+ } else if (config.preferences[i].clear) {
+ Preferences.reset(i);
+ } else {
+ if (i == "browser.startup.homepage" ||
+ i == "gecko.handlerService.defaultHandlersVersion" ||
+ i == "browser.menu.showCharacterEncoding" ||
+ i == "intl.accept_languages" ||
+ i.indexOf("browser.search.defaultenginename") == 0 ||
+ i.indexOf("browser.search.order") == 0 ||
+ i.indexOf("browser.contentHandlers.types") == 0 ||
+ i.indexOf("gecko.handlerService.schemes") == 0) {
+ // If it's a complex preference, we need to set it differently
+ Preferences.defaults.set(i, "data:text/plain," + i + "=" + config.preferences[i].value);
+ } else {
+ Preferences.defaults.set(i, config.preferences[i].value);
+ }
+ }
+ }
+ }
+ if (config.registry && "@mozilla.org/windows-registry-key;1" in Cc) {
+ for (var i in config.registry) {
+ addRegistryKey(config.registry[i].rootkey,
+ config.registry[i].key,
+ config.registry[i].name,
+ config.registry[i].value,
+ config.registry[i].type);
+ }
+ }
+ if (config.permissions) {
+ for (var i in config.permissions) {
+ for (var j in config.permissions[i]) {
+ if (i.indexOf("http") == 0) {
+ Services.perms.add(NetUtil.newURI(i), j, config.permissions[i][j]);
+ } else {
+ var domain = i.replace(/^\*\./g, '');
+ Services.perms.add(NetUtil.newURI("http://" + domain), j, config.permissions[i][j]);
+ Services.perms.add(NetUtil.newURI("https://" + domain), j, config.permissions[i][j]);
+ }
+ if (j == "plugins") {
+ var plugins = Cc["@mozilla.org/plugin/host;1"].getService(Ci.nsIPluginHost).getPluginTags({});
+ for (var k=0; k < plugins.length; k++) {
+ if (i.indexOf("http") == 0) {
+ Services.perms.add(NetUtil.newURI(i), "plugin:" + CTP.getPluginPermissionFromTag(plugins[k]), config.permissions[i][j]);
+ Services.perms.add(NetUtil.newURI(i), "plugin-vulnerable:" + CTP.getPluginPermissionFromTag(plugins[k]), config.permissions[i][j]);
+ } else {
+ var domain = i.replace(/^\*\./g, '');
+ Services.perms.add(NetUtil.newURI("http://" + domain), "plugin:" + CTP.getPluginPermissionFromTag(plugins[k]), config.permissions[i][j]);
+ Services.perms.add(NetUtil.newURI("http://" + domain), "plugin-vulnerable:" + CTP.getPluginPermissionFromTag(plugins[k]), config.permissions[i][j]);
+ Services.perms.add(NetUtil.newURI("https://" + domain), "plugin:" + CTP.getPluginPermissionFromTag(plugins[k]), config.permissions[i][j]);
+ Services.perms.add(NetUtil.newURI("https://" + domain), "plugin-vulnerable:" + CTP.getPluginPermissionFromTag(plugins[k]), config.permissions[i][j]);
+ }
+ }
+ }
+ }
+ if (Object.keys(config.permissions[i]).length === 0) {
+ let perms = Services.perms.enumerator;
+ while (perms.hasMoreElements()) {
+ let perm = perms.getNext();
+ try {
+ // Firefox 41 and below
+ if (perm.host == i) {
+ Services.perms.remove(perm.host, perm.type);
+ }
+ } catch(e) {
+ if (i.indexOf("http") == 0) {
+ if (perm.matchesURI(NetUtil.newURI(i), false)) {
+ perm.remove(NetUtil.newURI(i), perm.type);
+ }
+ } else {
+ var domain = i.replace(/^\*\./g, '');
+ if (perm.matchesURI(NetUtil.newURI("http://" + domain), false)) {
+ perm.remove(NetUtil.newURI("http://" + domain), perm.type);
+ }
+ if (perm.matchesURI(NetUtil.newURI("https://" + i), false)) {
+ perm.remove(NetUtil.newURI("https://" + domain), perm.type);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ if (config.disablePrivateBrowsing) {
+ Preferences.lock("browser.taskbar.lists.tasks.enabled", false);
+ Preferences.lock("browser.privatebrowsing.autostart", false);
+ var aboutPrivateBrowsing = {};
+ aboutPrivateBrowsing.classID = Components.ID(uuid.generateUUID().toString());
+ aboutPrivateBrowsing.factory = disableAbout(aboutPrivateBrowsing.classID,
+ "Disable about:privatebrowsing - CCK",
+ "privatebrowsing");
+ CCK2.aboutFactories.push(aboutPrivateBrowsing);
+ }
+ if (config.noGetAddons) {
+ Preferences.lock("extensions.getAddons.showPane", false);
+ }
+ if (config.noAddons) {
+ Preferences.lock("xpinstall.enabled", false);
+ }
+ if (config.disablePDFjs) {
+ Preferences.lock("pdfjs.disabled", true);
+ }
+ if (config.disableHello) {
+ Preferences.lock("loop.enabled", false);
+ }
+ if (config.disablePocket) {
+ Preferences.lock("browser.pocket.enabled", false);
+ Preferences.lock("extensions.pocket.enabled", false);
+ Preferences.lock("browser.newtabpage.activity-stream.feeds.section.topstories", false);
+ }
+ if (config.disableHeartbeat) {
+ Preferences.lock("browser.selfsupport.url", "");
+ }
+ if (config.disableInContentPrefs) {
+ Preferences.lock("browser.preferences.inContent", false);
+ }
+ if (config.disableSync) {
+ var aboutAccounts = {};
+ aboutAccounts.classID = Components.ID(uuid.generateUUID().toString());
+ aboutAccounts.factory = disableAbout(aboutAccounts.classID,
+ "Disable about:accounts - CCK",
+ "accounts");
+ CCK2.aboutFactories.push(aboutAccounts);
+ var aboutSyncLog = {};
+ aboutSyncLog.classID = Components.ID(uuid.generateUUID().toString());
+ aboutSyncLog.factory = disableAbout(aboutSyncLog.classID,
+ "Disable about:sync-log - CCK",
+ "sync-log");
+ CCK2.aboutFactories.push(aboutSyncLog);
+ var aboutSyncProgress = {};
+ aboutSyncProgress.classID = Components.ID(uuid.generateUUID().toString());
+ aboutSyncProgress.factory = disableAbout(aboutSyncProgress.classID,
+ "Disable about:sync-progress - CCK",
+ "sync-progress");
+ CCK2.aboutFactories.push(aboutSyncProgress);
+ var aboutSyncTabs = {};
+ aboutSyncTabs.classID = Components.ID(uuid.generateUUID().toString());
+ aboutSyncTabs.factory = disableAbout(aboutSyncTabs.classID,
+ "Disable about:sync-tabs - CCK",
+ "sync-tabs");
+ CCK2.aboutFactories.push(aboutSyncTabs);
+ Preferences.lock("browser.syncPromoViewsLeftMap", JSON.stringify({bookmarks:0, passwords:0, addons:0}));
+ Preferences.lock("browser.newtabpage.activity-stream.migrationExpired", true);
+ Preferences.lock("identity.fxaccounts.enabled", false);
+ }
+ var disableAboutConfigFactory = null;
+ if (config.disableAboutConfig) {
+ var aboutConfig = {};
+ aboutConfig.classID = Components.ID(uuid.generateUUID().toString());
+ aboutConfig.factory = disableAbout(aboutConfig.classID,
+ "Disable about:config - CCK",
+ "config");
+ CCK2.aboutFactories.push(aboutConfig);
+ }
+ if (config.disableAboutProfiles) {
+ var aboutProfiles = {};
+ aboutProfiles.classID = Components.ID(uuid.generateUUID().toString());
+ aboutProfiles.factory = disableAbout(aboutProfiles.classID,
+ "Disable about:profiles - CCK",
+ "profiles");
+ CCK2.aboutFactories.push(aboutProfiles);
+ }
+ if (config.disableAboutSupport) {
+ var aboutSupport = {};
+ aboutSupport.classID = Components.ID(uuid.generateUUID().toString());
+ aboutSupport.factory = disableAbout(aboutSupport.classID,
+ "Disable about:support - CCK",
+ "support");
+ CCK2.aboutFactories.push(aboutSupport);
+ }
+ if (config.disableAddonsManager) {
+ var aboutAddons = {};
+ aboutAddons.classID = Components.ID(uuid.generateUUID().toString());
+ aboutAddons.factory = disableAbout(aboutAddons.classID,
+ "Disable about:addons - CCK",
+ "addons");
+ CCK2.aboutFactories.push(aboutAddons);
+ }
+
+ if (config.alwaysDefaultBrowser) {
+ var shellSvc = Cc["@mozilla.org/browser/shell-service;1"].getService(Ci.nsIShellService);
+ if (shellSvc) {
+ try {
+ var isDefault = shellSvc.isDefaultBrowser(true, false);
+ if (!isDefault) {
+ shellSvc.setDefaultBrowser(true, false);
+ }
+ } catch (e) {
+ // setDefaultBrowser errors on Yosemite, so we're just ignoring the error.
+ // See Bugzilla bug #1063529
+ }
+ }
+ }
+ if (config.dontCheckDefaultBrowser) {
+ Preferences.lock("browser.shell.checkDefaultBrowser", false);
+ }
+ if (config.dontUseDownloadDir) {
+ Preferences.lock("browser.download.useDownloadDir", false);
+ }
+ if (config.disableFormFill) {
+ Preferences.lock("browser.formfill.enable", false);
+ }
+ if (config.removeSmartBookmarks) {
+ Preferences.lock("browser.places.smartBookmarksVersion", -1);
+ }
+ if (config.disableCrashReporter) {
+ Preferences.lock("toolkit.crashreporter.enabled", false);
+ Preferences.lock("browser.crashReports.unsubmittedCheck.autoSubmit", false);
+ try {
+ Cc["@mozilla.org/toolkit/crash-reporter;1"].
+ getService(Ci.nsICrashReporter).submitReports = false;
+ } catch (e) {
+ // There seem to be cases where the crash reporter isn't defined
+ }
+ var aboutCrashes = {};
+ aboutCrashes.classID = Components.ID(uuid.generateUUID().toString());
+ aboutCrashes.factory = disableAbout(aboutCrashes.classID,
+ "Disable about:crashes - CCK",
+ "crashes");
+ CCK2.aboutFactories.push(aboutCrashes);
+ }
+ if (config.disableTelemetry) {
+ Preferences.lock("toolkit.telemetry.enabled", false);
+ Preferences.lock("toolkit.telemetry.prompted", 999);
+ Preferences.lock("datareporting.policy.dataSubmissionPolicyBypassNotification", true);
+ var aboutTelemetry = {};
+ aboutTelemetry.classID = Components.ID(uuid.generateUUID().toString());
+ aboutTelemetry.factory = disableAbout(aboutTelemetry.classID,
+ "Disable about:telemetry - CCK",
+ "telemetry");
+ CCK2.aboutFactories.push(aboutTelemetry);
+ }
+ if (config.removeDeveloperTools) {
+ Preferences.lock("devtools.scratchpad.enabled", false);
+ Preferences.lock("devtools.responsiveUI.enabled", false);
+ Preferences.lock("devtools.toolbar.enabled", false);
+ Preferences.lock("devtools.styleeditor.enabled", false);
+ Preferences.lock("devtools.debugger.enabled", false);
+ Preferences.lock("devtools.profiler.enabled", false);
+ Preferences.lock("devtools.errorconsole.enabled", false);
+ Preferences.lock("devtools.inspector.enabled", false);
+ }
+ if (config.homePage && !config.lockHomePage) {
+ Preferences.defaults.set("browser.startup.homepage", "data:text/plain,browser.startup.homepage=" + config.homePage);
+ /* If you have a distribution.ini, browser.startup.homepage gets wiped out */
+ /* We need to save it */
+ if (!Preferences.isSet("browser.startup.homepage")) {
+ Preferences.set("browser.startup.homepage", config.homePage);
+ }
+ }
+ if (config.lockHomePage) {
+ if (config.homePage) {
+ Preferences.lock("browser.startup.homepage", config.homePage);
+ } else {
+ Preferences.lock("browser.startup.homepage");
+ }
+ Preferences.lock("pref.browser.homepage.disable_button.current_page", true);
+ Preferences.lock("pref.browser.homepage.disable_button.bookmark_page", true);
+ Preferences.lock("pref.browser.homepage.disable_button.restore_default", true);
+ }
+ if (config.noWelcomePage) {
+ Preferences.lock("startup.homepage_welcome_url", "");
+ Preferences.lock("startup.homepage_welcome_url.additional", "");
+ Preferences.lock("browser.usedOnWindows10", true);
+
+ } else if (config.welcomePage) {
+ Preferences.lock("startup.homepage_welcome_url", config.welcomePage);
+ }
+ if (config.noUpgradePage) {
+ Preferences.lock("browser.startup.homepage_override.mstone", "ignore");
+ } else if (config.upgradePage) {
+ Preferences.lock("startup.homepage_override_url", config.upgradePage);
+ }
+ if (config.dontShowRights) {
+ Preferences.lock("browser.rights.override", true);
+ var rightsVersion = Preferences.get("browser.rights.version");
+ Preferences.lock("browser.rights." + rightsVersion + ".shown", true);
+ }
+ if (config.dontRememberPasswords) {
+ Preferences.lock("signon.rememberSignons", false);
+ }
+ if (config.disableFirefoxHealthReport) {
+ Preferences.lock("datareporting.healthreport.uploadEnabled", false);
+ var aboutHealthReport = {};
+ aboutHealthReport.classID = Components.ID(uuid.generateUUID().toString());
+ aboutHealthReport.factory = disableAbout(aboutHealthReport.classID,
+ "Disable about:healthreport - CCK",
+ "healthreport");
+ CCK2.aboutFactories.push(aboutHealthReport);
+ }
+ if (config.disableFirefoxHealthReportUpload) {
+ Preferences.lock("datareporting.healthreport.uploadEnabled", false);
+ }
+ if (config.disableResetFirefox) {
+ try {
+ Cu.import("resource:///modules/UITour.jsm");
+ UITour.origOnPageEvent = UITour.onPageEvent;
+ UITour.onPageEvent = function(a, b) {
+ var aEvent = b;
+ if (!aEvent) {
+ aEvent = a;
+ }
+ if (aEvent.detail.action == "resetFirefox") {
+ Services.prompt.alert(null, "CCK2", "This has been disabled by your administrator");
+ return;
+ }
+ UITour.origOnPageEvent(a, b);
+ }
+ Preferences.lock("browser.disableResetPrompt ", true);
+ } catch (e) {}
+ }
+ if (config.disableFirefoxUpdates) {
+ Preferences.lock("app.update.auto", false);
+ Preferences.lock("app.update.enabled", false);
+ }
+ if (config.network) {
+ for (var i in networkPrefMapping) {
+ if (i in config.network) {
+ Preferences.defaults.set(networkPrefMapping[i], config.network[i]);
+ }
+ if (config.network.locked) {
+ Preferences.lock(networkPrefMapping[i]);
+ }
+ }
+ }
+ if (config.removeSnippets) {
+ Preferences.lock("browser.newtabpage.activity-stream.disableSnippets", true);
+ }
+ // Fixup bad strings
+ if ("helpMenu" in config) {
+ if ("label" in config.helpMenu) {
+ config.helpMenu.label = fixupUTF8(config.helpMenu.label);
+ }
+ if ("accesskey" in config.helpMenu) {
+ config.helpMenu.accesskey = fixupUTF8(config.helpMenu.accesskey);
+ }
+ }
+ if ("titlemodifier" in config) {
+ config.titlemodifier = fixupUTF8(config.titlemodifier);
+ }
+ if ("defaultSearchEngine" in config) {
+ config.defaultSearchEngine = fixupUTF8(config.defaultSearchEngine);
+ }
+ this.configs[config.id] = config;
+ } catch (e) {
+ errorCritical(e);
+ }
+ },
+ getConfigs: function() {
+ return this.configs;
+ },
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "distribution-customization-complete":
+ for (var id in this.configs) {
+ var config = this.configs[id];
+ // Due to bug 947838, we have to reinitialize default preferences
+ {
+ var iniFile = Services.dirsvc.get("XREAppDist", Ci.nsIFile);
+ iniFile.leafName = "distribution";
+ iniFile.append("distribution.ini");
+ if (iniFile.exists()) {
+ if (config.preferences) {
+ for (var i in config.preferences) {
+ // Workaround bug where this pref is coming is as a string from import
+ if (i == "toolkit.telemetry.prompted") {
+ config.preferences[i].value = parseInt(config.preferences[i].value);
+ }
+ if (!("locked" in config.preferences[i]) &&
+ !("userset" in config.preferences[i]) &&
+ !("clear" in config.preferences[i])) {
+ if (Preferences.defaults.has(i)) {
+ try {
+ // If it's a complex preference, we need to set it differently
+ Services.prefs.getComplexValue(i, Ci.nsIPrefLocalizedString).data;
+ Preferences.defaults.set(i, "data:text/plain," + i + "=" + config.preferences[i].value);
+ } catch (ex) {
+ Preferences.defaults.set(i, config.preferences[i].value);
+ }
+ } else {
+ Preferences.defaults.set(i, config.preferences[i].value);
+ }
+ }
+ }
+ }
+ }
+ if (config.homePage && !config.lockHomePage) {
+ Preferences.defaults.set("browser.startup.homepage", "data:text/plain,browser.startup.homepage=" + config.homePage);
+ /* If you have a distribution.ini, we changed browser.startup.homepage */
+ /* Put it back */
+ if (Preferences.get("browser.startup.homepage") == config.homePage) {
+ Preferences.reset("browser.startup.homepage");
+ }
+ }
+ if (config.network) {
+ for (var i in networkPrefMapping) {
+ if (i in config.network) {
+ Preferences.defaults.set(networkPrefMapping[i], config.network[i]);
+ }
+ }
+ }
+ }
+ // Try to install devices every time just in case get added after install
+ if ("certs" in config && "devices" in config.certs) {
+ let pkcs11;
+ try {
+ pkcs11 = Components.classes["@mozilla.org/security/pkcs11;1"].getService(Ci.nsIPKCS11);
+ } catch (e) {
+ pkcs11 = Components.classes["@mozilla.org/security/pkcs11moduledb;1"].getService(Ci.nsIPKCS11ModuleDB);
+ }
+ for (var i=0; i < config.certs.devices.length; i++) {
+ var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
+ try {
+ file.initWithPath(config.certs.devices[i].path);
+ if (file.exists()) {
+ pkcs11.addModule(config.certs.devices[i].name, config.certs.devices[i].path, 0, 0);
+ }
+ } catch(e) {
+ // Ignore path errors in case we are on different OSes
+ }
+ }
+ }
+ if (!config.firstrun && config.installedVersion == config.version) {
+ continue;
+ }
+ if (config.removeSmartBookmarks) {
+ var smartBookmarks = annos.getItemsWithAnnotation("Places/SmartBookmark", {});
+ for (var i = 0; i < smartBookmarks.length; i++) {
+ try {
+ bmsvc.removeItem(smartBookmarks[i]);
+ } catch (ex) {}
+ }
+ }
+ let syncBookmarks = false;
+ if ("getIdForItemAt" in bmsvc) {
+ syncBookmarks = true;
+ }
+ if (config.removeDefaultBookmarks) {
+ if (syncBookmarks) {
+ var firefoxFolder = bmsvc.getIdForItemAt(bmsvc.bookmarksMenuFolder, 3);
+ if ((firefoxFolder != -1) && (bmsvc.getItemType(firefoxFolder) == bmsvc.TYPE_FOLDER)) {
+ var aboutMozilla = bmsvc.getIdForItemAt(firefoxFolder, 3);
+ if (aboutMozilla != -1 &&
+ bmsvc.getItemType(aboutMozilla) == bmsvc.TYPE_BOOKMARK &&
+ /https?:\/\/www.mozilla.(com|org)\/.*\/about/.test(bmsvc.getBookmarkURI(aboutMozilla).spec)) {
+ bmsvc.removeItem(firefoxFolder);
+ }
+ }
+ var userAgentLocale = Preferences.defaults.get("general.useragent.locale");
+ var gettingStartedURL = "https://www.mozilla.org/" + userAgentLocale + "/firefox/central/";
+ var bookmarks = bmsvc.getBookmarkIdsForURI(NetUtil.newURI("https://www.mozilla.org/" + userAgentLocale + "/firefox/central/"));
+ if (bookmarks.length == 0) {
+ bookmarks = bmsvc.getBookmarkIdsForURI(NetUtil.newURI("http://www.mozilla.com/" + userAgentLocale + "/firefox/central/"));
+ }
+ if (bookmarks.length > 0) {
+ bmsvc.removeItem(bookmarks[0])
+ }
+ var bookmarks = bmsvc.getBookmarkIdsForURI(NetUtil.newURI("https://www.mozilla.org/" + userAgentLocale + "/about/"));
+ if (bookmarks.length == 0) {
+ bookmarks = bmsvc.getBookmarkIdsForURI(NetUtil.newURI("http://www.mozilla.com/" + userAgentLocale + "/about/"));
+ }
+ if (bookmarks.length > 0) {
+ var mozillaFolder = bmsvc.getFolderIdForItem(bookmarks[0]);
+ if (mozillaFolder != -1) {
+ var mozillaFolderIndex = bmsvc.getItemIndex(mozillaFolder);
+ var mozillaFolderParent = bmsvc.getFolderIdForItem(mozillaFolder);
+ bmsvc.removeItem(mozillaFolder);
+ if (config.removeSmartBookmarks) {
+ var separator = bmsvc.getIdForItemAt(mozillaFolderParent, mozillaFolderIndex-1);
+ if (separator != -1) {
+ bmsvc.removeItem(separator);
+ }
+ }
+ }
+ }
+
+ } else {
+ removeDefaultBookmarks();
+ }
+ }
+
+ // If we detect an old CCK Wizard, remove it's bookmarks
+ var bookmarksToRemove = [];
+ if ("extension" in config) {
+ var oldCCKVersion = Preferences.get("extensions." + config.extension.id + ".version", null);
+ if (oldCCKVersion) {
+ Preferences.reset("extensions." + config.extension.id + ".version");
+ bookmarksToRemove = bookmarksToRemove.concat(annos.getItemsWithAnnotation(config.extension.id + "/" + oldCCKVersion, {}));
+ }
+ }
+ if (config.installedVersion != config.version) {
+ bookmarksToRemove = bookmarksToRemove.concat(annos.getItemsWithAnnotation(config.id + "/" + config.installedVersion, {}));
+ bookmarksToRemove = bookmarksToRemove.concat(annos.getItemsWithAnnotation(config.installedVersion + "/" + config.installedVersion, {}));
+ }
+ // Just in case, remove bookmarks for this version too
+ bookmarksToRemove = bookmarksToRemove.concat(annos.getItemsWithAnnotation(config.id + "/" + config.version, {}));
+ if (syncBookmarks) {
+ let bmFolders = [];
+ for (var i = 0; i < bookmarksToRemove.length; i++) {
+ try {
+ var itemType = bmsvc.getItemType(bookmarksToRemove[i]);
+ if (itemType == bmsvc.TYPE_FOLDER) {
+ bmFolders.push(bookmarksToRemove[i]);
+ } else {
+ bmsvc.removeItem(bookmarksToRemove[i]);
+ }
+ } catch (e) {
+ Components.utils.reportError(e);
+ }
+ }
+ if (bmFolders.length > 0) {
+ // Only remove folders if they are empty
+ for (var i = 0; i < bmFolders.length; i++) {
+ try {
+ var bmID = bmsvc.getIdForItemAt(bmFolders[i], 0);
+ if (bmID == -1) {
+ bmsvc.removeItem(bmFolders[i]);
+ } else {
+ var newTitle = bmsvc.getItemTitle(bmFolders[i]) + " (" + (oldCCKVersion || config.installedVersion) + ")";
+ bmsvc.setItemTitle(bmFolders[i], newTitle);
+ }
+ } catch (e) {
+ bmsvc.removeItem(bmFolders[i]);
+ }
+ }
+ }
+ } else {
+ removeOldBookmarks(bookmarksToRemove, oldCCKVersion || config.installedVersion);
+ }
+ if (config.bookmarks) {
+ if (config.bookmarks.toolbar) {
+ if (syncBookmarks) {
+ addBookmarksSync(config.bookmarks.toolbar, bmsvc.toolbarFolder, config.id + "/" + config.version, config.removeDuplicateBookmarkNames);
+ } else {
+ addBookmarks(config.bookmarks.toolbar, PlacesUtils.bookmarks.toolbarGuid, config.id + "/" + config.version, config.removeDuplicateBookmarkNames);
+ }
+ }
+ if (config.bookmarks.menu) {
+ if (syncBookmarks) {
+ addBookmarksSync(config.bookmarks.menu, bmsvc.bookmarksMenuFolder, config.id + "/" + config.version, config.removeDuplicateBookmarkNames);
+ } else {
+ addBookmarks(config.bookmarks.menu, PlacesUtils.bookmarks.menuGuid, config.id + "/" + config.version, config.removeDuplicateBookmarkNames);
+ }
+ }
+ }
+ if (config.searchplugins || config.defaultSearchEngine) {
+ searchInitRun(function() {
+ if (Array.isArray(config.searchplugins)) {
+ for (var i=0; i < config.searchplugins.length; i++) {
+ Services.search.addEngine(config.searchplugins[i], Ci.nsISearchEngine.DATA_XML, null, false, {
+ onSuccess: function (engine) {
+ if (engine.name == config.defaultSearchEngine) {
+ Services.search.currentEngine = engine;
+ }
+ },
+ onError: function (errorCode) {
+ Components.utils.reportError("Engine install error: " + errorCode);
+ // Ignore errors
+ }
+ });
+ }
+ } else {
+ for (let enginename in config.searchplugins) {
+ var engine = Services.search.getEngineByName(enginename);
+ if (engine) {
+ Services.search.removeEngine(engine);
+ }
+ Services.search.addEngine(config.searchplugins[enginename], Ci.nsISearchEngine.DATA_XML, null, false, {
+ onSuccess: function (engine) {
+ if (engine.name == config.defaultSearchEngine) {
+ Services.search.currentEngine = engine;
+ }
+ },
+ onError: function (errorCode) {
+ Components.utils.reportError("Engine install error: " + errorCode);
+ }
+ });
+ }
+ }
+
+ var defaultSearchEngine = Services.search.getEngineByName(config.defaultSearchEngine);
+ if (defaultSearchEngine) {
+ Services.search.currentEngine = defaultSearchEngine;
+ }
+ });
+ }
+ if (config.disableSearchEngineInstall) {
+ try {
+ Cu.import("resource:///modules/ContentLinkHandler.jsm");
+ ContentLinkHandler.origOnLinkAdded = ContentLinkHandler.onLinkAdded;
+ ContentLinkHandler.onLinkAdded = function(event, chromeGlobal) {
+ if (event.originalTarget.rel == "search") {
+ return;
+ }
+ ContentLinkHandler.origOnLinkAdded(event, chromeGlobal);
+ };
+ } catch (e) {
+ // Just in case we are pre Firefox 31
+ }
+ }
+ }
+ break;
+ case "browser-ui-startup-complete":
+ var disableWebApps = false;
+ for (var id in this.configs) {
+ var config = this.configs[id];
+ if (config.disableWebApps) {
+ disableWebApps = true;
+ break;
+ }
+ }
+ if (!disableWebApps) {
+ return;
+ }
+ try {
+ Cu.import("resource://gre/modules/WebappManager.jsm");
+ } catch (e) {
+ try {
+ Cu.import("resource:///modules/WebappManager.jsm");
+ } catch (e) {}
+ }
+ try {
+ WebappManager.doInstall = function() {
+ var win = Services.wm.getMostRecentWindow("navigator:browser");
+ var gBrowser = win.gBrowser;
+ var gNavigatorBundle = win.gNavigatorBundle
+ messageString = gNavigatorBundle.getString("xpinstallDisabledMessageLocked");;
+ var options = {
+ timeout: Date.now() + 30000
+ };
+ win.PopupNotifications.show(gBrowser.selectedBrowser, "xpinstall-disabled",
+ messageString, "addons-notification-icon",
+ null, null, options);
+ };
+ } catch(e) {
+ // Web Apps was removed
+ }
+ break;
+ case "final-ui-startup":
+ for (var id in this.configs) {
+ var config = this.configs[id];
+ // Delay loading unnecessary modules
+ // We should do this on a timeout
+ loadModules(config);
+ if (!config.firstrun && config.installedVersion == config.version) {
+ return;
+ }
+ if ("certs" in config) {
+ if ("override" in config.certs) {
+ for (var i=0; i < config.certs.override.length; i++) {
+ var xhr = new XMLHttpRequest();
+ try {
+ xhr.open("GET", "https://" + config.certs.override[i]);
+ xhr.channel.notificationCallbacks = SSLExceptions;
+ xhr.send(null);
+ } catch (ex) {}
+ }
+ }
+ var certdb = Cc["@mozilla.org/security/x509certdb;1"].getService(Ci.nsIX509CertDB);
+ var certdb2 = certdb;
+ try {
+ certdb2 = Cc["@mozilla.org/security/x509certdb;1"].getService(Ci.nsIX509CertDB2);
+ } catch (e) {}
+ if (config.certs.ca) {
+ for (var i=0; i < config.certs.ca.length; i++) {
+ var certTrust;
+ if (config.certs.ca[i].trust){
+ certTrust = config.certs.ca[i].trust
+ } else {
+ certTrust = ",,";
+ }
+ if (config.certs.ca[i].url) {
+ try {
+ download(config.certs.ca[i].url, function(file, extraParams) {
+ var istream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
+ istream.init(file, -1, -1, false);
+ var bstream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Ci.nsIBinaryInputStream);
+ bstream.setInputStream(istream);
+ var cert = bstream.readBytes(bstream.available());
+ bstream.close();
+ istream.close();
+ if (/-----BEGIN CERTIFICATE-----/.test(cert)) {
+ certdb2.addCertFromBase64(fixupCert(cert), extraParams.trust, "");
+ } else {
+ certdb.addCert(cert, extraParams.trust, "");
+ }
+ }, errorCritical, {trust: certTrust});
+ } catch (e) {
+ errorCritical("Unable to install " + config.certs.ca[i].url + " - " + e);
+ }
+ } else if (config.certs.ca[i].cert) {
+ certdb2.addCertFromBase64(fixupCert(config.certs.ca[i].cert), certTrust, "");
+ }
+ }
+ }
+ if (config.certs.server) {
+ for (var i=0; i < config.certs.server.length; i++) {
+ try {
+ download(config.certs.server[i], function(file) {
+ try {
+ certdb.importCertsFromFile(null, file, Ci.nsIX509Cert.SERVER_CERT);
+ } catch(e) {
+ // API removed in bugzilla #1064402 (FF47)
+ }
+ }, errorCritical);
+ } catch (e) {
+ errorCritical("Unable to install " + config.certs.server[i] + " - " + e);
+ }
+ }
+ }
+ }
+ if (config.persona) {
+ var temp = {};
+ Components.utils.import("resource://gre/modules/LightweightThemeManager.jsm", temp);
+ temp.LightweightThemeManager.currentTheme = config.persona;
+ }
+ if (config.addons) {
+ Cu.import("resource://gre/modules/AddonManager.jsm");
+ var numAddonsInstalled = 0;
+ var numAddons = config.addons.length;
+ let listener = {
+ onInstallEnded: function(install, addon) {
+ if (addon.isActive) {
+ // restartless add-on, so we don't need to restart
+ numAddons--;
+ } else {
+ numAddonsInstalled++;
+ }
+ if (numAddonsInstalled > 0 &&
+ numAddonsInstalled == numAddons) {
+ Services.startup.quit(Services.startup.eRestart | Services.startup.eAttemptQuit);
+ }
+ }
+ }
+ for (var i=0; i < config.addons.length; i++) {
+ try {
+ AddonManager.getInstallForURL(config.addons[i], function(addonInstall) {
+ addonInstall.addListener(listener);
+ addonInstall.install();
+ }, "application/x-xpinstall");
+ } catch (e) {
+ try {
+ AddonManager.getInstallForURL(config.addons[i], "application/x-xpinstall").then(addonInstall => {
+ addonInstall.addListener(listener);
+ addonInstall.install();
+ });
+ } catch (e) {
+ errorCriticial(e);
+ }
+ }
+ }
+ }
+ }
+ break;
+ case "load-extension-defaults":
+ if (gBundlePrefFiles.length > 0) {
+ // Create a temporary scope so the pref function works
+ var temp = {};
+ temp.pref = function(a, b) {
+ Preferences.defaults.set(a, b);
+ }
+ gBundlePrefFiles.forEach(function(prefFile) {
+ Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
+ .getService(Components.interfaces.mozIJSSubScriptLoader)
+ .loadSubScript(prefFile, temp);
+ });
+ }
+ break;
+ case "quit-application":
+ var registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
+ for (var i=0; i < CCK2.aboutFactories.length; i++)
+ registrar.unregisterFactory(CCK2.aboutFactories[i].classID, CCK2.aboutFactories[i].factory);
+ break;
+ }
+ }
+}
+
+async function removeDefaultBookmarks() {
+ var firefoxFolder = await PlacesUtils.bookmarks.fetch({
+ parentGuid: PlacesUtils.bookmarks.menuGuid,
+ index: 0});
+ if (firefoxFolder && firefoxFolder.type == PlacesUtils.bookmarks.TYPE_FOLDER) {
+ await PlacesUtils.bookmarks.remove(firefoxFolder);
+ }
+ var userAgentLocale = Preferences.defaults.get("general.useragent.locale");
+ if (!userAgentLocale) {
+ userAgentLocale = Services.locale.getRequestedLocales()[0];
+ }
+ var userAgentLocale = "en-US";
+ var gettingStartedURL = "https://www.mozilla.org/" + userAgentLocale + "/firefox/central/";
+ let bookmarks = [];
+ await PlacesUtils.bookmarks.fetch({url: gettingStartedURL}, b => bookmarks.push(b));
+ for (let bookmark of bookmarks) {
+ await PlacesUtils.bookmarks.remove(bookmark);
+ }
+}
+
+async function removeOldBookmarks(oldBookmarks, oldVersion) {
+ let bmFolders = [];
+ for (var i = 0; i < oldBookmarks.length; i++) {
+ try {
+ let guid = await PlacesUtils.promiseItemGuid(oldBookmarks[i]);
+ let bookmark = await PlacesUtils.bookmarks.fetch(guid);
+ if (bookmark.type == PlacesUtils.bookmarks.TYPE_FOLDER) {
+ bmFolders.push(bookmark);
+ } else {
+ await PlacesUtils.bookmarks.remove(bookmark);
+ }
+ } catch (ex) {
+ Components.utils.reportError(ex);
+ }
+ }
+ if (bmFolders.length > 0) {
+ // Only remove folders if they are empty
+ for (var i = 0; i < bmFolders.length; i++) {
+ let bookmarks = [];
+ await PlacesUtils.bookmarks.fetch({parentGuid: bmFolders[i].guid, index: 0}, b => bookmarks.push(b));
+ if (bookmarks.length == 0) {
+ await PlacesUtils.bookmarks.remove(bmFolders[i]);
+ } else {
+ PlacesUtils.bookmarks.update({guid: bmFolders[i].guid,
+ title: `${bmFolders[i].title} (${oldVersion})`});
+ }
+ }
+ }
+}
+
+function loadModules(config) {
+ let globalMM = Cc["@mozilla.org/globalmessagemanager;1"].getService();
+ globalMM.addMessageListener("cck2:get-configs", function(message) {
+ return CCK2.configs;
+ });
+ globalMM.addMessageListener("cck2:open-url", function(message) {
+ var win = Services.wm.getMostRecentWindow("navigator:browser");
+ if (win) {
+ win.openUILinkIn(message.data.url, message.data.where);
+ }
+ });
+ Cu.import("resource://cck2/CCK2AboutDialogOverlay.jsm");
+ Cu.import("resource://cck2/CCK2AboutAddonsOverlay.jsm");
+ Cu.import("resource://cck2/CCK2PreferencesOverlay.jsm");
+ globalMM.loadFrameScript("resource://cck2/CCK2Framescript.js", true);
+ globalMM.loadFrameScript("resource://cck2/CCK2AboutHomeFramescript.js", true);
+ globalMM.loadFrameScript("resource://cck2/CAPSCheckLoadURIFramescript.js", true);
+ globalMM.loadFrameScript("resource://cck2/CAPSClipboardFramescript.js", true);
+ Cu.import("resource://cck2/CCK2AboutSupportOverlay.jsm");
+ Cu.import("resource://cck2/CCK2BrowserOverlay.jsm");
+ Cu.import("resource://cck2/CCK2FileBlock.jsm");
+}
+
+function addRegistryKey(RootKey, Key, Name, NameValue, Type) {
+ const nsIWindowsRegKey = Ci.nsIWindowsRegKey;
+ var key = null;
+
+ try {
+ key = Cc["@mozilla.org/windows-registry-key;1"]
+ .createInstance(nsIWindowsRegKey);
+ var rootKey;
+ switch (RootKey) {
+ case "HKEY_CLASSES_ROOT":
+ rootKey = nsIWindowsRegKey.ROOT_KEY_CLASSES_ROOT;
+ break;
+ case "HKEY_CURRENT_USER":
+ rootKey = nsIWindowsRegKey.ROOT_KEY_CURRENT_USER;
+ break;
+ default:
+ rootKey = nsIWindowsRegKey.ROOT_KEY_LOCAL_MACHINE;
+ break;
+ }
+
+ key.create(rootKey, Key, nsIWindowsRegKey.ACCESS_WRITE);
+
+ switch (Type) {
+ case "REG_DWORD":
+ key.writeIntValue(Name, NameValue);
+ break;
+ case "REG_QWORD":
+ key.writeInt64Value(Name, NameValue);
+ break;
+ case "REG_BINARY":
+ key.writeBinaryValue(Name, NameValue);
+ break;
+ case "REG_SZ":
+ default:
+ key.writeStringValue(Name, NameValue);
+ break;
+ }
+ key.close();
+ } catch (ex) {
+ /* This could fail if you don't have the right authority on Windows */
+ if (key) {
+ key.close();
+ }
+ }
+}
+
+function addBookmarksSync(bookmarks, destination, annotation, removeDuplicateBookmarkNames) {
+ for (var i =0; i < bookmarks.length; i++) {
+ if (bookmarks[i].folder) {
+ var newFolderId = bmsvc.createFolder(destination, fixupUTF8(bookmarks[i].name), bmsvc.DEFAULT_INDEX);
+ annos.setItemAnnotation(newFolderId, annotation, "true", 0, annos.EXPIRE_NEVER);
+ addBookmarksSync(bookmarks[i].folder, newFolderId, annotation, removeDuplicateBookmarkNames);
+ } else if (bookmarks[i].type == "separator") {
+ var separatorId = bmsvc.insertSeparator(destination, bmsvc.DEFAULT_INDEX);
+ annos.setItemAnnotation(separatorId, annotation, "true", 0, annos.EXPIRE_NEVER);
+ } else {
+ try {
+ var uri = NetUtil.newURI(bookmarks[i].location);
+ var title = fixupUTF8(bookmarks[i].name);
+ var bookmarkIds = bmsvc.getBookmarkIdsForURI(uri, {}, {});
+ if (bookmarkIds.length > 0) {
+ // Remove duplicate bookmarks
+ for (var j=0; j < bookmarkIds.length; j++) {
+ // Unfortunately there's no way to generically
+ // check for any annotation, so we assume it is ours.
+ // We at least check if the destination is the same
+ let folderID = bmsvc.getFolderIdForItem(bookmarkIds[j]);
+ if (bmsvc.getItemTitle(bookmarkIds[j]) == title &&
+ destination == folderID) {
+ bmsvc.removeItem(bookmarkIds[j]);
+ }
+ }
+ }
+ if (removeDuplicateBookmarkNames) {
+ // This is hideous. There's no way to get the number of children
+ // in a folder, so we do a loop to get a quick count so we can
+ // work backwards.
+ let numItems = 0;
+ do {
+ let bmId = bmsvc.getIdForItemAt(destination, numItems);
+ if (bmId == -1) {
+ break;
+ }
+ numItems++;
+ } while (numItems < 50) // Failsafe just in case we somehow end up in a loop
+ for (var k=numItems; k > 0; k--) {
+ let bmId = bmsvc.getIdForItemAt(destination, k-1);
+ if (bmId == -1) { // Shouldn't happen
+ break;
+ }
+ if (bmsvc.getItemTitle(bmId) == title) {
+ bmsvc.removeItem(bmId);
+ }
+ }
+ }
+ var newBookmarkId = bmsvc.insertBookmark(destination, uri, bmsvc.DEFAULT_INDEX, title);
+ annos.setItemAnnotation(newBookmarkId, annotation, "true", 0, annos.EXPIRE_NEVER);
+ } catch(e) {
+ Components.utils.reportError(e);
+ }
+ }
+ }
+}
+
+let BOOKMARK_GUID_PREFIX = "CCKB-";
+let FOLDER_GUID_PREFIX = "CCKF-";
+let SEPARATOR_GUID_PREFIX = "CCKS-";
+
+function generateGuidWithPrefix(prefix) {
+ // Generates a random GUID and replace its beginning with the given
+ // prefix. We do this instead of just prepending the prefix to keep
+ // the correct character length.
+ return prefix + PlacesUtils.history.makeGuid().substring(prefix.length);
+}
+
+async function addBookmarks(bookmarks, parentGuid, annotation, removeDuplicateBookmarkNames) {
+ for (var i =0; i < bookmarks.length; i++) {
+ if (bookmarks[i].folder) {
+ let guid = generateGuidWithPrefix(FOLDER_GUID_PREFIX);
+ await PlacesUtils.bookmarks.insert({
+ type: PlacesUtils.bookmarks.TYPE_FOLDER,
+ title: fixupUTF8(bookmarks[i].name),
+ guid,
+ parentGuid
+ });
+ let newFolderId = await PlacesUtils.promiseItemId(guid);
+ annos.setItemAnnotation(newFolderId, annotation, "true", 0, annos.EXPIRE_NEVER);
+ addBookmarks(bookmarks[i].folder, guid, annotation, removeDuplicateBookmarkNames);
+ } else if (bookmarks[i].type == "separator") {
+ let guid = generateGuidWithPrefix(SEPARATOR_GUID_PREFIX);
+ await PlacesUtils.bookmarks.insert({
+ type: PlacesUtils.bookmarks.TYPE_SEPARATOR,
+ guid,
+ parentGuid
+ });
+ let newSeparatorId = await PlacesUtils.promiseItemId(guid);
+ annos.setItemAnnotation(newSeparatorId, annotation, "true", 0, annos.EXPIRE_NEVER);
+ } else {
+ try {
+ var title = fixupUTF8(bookmarks[i].name);
+ let bookmarksArray = [];
+ await PlacesUtils.bookmarks.fetch({url: bookmarks[i].location}, b => bookmarksArray.push(b));
+ for (let bookmark of bookmarksArray) {
+ // Unfortunately there's no way to generically
+ // check for any annotation, so we assume it is ours.
+ // We at least check if the destination is the same
+ if (bookmark.title == title &&
+ bookmark.parentGuid == parentGuid) {
+ }
+ await PlacesUtils.bookmarks.remove(bookmark);
+ }
+ if (removeDuplicateBookmarkNames) {
+ try {
+ await PlacesUtils.bookmarks.fetch({parentGuid}, b => bookmarksArray.push(b));
+ for (var k=bookmarksArray.length; k > 0; k--) {
+ if (bookmarks[i].title == title) {
+ await PlacesUtils.bookmarks.remove(bookmarksArray[i]);
+ }
+ }
+ } catch(e) {
+ // Bad index errors in some cases
+ }
+ }
+ let guid = generateGuidWithPrefix(BOOKMARK_GUID_PREFIX);
+ await PlacesUtils.bookmarks.insert({
+ url: bookmarks[i].location,
+ title: fixupUTF8(bookmarks[i].name),
+ guid,
+ parentGuid
+ });
+ let newBookmarkId = await PlacesUtils.promiseItemId(guid);
+ annos.setItemAnnotation(newBookmarkId, annotation, "true", 0, annos.EXPIRE_NEVER);
+ } catch(e) {
+ Components.utils.reportError(e);
+ }
+ }
+ }
+}
+
+function errorCritical(e) {
+ var stack = e.stack;
+ if (!stack) {
+ stack = Error().stack;
+ }
+ Components.utils.reportError("CCK2: " + e + "\n\n" + stack);
+}
+
+/**
+ * If the search service is not available, passing function
+ * to search service init
+ */
+function searchInitRun(func)
+{
+ if (Services.search.init && !Services.search.isInitialized)
+ Services.search.init(func);
+ else
+ func();
+}
+
+/**
+ * Remove all extraneous info from a certificates. addCertFromBase64 requires
+ * just the cert with no whitespace or anything.
+ *
+ * @param {String} certificate text
+ * @returns {String} certificate text cleaned up
+ */
+function fixupCert(cert) {
+ var beginCert = "-----BEGIN CERTIFICATE-----";
+ var endCert = "-----END CERTIFICATE-----";
+
+ cert = cert.replace(/[\r\n]/g, "");
+ var begin = cert.indexOf(beginCert);
+ var end = cert.indexOf(endCert);
+ return cert.substring(begin + beginCert.length, end);
+}
+
+/**
+ * Download the given URL to the user's download directory
+ *
+ * @param {String} URL of the file
+ * @param {function} Function to call on success - called with nsIFile
+ * @param {String} Function to call on failure
+ * @param {Object} extraParams passed to callback
+ * @returns {nsIFile} Downloaded file
+ */
+function download(url, successCallback, errorCallback, extraParams) {
+ var uri = Services.io.newURI(url, null, null);
+
+ var channel = Services.io.newChannelFromURI(uri);
+
+ var downloader = Cc["@mozilla.org/network/downloader;1"].createInstance(Ci.nsIDownloader);
+ var listener = {
+ onDownloadComplete: function(downloader, request, ctxt, status, result) {
+ if (Components.isSuccessCode(status)) {
+ result.QueryInterface(Ci.nsIFile);
+ if (result.exists() && result.fileSize > 0) {
+ successCallback(result, extraParams);
+ return;
+ }
+ }
+ errorCallback(new Error("Download failed (" + status + " for " + url));
+ }
+ }
+ downloader.init(listener, null);
+ channel.asyncOpen(downloader, null);
+}
+
+/**
+ * Used to allow the overriding of certificates
+ */
+var SSLExceptions = {
+ getInterface: function(uuid) {
+ return this.QueryInterface(uuid);
+ },
+ QueryInterface: function(uuid) {
+ if (uuid.equals(Ci.nsIBadCertListener2) ||
+ uuid.equals(Ci.nsISupports))
+ return this;
+ throw Components.results.NS_ERROR_NO_INTERFACE;
+ },
+
+ notifyCertProblem: function (socketInfo, status, targetSite) {
+ status.QueryInterface(Ci.nsISSLStatus);
+
+ let flags = 0;
+
+ if (status.isUntrusted)
+ flags |= override.ERROR_UNTRUSTED;
+ if (status.isDomainMismatch)
+ flags |= override.ERROR_MISMATCH;
+ if (status.isNotValidAtThisTime)
+ flags |= override.ERROR_TIME;
+
+ var hostInfo = targetSite.split(":");
+
+ override.rememberValidityOverride(
+ hostInfo[0],
+ hostInfo[1],
+ status.serverCert,
+ flags,
+ false);
+ return true; // Don't show error UI
+ }
+};
+
+var gAboutXHTML = '' +
+'' +
+' ' +
+' ' +
+' ' +
+' ' +
+' ' +
+' ' +
+' ' +
+'
' +
+'
%s
' +
+' ' +
+'
' +
+'
' +
+'
Access to %s has been disabled by your administrator.
' +
+'
' +
+'
' +
+'
' +
+' ' +
+' ' +
+'' +
+'';
+
+/**
+ * Register a component that replaces an about page
+ *
+ * @param {String} The ClassID of the class being registered.
+ * @param {String} The name of the class being registered.
+ * @param {String} The type of about to be disabled (config/addons/privatebrowsing)
+ * @returns {Object} The factory to be used to unregister
+ */
+function disableAbout(aClass, aClassName, aboutType) {
+ var gAbout = {
+ newChannel : function (aURI, aLoadInfo) {
+ var url = "data:text/html," + gAboutXHTML;
+ var channel = Services.io.newChannelFromURIWithLoadInfo(NetUtil.newURI(url), aLoadInfo);
+ channel.originalURI = aURI;
+ return channel;
+ },
+ getURIFlags : function getURIFlags(aURI) {
+ return Ci.nsIAboutModule.HIDE_FROM_ABOUTABOUT;
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIAboutModule]),
+
+ createInstance: function(outer, iid) {
+ return this.QueryInterface(iid);
+ },
+ };
+
+ var registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
+ registrar.registerFactory(aClass, aClassName, "@mozilla.org/network/protocol/about;1?what=" + aboutType, gAbout);
+ return gAbout;
+}
+
+var documentObserver = {
+ observe: function observe(subject, topic, data) {
+ if (subject instanceof Ci.nsIDOMWindow) {
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ if (topic == "chrome-document-global-created" ||
+ (topic == "content-document-global-created" && win.document.documentURIObject.scheme == "about")) {
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var configs = CCK2.getConfigs();
+ for (var id in configs) {
+ var config = configs[id];
+ if (config.hiddenUI) {
+ for (var i=0; i < config.hiddenUI.length; i++) {
+ var uiElements = doc.querySelectorAll(config.hiddenUI[i]);
+ for (var j=0; j < uiElements.length; j++) {
+ var uiElement = uiElements[j];
+ uiElement.setAttribute("hidden", "true");
+ }
+ }
+ }
+ }
+ }, false);
+ }
+ }
+ }
+}
+
+function copyDir(aOriginal, aDestination) {
+ var enumerator = aOriginal.directoryEntries;
+ while (enumerator.hasMoreElements()) {
+ var file = enumerator.getNext().QueryInterface(Components.interfaces.nsIFile);
+ if (file.isDirectory()) {
+ var subdir = aDestination.clone();
+ subdir.append(file.leafName);
+ subdir.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
+ copyDir(file, subdir);
+ } else {
+ file.copyTo(aDestination, null);
+ }
+ }
+}
+
+function loadBundleDirs() {
+ var cck2BundleDir = Services.dirsvc.get("GreD", Ci.nsIFile);
+ cck2BundleDir.append("cck2");
+ cck2BundleDir.append("bundles");
+ if (!cck2BundleDir.exists() || !cck2BundleDir.isDirectory()) {
+ return;
+ }
+ var enumerator = cck2BundleDir.directoryEntries;
+ while (enumerator.hasMoreElements()) {
+ var file = enumerator.getNext().QueryInterface(Ci.nsIFile);
+ var dirName = file.leafName;
+ file.append("chrome.manifest");
+ Components.manager.QueryInterface(Ci.nsIComponentRegistrar).autoRegister(file);
+ file.leafName = "defaults";
+ file.append("preferences");
+ if (!file.exists() || !file.isDirectory()) {
+ continue;
+ }
+ // In order to load prefs, we have to use a chrome URL.
+ // Create a resource that maps to the prefs directory.
+ var prefAlias = Services.io.newFileURI(file);
+ var resource = Services.io.getProtocolHandler("resource")
+ .QueryInterface(Ci.nsIResProtocolHandler);
+ resource.setSubstitution(dirName + "_prefs", prefAlias);
+ var prefEnumerator = file.directoryEntries;
+ while (prefEnumerator.hasMoreElements()) {
+ var prefFile = prefEnumerator.getNext().QueryInterface(Ci.nsIFile);
+ gBundlePrefFiles.push("resource://" + dirName + "_prefs/" + prefFile.leafName);
+ }
+ }
+}
+
+Services.obs.addObserver(CCK2, "distribution-customization-complete", false);
+Services.obs.addObserver(CCK2, "final-ui-startup", false);
+Services.obs.addObserver(CCK2, "browser-ui-startup-complete", false);
+Services.obs.addObserver(documentObserver, "chrome-document-global-created", false);
+Services.obs.addObserver(documentObserver, "content-document-global-created", false);
+Services.obs.addObserver(CCK2, "load-extension-defaults", false);
+try {
+ loadBundleDirs()
+} catch (e) {
+ Components.utils.reportError(e);
+}
diff --git a/osx/build/preferences/cck2/modules/CCK2AboutAddonsOverlay.jsm b/osx/build/preferences/cck2/modules/CCK2AboutAddonsOverlay.jsm
new file mode 100644
index 0000000..ea1bbd1
--- /dev/null
+++ b/osx/build/preferences/cck2/modules/CCK2AboutAddonsOverlay.jsm
@@ -0,0 +1,111 @@
+/* This file overlays about:addons. It does the following: */
+/* Workaround https://bugzilla.mozilla.org/show_bug.cgi?id=1132971 */
+/* Hide the "Install Add-on From File" menu if xpinstall.enabled is false */
+/* Hides the discover pane if xpinstall.enabled is false */
+/* Hides the add-on entry if specified in the CCK2 config */
+
+const EXPORTED_SYMBOLS = [];
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://cck2/CCK2.jsm");
+
+var addonId = "cck2wizard@kaply.com";
+
+var observer = {
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "chrome-document-global-created":
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var url = doc.location.href.split("?")[0].split("#")[0];
+ switch (url) {
+ case "about:addons":
+ case "chrome://mozapps/content/extensions/extensions.xul":
+ var configs = CCK2.getConfigs();
+ var hiddenAddons = [];
+ var requiredAddons = [];
+ for (let id in configs) {
+ var config = configs[id];
+ if (config && "extension" in config && config.extension.hide) {
+ hiddenAddons.push(config.extension.id);
+ }
+ if (config.requiredAddons) {
+ requiredAddons.push.apply(requiredAddons, config.requiredAddons.split(","));
+ }
+ }
+ if (hiddenAddons.length > 0 || requiredAddons.length > 0) {
+ var ss;
+ for (var i = 0; i < doc.styleSheets.length; i++) {
+ if (doc.styleSheets[i].href == "chrome://mozapps/skin/extensions/extensions.css") {
+ ss = doc.styleSheets[i];
+ break;
+ }
+ }
+ for (var i=0; i < hiddenAddons.length; i++) {
+ ss.insertRule("richlistitem[value='" + hiddenAddons[i] + "'] { display: none;}", ss.cssRules.length);
+ }
+ for (var i=0; i < requiredAddons.length; i++) {
+ ss.insertRule("richlistitem[value='" + requiredAddons[i] + "'] button[anonid='disable-btn'] { display: none;}", ss.cssRules.length);
+ ss.insertRule("richlistitem[value='" + requiredAddons[i] + "'] button[anonid='remove-btn'] { display: none;}", ss.cssRules.length);
+ }
+ if (requiredAddons.length > 0) {
+ win.gViewController.commands.cmd_disableItem.origIsEnabled = win.gViewController.commands.cmd_disableItem.isEnabled;
+ win.gViewController.commands.cmd_disableItem.isEnabled = function(aAddon) { if (aAddon && requiredAddons.indexOf(aAddon.id) != -1) return false; return this.origIsEnabled;}
+ win.gViewController.commands.cmd_uninstallItem.origIsEnabled = win.gViewController.commands.cmd_disableItem.isEnabled;
+ win.gViewController.commands.cmd_uninstallItem.isEnabled = function(aAddon) { if (aAddon && requiredAddons.indexOf(aAddon.id) != -1) return false; return this.origIsEnabled;}
+ }
+ }
+ var showDiscoverPane = true;
+ var xpinstallEnabled = true;
+ try {
+ xpinstallEnabled = Services.prefs.getBoolPref("xpinstall.enabled");
+ } catch (e) {}
+ try {
+ showDiscoverPane = Services.prefs.getBoolPref("extensions.getAddons.showPane");
+ } catch (e) {}
+ if (!xpinstallEnabled || !showDiscoverPane) {
+ // Work around Mozilla bug 1132971
+ // Hide the discover pane if it is the selected pane
+ if (E("view-port", doc) && E("view-port", doc).selectedIndex == 0) {
+ try {
+ win.gViewController.loadView("addons://list/extension");
+ } catch (ex) {
+ // This fails with Webconverger installed. Ignore it.
+ }
+ }
+ }
+ if (!xpinstallEnabled) {
+ // Hide the "Install Add-on From File" separator
+ hide(E("utils-installFromFile-separator", doc));
+ // Hide the "Install Add-on From File" menuitem
+ hide(E("utils-installFromFile", doc));
+ win.gDragDrop.onDragOver = function(event) {
+ event.dataTransfer.dropEffect = "none";
+ event.stopPropagation();
+ event.preventDefault();
+ };
+ }
+ break;
+ }
+ }, false);
+ break;
+ }
+ }
+}
+
+Services.obs.addObserver(observer, "chrome-document-global-created", false);
+
+function E(id, context) {
+ var element = context.getElementById(id);
+ return element;
+}
+
+function hide(element) {
+ if (element) {
+ element.setAttribute("hidden", "true");
+ }
+}
diff --git a/osx/build/preferences/cck2/modules/CCK2AboutDialogOverlay.jsm b/osx/build/preferences/cck2/modules/CCK2AboutDialogOverlay.jsm
new file mode 100644
index 0000000..630e27b
--- /dev/null
+++ b/osx/build/preferences/cck2/modules/CCK2AboutDialogOverlay.jsm
@@ -0,0 +1,33 @@
+/* This file is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1139509 */
+/* It bolds the Firefox version in the about dialog and unbolds the distribution information */
+/* It can be removed once Firefox 38 ESR is out of support */
+
+const EXPORTED_SYMBOLS = [];
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+var observer = {
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "chrome-document-global-created":
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var url = doc.location.href.split("?")[0].split("#")[0];
+ switch (url) {
+ case "chrome://browser/content/aboutDialog.xul":
+ doc.querySelector("#version").style.fontWeight = "bold";
+ doc.querySelector("#distribution").style.fontWeight = "normal";
+ doc.querySelector("#distributionId").style.fontWeight = "normal";
+ break;
+ }
+ }, false);
+ break;
+ }
+ }
+}
+
+Services.obs.addObserver(observer, "chrome-document-global-created", false);
diff --git a/osx/build/preferences/cck2/modules/CCK2AboutHomeFramescript.js b/osx/build/preferences/cck2/modules/CCK2AboutHomeFramescript.js
new file mode 100644
index 0000000..98e5b3d
--- /dev/null
+++ b/osx/build/preferences/cck2/modules/CCK2AboutHomeFramescript.js
@@ -0,0 +1,79 @@
+/* This file overrides about:home. It does the following:
+ * Remove the sync button if Sync is disabled
+ * Remove the Addons button if Sync is disabled
+ * Remove the snippets if snippets are disabled
+ */
+
+const EXPORTED_SYMBOLS = [];
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+var configs = null;
+
+var observer = {
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "content-document-global-created":
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var url = doc.location.href.split("?")[0].split("#")[0];
+ switch (url) {
+ case "about:home":
+ case "chrome://browser/content/abouthome/aboutHome.xhtml":
+ if (!configs) {
+ // TODO - Make this Async
+ configs = sendSyncMessage("cck2:get-configs")[0];
+ }
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.disableSync) {
+ remove(E("sync", doc));
+ }
+ if (config.disableAddonsManager) {
+ remove(E("addons", doc));
+ }
+ if (config.disableWebApps) {
+ remove(E("apps", doc));
+ }
+ if (config.removeSnippets) {
+ var snippets = E("snippets", doc);
+ if (snippets) {
+ snippets.style.display = "none";
+ }
+ }
+ if (config.hiddenUI) {
+ for (var i=0; i < config.hiddenUI.length; i++) {
+ var uiElements = doc.querySelectorAll(config.hiddenUI[i]);
+ for (var j=0; j < uiElements.length; j++) {
+ var uiElement = uiElements[j];
+ uiElement.setAttribute("hidden", "true");
+ }
+ }
+ }
+ }
+ break;
+ }
+ }, false);
+ break;
+ }
+ }
+}
+Services.obs.addObserver(observer, "content-document-global-created", false);
+
+addEventListener("unload", function() {
+ Services.obs.removeObserver(observer, "content-document-global-created", false);
+})
+
+function E(id, context) {
+ var element = context.getElementById(id);
+ return element;
+}
+
+function remove(element) {
+ if (element && element.parentNode)
+ element.parentNode.removeChild(element);
+}
diff --git a/osx/build/preferences/cck2/modules/CCK2AboutSupportOverlay.jsm b/osx/build/preferences/cck2/modules/CCK2AboutSupportOverlay.jsm
new file mode 100644
index 0000000..4da8fba
--- /dev/null
+++ b/osx/build/preferences/cck2/modules/CCK2AboutSupportOverlay.jsm
@@ -0,0 +1,62 @@
+/* This file overrides about:support It does the following:
+ * Remove the reset Firefox button if disableResetFirefox is set
+ * Remove the safe mode Button if disableSafeMode is set
+ * Remove the box if both are set
+ */
+
+const EXPORTED_SYMBOLS = [];
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://cck2/CCK2.jsm");
+
+var configs = null;
+
+var observer = {
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "chrome-document-global-created":
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var url = doc.location.href.split("?")[0].split("#")[0];
+ switch (url) {
+ case "about:support":
+ case "chrome://global/content/aboutSupport.xhtml":
+ if (!configs) {
+ configs = CCK2.getConfigs();
+ }
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.disableResetFirefox) {
+ remove(E("reset-box", doc));
+ }
+ if (config.disableSafeMode) {
+ remove(E("safe-mode-box", doc));
+ }
+ if (config.disableResetFirefox &&
+ config.disableSafeMode) {
+ remove(E("action-box", doc));
+ }
+ }
+ break;
+ }
+ }, false);
+ break;
+ }
+ }
+}
+Services.obs.addObserver(observer, "chrome-document-global-created", false);
+
+function E(id, context) {
+ var element = context.getElementById(id);
+ return element;
+}
+
+
+function remove(element) {
+ if (element && element.parentNode)
+ element.parentNode.removeChild(element);
+}
diff --git a/osx/build/preferences/cck2/modules/CCK2BrowserOverlay.jsm b/osx/build/preferences/cck2/modules/CCK2BrowserOverlay.jsm
new file mode 100644
index 0000000..52d59fb
--- /dev/null
+++ b/osx/build/preferences/cck2/modules/CCK2BrowserOverlay.jsm
@@ -0,0 +1,373 @@
+/* This file modifies the main browser window. It does the following:
+ * Goes through the hiddenUI list and hides any UI
+ *
+ */
+
+const EXPORTED_SYMBOLS = [];
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource:///modules/CustomizableUI.jsm");
+Cu.import("resource://gre/modules/PrivateBrowsingUtils.jsm");
+Cu.import("resource://cck2/CCK2.jsm");
+
+var configs = null;
+
+var observer = {
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "chrome-document-global-created":
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var url = doc.location.href.split("?")[0].split("#")[0];
+ switch (url) {
+ case "chrome://browser/content/browser.xul":
+ // Workaround https://bugzilla.mozilla.org/show_bug.cgi?id=1149617
+ var origSetReportPhishingMenu = win.gSafeBrowsing.setReportPhishingMenu;
+ win.gSafeBrowsing.setReportPhishingMenu = function() {
+ try {
+ origSetReportPhishingMenu();
+ } catch (e) {}
+ }
+
+ win.addEventListener("unload", function onUnload(event) {
+ win.removeEventListener("unload", onUnload, false);
+ var panelUIPopup = doc.getElementById("PanelUI-popup");
+ if (panelUIPopup) {
+ E("PanelUI-popup", doc).removeEventListener("popupshowing", onPanelShowing, false);
+ }
+ });
+ var panelUIPopup = doc.getElementById("PanelUI-popup");
+ if (panelUIPopup) {
+ E("PanelUI-popup", doc).addEventListener("popupshowing", onPanelShowing, false);
+ }
+ var appMenuPopup = doc.getElementById("appMenu-popup");
+ if (appMenuPopup) {
+ E("appMenu-popup", doc).addEventListener("popupshowing", onAppMenuShowing, false);
+ }
+ configs = CCK2.getConfigs();
+ for (let id in configs) {
+ config = configs[id];
+ if (config.disablePrivateBrowsing &&
+ PrivateBrowsingUtils.isWindowPrivate(win)) {
+ win.setTimeout(function() {
+ Services.prompt.alert(win, "Private Browsing", "Private Browsing has been disabled by your administrator");
+ win.close();
+ }, 0, false);
+ }
+ if (config.disablePrivateBrowsing) {
+ disablePrivateBrowsing(doc);
+ }
+ if (config.disableSync) {
+ disableSync(doc);
+ }
+ if (config.disableAddonsManager) {
+ disableAddonsManager(doc);
+ }
+ if (config.removeDeveloperTools) {
+ Services.tm.mainThread.dispatch(function() {
+ removeDeveloperTools(doc);
+ }, Ci.nsIThread.DISPATCH_NORMAL);
+ }
+ if (config.disableErrorConsole) {
+ disableErrorConsole(doc);
+ }
+ if (config.disableFirefoxHealthReport) {
+ var healthReportMenu = doc.getElementById("healthReport");
+ if (healthReportMenu) {
+ healthReportMenu.parentNode.removeChild(healthReportMenu);
+ }
+ }
+ if (config.removeSafeModeMenu) {
+ hide(E("helpSafeMode", doc));
+ }
+ if (config.titlemodifier) {
+ doc.getElementById("main-window").setAttribute("titlemodifier", config.titlemodifier);
+ }
+ if (config.removeSetDesktopBackground) {
+ // Because this is on a context menu, we can't use "hidden"
+ if (E("context-setDesktopBackground", doc)) {
+ E("context-setDesktopBackground", doc).setAttribute("style", "display: none;");
+ }
+ }
+ if (config.disableWebApps) {
+ CustomizableUI.destroyWidget("web-apps-button");
+ hide(E("menu_openApps", doc));
+ }
+ if (config.disableHello) {
+ CustomizableUI.destroyWidget("loop-button");
+ hide(E("menu_openLoop", doc));
+ }
+ if (config.disablePocket) {
+ CustomizableUI.destroyWidget("pocket-button");
+ }
+ if (config.disableSharePage) {
+ CustomizableUI.destroyWidget("social-share-button");
+ // Because these are on a context menu, we can't use "hidden"
+ if (E("context-sharelink", doc)) {
+ E("context-sharelink", doc).setAttribute("style", "display: none;");
+ }
+ if (E("context-shareselect", doc)) {
+ E("context-shareselect", doc).setAttribute("style", "display: none;");
+ }
+ if (E("context-shareimage", doc)) {
+ E("context-shareimage", doc).setAttribute("style", "display: none;");
+ }
+ if (E("context-sharevideo", doc)) {
+ E("context-sharevideo", doc).setAttribute("style", "display: none;");
+ }
+ if (E("context-sharepage", doc)) {
+ E("context-sharepage", doc).setAttribute("style", "display: none;");
+ }
+ }
+ if (config.disableSocialAPI) {
+ win.SocialActivationListener = {};
+ }
+ if (config.disableForget) {
+ CustomizableUI.destroyWidget("panic-button");
+ }
+ if (config.hiddenUI) {
+ hideUIElements(doc, config.hiddenUI);
+ }
+ if (config.helpMenu) {
+ // We need to run this function on a delay, because we won't know
+ // if the about menu is hidden for mac until after it is run.
+ Services.tm.mainThread.dispatch(function() {
+ var helpMenuPopup = doc.getElementById("menu_HelpPopup");
+ var menuitem = doc.createElement("menuitem");
+ menuitem.setAttribute("label", config.helpMenu.label);
+ if ("accesskey" in config.helpMenu) {
+ menuitem.setAttribute("accesskey", config.helpMenu.accesskey);
+ }
+ menuitem.setAttribute("oncommand", "openUILink('" + config.helpMenu.url + "');");
+ menuitem.setAttribute("onclick", "checkForMiddleClick(this, event);");
+ if (!E("aboutName", doc) || E("aboutName", doc).hidden) {
+ // Mac
+ helpMenuPopup.appendChild(menuitem);
+ } else {
+ helpMenuPopup.insertBefore(menuitem, E("aboutName", doc));
+ helpMenuPopup.insertBefore(doc.createElement("menuseparator"),
+ E("aboutName", doc));
+ }
+ }, Ci.nsIThread.DISPATCH_NORMAL);
+ }
+ if (config.firstrun || config.upgrade) {
+ if (config.displayBookmarksToolbar || (config.bookmarks && config.bookmarks.toolbar)) {
+ CustomizableUI.setToolbarVisibility("PersonalToolbar", "true");
+ }
+ if (config.displayMenuBar) {
+ CustomizableUI.setToolbarVisibility("toolbar-menubar", "true");
+ }
+ if (config.showSearchBar) {
+ CustomizableUI.addWidgetToArea("search-container", CustomizableUI.AREA_NAVBAR,
+ CustomizableUI.getPlacementOfWidget("urlbar-container").position + 1);
+ }
+ config.firstrun = false;
+ config.upgrade = false;
+ }
+ }
+ break;
+ case "chrome://browser/content/places/places.xul":
+ case "chrome://browser/content/bookmarks/bookmarksPanel.xul":
+ case "chrome://browser/content/history/history-panel.xul":
+ configs = CCK2.getConfigs();
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.disablePrivateBrowsing) {
+ if (E("placesContext_open:newprivatewindow", doc)) {
+ E("placesContext_open:newprivatewindow", doc).setAttribute("style", "display: none;");
+ }
+ }
+ if (config.hiddenUI) {
+ hideUIElements(doc, config.hiddenUI);
+ }
+ }
+ break;
+ }
+ }, false);
+ break;
+ }
+ }
+}
+Services.obs.addObserver(observer, "chrome-document-global-created", false);
+
+function disableSync(doc) {
+ var win = doc.defaultView;
+ if (win.gSyncUI) {
+ var mySyncUI = {
+ init: function() {
+ return;
+ },
+ initUI: function() {
+ return;
+ },
+ updateUI: function() {
+ hide(E("sync-setup-state", doc));
+ hide(E("sync-syncnow-state", doc));
+ hide(E("sync-setup", doc));
+ hide(E("sync-syncnowitem", doc));
+ }
+ }
+ win.gSyncUI = mySyncUI;
+ }
+ CustomizableUI.destroyWidget("sync-button");
+ CustomizableUI.removeWidgetFromArea("sync-button");
+ var toolbox = doc.getElementById("navigator-toolbox");
+ if (toolbox && toolbox.palette) {
+ let element = toolbox.palette.querySelector("#sync-button");
+ if (element) {
+ element.parentNode.removeChild(element);
+ }
+ }
+ hide(E("sync-setup-state", doc));
+ hide(E("sync-syncnow-state", doc));
+ hide(E("sync-setup", doc));
+ hide(E("sync-syncnowitem", doc));
+}
+
+function disablePrivateBrowsing(doc) {
+ disable(E("Tools:PrivateBrowsing", doc));
+ hide(E("menu_newPrivateWindow", doc));
+ // Because this is on a context menu, we can't use "hidden"
+ if (E("context-openlinkprivate", doc))
+ E("context-openlinkprivate", doc).setAttribute("style", "display: none;");
+ if (E("placesContext_open:newprivatewindow", doc))
+ E("placesContext_open:newprivatewindow", doc).setAttribute("style", "display: none;");
+ CustomizableUI.destroyWidget("privatebrowsing-button")
+}
+
+function disableAddonsManager(doc) {
+ hide(E("menu_openAddons", doc));
+ disable(E("Tools:Addons", doc)); // Ctrl+Shift+A
+ CustomizableUI.destroyWidget("add-ons-button")
+}
+
+function removeDeveloperTools(doc) {
+ var win = doc.defaultView;
+ // Need to delay this because devtools is created dynamically
+ win.setTimeout(function() {
+ CustomizableUI.destroyWidget("developer-button")
+ hide(E("webDeveloperMenu", doc));
+ var devtoolsKeyset = doc.getElementById("devtoolsKeyset");
+ if (devtoolsKeyset) {
+ for (var i = 0; i < devtoolsKeyset.childNodes.length; i++) {
+ devtoolsKeyset.childNodes[i].removeAttribute("oncommand");
+ devtoolsKeyset.childNodes[i].removeAttribute("command");
+ }
+ }
+ }, 0);
+ try {
+ doc.getElementById("Tools:ResponsiveUI").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:Scratchpad").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:BrowserConsole").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:BrowserToolbox").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:DevAppsMgr").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:DevToolbar").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:DevToolbox").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:DevToolbarFocus").removeAttribute("oncommand");
+ } catch (e) {}
+ CustomizableUI.destroyWidget("developer-button")
+}
+
+function disableErrorConsole(doc) {
+ doc.getElementById("Tools:ErrorConsole").removeAttribute("oncommand");
+}
+
+function onPanelShowing(event) {
+ var configs = CCK2.getConfigs();
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.disableSync) {
+ hide(E("PanelUI-fxa-status", event.target.ownerDocument));
+ hide(E("PanelUI-footer-fxa", event.target.ownerDocument)); // Firefox 42+
+ }
+ }
+}
+
+function onAppMenuShowing(event) {
+ var configs = CCK2.getConfigs();
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.disableSync) {
+ hide(E("appMenu-fxa-container", event.target.ownerDocument));
+ }
+ if (config.removeDeveloperTools) {
+ hide(E("appMenu-developer-button", event.target.ownerDocument));
+ }
+ }
+}
+
+function E(id, context) {
+ var element = context.getElementById(id);
+ return element;
+}
+
+function hide(element) {
+ if (element) {
+ element.setAttribute("hidden", "true");
+ }
+}
+
+function disable(element) {
+ if (element) {
+ element.disabled = true;
+ element.setAttribute("disabled", "true");
+ }
+}
+
+function hideUIElements(doc, hiddenUI) {
+ for (var i=0; i < hiddenUI.length; i++) {
+ var uiElements = doc.querySelectorAll(hiddenUI[i]);
+ // Don't use .hidden since it doesn't work sometimes
+ var style = doc.getElementById("cck2-hidden-style");
+ if (!style) {
+ style = doc.createElementNS("http://www.w3.org/1999/xhtml", "style");
+ style.setAttribute("id", "cck2-hidden-style");
+ style.setAttribute("type", "text/css");
+ doc.documentElement.appendChild(style);
+ }
+ style.textContent = style.textContent + hiddenUI[i] + "{display: none !important;}";
+ if (!uiElements || uiElements.length == 0) {
+ continue;
+ }
+ for (var j=0; j < uiElements.length; j++) {
+ var uiElement = uiElements[j];
+ if (uiElement.nodeName == "menuitem") {
+ uiElement.removeAttribute("key");
+ uiElement.removeAttribute("oncommand");
+ if (uiElement.hasAttribute("command")) {
+ var commandId = uiElement.getAttribute("command");
+ uiElement.removeAttribute("command");
+ var command = doc.getElementById(commandId);
+ command.removeAttribute("oncommand");
+ var keys = doc.querySelectorAll("key[command='" + commandId + "']")
+ for (var k=0; k < keys.length; k++) {
+ keys[k].removeAttribute("command");
+ }
+ }
+ }
+ // Horrible hack to work around the crappy Australis help menu
+ // Items on the menu always show up in the Australis menu, so we have to remove them.
+ if (uiElements[j].parentNode.id == "menu_HelpPopup") {
+ uiElements[j].parentNode.removeChild(uiElements[j]);
+ }
+ }
+ }
+}
diff --git a/osx/build/preferences/cck2/modules/CCK2FileBlock.jsm b/osx/build/preferences/cck2/modules/CCK2FileBlock.jsm
new file mode 100644
index 0000000..5cad7de
--- /dev/null
+++ b/osx/build/preferences/cck2/modules/CCK2FileBlock.jsm
@@ -0,0 +1,47 @@
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+var EXPORTED_SYMBOLS = [];
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+let CCK2FileBlock = {
+ chromeBlacklist: ["browser", "mozapps", "marionette", "specialpowers",
+ "branding", "alerts"],
+ shouldLoad: function(aContentType, aContentLocation, aRequestOrigin, aContext, aMimeTypeGuess, aExtra) {
+ // Prevent the loading of chrome URLs into the main browser window
+ if (aContentLocation.scheme == "chrome") {
+ if (aRequestOrigin &&
+ (aRequestOrigin.spec == "chrome://browser/content/browser.xul" ||
+ aRequestOrigin.scheme == "moz-nullprincipal")) {
+ for (var i=0; i < this.chromeBlacklist.length; i++) {
+ if (aContentLocation.host == this.chromeBlacklist[i]) {
+ if (aContentLocation.spec.includes(".xul")) {
+ return Ci.nsIContentPolicy.REJECT_REQUEST;
+ }
+ }
+ }
+ }
+ }
+ return Ci.nsIContentPolicy.ACCEPT;
+ },
+ shouldProcess: function(aContentType, aContentLocation, aRequestOrigin, aContext, aMimeTypeGuess, aExtra) {
+ return Ci.nsIContentPolicy.ACCEPT;
+ },
+ classDescription: "CCK2 FileBlock Service",
+ contractID: "@kaply.com/cck2-fileblock-service;1",
+ classID: Components.ID('{26e7afc9-e22d-4d12-bb57-c184fe24b828}'),
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPolicy]),
+ createInstance: function(outer, iid) {
+ return this.QueryInterface(iid);
+ },
+};
+
+var registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
+registrar.registerFactory(CCK2FileBlock.classID,
+ CCK2FileBlock.classDescription,
+ CCK2FileBlock.contractID,
+ CCK2FileBlock);
+
+var cm = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager);
+cm.addCategoryEntry("content-policy", CCK2FileBlock.contractID,
+ CCK2FileBlock.contractID, false, true);
diff --git a/osx/build/preferences/cck2/modules/CCK2Framescript.js b/osx/build/preferences/cck2/modules/CCK2Framescript.js
new file mode 100644
index 0000000..fda925c
--- /dev/null
+++ b/osx/build/preferences/cck2/modules/CCK2Framescript.js
@@ -0,0 +1,51 @@
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+Cu.import("resource://gre/modules/Services.jsm");
+
+var disableSearchEngineInstall = false;
+
+var documentObserver = {
+ observe: function observe(subject, topic, data) {
+ if (subject instanceof Ci.nsIDOMWindow && topic == 'content-document-global-created') {
+ var doc = subject.document;
+ doc.addEventListener("DOMContentLoaded", function onLoad(event) {
+ event.target.removeEventListener("DOMContentLoaded", onLoad, false);
+ if (disableSearchEngineInstall) {
+ subject.wrappedJSObject.external.AddSearchProvider = function() {};
+ }
+ if (!doc.documentURI.startsWith("about:")) {
+ return;
+ }
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.hiddenUI) {
+ for (var i=0; i < config.hiddenUI.length; i++) {
+ // Don't use .hidden since it doesn't work sometimes
+ var style = doc.getElementById("cck2-hidden-style");
+ if (!style) {
+ style = doc.createElementNS("http://www.w3.org/1999/xhtml", "style");
+ style.setAttribute("id", "cck2-hidden-style");
+ style.setAttribute("type", "text/css");
+ doc.documentElement.appendChild(style);
+ }
+ style.textContent = style.textContent + config.hiddenUI[i] + "{display: none !important;}";
+ }
+ }
+ }
+ }, false);
+ }
+ }
+}
+
+var configs = sendSyncMessage("cck2:get-configs")[0];
+for (var id in configs) {
+ var config = configs[id];
+ if (config.disableSearchEngineInstall) {
+ disableSearchEngineInstall = true;
+ break;
+ }
+}
+
+Services.obs.addObserver(documentObserver, "content-document-global-created", false);
+addEventListener("unload", function() {
+ Services.obs.removeObserver(documentObserver, "content-document-global-created", false);
+})
diff --git a/osx/build/preferences/cck2/modules/CCK2PreferencesOverlay.jsm b/osx/build/preferences/cck2/modules/CCK2PreferencesOverlay.jsm
new file mode 100644
index 0000000..3f165bd
--- /dev/null
+++ b/osx/build/preferences/cck2/modules/CCK2PreferencesOverlay.jsm
@@ -0,0 +1,123 @@
+/* This file modifies the preferences dialogs. It does the following:
+ * Removes private browsing from the pref UI if it is disabled
+ * Removes Sync from the pref UI if it is diabled
+ * Disables the crash reporter button if crash reporter is disabled
+ * Removed the master password UI if it is disabled
+ * Goes through the hiddenUI list and hides any UI
+ *
+ */
+
+const EXPORTED_SYMBOLS = [];
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://cck2/CCK2.jsm");
+
+var configs = null;
+
+var observer = {
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "chrome-document-global-created":
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var url = doc.location.href.split("?")[0].split("#")[0];
+ switch (url) {
+ case "chrome://browser/content/preferences/preferences.xul":
+ configs = CCK2.getConfigs();
+ win.addEventListener("paneload", function(event) {
+ updatePrefUI(event.target.ownerDocument);
+ }, false);
+ updatePrefUI(doc);
+ for (let id in configs) {
+ var config = configs[id];
+ if (!config.disableSync) {
+ continue;
+ }
+ var prefWindow = E("BrowserPreferences", doc);
+ var paneSyncRadio = doc.getAnonymousElementByAttribute(prefWindow, "pane", "paneSync");
+ hide(paneSyncRadio);
+ var paneDeck = doc.getAnonymousElementByAttribute(prefWindow, "anonid", "paneDeck");
+ var paneSync = E("paneSync", doc);
+ paneSync.removeAttribute("helpTopic");
+ var weavePrefsDeck = E("weavePrefsDeck", doc);
+ if (weavePrefsDeck)
+ weavePrefsDeck.parentNode.removeChild(weavePrefsDeck);
+ if (prefWindow.currentPane == E("paneSync", doc))
+ prefWindow.showPane(E("paneMain", doc));
+ }
+ break;
+ case "about:preferences":
+ case "chrome://browser/content/preferences/in-content/preferences.xul":
+ configs = CCK2.getConfigs();
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.disableSync) {
+ hide(E("category-sync", doc));
+ }
+ }
+ updatePrefUI(doc);
+ break;
+ }
+ }, false);
+ break;
+ }
+ }
+}
+Services.obs.addObserver(observer, "chrome-document-global-created", false);
+
+// The IDs are the same, so I can reuse this for regular and in-content prefs
+function updatePrefUI(doc) {
+ for (var id in configs) {
+ var config = configs[id];
+ if (config.disablePrivateBrowsing) {
+ hide(E("privateBrowsingAutoStart", doc));
+ var privateBrowsingMenu = doc.querySelector("menuitem[value='dontremember']");
+ hide(privateBrowsingMenu, doc);
+ }
+ if (config.disableCrashReporter) {
+ disable(E("submitCrashesBox", doc));
+ }
+ if (config.disableSync) {
+ hide(E("noFxaAccount", doc));
+ hide(E("hasFxaAccount", doc));
+ }
+ if (config.noMasterPassword == true) {
+ hide(E("useMasterPassword", doc));
+ hide(E("changeMasterPassword", doc));
+ }
+ if (config.hiddenUI) {
+ for (var i=0; i < config.hiddenUI.length; i++) {
+ // Don't use .hidden since it doesn't work sometimes
+ var style = doc.getElementById("cck2-hidden-style");
+ if (!style) {
+ style = doc.createElementNS("http://www.w3.org/1999/xhtml", "style");
+ style.setAttribute("id", "cck2-hidden-style");
+ style.setAttribute("type", "text/css");
+ doc.documentElement.appendChild(style);
+ }
+ style.textContent = style.textContent + config.hiddenUI[i] + "{display: none !important;}";
+ }
+ }
+ }
+}
+
+function E(id, context) {
+ var element = context.getElementById(id);
+ return element;
+}
+
+function hide(element) {
+ if (element) {
+ element.setAttribute("hidden", "true");
+ }
+}
+
+function disable(element) {
+ if (element) {
+ element.disabled = true;
+ }
+}
diff --git a/osx/build/preferences/cck2/modules/CTPPermissions.jsm b/osx/build/preferences/cck2/modules/CTPPermissions.jsm
new file mode 100644
index 0000000..862ea48
--- /dev/null
+++ b/osx/build/preferences/cck2/modules/CTPPermissions.jsm
@@ -0,0 +1,123 @@
+/**
+ * Copied from https://github.com/jvillalobos/CTP-Manager/blob/master/extension/modules/permissions.js
+ **/
+
+/**
+ * Copyright 2013 Jorge Villalobos
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ **/
+
+var EXPORTED_SYMBOLS = ["CTP"];
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+
+Components.utils.import("resource://gre/modules/Services.jsm");
+
+var CTP = {
+ /**
+ * Cleans up the plugin name to a more readable form.
+ * Taken from /browser/base/content/pageinfo/permissions.js (Firefox 20)
+ * @param aPluginName the name to clean up.
+ * @return cleaned up plugin name.
+ */
+ makeNicePluginName : function(aPluginName) {
+ let newName =
+ aPluginName.replace(/[\s\d\.\-\_\(\)]+$/, "").
+ replace(/\bplug-?in\b/i, "").trim();
+
+ return newName;
+ },
+
+ /**
+ * Gets the plugin permission string from the tag object. In Firefox 20, this
+ * is the plugin filename. In 21 an above, the file extension is removed and
+ * Flash and Java are special-cased.
+ * @param aTag the tag object with the plugin information.
+ * @return permission string that corresponds to the plugin in the tag.
+ */
+ getPluginPermissionFromTag : function(aTag) {
+ let permission = null;
+ let majorVersion = Services.appinfo.platformVersion.split(".")[0];
+
+ if (21 <= majorVersion) {
+ let mimeTypes = aTag.getMimeTypes();
+
+ if (CTP.isFlashPlugin(mimeTypes)) {
+ permission = "flash";
+ } else if (CTP.isJavaPlugin(mimeTypes)) {
+ permission = "java";
+ } else {
+ let lastPeriod = aTag.filename.lastIndexOf(".");
+
+ permission =
+ ((0 < lastPeriod) ? aTag.filename.substring(0, lastPeriod) :
+ aTag.filename);
+ // Remove digits at the end
+ permission = permission.replace(/[0-9]+$/, "");
+ permission = permission.toLowerCase();
+ }
+ } else {
+ permission = aTag.filename;
+ }
+
+ return permission;
+ },
+
+ /**
+ * Checks if the tag object corresponds to the Java plugin.
+ * @param aMimeTypes the list of MIME types for the plugin.
+ * @return true if the tag corresponds to the Java plugin.
+ */
+ isJavaPlugin : function(aMimeTypes) {
+ let isJava = false;
+ let mimeType;
+
+ for (let i = 0; i < aMimeTypes.length; i++) {
+ mimeType =
+ ((null != aMimeTypes[i].type) ? aMimeTypes[i].type : aMimeTypes[i]);
+
+ if ((0 == mimeType.indexOf("application/x-java-vm")) ||
+ (0 == mimeType.indexOf("application/x-java-applet")) ||
+ (0 == mimeType.indexOf("application/x-java-bean"))) {
+ isJava = true;
+ break;
+ }
+ }
+
+ return isJava;
+ },
+
+ /**
+ * Checks if the tag object corresponds to the Flash plugin.
+ * @param aMimeTypes the list of MIME types for the plugin.
+ * @return true if the tag corresponds to the Flash plugin.
+ */
+ isFlashPlugin : function(aMimeTypes) {
+ let isFlash = false;
+ let mimeType;
+
+ for (let i = 0; i < aMimeTypes.length; i++) {
+ mimeType =
+ ((null != aMimeTypes[i].type) ? aMimeTypes[i].type : aMimeTypes[i]);
+
+ if (0 == mimeType.indexOf("application/x-shockwave-flash")) {
+ isFlash = true;
+ break;
+ }
+ }
+
+ return isFlash;
+ }
+};
diff --git a/osx/build/preferences/cck2/modules/Preferences.jsm b/osx/build/preferences/cck2/modules/Preferences.jsm
new file mode 100644
index 0000000..2100911
--- /dev/null
+++ b/osx/build/preferences/cck2/modules/Preferences.jsm
@@ -0,0 +1,629 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Preferences.
+ *
+ * The Initial Developer of the Original Code is Mozilla.
+ * Portions created by the Initial Developer are Copyright (C) 2008
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Myk Melez
+ * Daniel Aquino
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+let EXPORTED_SYMBOLS = ["Preferences"];
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cr = Components.results;
+const Cu = Components.utils;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+// The minimum and maximum integers that can be set as preferences.
+// The range of valid values is narrower than the range of valid JS values
+// because the native preferences code treats integers as NSPR PRInt32s,
+// which are 32-bit signed integers on all platforms.
+const MAX_INT = Math.pow(2, 31) - 1;
+const MIN_INT = -MAX_INT;
+
+function Preferences(args) {
+ if (isObject(args)) {
+ if (args.branch)
+ this._prefBranch = args.branch;
+ }
+ else if (args)
+ this._prefBranch = args;
+ this.isDefaultBranch = false;
+}
+
+Preferences.prototype = {
+ /**
+ * Get the value of a pref, if any; otherwise return the default value.
+ *
+ * @param prefName {String|Array}
+ * the pref to get, or an array of prefs to get
+ *
+ * @param defaultValue
+ * the default value, if any, for prefs that don't have one
+ *
+ * @returns the value of the pref, if any; otherwise the default value
+ */
+ get: function(prefName, defaultValue) {
+ if (isArray(prefName))
+ return prefName.map(v => this.get(v, defaultValue));
+
+ return this._get(prefName, defaultValue);
+ },
+
+// In all cases below, the preference might exist as a user pref, but not
+// have a default value. In those cases, get* throws. Return the default value.
+ _get: function(prefName, defaultValue) {
+ switch (this._prefSvc.getPrefType(prefName)) {
+ case Ci.nsIPrefBranch.PREF_STRING:
+ try {
+ return this._prefSvc.getComplexValue(prefName, Ci.nsISupportsString).data;
+ } catch (ex) {
+ if (this.isDefaultBranch)
+ return defaultValue;
+ else
+ return this._prefSvc.getCharPref(prefName);
+ }
+
+ case Ci.nsIPrefBranch.PREF_INT:
+ try {
+ return this._prefSvc.getIntPref(prefName);
+ } catch (ex) {
+ return defaultValue;
+ }
+
+ case Ci.nsIPrefBranch.PREF_BOOL:
+ try {
+ return this._prefSvc.getBoolPref(prefName);
+ } catch (ex) {
+ return defaultValue;
+ }
+
+ case Ci.nsIPrefBranch.PREF_INVALID:
+ return defaultValue;
+
+ default:
+ // This should never happen.
+ throw "Error getting pref " + prefName + "; its value's type is " +
+ this._prefSvc.getPrefType(prefName) + ", which I don't know " +
+ "how to handle.";
+ }
+ },
+
+ /**
+ * Set a preference to a value.
+ *
+ * You can set multiple prefs by passing an object as the only parameter.
+ * In that case, this method will treat the properties of the object
+ * as preferences to set, where each property name is the name of a pref
+ * and its corresponding property value is the value of the pref.
+ *
+ * @param prefName {String|Object}
+ * the name of the pref to set; or an object containing a set
+ * of prefs to set
+ *
+ * @param prefValue {String|Number|Boolean}
+ * the value to which to set the pref
+ *
+ * Note: Preferences cannot store non-integer numbers or numbers outside
+ * the signed 32-bit range -(2^31-1) to 2^31-1, If you have such a number,
+ * store it as a string by calling toString() on the number before passing
+ * it to this method, i.e.:
+ * Preferences.set("pi", 3.14159.toString())
+ * Preferences.set("big", Math.pow(2, 31).toString()).
+ */
+ set: function(prefName, prefValue) {
+ if (isObject(prefName)) {
+ for (let [name, value] in Iterator(prefName))
+ this.set(name, value);
+ return;
+ }
+
+ this._set(prefName, prefValue);
+ },
+
+ _set: function(prefName, prefValue) {
+ let prefType;
+ if (typeof prefValue != "undefined" && prefValue != null)
+ prefType = prefValue.constructor.name;
+
+ var existingPrefType = this._prefSvc.getPrefType(prefName);
+ if (existingPrefType != Ci.nsIPrefBranch.PREF_INVALID)
+ {
+ // convert
+ if (existingPrefType == Ci.nsIPrefBranch.PREF_INT && prefType == "String")
+ {
+ prefValue = parseInt(prefValue);
+ if (isNaN(prefValue))
+ throw "Incompatible pref value type - " + prefName;
+ prefType = "Number";
+ }
+ else if (existingPrefType == Ci.nsIPrefBranch.PREF_BOOL && prefType == "String")
+ {
+ if (prefValue == "true")
+ prefValue = true;
+ else if (prefValue == "false")
+ prefValue = false;
+ else
+ throw "Incompatible pref value type - " + prefName;
+ prefType = "Boolean";
+ }
+ else if (existingPrefType == Ci.nsIPrefBranch.PREF_BOOL && prefType == "Number")
+ {
+ prefValue = prefValue != 0;
+ prefType = "Boolean";
+ }
+ }
+
+ switch (prefType) {
+ case "String":
+ {
+ try {
+ this._prefSvc.setStringPref(prefName, prefValue);
+ } catch (e) {
+ try {
+ let string = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
+ string.data = prefValue;
+ this._prefSvc.setComplexValue(prefName, Ci.nsISupportsString, string);
+ } catch (e2) {
+ Components.utils.reportError(e2);
+ }
+ }
+ }
+ break;
+
+ case "Number":
+ // We throw if the number is outside the range, since the result
+ // will never be what the consumer wanted to store, but we only warn
+ // if the number is non-integer, since the consumer might not mind
+ // the loss of precision.
+ if (prefValue > MAX_INT || prefValue < MIN_INT)
+ throw("you cannot set the " + prefName + " pref to the number " +
+ prefValue + ", as number pref values must be in the signed " +
+ "32-bit integer range -(2^31-1) to 2^31-1. To store numbers " +
+ "outside that range, store them as strings.");
+ try {
+ this._prefSvc.setIntPref(prefName, prefValue);
+ } catch (e) {
+ throw new Error(e.toString() + " - " + prefName);
+ }
+ if (prefValue % 1 != 0)
+ Cu.reportError("Warning: setting the " + prefName + " pref to the " +
+ "non-integer number " + prefValue + " converted it " +
+ "to the integer number " + this.get(prefName) +
+ "; to retain fractional precision, store non-integer " +
+ "numbers as strings.");
+ break;
+
+ case "Boolean":
+ this._prefSvc.setBoolPref(prefName, prefValue);
+ break;
+
+ default:
+ throw "can't set pref " + prefName + " to value '" + prefValue +
+ "'; it isn't a String, Number, or Boolean";
+ }
+ },
+
+ /**
+ * Whether or not the given pref has a value. This is different from isSet
+ * because it returns true whether the value of the pref is a default value
+ * or a user-set value, while isSet only returns true if the value
+ * is a user-set value.
+ *
+ * @param prefName {String|Array}
+ * the pref to check, or an array of prefs to check
+ *
+ * @returns {Boolean|Array}
+ * whether or not the pref has a value; or, if the caller provided
+ * an array of pref names, an array of booleans indicating whether
+ * or not the prefs have values
+ */
+ has: function(prefName) {
+ if (isArray(prefName))
+ return prefName.map(this.has, this);
+
+ return this._has(prefName);
+ },
+
+ _has: function(prefName) {
+ return (this._prefSvc.getPrefType(prefName) != Ci.nsIPrefBranch.PREF_INVALID);
+ },
+
+ /**
+ * Whether or not the given pref has a user-set value. This is different
+ * from |has| because it returns true only if the value of the pref is a user-
+ * set value, while |has| returns true if the value of the pref is a default
+ * value or a user-set value.
+ *
+ * @param prefName {String|Array}
+ * the pref to check, or an array of prefs to check
+ *
+ * @returns {Boolean|Array}
+ * whether or not the pref has a user-set value; or, if the caller
+ * provided an array of pref names, an array of booleans indicating
+ * whether or not the prefs have user-set values
+ */
+ isSet: function(prefName) {
+ if (isArray(prefName))
+ return prefName.map(this.isSet, this);
+
+ return (this.has(prefName) && this._prefSvc.prefHasUserValue(prefName));
+ },
+
+ /**
+ * Whether or not the given pref has a user-set value. Use isSet instead,
+ * which is equivalent.
+ * @deprecated
+ */
+ modified: function(prefName) { return this.isSet(prefName) },
+
+ reset: function(prefName) {
+ if (isArray(prefName)) {
+ prefName.map(v => this.reset(v));
+ return;
+ }
+
+ this._reset(prefName);
+ },
+
+ _reset: function(prefName) {
+ try {
+ this._prefSvc.clearUserPref(prefName);
+ }
+ catch(ex) {
+ // The pref service throws NS_ERROR_UNEXPECTED when the caller tries
+ // to reset a pref that doesn't exist or is already set to its default
+ // value. This interface fails silently in those cases, so callers
+ // can unconditionally reset a pref without having to check if it needs
+ // resetting first or trap exceptions after the fact. It passes through
+ // other exceptions, however, so callers know about them, since we don't
+ // know what other exceptions might be thrown and what they might mean.
+ if (ex.result != Cr.NS_ERROR_UNEXPECTED)
+ throw ex;
+ }
+ },
+
+ /**
+ * If you need to know the default values, without resetting the actual
+ * user prefs, you can use this.
+ * @returns {Preferences} a new Preferences object, which accesses
+ * the defaults rather than the user prefs.
+ * *Only* call get() on this.
+ * If you call set(), you will modify the defaults, so don't do that!
+ */
+ get defaults() {
+ // nsIPrefService
+ let defaultBranch = Services.prefs.
+ getDefaultBranch(this._prefBranch).
+ QueryInterface(Ci.nsIPrefBranch);
+ let prefs = new Preferences(this._prefBranch);
+ // override. nasty, but this is internal, so OK.
+ Object.defineProperty(prefs, "_prefSvc", {
+ get: function() {
+ return defaultBranch;
+ }
+ });
+ prefs.isDefaultBranch = true;
+ return prefs;
+ },
+
+ /**
+ * Lock a pref so it can't be changed.
+ *
+ * @param prefName {String|Array}
+ * the pref to lock, or an array of prefs to lock
+ * @param prefValue {String} (optional)
+ * default value of pref to lock only works if prefName isn't an array
+ */
+ lock: function(prefName, prefValue) {
+ if (isArray(prefName))
+ prefName.map(this.lock, this);
+ else if (typeof prefValue != "undefined")
+ this.defaults.set(prefName, prefValue);
+
+ this._prefSvc.lockPref(prefName);
+ },
+
+ /**
+ * Unlock a pref so it can be changed.
+ *
+ * @param prefName {String|Array}
+ * the pref to lock, or an array of prefs to lock
+ */
+ unlock: function(prefName) {
+ if (isArray(prefName))
+ prefName.map(this.unlock, this);
+
+ this._prefSvc.unlockPref(prefName);
+ },
+
+ /**
+ * Whether or not the given pref is locked against changes and
+ * if it is set to the passedi n value
+ *
+ * @param prefName {String|Array}
+ * the pref to check, or an array of prefs to check
+ * @param prefValue {String|Number|Boolean}}
+ * the pref value to compare against
+ *
+ * @returns {Boolean|Array}
+ * whether or not the pref is locked; or, if the caller
+ * provided an array of pref names, an array of booleans indicating
+ * whether or not the prefs are locked
+ * If a pref value was specified returns whether or not the pref
+ * was locked and equal to the passed in value.
+ */
+ locked: function(prefName, prefValue) {
+ if (isArray(prefName))
+ return prefName.map(this.locked, this);
+
+ if (prefValue)
+ return this._prefSvc.prefIsLocked(prefName) && (this.get(prefName) == prefValue);
+ else
+ return this._prefSvc.prefIsLocked(prefName);
+ },
+
+ /**
+ * Start observing a pref.
+ *
+ * The callback can be a function or any object that implements nsIObserver.
+ * When the callback is a function and thisObject is provided, it gets called
+ * as a method of thisObject.
+ *
+ * @param prefName {String}
+ * the name of the pref to observe
+ *
+ * @param callback {Function|Object}
+ * the code to notify when the pref changes;
+ *
+ * @param thisObject {Object} [optional]
+ * the object to use as |this| when calling a Function callback;
+ *
+ * @returns the wrapped observer
+ */
+ observe: function(prefName, callback, thisObject) {
+ let fullPrefName = this._prefBranch + (prefName || "");
+
+ let observer = new PrefObserver(fullPrefName, callback, thisObject);
+ Preferences._prefSvc.addObserver(fullPrefName, observer, true);
+ observers.push(observer);
+
+ return observer;
+ },
+
+ /**
+ * Stop observing a pref.
+ *
+ * You must call this method with the same prefName, callback, and thisObject
+ * with which you originally registered the observer. However, you don't have
+ * to call this method on the same exact instance of Preferences; you can call
+ * it on any instance. For example, the following code first starts and then
+ * stops observing the "foo.bar.baz" preference:
+ *
+ * let observer = function() {...};
+ * Preferences.observe("foo.bar.baz", observer);
+ * new Preferences("foo.bar.").ignore("baz", observer);
+ *
+ * @param prefName {String}
+ * the name of the pref being observed
+ *
+ * @param callback {Function|Object}
+ * the code being notified when the pref changes
+ *
+ * @param thisObject {Object} [optional]
+ * the object being used as |this| when calling a Function callback
+ */
+ ignore: function(prefName, callback, thisObject) {
+ let fullPrefName = this._prefBranch + (prefName || "");
+
+ // This seems fairly inefficient, but I'm not sure how much better we can
+ // make it. We could index by fullBranch, but we can't index by callback
+ // or thisObject, as far as I know, since the keys to JavaScript hashes
+ // (a.k.a. objects) can apparently only be primitive values.
+ let [observer] = observers.filter(v => v.prefName == fullPrefName &&
+ v.callback == callback &&
+ v.thisObject == thisObject);
+
+ if (observer) {
+ Preferences._prefSvc.removeObserver(fullPrefName, observer);
+ observers.splice(observers.indexOf(observer), 1);
+ }
+ },
+
+ /**
+ * Same as observe(), but automatically unregisters itself when
+ * the window closes, saving you from writing an unload handler and
+ * calling ignore().
+ * @param win {nsIDOMWindow} your |window|
+ */
+ observeAuto: function(win, prefName, callback, thisObject) {
+ if (!win instanceof Ci.nsIDOMWindow)
+ throw "Need your |window| as first parameter";
+ this.observe(prefName, callback, thisObject);
+ var self = this;
+ win.addEventListener("unload", function()
+ {
+ self.ignore(prefName, callback, thisObject);
+ }, false);
+ win = null; // don't let closure hold on to window unnecessarily
+ },
+
+ resetBranch: function(prefBranch) {
+ try {
+ this._prefSvc.resetBranch(prefBranch);
+ }
+ catch(ex) {
+ // The current implementation of nsIPrefBranch in Mozilla
+ // doesn't implement resetBranch, so we do it ourselves.
+ if (ex.result == Cr.NS_ERROR_NOT_IMPLEMENTED)
+ this.reset(this._prefSvc.getChildList(prefBranch, []));
+ else
+ throw ex;
+ }
+ },
+
+ /**
+ * Returns all child prefs of this pref branch.
+ * This equals nsIPrefBranch.getChildList().
+ * This allows you to do e.g.
+ * var myPrefs = new Preferences("extensions.cooler.");
+ * var contents = myPrefs.branch("contents.");
+ * for each (let prefname in contents.childPrefNames())
+ * dump("have " + contents.get(prefname) + " " + prefname + "\n");
+ *
+ * @returns {Array of String} The names of the children,
+ * without the base pref branch, but with subbranch.
+ */
+ childPrefNames : function() {
+ return this._prefSvc.getChildList("", []);
+ },
+
+ /**
+ * Returns an nsIPrefBranch for the pref branch that this object stands for.
+ * You can use this to use functions that are not supported here.
+ * @returns {nsIPrefBranch}
+ */
+ get mozillaPrefBranch() {
+ return this._prefSvc;
+ },
+
+ /**
+ * Returns the base pref name that this object stands for.
+ * E.g. "extensions.yourcooler.";
+ * @returns {String}
+ */
+ get prefBranchName() {
+ return this._prefBranch;
+ },
+
+ /**
+ * Returns an Preferences object for an sub pref branch
+ * underneath the current pref branch.
+ * @param subbranch {String} Will be appended to the
+ * current pref branch. Don't forget the trailing dot,
+ * where necessary.
+ * E.g. "contents."
+ * @returns {Preferences}
+ */
+ branch : function(subbranch) {
+ return new Preferences(this._prefBranch + subbranch);
+ },
+
+ /**
+ * The branch of the preferences tree to which this instance provides access.
+ * @private
+ */
+ _prefBranch: "",
+
+ /**
+ * Preferences Service
+ * @private
+ */
+ get _prefSvc() {
+ // nsIPrefService
+ let prefSvc = Services.prefs.
+ getBranch(this._prefBranch).
+ QueryInterface(Ci.nsIPrefBranch);
+ Object.defineProperty(this, "_prefSvc", {
+ get: function() {
+ return prefSvc;
+ }
+ });
+ return this._prefSvc;
+ }
+
+};
+
+// Give the constructor the same prototype as its instances, so users can access
+// preferences directly via the constructor without having to create an instance
+// first.
+Preferences.__proto__ = Preferences.prototype;
+
+/**
+ * A cache of pref observers.
+ *
+ * We use this to remove observers when a caller calls Preferences::ignore.
+ *
+ * All Preferences instances share this object, because we want callers to be
+ * able to remove an observer using a different Preferences object than the one
+ * with which they added it. That means we have to identify the observers
+ * in this object by their complete pref name, not just their name relative to
+ * the root branch of the Preferences object with which they were created.
+ */
+let observers = [];
+
+function PrefObserver(prefName, callback, thisObject) {
+ this.prefName = prefName;
+ this.callback = callback;
+ this.thisObject = thisObject;
+}
+
+PrefObserver.prototype = {
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
+
+ observe: function(subject, topic, data) {
+ // The pref service only observes whole branches, but we only observe
+ // individual preferences, so we check here that the pref that changed
+ // is the exact one we're observing (and not some sub-pref on the branch).
+ if (data != this.prefName)
+ return;
+
+ if (typeof this.callback == "function") {
+ let prefValue = Preferences.get(this.prefName);
+
+ if (this.thisObject)
+ this.callback.call(this.thisObject, prefValue);
+ else
+ this.callback(prefValue);
+ }
+ else // typeof this.callback == "object" (nsIObserver)
+ this.callback.observe(subject, topic, data);
+ }
+};
+
+function isArray(val) {
+ // We can't check for |val.constructor == Array| here, since the value
+ // might be from a different context whose Array constructor is not the same
+ // as ours, so instead we match based on the name of the constructor.
+ return (typeof val != "undefined" && val != null && typeof val == "object" &&
+ val.constructor.name == "Array");
+}
+
+function isObject(val) {
+ // We can't check for |val.constructor == Object| here, since the value
+ // might be from a different context whose Object constructor is not the same
+ // as ours, so instead we match based on the name of the constructor.
+ return (typeof val != "undefined" && val != null && typeof val == "object" &&
+ val.constructor.name == "Object");
+}
diff --git a/osx/build/preferences/cck2/modules/Timer.jsm b/osx/build/preferences/cck2/modules/Timer.jsm
new file mode 100644
index 0000000..d405b28
--- /dev/null
+++ b/osx/build/preferences/cck2/modules/Timer.jsm
@@ -0,0 +1,43 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+/**
+ * JS module implementation of nsIDOMJSWindow.setTimeout and clearTimeout.
+ */
+
+this.EXPORTED_SYMBOLS = ["setTimeout", "clearTimeout"];
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cu = Components.utils;
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+// This gives us >=2^30 unique timer IDs, enough for 1 per ms for 12.4 days.
+let gNextTimeoutId = 1; // setTimeout must return a positive integer
+
+let gTimeoutTable = new Map(); // int -> nsITimer
+
+this.setTimeout = function setTimeout(aCallback, aMilliseconds) {
+ let id = gNextTimeoutId++;
+ let args = Array.slice(arguments, 2);
+ let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ timer.initWithCallback(function setTimeout_timer() {
+ gTimeoutTable.delete(id);
+ aCallback.apply(null, args);
+ }, aMilliseconds, timer.TYPE_ONE_SHOT);
+
+ gTimeoutTable.set(id, timer);
+ return id;
+}
+
+this.clearTimeout = function clearTimeout(aId) {
+ if (gTimeoutTable.has(aId)) {
+ gTimeoutTable.get(aId).cancel();
+ gTimeoutTable.delete(aId);
+ }
+}
+
diff --git a/osx/build/preferences/cck2/modules/Utils.jsm b/osx/build/preferences/cck2/modules/Utils.jsm
new file mode 100644
index 0000000..559bb0b
--- /dev/null
+++ b/osx/build/preferences/cck2/modules/Utils.jsm
@@ -0,0 +1,10 @@
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+var EXPORTED_SYMBOLS = ["errorCritical"];
+
+Components.utils.import("resource://gre/modules/Services.jsm");
+
+function errorCritical(e)
+{
+ Services.prompt.alert(null, "", e);
+}
diff --git a/osx/build/preferences/cck2/resources/certs/purplei2p_ca.pem b/osx/build/preferences/cck2/resources/certs/purplei2p_ca.pem
new file mode 100644
index 0000000..bbbcc77
--- /dev/null
+++ b/osx/build/preferences/cck2/resources/certs/purplei2p_ca.pem
@@ -0,0 +1,23 @@
+-----BEGIN CERTIFICATE-----
+MIID7DCCAtSgAwIBAgIJAKXaTovgoTIUMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD
+VQQGEwJXVzEUMBIGA1UECAwLSTJQIE5ldHdvcmsxEjAQBgNVBAoMCVB1cnBsZUky
+UDEqMCgGA1UEAwwhUHVycGxlSTJQIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR0w
+GwYJKoZIhvcNAQkBFg5yNHNhc0BtYWlsLmkycDAeFw0xODA4MjQyMTQ3NTJaFw0y
+MzA4MjMyMTQ3NTJaMIGCMQswCQYDVQQGEwJXVzEUMBIGA1UECAwLSTJQIE5ldHdv
+cmsxEjAQBgNVBAoMCVB1cnBsZUkyUDEqMCgGA1UEAwwhUHVycGxlSTJQIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MR0wGwYJKoZIhvcNAQkBFg5yNHNhc0BtYWlsLmky
+cDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALAZnN/U5bgkmiBqp/Np
+yiMOkUPjr2tLhV78Oba46xDLA6AiQ7yTPg+/ZYPIfbF2dPBTpfgGdly2M1xymRKc
+3Pa+IUXkLw6oCA+lFzOFW0Swtekk9HRAgGyHgj6/Hvagva5Wer4HJIO1qRsFPew+
+XcM3uhhiXoiO8o+YGpJ/7kz0gED3p2b9OVsLPd8G/GfdR3miD+Au+kUx/27z/WdJ
+ISfFILFnYeYZGffrpRcFtoGwuZUCugwnbLtpQpNKuGq8jDidm1v6Rb85JmkoH3Sg
+lRaX1MK0aPhM4WfCf7aWCNe669FAWPNB3Ya2lue7ewPLI84ZUEqcoJwmWn2ci2SU
+EXUCAwEAAaNjMGEwHQYDVR0OBBYEFG3hwzikpXqMasw678OHM8uLyjEoMB8GA1Ud
+IwQYMBaAFG3hwzikpXqMasw678OHM8uLyjEoMA8GA1UdEwQIMAYBAf8CAQAwDgYD
+VR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQA07URxJMI/Ta9y1wIg+k7o
+1aHXsl6YOXmd2ymhKZhZHrZlutE2U19IQSoEV0SBddP9D05xD6Ovsrwo7caeYzNt
++2DJnlJ2IY61NqYUIDEoJyNPL/S7WleH+xO+bcSqWvbntTNYAD6WQVfHCAimVE6P
+RnSZGqG089i84DRCyrh/6F1OxnBd6j14z+2ctQD+h6NlQXiCAUIwzVirYoE7oGpH
+Xta7Ei+RDvBXLXLAQRdXpzSP/Ddf7MCJzmH3VYAy+0sVuHr09hpFMtC59hTrdLVD
+/qma0eKrBr1DGH6QrZMZDqpNfv4wUPyVQBsRbbn2/1fL9IqK43CIj8RUllCOsmyU
+-----END CERTIFICATE-----
diff --git a/osx/build/preferences/i2pdbrowser.cfg b/osx/build/preferences/i2pdbrowser.cfg
index ebcc93f..dfaf614 100644
--- a/osx/build/preferences/i2pdbrowser.cfg
+++ b/osx/build/preferences/i2pdbrowser.cfg
@@ -17,38 +17,39 @@
* For more information, see http://www.mozilla.org/unix/customizing.html#prefs
*/
-lockPref("accessibility.force_disabled", 1);
-pref("app.normandy.first_run", false);
-lockPref("app.update.auto", false);
-lockPref("app.update.channel", "no");
-lockPref("app.update.enabled", false);
-lockPref("app.update.interval", 0);
-lockPref("app.update.service.enabled", false);
-pref("app.update.staging.enabled", false);
-pref("app.update.timer", 0);
+// defaultPref("browser.startup.firstrunSkipsHomepage", false);
+// pref("browser.display.use_document_fonts", 0);
+// pref("browser.urlbar.suggest.history", false);
+// pref("dom.indexedDB.enabled", false);
+// pref("gfx.font_rendering.opentype_svg.enabled", false);
+// pref("javascript.options.asmjs", false);
+// pref("media.gmp-provider.enabled", false);
+// pref("network.cookie.cookieBehavior", 1);
+// pref("network.cookie.lifetimePolicy", 2);
+// pref("network.cookie.thirdparty.sessionOnly", true);
+// pref("network.dns.blockDotOnion", true);
+// pref("network.http.referer.spoofSource", true);
+// pref("network.http.referer.XOriginPolicy", 2);
+// pref("plugin.state.flash", 0);
+// pref("privacy.clearOnShutdown.cache", true);
+// pref("privacy.clearOnShutdown.cookies", true);
+// pref("privacy.clearOnShutdown.downloads", true);
+// pref("privacy.clearOnShutdown.formdata", true);
+// pref("privacy.clearOnShutdown.history", true);
+// pref("privacy.clearOnShutdown.offlineApps", true);
+// pref("privacy.clearOnShutdown.openWindows", true);
+// pref("privacy.clearOnShutdown.sessions", true);
+// pref("privacy.donottrackheader.enabled", true); // doesn't make sense anyway
+// pref("privacy.sanitize.sanitizeOnShutdown", true);
+// pref("shumway.disabled", true);
defaultPref("beacon.enabled", false);
-pref("breakpad.reportURL", "");
-pref("browser.aboutHomeSnippets.updateUrl", "");
defaultPref("browser.cache.disk.capacity", 131072);
defaultPref("browser.casting.enabled", false);
-pref("browser.crashReports.unsubmittedCheck.enabled", false);
-// pref("browser.display.use_document_fonts", 0);
-pref("browser.download.manager.retention", 0);
defaultPref("browser.download.useDownloadDir", false);
defaultPref("browser.feeds.showFirstRunUI", false);
defaultPref("browser.fixup.alternate.enabled", false);
-pref("browser.fixup.hide_user_pass", true);
defaultPref("browser.formfill.enable", false);
-// PREF: Delete Search and Form History
defaultPref("browser.formfill.expire_days", 0);
-// PREF: Delete temporary files on exit
-pref("browser.helperApps.deleteTempFileOnExit", true);
-lockPref("browser.newtabpage.activity-stream.default.sites", "http://i2pd.i2p/,http://333.i2p/,http://inr.i2p/,http://102chan.i2p/,http://flibusta.i2p/,http://fsoc.i2p/,http://lifebox.i2p/,http://onelon.i2p/,http://wiki.ilita.i2p/");
-lockPref("browser.newtabpage.activity-stream.feeds.section.highlights", false);
-lockPref("browser.newtabpage.activity-stream.feeds.snippets", false);
-lockPref("browser.newtabpage.activity-stream.showSearch", false);
-pref("browser.newtabpage.activity-stream.topSitesRows", 2);
-pref("browser.newtabpage.enhanced", false);
defaultPref("browser.newtabpage.introShown", true);
defaultPref("browser.onboarding.tour.onboarding-tour-addons.completed", true);
defaultPref("browser.onboarding.tour.onboarding-tour-customize.completed", true);
@@ -56,13 +57,7 @@ defaultPref("browser.onboarding.tour.onboarding-tour-default-browser.completed",
defaultPref("browser.onboarding.tour.onboarding-tour-performance.completed", true);
defaultPref("browser.onboarding.tour.onboarding-tour-private-browsing.completed", true);
defaultPref("browser.onboarding.tour.onboarding-tour-screenshots.completed", true);
-// PREF: Do not create screenshots of visited pages
-pref("browser.pagethumbnails.capturing_disabled", true);
-pref("browser.places.smartBookmarksVersion", -1);
defaultPref("browser.pocket.enabled", false);
-pref("browser.pocket.useLocaleList", false);
-pref("browser.reader.detectedFirstArticle", false);
-pref("browser.rights.3.shown", true);
defaultPref("browser.safebrowsing.appRepURL", "");
defaultPref("browser.safebrowsing.blockedURIs.enabled", false);
defaultPref("browser.safebrowsing.downloads.enabled", false);
@@ -89,60 +84,166 @@ defaultPref("browser.safebrowsing.reportURL", "");
defaultPref("browser.safebrowsing.updateURL", "");
defaultPref("browser.safebrowsing.warning.infoURL", "");
defaultPref("browser.search.countryCode", "US");
-defaultPref("browser.search.defaultenginename", "DuckDuckGo");
+defaultPref("browser.search.defaultenginename", "YaCy 'legwork'");
+defaultPref("browser.search.geoip.url", "");
defaultPref("browser.search.geoSpecificDefaults", false);
defaultPref("browser.search.geoSpecificDefaults.url", "");
-defaultPref("browser.search.geoip.url", "");
-defaultPref("browser.search.order.1", "DuckDuckGo");
+defaultPref("browser.search.hiddenOneOffs", "Amazon.com,Bing,DuckDuckGo,eBay,Google,Twitter,Wikipedia (en)");
+defaultPref("browser.search.official", false);
+defaultPref("browser.search.order.1", "YaCy 'legwork'");
defaultPref("browser.search.redirectWindowsSearch", false);
defaultPref("browser.search.region", "US");
defaultPref("browser.search.searchEnginesURL", "");
defaultPref("browser.search.suggest.enabled", false);
defaultPref("browser.search.update", false);
+pref("browser.search.widget.inNavBar", true);
+defaultPref("browser.shell.checkDefaultBrowser", false);
+defaultPref("browser.uitour.enabled", false);
+defaultPref("browser.urlbar.suggest.searches", false);
+defaultPref("datareporting.healthreport.about.reportUrl", "");
+defaultPref("datareporting.healthreport.about.reportUrlUnified", "");
+defaultPref("datareporting.healthreport.documentServerURI", "");
+defaultPref("datareporting.healthreport.pendingDeleteRemoteData", true);
+defaultPref("datareporting.healthreport.service.firstRun", false);
+defaultPref("datareporting.healthreport.uploadEnabled", false);
+defaultPref("extensions.update.enabled", false);
+defaultPref("geo.enabled", false);
+defaultPref("geo.wifi.uri", "");
+defaultPref("intl.locale.matchOS", true);
+defaultPref("media.eme.enabled", false);
+defaultPref("media.getusermedia.audiocapture.enabled", false);
+defaultPref("media.getusermedia.screensharing.enabled", false);
+defaultPref("media.navigator.enabled", false);
+defaultPref("media.navigator.video.enabled", false);
+defaultPref("media.peerconnection.enabled", false);
+defaultPref("media.peerconnection.ice.no_host", true);
+defaultPref("media.video_stats.enabled", false);
+defaultPref("media.webspeech.recognition.enable", false);
+defaultPref("media.webspeech.synth.enabled", false);
+defaultPref("network.dns.disableIPv6", true);
+defaultPref("network.dns.disableprefetch", true);
+defaultPref("network.dns.disablePrefetchFromHTTPS", true);
+defaultPref("network.prefetch-next", false);
+defaultPref("network.proxy.backup.ftp", "127.0.0.1");
+defaultPref("network.proxy.backup.ftp_port", 4444);
+defaultPref("network.proxy.backup.socks", "127.0.0.1");
+defaultPref("network.proxy.backup.socks_port", 4444);
+defaultPref("network.proxy.backup.ssl", "127.0.0.1");
+defaultPref("network.proxy.backup.ssl_port", 4444);
+defaultPref("network.proxy.ftp", "127.0.0.1");
+defaultPref("network.proxy.ftp_port", 4444);
+defaultPref("network.proxy.http", "127.0.0.1");
+defaultPref("network.proxy.http_port", 4444);
+defaultPref("network.proxy.share_proxy_settings", true);
+defaultPref("network.proxy.socks", "127.0.0.1");
+defaultPref("network.proxy.socks_port", 4444);
+defaultPref("network.proxy.socks_remote_dns", true);
+defaultPref("network.proxy.ssl", "127.0.0.1");
+defaultPref("network.proxy.ssl_port", 4444);
+defaultPref("pdfjs.disabled", true);
+defaultPref("pdfjs.enableWebGL", false);
+defaultPref("permissions.default.camera", 2);
+defaultPref("permissions.default.desktop-notification", 2);
+defaultPref("permissions.default.geo", 2);
+defaultPref("permissions.default.microphone", 2);
+defaultPref("plugin.default_plugin_disabled", true);
+defaultPref("plugin.state.java", 0);
+defaultPref("plugin.state.libgnome-shell-browser-plugin", 0);
+defaultPref("plugins.click_to_play", true);
+defaultPref("plugins.load_appdir_plugins", false);
+defaultPref("plugins.update.notifyUser", false);
+defaultPref("plugins.update.url", "");
+defaultPref("privacy.resistFingerprinting", true);
+defaultPref("privacy.spoof_english", 2);
+defaultPref("privacy.trackingprotection.enabled", true);
+defaultPref("privacy.trackingprotection.pbmode.enabled", true);
+defaultPref("security.insecure_field_warning.contextual.enabled", false);
+defaultPref("security.insecure_password.ui.enabled", false);
+defaultPref("services.blocklist.update_enabled", false);
+defaultPref("services.sync.prefs.sync.browser.search.update", false);
+defaultPref("services.sync.prefs.sync.extensions.update.enabled", false);
+defaultPref("startup.homepage_welcome_url", "http://i2pd.i2p/");
+defaultPref("toolkit.telemetry.archive.enabled", false);
+defaultPref("toolkit.telemetry.optoutSample", false);
+defaultPref("toolkit.telemetry.reportingpolicy.firstRun", false);
+defaultPref("toolkit.telemetry.unified", false);
+defaultPref("toolkit.telemetry.unifiedIsOptIn", true);
+defaultPref("webgl.disable-extensions", true);
+defaultPref("webgl.disable-fail-if-major-performance-caveat", true);
+defaultPref("webgl.disabled", true);
+defaultPref("webgl.enable-debug-renderer-info", false);
+defaultPref("webgl.min_capability_mode", true);
+lockPref("accessibility.force_disabled", 1);
+lockPref("app.update.auto", false);
+lockPref("app.update.channel", "no");
+lockPref("app.update.enabled", false);
+lockPref("app.update.interval", 0);
+lockPref("app.update.service.enabled", false);
+lockPref("browser.newtabpage.activity-stream.default.sites", "http://i2pd.i2p/,http://333.i2p/,http://inr.i2p/,http://102chan.i2p/,http://flibusta.i2p/,http://fsoc.i2p/,http://lifebox.i2p/,http://onelon.i2p/,http://wiki.ilita.i2p/");
+lockPref("browser.newtabpage.activity-stream.feeds.section.highlights", false);
+lockPref("browser.newtabpage.activity-stream.feeds.snippets", false);
+defaultPref("browser.newtabpage.activity-stream.showSearch", true);
+lockPref("browser.newtabpage.activity-stream.telemetry", false);
+lockPref("browser.tabs.crashReporting.sendReport", false);
+lockPref("browser.usedOnWindows10", false);
+lockPref("browser.usedOnWindows10.introURL", "");
+lockPref("camera.control.face_detection.enabled", false);
+lockPref("datareporting.healthreport.service.enabled", false);
+lockPref("general.platform.override", "Win32");
+lockPref("general.useragent.locale", "en-US");
+lockPref("general.useragent.override", "Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0");
+lockPref("geo.wifi.logging.enabled", false);
+lockPref("identity.fxaccounts.enabled", false);
+lockPref("network.proxy.type", 1);
+lockPref("services.sync.enabled", false);
+lockPref("toolkit.telemetry.enabled", false);
+lockPref("toolkit.telemetry.server", "");
+defaultPref("app.normandy.first_run", false);
+pref("app.update.staging.enabled", false);
+pref("app.update.timer", 0);
+pref("breakpad.reportURL", "");
+pref("browser.aboutHomeSnippets.updateUrl", "");
+pref("browser.cache.offline.enable", false);
+pref("browser.crashReports.unsubmittedCheck.enabled", false);
+pref("browser.download.manager.retention", 0);
+pref("browser.fixup.hide_user_pass", true);
+pref("browser.helperApps.deleteTempFileOnExit", true);
+pref("browser.newtabpage.activity-stream.topSitesRows", 2);
+pref("browser.newtabpage.enhanced", false);
+pref("browser.pagethumbnails.capturing_disabled", true);
+pref("browser.places.smartBookmarksVersion", -1);
+pref("browser.pocket.useLocaleList", false);
+pref("browser.reader.detectedFirstArticle", false);
+pref("browser.rights.3.shown", true);
+pref("browser.selfsupport.url", "");
pref("browser.send_pings", false);
pref("browser.send_pings.require_same_host", true);
-pref("browser.selfsupport.url", "");
-defaultPref("browser.shell.checkDefaultBrowser", false);
-//defaultPref("browser.startup.firstrunSkipsHomepage", false);
pref("browser.startup.homepage", "http://i2pd.i2p/");
pref("browser.tabs.closeWindowWithLastTab", false);
-lockPref("browser.tabs.crashReporting.sendReport", false);
pref("browser.tabs.loadInBackground", true);
-defaultPref("browser.uitour.enabled", false);
pref("browser.urlbar.filter.javascript", true);
pref("browser.urlbar.formatting.enabled", false);
pref("browser.urlbar.maxRichResults", 12);
-// pref("browser.urlbar.suggest.history", false);
-defaultPref("browser.urlbar.suggest.searches", false);
+pref("browser.urlbar.speculativeConnect.enabled", false);
pref("browser.urlbar.trimURLs", false);
-lockPref("browser.usedOnWindows10", false);
-lockPref("browser.usedOnWindows10.introURL", "");
-lockPref("camera.control.face_detection.enabled", false);
pref("canvas.capturestream.enabled", false);
pref("clipboard.autocopy", false);
-defaultPref("datareporting.healthreport.about.reportUrl", "");
-defaultPref("datareporting.healthreport.about.reportUrlUnified", "");
-defaultPref("datareporting.healthreport.documentServerURI", "");
-defaultPref("datareporting.healthreport.pendingDeleteRemoteData", true);
-lockPref("datareporting.healthreport.service.enabled", false);
-defaultPref("datareporting.healthreport.service.firstRun", false);
-defaultPref("datareporting.healthreport.uploadEnabled", false);
pref("datareporting.policy.dataSubmissionEnabled", false);
pref("datareporting.policy.dataSubmissionEnabled.v2", false);
pref("datareporting.policy.dataSubmissionPolicyAccepted", false);
pref("datareporting.policy.dataSubmissionPolicyBypassAcceptance", false);
pref("datareporting.policy.dataSubmissionPolicyNotifiedTime", "0");
-pref("datareporting.policy.dataSubmissionPolicyResponseType", "accepted-info-bar-dismissed");
pref("datareporting.policy.dataSubmissionPolicyResponseTime", "0");
+pref("datareporting.policy.dataSubmissionPolicyResponseType", "accepted-info-bar-dismissed");
pref("datareporting.policy.firstRunTime", "0");
pref("datareporting.sessions.current.clean", true);
pref("device.sensors.enabled", false);
pref("devtools.chrome.enabled", false);
-pref("devtools.debugger.remote-enabled", false);
pref("devtools.debugger.force-local", true);
-pref("devtools.webide.enabled", false);
+pref("devtools.debugger.remote-enabled", false);
pref("devtools.webide.autoinstallADBHelper", false);
pref("devtools.webide.autoinstallFxdtAdapters", false);
+pref("devtools.webide.enabled", false);
pref("dom.allow_cut_copy", false);
pref("dom.archivereader.enabled", false);
pref("dom.battery.enabled", false);
@@ -154,7 +255,7 @@ pref("dom.flyweb.enabled", false);
pref("dom.gamepad.enabled", false);
pref("dom.ipc.plugins.flash.subprocess.crashreporter.enabled", false);
pref("dom.ipc.plugins.reportCrashURL", false);
-// pref("dom.indexedDB.enabled", false);
+pref("dom.maxHardwareConcurrency", 2);
pref("dom.mozTCPSocket.enabled", false);
pref("dom.netinfo.enabled", false);
pref("dom.network.enabled", false);
@@ -165,9 +266,9 @@ pref("dom.vr.enabled", false);
pref("dom.webaudio.enabled", false);
pref("dom.webnotifications.enabled", false);
pref("dom.workers.enabled", false);
-pref("experiments.supported", false);
pref("experiments.enabled", false);
pref("experiments.manifest.uri", "");
+pref("experiments.supported", false);
pref("extensions.autoDisableScopes", 0);
pref("extensions.blocklist.enabled", false);
pref("extensions.blocklist.url", "");
@@ -178,128 +279,57 @@ pref("extensions.pocket.enabled", false);
pref("extensions.shownSelectionUI", true);
pref("extensions.ui.lastCategory", "addons://list/extension");
pref("extensions.update.autoUpdateDefault", false);
-defaultPref("extensions.update.enabled", false);
pref("full-screen-api.approval-required", false);
pref("full-screen-api.warning.timeout", 0);
pref("general.buildID.override", "19700101");
pref("general.warnOnAboutConfig", false);
-defaultPref("geo.enabled", false);
-defaultPref("geo.wifi.uri", "");
-lockPref("geo.wifi.logging.enabled", false);
-// pref("gfx.font_rendering.opentype_svg.enabled", false);
-lockPref("identity.fxaccounts.enabled", false);
-defaultPref("intl.locale.matchOS", true);
-// pref("javascript.options.asmjs", false);
pref("javascript.use_us_english_locale", true);
pref("keyword.enabled", false);
pref("lightweightThemes.update.enabled", false);
-defaultPref("media.eme.enabled", false);
-defaultPref("media.getusermedia.screensharing.enabled", false);
-defaultPref("media.getusermedia.audiocapture.enabled", false);
+pref("loop.logDomains", false);
pref("media.gmp-eme-adobe.enabled", false);
pref("media.gmp-gmpopenh264.enabled", false);
pref("media.gmp-gmpopenh264.provider.enabled", false);
pref("media.gmp-manager.url", "");
-// pref("media.gmp-provider.enabled", false);
-defaultPref("media.navigator.enabled", false);
-defaultPref("media.navigator.video.enabled", false);
-defaultPref("media.peerconnection.enabled", false);
-defaultPref("media.peerconnection.ice.no_host", true);
-defaultPref("media.video_stats.enabled", false);
-defaultPref("media.webspeech.recognition.enable", false);
-defaultPref("media.webspeech.synth.enabled", false);
+pref("media.peerconnection.ice.default_address_only", true);
+pref("media.peerconnection.identity.timeout", 1);
+pref("media.peerconnection.turn.disable", true);
+pref("media.peerconnection.use_document_iceservers", false);
pref("network.allow-experiments", false);
-// pref("network.cookie.cookieBehavior", 1);
-// PREF: Cookies expires at the end of the session (when the browser closes)
-// pref("network.cookie.lifetimePolicy", 2);
pref("network.cookie.prefsMigrated", true);
-// pref("network.cookie.thirdparty.sessionOnly", true);
-// pref("network.dns.blockDotOnion", true);
-defaultPref("network.dns.disableIPv6", true);
-defaultPref("network.dns.disableprefetch", true);
-defaultPref("network.dns.disableprefetchFromHTTPS", true);
-defaultPref("network.dns.disablePrefetch", true);
-defaultPref("network.dns.disablePrefetchFromHTTPS", true);
-// pref("network.http.referer.spoofSource", true);
-// pref("network.http.referer.XOriginPolicy", 2);
pref("network.http.speculative-parallel-limit", 0);
pref("network.IDN_show_punycode", true);
pref("network.jar.open-unsafe-types", false);
pref("network.manage-offline-status", false);
pref("network.negotiate-auth.allow-insecure-ntlm-v1", false);
pref("network.predictor.enabled", false);
-defaultPref("network.prefetch-next", false);
-pref("network.protocol-handler.warn-external-default", true);
-pref("network.protocol-handler.external.http", false);
-pref("network.protocol-handler.external.https", false);
-pref("network.protocol-handler.external.javascript", false);
-pref("network.protocol-handler.external.moz-extension", false);
-pref("network.protocol-handler.external.ftp", false);
-pref("network.protocol-handler.external.file", false);
-pref("network.protocol-handler.external.about", false);
pref("network.protocol-handler.expose-all", false);
+pref("network.protocol-handler.expose.about", true);
+pref("network.protocol-handler.expose.file", true);
+pref("network.protocol-handler.expose.ftp", true);
pref("network.protocol-handler.expose.http", true);
pref("network.protocol-handler.expose.https", true);
pref("network.protocol-handler.expose.javascript", true);
pref("network.protocol-handler.expose.moz-extension", true);
-pref("network.protocol-handler.expose.ftp", true);
-pref("network.protocol-handler.expose.file", true);
-pref("network.protocol-handler.expose.about", true);
-lockPref("network.proxy.backup.ftp", "127.0.0.1");
-lockPref("network.proxy.backup.ftp_port", 4444);
-lockPref("network.proxy.backup.socks", "127.0.0.1");
-lockPref("network.proxy.backup.socks_port", 4444);
-lockPref("network.proxy.backup.ssl", "127.0.0.1");
-lockPref("network.proxy.backup.ssl_port", 4444);
-lockPref("network.proxy.ftp", "127.0.0.1");
-lockPref("network.proxy.ftp_port", 4444);
-lockPref("network.proxy.http", "127.0.0.1");
-lockPref("network.proxy.http_port", 4444);
-lockPref("network.proxy.share_proxy_settings", true);
-lockPref("network.proxy.socks", "127.0.0.1");
-lockPref("network.proxy.socks_port", 4444);
-lockPref("network.proxy.socks_remote_dns", true);
-lockPref("network.proxy.ssl", "127.0.0.1");
-lockPref("network.proxy.ssl_port", 4444);
-lockPref("network.proxy.type", 1);
-pref("network.cookie.prefsMigrated", true);
-pref("pdfjs.disabled", true);
-pref("pdfjs.enableWebGL", false);
-defaultPref("permissions.default.camera", 2);
-defaultPref("permissions.default.desktop-notification", 2);
-defaultPref("permissions.default.geo", 2);
-defaultPref("permissions.default.microphone", 2);
-defaultPref("plugin.default_plugin_disabled", true);
-// pref("plugin.state.flash", 0);
-pref("plugin.state.java", 0);
-pref("plugin.state.libgnome-shell-browser-plugin", 0);
-pref("plugins.click_to_play", true);
-pref("plugins.load_appdir_plugins", false);
-pref("plugins.update.notifyUser", false);
-pref("plugins.update.url", "");
-// PREF: Clear history when Firefox closes
-// pref("privacy.sanitize.sanitizeOnShutdown", true);
-// pref("privacy.clearOnShutdown.cache", true);
-// pref("privacy.clearOnShutdown.cookies", true);
-// pref("privacy.clearOnShutdown.downloads", true);
-// pref("privacy.clearOnShutdown.formdata", true);
-// pref("privacy.clearOnShutdown.history", true);
-// pref("privacy.clearOnShutdown.offlineApps", true);
-// pref("privacy.clearOnShutdown.sessions", true);
-// pref("privacy.clearOnShutdown.openWindows", true);
-pref("privacy.cpd.offlineApps", true);
+pref("network.protocol-handler.external.about", false);
+pref("network.protocol-handler.external.file", false);
+pref("network.protocol-handler.external.ftp", false);
+pref("network.protocol-handler.external.http", false);
+pref("network.protocol-handler.external.https", false);
+pref("network.protocol-handler.external.javascript", false);
+pref("network.protocol-handler.external.moz-extension", false);
+pref("network.protocol-handler.warn-external-default", true);
+pref("network.proxy.no_proxies_on", "localhost, 127.0.0.1");
pref("privacy.cpd.cache", true);
pref("privacy.cpd.cookies", true);
pref("privacy.cpd.downloads", true);
pref("privacy.cpd.formdata", true);
pref("privacy.cpd.history", true);
+pref("privacy.cpd.offlineApps", true);
pref("privacy.cpd.sessions", true);
-pref("privacy.donottrackheader.enabled", true);
+pref("privacy.firstparty.isolate", true);
pref("privacy.resistFingerprinting", true);
pref("privacy.sanitize.timeSpan", 0);
-defaultPref("privacy.spoof_english", 2);
-pref("privacy.trackingprotection.enabled", true);
-pref("privacy.trackingprotection.pbmode.enabled", true);
pref("privacy.userContext.enabled", true);
pref("reader.parse-on-load.enabled", false);
pref("reader.parse-on-load.force-enabled", false);
@@ -307,55 +337,106 @@ pref("security.csp.enable", true);
pref("security.csp.experimentalEnabled", true);
pref("security.dialog_enable_delay", 1000);
pref("security.fileuri.strict_origin_policy", true);
-pref("security.insecure_field_warning.contextual.enabled", false);
-// PREF: Enable insecure password warnings (login forms in non-HTTPS pages)
-pref("security.insecure_password.ui.enabled", false);
pref("security.mixed_content.block_active_content", true);
pref("security.mixed_content.block_display_content", true);
-pref("services.blocklist.update_enabled", false);
pref("security.sri.enable", true);
pref("security.ssl.errorReporting.automatic", false);
pref("security.ssl.errorReporting.enabled", false);
-lockPref("services.sync.enabled", false);
pref("services.sync.prefs.sync.browser.download.manager.scanWhenDone", false);
pref("services.sync.prefs.sync.browser.safebrowsing.enabled", false);
-defaultPref("services.sync.prefs.sync.browser.search.update", false);
-defaultPref("services.sync.prefs.sync.extensions.update.enabled", false);
-// pref("shumway.disabled", true);
pref("signon.autofillForms", false);
-// PREF: Disable password manager
pref("signon.rememberSignons", false);
-defaultPref("startup.homepage_welcome_url", "http://i2pd.i2p/");
pref("startup.homepage_welcome_url.additional", "about:blank");
-pref("toolkit.telemetry.archive.enabled", false);
-lockPref("toolkit.telemetry.enabled", false);
-pref("toolkit.telemetry.optoutSample", false);
-defaultPref("toolkit.telemetry.reportingpolicy.firstRun", false);
-lockPref("toolkit.telemetry.server", "");
-defaultPref("toolkit.telemetry.unified", false);
-pref("toolkit.telemetry.unifiedIsOptIn", true);
-pref("webgl.disabled", true);
-pref("webgl.disable-extensions", true);
-pref("webgl.disable-fail-if-major-performance-caveat", true);
-pref("webgl.enable-debug-renderer-info", false);
-pref("webgl.min_capability_mode", true);
-// Ensure domain logging is disabled
-pref("loop.logDomains", false);
-// Spoof to dual-core cpu
-pref("dom.maxHardwareConcurrency", 2);
-// Disable offline cache
-pref("browser.cache.offline.enable", false);
-// Prevent tracking over multiple domains
-pref("privacy.firstparty.isolate", true);
-pref("network.proxy.no_proxies_on", "localhost, 127.0.0.1");
-// In relation to webrtc
-pref("media.peerconnection.turn.disable", true);
-pref("media.peerconnection.use_document_iceservers", false);
-pref("media.peerconnection.identity.timeout", 1);
-pref("media.peerconnection.ice.default_address_only", true);
-// Disable url prefetch
-pref("browser.urlbar.speculativeConnect.enabled", false);
-// Set platform, user-agent and locale to same values as Tor Browser 7.0.10
-pref("general.useragent.override", "Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0");
-pref("general.useragent.locale", "en-US");
-pref("general.platform.override", "Win32");
+
+var config = {
+ "cckVersion": "2.2.9",
+ "name": "I2Pd Browser",
+ "description": "Preconfigured for use with I2P browser",
+ "version": "1.2.8",
+ "homePage": "http://i2pd.i2p/",
+ "welcomePage": "http://i2pd.i2p/",
+ "titlemodifier": "I2Pd Browser",
+ "extension": {
+ "name": "I2Pd Browser"
+ },
+ "noWelcomePage": true,
+ "noUpgradePage": true,
+ "removeSetDesktopBackground": true,
+ "removeSafeModeMenu": true,
+ "noGetAddons": true,
+ "noAddonCompatibilityCheck": true,
+ "disableSearchEngineInstall": true,
+ "removeDefaultSearchEngines": false,
+ "displayBookmarksToolbar": true,
+ "removeSmartBookmarks": true,
+ "removeDefaultBookmarks": true,
+ "removeDuplicateBookmarkNames": true,
+ "dontCheckDefaultBrowser": true,
+ "dontUseDownloadDir": true,
+ "disableFormFill": true,
+ "disableSync": true,
+ "disableCrashReporter": true,
+ "disableTelemetry": true,
+ "disableFirefoxHealthReportUpload": true,
+ "disableFirefoxHealthReport": true,
+ "disableFirefoxUpdates": true,
+ "removeSnippets": true,
+ "disableResetFirefox": true,
+ "disableWebApps": true,
+ "disableHello": true,
+ "disableSharePage": true,
+ "disableForget": true,
+ "disableHeartbeat": true,
+ "disablePocket": true,
+ "disableAboutSupport": true,
+ "disableAboutProfiles": true,
+ "showSearchBar": true,
+ "autoconfig": {
+ "disableProfileMigrator": true
+ },
+ "id": "i2pdbrowser",
+ "hiddenUI": [
+ "#defaultBrowserBox",
+ "#enableSearchUpdate",
+ "#dataCollectionCategory",
+ "#dataCollectionGroup",
+ ".help-button",
+ "#onboarding-overlay-button",
+ ".prefs-modal-inner-wrapper > section:nth-child(6)"
+ ],
+ "searchplugins": {
+ "YaCy 'legwork'": "http://legwork.i2p/opensearchdescription.xml"
+ },
+ "defaultSearchEngine": "YaCy 'legwork'",
+ "certs": {
+ "ca": [
+ {
+ "url": "resource://cck2_i2pdbrowser/certs/purplei2p_ca.pem",
+ "trust": "CTc,CTc,CTc"
+ }
+ ]
+ }
+};
+
+var io = Components.classes["@mozilla.org/network/io-service;1"]
+ .getService(Components.interfaces.nsIIOService);
+var resource = io.getProtocolHandler("resource")
+ .QueryInterface(Components.interfaces.nsIResProtocolHandler);
+
+var greDir = Components.classes["@mozilla.org/file/directory_service;1"]
+ .getService(Components.interfaces.nsIProperties)
+ .get("GreD", Components.interfaces.nsIFile);
+var cck2ModuleDir = greDir.clone();
+cck2ModuleDir.append("cck2");
+cck2ModuleDir.append("modules");
+var cck2Alias = io.newFileURI(cck2ModuleDir);
+resource.setSubstitution("cck2", cck2Alias);
+
+var configModuleDir = greDir.clone();
+configModuleDir.append("cck2");
+configModuleDir.append("resources");
+var configAlias = io.newFileURI(configModuleDir);
+resource.setSubstitution("cck2_i2pdbrowser", configAlias);
+
+Components.utils.import("resource://cck2/CCK2.jsm");
+CCK2.init(config, "ä"[0], "ä");
diff --git a/windows/build/build.cmd b/windows/build/build.cmd
index ad996ea..e82ae02 100644
--- a/windows/build/build.cmd
+++ b/windows/build/build.cmd
@@ -7,8 +7,8 @@ REM See full license text in LICENSE file at top of project tree
setlocal enableextensions
set CURL=%~dp0curl.exe
-set FFversion=60.1.0
-set I2Pdversion=2.19.0
+set FFversion=60.2.1
+set I2Pdversion=2.20.0
call :GET_LOCALE
call :GET_PROXY
call :GET_ARCH
@@ -75,9 +75,28 @@ if "%locale%"=="ru" (
) else (
echo Downloading NoScript extension
)
-"%CURL%" -L -f -# -o ..\Firefox\App\Firefox\browser\extensions\{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi https://addons.mozilla.org/firefox/downloads/file/972162/noscript_security_suite-10.1.8.2-an+fx.xpi
+"%CURL%" -L -f -# -o ..\Firefox\App\Firefox\browser\extensions\{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi https://addons.mozilla.org/firefox/downloads/file/1077146/noscript_security_suite-10.1.9.6-an+fx.xpi
if errorlevel 1 ( echo ERROR:%ErrorLevel% && pause && exit ) else (echo OK!)
+REM echo.
+REM if "%locale%"=="ru" (
+REM echo ‡ £à㧪 ¤®¯®«¥¨ï CanvasBlocker
+REM ) else (
+REM echo Downloading CanvasBlocker extension
+REM )
+REM "%CURL%" -L -f -# -o ..\Firefox\App\Firefox\browser\extensions\CanvasBlocker@kkapsner.de.xpi https://addons.mozilla.org/firefox/downloads/file/1086424/canvasblocker-0.5.4-an+fx.xpi
+REM if errorlevel 1 ( echo ERROR:%ErrorLevel% && pause && exit ) else (echo OK!)
+
+
+REM echo.
+REM if "%locale%"=="ru" (
+REM echo ‡ £à㧪 ¤®¯®«¥¨ï Privacy Badger
+REM ) else (
+REM echo Downloading Privacy Badger extension
+REM )
+REM "%CURL%" -L -f -# -o ..\Firefox\App\Firefox\browser\extensions\jid1-MnnxcxisBPnSXQ-eff@jetpack.xpi https://www.eff.org/files/privacy-badger-latest.xpi
+REM if errorlevel 1 ( echo ERROR:%ErrorLevel% && pause && exit ) else (echo OK!)
+
echo.
if "%locale%"=="ru" (
echo Š®¯¨à®¢ ¨¥ ä ©«®¢ áâ஥ª ¢ ¯ ¯ªã Firefox
diff --git a/windows/build/i2pd/addressbook/addresses.csv b/windows/build/i2pd/addressbook/addresses.csv
index 54316f7..fd00b65 100644
--- a/windows/build/i2pd/addressbook/addresses.csv
+++ b/windows/build/i2pd/addressbook/addresses.csv
@@ -1,307 +1,190 @@
-02ch.i2p,6k3irsqo5v536bs45t5hn5f3s5pi7a3bp5nuxc6y72svjqp6vymq
-0chan.i2p,ah7wvpwga7hlwa2f7gnnxuqycnng5j5bkglhfm5ychejpnjucmka
-0chanrunet.i2p,3q7mdphwa7cmdjvxxrmbnvpy4dnei4hb4kyo2wvdhuvct3pclyvq
-0thers.i2p,f3osaqktj55iedisoabrd7uergxbpljovbwcr6hihmxmjdc6oafa
+00.i2p,zmzpltxslembpaupg3srh4bbhv5txgh5jmms6sfj4hzsvlv3xugq
+0xcc.i2p,gawouxh2sg32cluwlqsnpy3dwedvoqtfroi4evvdvm2pfv7tdadq
1.fcp.freenet.i2p,cuxbeputgxn75ak4nr7ltp7fjktnzl5sul3wstwnsoytbbpb4ixq
102chan.i2p,xxu3lso4h2rh6wmrxiou3ax7r7la7x6dhoepnku3jvrlwp35pefq
-1553b.i2p,2vhlowhistigqlu3vingiyv66jq43rhvn4qa75gtzpcjmcbvclta
+1st.i2p,rduua7bhest6rwsmmyttzssfdw3p4eu6bgl3mb4hin32qo3x5zfq
2.fcp.freenet.i2p,ndsznnipoeyapnsg3gj3yi2dzsqduxwalmujm5mzjm7e6x374tta
-258.i2p,dunea3q6whmbtf4vomdiv3si3grtqy7fqftdslk4piin4j5tkdka
-2chan.i2p,xnmlqiwaio6bg6dtbjqb63rtoznvgeud5acxklccomv5yytefmda
+2rqv7nn2.i2p,2rqv7nn2j4q3wcxe5lsrqpf73k4rmtutweft3dvbc2w245vpkdva
+31337.i2p,ydlngh3dd52av3aalpd3uqi5iuvmby7nxpkwclan4xqjsttz4fbq
333.i2p,ctvfe2fimcsdfxmzmd42brnbf7ceenwrbroyjx3wzah5eudjyyza
55cancri.i2p,b4iqenefh2fr4xtuq6civfc6nhnia6e2yo36pf7vcgdvrwmh7xua
a-zine-repo.i2p,zt6okylza25s2ppso7ngqbz2ybeteatxezxqemvucwhbb5ajot7a
-abhishek.i2p,rthkq2epkzgkqpqqg4b5elasnqydiwmlgzcb66fg77i2eujicdpa
-abvc.i2p,wsq3gg5t6kbvoxoo3pitreikdr4wyckh2svraor4esdop4mua25q
-acestream.i2p,2ojd3s4rb73d6qvwz36x4ysjzqbnkzluemdbxhuuuf7qbbfew26a
adab.i2p,pxjr6f2cig6v7v7ekam3smdnkqgmgseyy5cdwrozdyejm7jknkha
-admin.open4you.i2p,hnlryqjvk52hsze2ixnz4qbuki4tf6qvygi25mf5bkllmbett2oa
-admin2.open4you.i2p,d62hjvhu7yqd23m766dvs4tupxpvrsa2hzd2r5rdpm5apsmtmc6a
-agora.anarplex.i2p,ydaal5nbvxmydnncny5esb3ipxupmpgkensow7yvhp6u7uioujna
-agora.i2p,nvslgzpyqhxldfik5uwua7eqse5adqon5h4dbzqepw7ringod44q
-ajomyqxciuehvxaa.i2p,4goi34hmq3g7foequzr6ofa242myjmntyvxgg6tcgom2jam6gs2q
-ajomyqxciuehvxaa2.i2p,fk3nyhwu4iul6epeb53j2faai7afeqb3wrg7wbuohl7zj4sgbtiq
-ajs.i2p,qnqkn6a7r5sxokwfil3s4mwbpvvbkeqifitl2qzmwtui3wf5l7ga
-alacast.i2p,sdlcbhe5jffgdsmzaharudzbzhipw4pth24ivy7m3nqm5paxgtuq
+agaming468.i2p,4svcmhjnijtnclv2vdgf3ipdvzizgeyllysjfl6vu3xkqwa3w6sq
+aktie.i2p,4qwhpshwlp6ndzvtiwvf7myc3lll3vizqcdvvuxrzgaxv4g2qogq
alice.i2p,iq26r2ls2qlkhbn62cvgb6a4iib7m5lkoulohdua5z6uvzlovjtq
-allgemeinplaetzchen.i2p,5u4buto5wfret356iqzukcf5avqkadpg3up4hngsfkd37modlo7q
-allsprk.i2p,uyyakverb5mxbmobdqmzjnpy7lqszzlmexes3hxkunceyz53otfq
-alterchan.i2p,6o6tlcrs3nj2vks5w4fehtbk7263dinlwd3brsbk3vdefsqkddda
-alternet.i2p,fxpygpgimhktfmf2zhb23qqzu642eivazn7nfmmjhv562xb7i5da
-alttechdenizen.i2p,a6doke6sicgf6kktwe6dxnpft5agsouvqnuqw2abfo7eyjbylzxa
always.i2p,wp43sdtuxum6gxbjvyeor35r5yvgtkp3dcu7dv47lx22zeb3relq
-amaq.i2p,txpcthypt4ou7cgygqw2h5kjenyuirknmso3akiiv6h24royotua
amazone.i2p,e6kq73lsxaeyiwpmykdbdo3uy4ppj64bl7y3viegp6mqrilqybqa
-amidoinitrite.i2p,onr7e32g3rgigvibygcjwytoypo2s6eusn7zdwc7nmr5fuxy45va
amiga.i2p,edy2xappzjjh7bxqounevji4wd2binqkv7gft4usrkan45xhbk5q
amobius.i2p,rj6432agdprun5baai2hj62xfhb4l75uvzl55dhj6z5zzoxv3htq
-anarplex.i2p,4qingryacppi5ed2vk2626qipri3d7c2v6iw3vr55zy6c2uc66za
andmp.i2p,rv6zugykqdhmwwsuglv7j6ktjojdbf5fqta66hixejg33qb2su3q
-anews.i2p,f7nnjswxq5yyehuzzed65ut4jz47p76vxp4xrw5cyog3jijsrcuq
animal.i2p,5iedafy32swqq4t2wcmjb4fvg3onscng7ct7wb237jkvrclaftla
anodex.i2p,25cb5kixhxm6i6c6wequrhi65mez4duc4l5qk6ictbik3tnxlu6a
-anomix.i2p,ptlpjzvcjl54yl7wdhlk2fd5moytixstshdz7rr5hsfsumodto2q
-anon-box.i2p,kbv3jc2f4efmq2q4lj66p6xjkgmfhaed3jl7uzaml6y3oqc4jfpq
-anonarchive.i2p,vblifonpbegzggx5mgev6wtgtfpkz5ykv5awgrzsqv2lcknjp7ea
anoncoin.i2p,nmi3loretkk4zbili32t2e5wyznwoxcsgzmd2z4ll3msgndyqpfa
anongw.i2p,owrnciwubb3f3dctvlmnaknb6tjdxtlzvv7klocb45mmhievdjhq
-anonname.i2p,h4mms4mtafykm6ftehxss6sv6hiu2a7gtoflf4pxy6bv4mlyj6kq
-anonsearch.i2p,33bbahrpqfyf5yywwnamzdexxw3bkiqtsap454qm4deiuvq2wsfa
anonsfw.i2p,ir6hzi66izmvqx3usjl6br3nndkpazonlckrzt3gtltqcy5ralyq
anonymnet.i2p,77ouyl2ane7ffgydosd4ye42g67aomtc4jrusmi76lds5qonlffa
anonynanny.i2p,l2lnhq2dynnmf3m46tcbpcmbbn4kifjgt26go6n2hlapy4drhyja
anonyradio.i2p,cbobsax3rhoyjbk7ii2nd2fnl5bxh3x7bbearokyxgvmudn7o5bq
-anotherblog.i2p,shkgse3sc3v7dlpxdt74dqsc5lxrfk3qw6tyrl2sodbq7bsd5mcq
antipiracyagency.i2p,by4kcmklz7xnkai6ndfio47kts3rndm6wwleegtxghllimikdapq
antipiratbyran.i2p,y2qbhrvuciifbszaqqwxd5t75bomp7kzdqx4yxsrkaq542t75k3a
-antirius.i2p,4l353ourymat7gzxu6gmo72vinsqvggmrtqizdaj4ord3zzy3doa
-aperi.i2p,2qk4ofkb6hlx456aeqjz6rvbcqwdhntjq5uhaww4irnwulyho6yq
-aplus.i2p,h67lym6btfqinjs5ye272fo6uze2uvjk6t7qabibocjedfcv5fva
-aport.i2p,uvpczf5ljaptviombwxi6vmqxpzh6zpthyhvczzp57ihwfzrxnhq
-apt.mirror.i2p,kazqug7jqkfokjuyfstok4s2wnhtk3pueoaiuucashwzjqgsvpra
arc2.i2p,rnmosuwvtftfcrk5sk7zoyhyadh2g4dhe2mif5ml7qjisgkyw2na
-archbsdmirror.i2p,35nnm55r53mu2f4kkgl5xtlr35uwhvmhlzegbrllefmpk2bffl4a
+archaicbinarybbs.i2p,t7o2tw36cffedgfr6kahewpkrntofnliuapji2e4rucl3os55epa
archiv.tutorials.i2p,lldr2miowq6353fxy44pnxfk37d6yn2f6kaivzecbmvvnnf5exyq
archive.i2p,x54d5st3dl6mwgfxj6raiekqkypo5pdvuex3n62szwju7hgefiyq
archive.syndie.i2p,abbyu5n3mh3nj7pe3b6byldrxswvva5ttxcafsnnseidanurq3kq
-archlinux.i2p,22n34pf7xrgbiaexaevndk6hdn4or4skqshkj6ezmgvo4rnnkpua
ardor-wallet.i2p,tm23k5ny3umhf6vf3kghnnwacli5zywq5wrr3xcqowbcofuyr4gq
ardvark.i2p,jcmw2sol3hruwc6rfinonx4e23pjkukkg7lg7xt7xb2gpiyyraiq
+arecords.i2p,pkp26u32ea6xrd4o53lzwm6pxzphu5heyrvyra37drfvn6vli7yq
+arf.i2p,o46lsq4u7udxg3qqlidrmpj4lb4nr7ldxmbb2x53nftndaeyxqeq
arkan.i2p,7o5y2lyyrjx5tf6l4fyumywui7msjv5azaaheatvw5sqj7mxbuvq
-arkwright.i2p,ebovdlxw47kodamth7p33nenfxy5kqsyu7usp2c3ni3dyfrbbvpa
-armada.i2p,26qxgmyqczulza5ym3jij5er3onclacejyqzecuhjllwun3kxuzq
-arslonga.i2p,evmelbak3htxtkakhzrzdubbkglffiv2reyg3xeuno3rnbcts4sq
asciiwhite.i2p,itbzny5ktuenhjwjfqx3jravolhlj5wullhhr2m4qr6k2emnm5dq
-asmith.i2p,vwkvflbd2divnm4twz7w2ged4uo2lmc3vr6zbi4sf4mnwcpgec5a
aspnet.i2p,tsb7zqru57p4q2a7cto2lko4w5cg4lieglwm6t27c44fkphqmf2a
-assiya.i2p,67ld2vpoq56edqjl44sreskxx5v7pr77uq4lnznxcpxyppisml5q
asylum.i2p,p45ejjw4p2q6nq3mzi6cm6ep35grtzshboidj2lojmrmic22noha
+atesi2p.i2p,hlahr4wgobvhegluufw3ckzulr4etamxxborktgz3dkefok232ga
+auchan.i2p,6vxz4yp3vhjwbkmxajj7wiikxafwujig63gkhjknbq6xh4rqpm5a
aum.i2p,ohdfneqxapfd3fwfbum4tut7z6k3rnr7rrguoxdrrfe2tln2kpbq
-aurous.i2p,cbwn6bfpmrwnqn7s7ummhvtcr5lpzrl6svwzakk63qajxbfpurka
awup.i2p,v6g32duzrkacnrezfbll3pza5u37h7lnukr2wbsk6rqen6prhbga
-axahj.i2p,fk7wfzjsn2rfx2w7sx4dl4exgbu2ocaannkrmfsvs4x2gzgvxhga
b.i2p,272kt3gcx6wjurunzaiiwld7s5p4mpjewfubzmlcvw2vie62ckpq
-babylonastronaut.i2p,t7xrcwnbbmf24mwr4n5l2blzsmrieawporojjx72m3yjvczqw6mq
bacardi.i2p,hivhnx2v47vh234c7coi2urj5cyvbl4bu3ypjr7snklortyqeljq
backup.i2p,kepphem42whle3rkfv26wcksmnegdbg6rdp6t3oobdkc2fmzrdkq
badfish.i2p,f6v26gyr4eipy3a7pi2voulw5qvob6dg7zij6xpo2ywbi5tvbu6a
badtoyz.i2p,3qz6ubtwlt2c4iasofjirkckq43u5fgkzyg7mlutcsym5gzhijna
+balrogbroadcasting.i2p,pqgjjmr2jgvr4rtjyscgbh3hby2qpuoiibldddwxied2f7flvika
barry.i2p,4kyahq53ol52n23l44tefgeaxqpp3cbb632t5k3umdvqcooevdzq
bash.i2p,s3wouoilbl3mrefxjhp4qoyujgok34e7y6vmpbu6hx4342ivqo4q
-bbs.catrat.i2p,3e2fes3hmo5jkhf7cyjji2gfhymw7mx76ulkekaw2o6iv5wdq42a
+bbs.tokachi.i2p,m2cjkyckmcib2pu65zdply5faymuewrq4b4yy5lajxoqivny2iia
bdl.i2p,kp6fnuulenbjm7r26pfbmjcq3u7c7kvxeajodvgr5flcnskdgi5a
bdsm.i2p,pa7fxql5jljegg7j5tglhnnaod2sptq3gxvdn3ji6muqyhgn3poq
betaguru.i2p,d7cduwwhrcc2voameqfkvd66u3advu4jw2p6pysgax35vq6ovriq
beyond.i2p,uaicfqlrpjtitqbqkpfujanj5dollzfzee5glsuls67ekw6hlpoa
-bfclan.i2p,73oc3du6vdhzsa6mkxtr2mw3xrjnqmoxsg5cq2dntx4d4et7c6xa
-biblioteca.i2p,wklqkggiwnzhotwoy6gxqbgkt6hic2rqovtdkteqlur7xyt6ahtq
bigbrother.i2p,tnxiifs6uticzyg6ac4lhv2l5luwi6xra7yngocro56ive5e4jsq
-bing.i2p,xmn674kxxsmrl3rvu6wcexk66l4stns7rjgccsggniclrrz2dkma
-bios.i2p,ugc57rc7ygmjwzectakl66x2jfmxzywducwjqto5gqeqtsoxuw7a
bitlox.i2p,lqw5khxcdntlv3u4vhn53upcqirplvnc4etjlmoytrzs66ytettq
-bitmoney.i2p,sd7asgdgnicjyj6lkaavux77u4vyvhv62pm3dfmluoc4xuivxb4a
-bitslair.i2p,q3k4tsw4fgw7wvm4ufpbstuw44rd6g6k6aymqvkij7fwehldecpq
bittorrent.i2p,pgax2vz572i4zsp6u6paox5xubmjrkqohq6g4hvlp6ruzzy56l5q
bk1k.i2p,nlyegmtyfffo5jfgg5h4dxxnlmqko2g36gpaye5a7vd3is35xxfq
bl.i2p,e73d6uhnfbylza6wqkhxejmqeyfb7thkzw35gn5ojmna64jzyk2a
+blach.i2p,khjfx7pdxt4oqxqcgk6zupqvmelpjkpiafzjefe75sl3qxu5hcua
black.i2p,sjwueu62qpe6dtv5b322k3f23fl4uz3w6qe6wcrwauiwpnymypfq
-blackdragon.i2p,yj7fa7i4malizkewvvzufwgig4dypuig2o3ysfxtewpxs2eqaq5q
-blackexchange.i2p,ztgr5kghkyn43fhhkuycroxgfti6cojo3vg4wdd3usqonyvrla5q
-blackmetal.i2p,xhcyocs3t4ifexiktqyld5t4ownetrm2oquhee57dgenwn6w2fjq
+blacklong.i2p,dx2jfxy7pwj6bbmcnshunjgfyranab4xy2dmaid65cpxwt6idiba
blog.curiosity.i2p,yiz6jec5k7ccxdgnh7msqa4ze52bqqmf6rpq6bqdyojra2erd4ta
blog.polecat.i2p,orlccceubewvxo3fbdyydq6e4uuidbs4xd5u2gyqbculnowo3ehq
+blog.tinlans.i2p,ylkch2nkrwehakx4z6wiyjbeqwlgasknukdkex6r6yq4xusrjnda
bluebeam.i2p,lvxp3cbcfwtol57d5pmrsck32t7ndutlxubjb4smaf32bynhlk6a
blueheron.i2p,anfb5jrhixjmvkyxctqwkezqer7dbob22wge2bh6wsewbhgnftfa
bmw.i2p,6naudpj2zozw6aiiqusv6znfzyprwitrufauz3zuejtdbotp6mxq
bmworc.i2p,w254y65la47elcmf6mo7xc2caamm3ikeusmjjfknwsavwsy4whzq
-board.hiddengate.i2p,zojmbo7fz2gxdk3zzovvjittzokdgwmtztf7t457544zt6m6zova
bob.i2p,i76m7dwm5hnapljendbie6fc5y3mjlkdlduo3tvbwiwmvhxbpyaa
bobcat.i2p,ftuukjtcquuvppt726w37boit7gp5hf2yxwfop35prx3grzzzxlq
bobthebuilder.i2p,qlahgthqhr4uojkkwahnper2cl3ro5f5gtzy5t4lzapbzo4osy6q
boerse.i2p,7633w56hd53sesr6b532r5qlbdnvyl5bnvama6ign6xryaxol4rq
bofh.i2p,auvuinzogu6gc4pwsgbjijuszxgcjygciu2wy53pfz7mo5nfpc5a
books.manveru.i2p,eb2tisc2vr5jvjqrixrozcujiucwxg4m722stxwho5666ipl67zq
-borderlands.i2p,qx7p6kevvetj4unyy3gfysksqlwpflqwwpe3z7l3xcctdqafueja
bote.i2p,bhjhc3lsdqzoyhxwzyrd63kvyg4br6n2337d74blyintae66mr2a
-boxthecompass.i2p,vqal5tlqr4lwgr22tweplff26agmbw57gw3xydbb6razak2eohla
bozo.i2p,7a2d23h6htprhzrol36vgwgklsbqrnuya4tbaaaspmaeaodt57iq
-brchan.i2p,wizbnurl2xzvrfsnbuhv3pyu3cfwos4jpoue5f5ellz4bv3px4da
brittanyworld.i2p,e76umhhic3474sdxiuax25ixyfg7y3z7oojj4fmxvhgv3ruet6aa
-bs.i2p,bcr355ziz6uupqzsmfffa6zbk4bdte4yvkk3qy4xryy7hmw5axzq
-bt-club.ws.i2p,2w656i43u2xjiuzbxxajl4ynez2c7ukjvmnbzkc2tbfjvc73jdya
bt.i2p,uhkuu54pg47zey76h45tnvsdtpkf5bthbtrjgnaloi5m54h4hlaq
bt.nnm-club.i2p,bmqz3v5ulhkvyqeahmp7co76ea4mwrxvb5nmtuclltpthm4mb47a
-btt-tracker.i2p,adsa5hhvulkv2zo6flv5glmnw5mf7e7sx37vuila5mtxpzxxfwcq
-bttracker.i2p,spjpsgdhy764p2tgk5uffvzwhr2tnojdedyooglwgjvf3izz2yaa
-buddy.i2p,bh5jfboctslsxapasfb54yvjgxv3mc4xq5ampfheowmxnedupeda
-burningcold.i2p,7sw4p3rhzl5q2olfcxwig54huc3rhhoqgqsz5cdpy7k5tlwfsriq
-burntout.i2p,lkep3fd7tjvxrs25crr2c3jy7xm4s7bqiua5r327zgpw37sgyerq
+bugfuzz.i2p,ubszn4gsf22vga67rvzzlg4qj2bfcq6o52fmxz46xruawqm6z7rq
+busyrider.i2p,sv7ksbdjctuhuf3ddcuj72ypepcfpy6tqolkokz3gd2jgbm4bjxa
bytepay.i2p,7amc4ztwkzu3cgsaaaw3223ohuihn5hlsqc6gpf2rxdyptdkyugq
-cacapo.i2p,y7hb4kzomfzzhekib2mby72ydlntiexmuafuwtlxrxyigtnd63la
-carding.i2p,l5crcmcrkspnn6o7pyypho4t2hrdknapzysiefpxnw7ubu3yhfuq
cases.i2p,kmpmk2fmineaiwublteqlifg4fkmewnhmxqlcgg7qwecz6daj43a
-castelpbf.i2p,xt6dd4cqf6m7uf7cv234lhg6ct4n3u4uq3qgb7rgmjt75rs5qleq
-castor.i2p,nynqxsr27owq74a4wqxvokudclkuzn2kx6fmjl455lmeoib5t3dq
-catgirls.i2p,taxqiyvy24hk67dadf3hzdsj4jtzjadljs57wdfgaujt46qeujbq
+cash.i2p,6qscc7avdla6lzs6u2nzbppoxndhioh5krmoauolpwixfeuylo2q
cathugger.i2p,vq43xjjcnejqpzfprws5qzrea2siieshu4tglpdepql2w3w3bpba
-catrat.i2p,3ha4vnxtirlerv3g34j675r3b5xyylajffvqmpcj3plplq3nqchq
-cats.i2p,ma773liy6ascw44gfnkt73fn2bnjjwcojn2xv5zdx5iigigiup7a
-cbs.i2p,u3lp7wazvq6opodzwjg5sc5w5kwxehmxd4wcdpt4s4j2k4dx4apq
cerapadus.i2p,zroed2cxga5zeuu6rcvmp2yfi77nzduw7yhdplbeuqkuyxwbrzaq
cerebrum.i2p,u5gtsfn267udwfh2uq35jiabkufifvcbgv456zz34cydutsiw2eq
cgan.i2p,43z65gdr52xe3fxmkumwp3dzhedu4tu4rdtzr24hz5b4awcpfbqa
-chan.i2p,fer3oxecsu3tknnnqsqlta3sy62pzsbqrqgr56xzyu6ezxbeqttq
chaoswebs.i2p,fz7l3tv3urnnhjvlrdylbd4uhxpglmm2i3xfvuqrhksjccdfzx6q
-charismazero.i2p,yqjyitvld4frrcipsclo4ceyetkjeyqg6u4juqd722g7tweq7sva
-chat.hashshop.i2p,nfqzckvh5kruzo6h53biio5ojiekoxsytn7ed4d3esc6lgby6x2a
chat.i2p,ollpwnp6yidc3obbb3famgt6rw5jg5w3k3a6z7hhaegj6gcohiuq
-chat.volatile.i2p,o2zogadvui65kr52h2sqeh2d67l4rx5qhd7gj53hkqbsj7y75wrq
-chatfreedom.i2p,mxwg6hn6dicaziccpxvejfjj7ycrldp6vkvfaplfny3jxilq5cnq
check.kovri.i2p,7uea4hzuqwbow5c6hm3ghkr7mvyb5vafoo473wrcaa4rmua2d7pq
-chen.i2p,l7fr75pvy3o66isse7bb4bdsy6coq2eb4irjkrsdlugbjanxqzzq
chess.fillament.i2p,tv6wbanei647yf5bie4dhg2wmybkjurezlpdfwftc5ajqlfswwya
chess.i2p,sbnoqznp5yzxals3vs6nzyqaj2fetvonys4e3b3x4ktmfeus54sa
china.i2p,wit6f2zx6dtuqqze6nhbykrds3idppfirxvhf2f7ydqoqf4xdzeq
-chishir.i2p,gd3ijpmfcmcukfjgxupuepckitmx52vii35kt7monsv35ljmbkbq
+chinese.i2p,vvbwsllobaiugvwksrqyhaigbdwkmtnqmdrelzcxjutnnlmcqoqq
chitanka.i2p,u4s3jneepk3akoez46kqiwikoezi6zyj2ibjkjyi4uuvsbcojzba
-christian.i2p,7atkjb6iiru3z4dtb6q3k2hmcyhe4tigbgy55pqi5wwg33h6jwma
ciaran.i2p,2r3645eete6xwbfu62ogonudcrcgqq25sbnij5v4geru74yrscna
+cicada3301.i2p,o24fedov6xocshjcksd2nimzww2iyjk65zamm6c5dm4vx4nfovkq
+ciphercraft.i2p,7s5pkqbpbfdkxtwuu2e2iwstbikyewvvscy76lij4x5pfbygbjca
city.i2p,q3x6msrirtu5gy5vilpki7afqlgrduvs3f6ywixu3qt5q6qc6sca
-cloakbuffer.i2p,rxjexx7dole53hiuaoqqjyq2nljknmnjfws5hwyfoc7jmmhmwrpa
closedshop.i2p,6fg67mbw2okopzyonsck4bsy3cy7l2fame56uiysr2cezhjhzdbq
cneal.i2p,g4za73ffigv3ht4jnhzy4dae52djjq7lqcguqsfg3w5cxzqm7nba
co.i2p,3mvo5eifcwplcsoubtvqkzdahwo2sdhfygfdde7lj2glybk4q22q
-coalicionespanola.i2p,qwmwl3oxelkrr4omz5cjn52ky4wq53aedqbmllut2io4vehpf3pa
codevoid.i2p,2mukrqwtinsw27uoejtrz74zxtilyhnnfdyso7j3yo6vaa6nzlaa
-cokeandcoffee.i2p,2e4cjl64viaks675d6kso3cwkfaae6eqd35crjj3kfdz7oazofla
colombo-bt.i2p,cyr75zgiu2uuzap5zeosforbgvpfbqos2g6spe4qfulvzpyhnzxa
complication.i2p,x2av6rwj5e5tp64yhdmifdyleo4wblw4ncrrcrabxwscuevpdv7a
comwiz.i2p,6p7zqfotzbd66etl5xqy3p6xvr5ijucru3am2xqa7wmnj6vf3djq
confessions.i2p,lh5vitshufxpmyr44zgyymebo5elc42eda7pxvn5lmtes47c7rxa
connelly.i2p,5yrris3nigb3fapvzrlrcaew6cdmzdknzvgrc7y2jpn3ntqurweq
-conobs.i2p,sbapt37ybk2pkprqnkucu4thvtnhs6b7swrhtq4ddopateqt7pqq
-conspiraciones.i2p,7gzrrcy4ilatcinirarpyhorhfkzktnfl4zevuu77gvidiexdwfq
-copyright.i2p,73ul6db3pk2fr2bwk2fewvpuxwiyetnh6heptroagamrchfq7kja
-costeira.i2p,abhty5xlmnyab2kqdxcd56352kcescxoux3p6dbqdrghggyygnxa
cowsay.i2p,q4ghzfpah4ffvm3bhc6fdkrznk5f6jxfjm2daytlparznai5d54q
-cronos.i2p,27sdshufrqpgto7b6ko7ahfk4r2mtqnqtgzf2ncx4gtvrne6zwhq
-croquemort.i2p,j6damyqss2msf47sdxgc6dq7axz6wocqp5utjhn5wifdgabkwhfq
crstrack.i2p,mm3zx3besctrx6peq5wzzueil237jdgscuvn5ugwilxrwzyuajja
-crumax.i2p,xg6ffstp3lnknou2ayhvnoc6nwdhic7fstzphy6idnjnner2wxnq
-crypt.i2p,4xpb7orp7xmhxyiwvdvjm36dzp23h6jxxvagr6xuldodqto2hcqq
-cryptdesign.i2p,ekfldb7x7hgmznu7wnw5d7ziryizyqr3dfhgjcnzshmbyn27zruq
-cryption.i2p,hdfyl5jvzvlkamuz4fp5wokh7rzsmsnidr2qfoocke6myqgpxw2a
-cryptobank.i2p,cv2ccppauuoc5lq4drvbs6wdxzsa6iswnrxqf7idie36rxbqp6ra
-cryptofreedom.i2p,uflpfypin7vzybsui2qk6z4cundhhenixjtkrmnhrxedfoaokefa
+crypthost.i2p,zywhrxtnkjc3rxxvxbocom7ml4hnutomgtuvqrwyf3rhuupnq5ca
curiosity.i2p,eomeif4xrykxlzhawc3icdilje5iammijos6tyizwhrfh3j7qdvq
-cut.i2p,uk5jarq7yvogeuxnbmntdkheyoh56mqbbqeysphdzcllnkvz5e2a
cvs.i2p,yd6k7dzpsa2tnlzx4q7xqkmd4qsjk5xk5hbiqpiarwbeyvxaxgba
-d3bug.i2p,c7tdscxwbhjpgcjz6zle3uhj2gonvy6e3yvloce6ekpmwltbibra
-dallashackers.i2p,lzkthydgao725tev3rsqdgy526t3rfae7q5xjxbmvy4huimlkiiq
-dankest.i2p,t3xtjrbxfehmg3hnqf2mewezirny75mfgzflonhkd24sky4am75a
+daniella.i2p,543gbm3qfbb4nhwnl25dhunasx6q2fxy4h573lj45m2na5lbvucq
danwin1210.i2p,eoqdf4no5dxn4tw5n256kkd4lzz3uk4p47np4mepsykpsdzrnvba
-darkhardwarelab.i2p,hdzxaxt5y5owwvg42s46ygxncshiaha5ec6kvczo62conzuh3pja
-darknet-products.i2p,xatbsnkatiravmh26kpb3qj4nq5lwxyze4q5uax4mme6yv23tzkq
-darknet.i2p,xrxbhjjolxz5mlkycicpdcgerw2dljdbguhq7hdscfeo3j42oiaa
+darklord1802.i2p,jnu3endfmzzf5t3gb6vdj745cl7yp3rmyqckqus77cki6a3lgoya
darkrealm.i2p,gbh4eerxdsph7etxsxznfhvmuiz54trlkenakqep343u4xcoekzq
-darksoapbox.i2p,jlp6a5wubjorjxwqfzfub34kvpcybbkndo3lc37zcs3rryrq3a7q
darrob.i2p,hz2xhtpeo6btgiwi6od4qj2575ml5o2246rd5orarruyjhd63zja
dashninja.i2p,dzjzoefy7fx57h5xkdknikvfv3ckbxu2bx5wryn6taud343g2jma
davidkra.i2p,nq7ca2egm563nir3xegfv52ocgmxstpz56droji4jgnzfoosk45a
dcherukhin.i2p,qa4boq364ndjdgow4kadycr5vvch7hofzblcqangh3nobzvyew7a
-ddw.i2p,wlyy7ees7cumw7ggrs7ksp3uzld6holwopqr6qikncqjgj3vngka
de-ebook-archiv.i2p,6mhurvyn6b6j6xa4a3wpuz7ovpsejbuncvyl6rnhepasfgdgmn7q
de-ebooks.i2p,epqdyuuhtydkg5muwwq47n7jvr66pq4jheve7ky5euls6klzwuyq
dead.i2p,7ko27dxvicr2sezvykkrfiktlghx5y5onup3f2bas5ipocy6ibvq
deadgod.i2p,63bveyh7wefb44hlia7wtxxb3jal3r67thd6jekmwrtq4ulaaksa
deb-mirror.i2p,l6ly7szjqvbffz7hacvjxqsbvpxoguh34ypkddtgse6bq3fljayq
-debian-multimedia.i2p,cylxxz2y35x6cvyrl57wu3brckurtexatyi2i5awz3eeamqwjspq
decadence.i2p,pw5ys7k2grjb5myydpv6ohikm6nna7y6u2dro44i4rucgulu3ikq
-deepdankmemes.i2p,ht4cn7mltt3bn7fm5uvbuvtnuc5laxyiimxza47xi3wffra2ehkq
deepwebradio.i2p,2nait2gdeozkgf6gyhzjfij6mwldwkxxwcvtxobb4b5q5cvtm5la
-def.i2p,qon42l7zzzzylw7q2hxcwz67ada7lijqrzzwqqrrspff2qyycita
-delos.i2p,zhq5z2ohg5ikrobdqacfwaqts6fylnq26veblksl7m7olmk3vj6q
-denofsubmission.i2p,ybk35cmsj3ip3mzyzrtd4pzq5w4qkhywigp2kzy4vcns7fyqe3nq
-deploy.i2p,ujzspsqkbz5z272eozsrdv4ukl434h3fuliwrfxxnab74jmd7e6a
+def2.i2p,cepsrw27kdegwo7ihzouwvgcvw2obswwjs23ollgj7hk2yrce3da
+def3.i2p,xbf3ots2purqun7orn72ypkpjmrzbfrkj3u654zfe77hbrbow6la
+def4.i2p,yyzdq4fwwmnlojp23drfpfqujln2vcjozjrfzfeuriuqzdq7g4mq
+det.i2p,y6d4fs3rpqrctuv77ltfajf5m4tl4kzcu7rtwhxgiohylfxxow4q
detonate.i2p,nykapdsjjswdkjov7x3jzslhg4ig3cpkhmshxqzijuhbisx25jja
-detra.i2p,nluwxqolosgyly5nzicm7dmjdnxj4e4d7mlfilef7qu5u7eqf3ma
-deutschland.i2p,dypqhruytjyjafxe277ok7xuls3vh6v7kmwd3fnzd7jpozlbjdzq
dev.i2p,cfscxpnm3w3qxnlv3oikewxm4qrot4u6dwp52ec2iuo6m7xb5mna
-devfs.i2p,3olqlrn3jutjmry5aaxndt6m7diktaf66zwp5fbrks6qf5ax5e4a
-devulgar.i2p,4mahjuyvnuinlzocrhrxo35xsdbwb6rcj2wxoakc253bpwhijqva
-dg2.i2p,sjnqo3saada5pfldxmsvszns2rosi24uy5m54k7z6wqimewbke6a
di.i2p,3irnooyt5spqiem66upksabez4f3yyrvvjwkmwyzlbealg64mgxa
diasporg.i2p,edvccoobtjukjgw2os5eetywanbb2mpag5aknkrpia5qx2koksua
-dieso.i2p,j4wpvotizkxpbljaptcvfs2eylofym6ftyavgvhbm7k5g3qlpcaq
diftracker.i2p,m4mer767ipj7mq6l7gdrmrq37yzvsj3kzezd7n7nsfuctntjseka
-digger.i2p,abkurcjh734b77blgj4ngvxzgfkxafprb3lxj62b22zy4myc5lzq
-digitalconcerns.i2p,7k4w3cttjgmand6ely2srvgfc4vbwltrzyrardubojf42altdylq
-dimqua.i2p,ao264bhdyp3cimoiagzw7rpa2vakgudf27hfmucsd5ibcg5xkooa
-dlms.i2p,krsbxsaw3lnb6ctdpydygm2gqobjcpm4pf367ddo5hylbscnynmq
dm.i2p,heysbdivyeugdbggpscco5wje3dsvwgcpp5ot4sopooebnmiqvtq
-dna.i2p,fcnogd6go3zrwggy5s3ec62dfv6jfnstqwntar5f2k2umy4ordzq
-dnca-anarplex.i2p,szdgwbm7utjqoawfnwtlmqtqemhycjucbvrxx46d3u2yecoicj3q
-dnp.i2p,46xuw53lvmjontyaodc3zqddgzozkmybmnyagnthquuiqqphfb6a
-dnpchat.i2p,34dwlvhzlcvq7lxld3f3dz26gt27gijerqje6otziiyityuiedaa
docs.i2p2.i2p,las5l45ulwwf5i72nht6vk33sfkidcpr2okpf5b6mvgbk3a2ujna
-documentheaven.i2p,3kbrghggbvqawdmxeesbnpqjtq7645evesf4dggj6hzbgvkzng2a
-dollchan.i2p,hvmnvcq6xv7ok2efmllyxl6lei7ugidtkr3slgmcns2fjj3cytwa
-doom.i2p,yvnq6yyiluav647i7qc3hpjkprrbx7x4hb7e6djgwflu46vwqodq
-download.ipredia.i2p,nbzqubihyfrdd5pfmggzx4cmtoxtcrbkr2cxjvgnn7g7janntlva
+domenica.i2p,hbnbggujfnwnjjy2zg2e54gypwy432t25tb4nn2ydk3xbuslgiba
downloads.legion.i2p,xpmxdpuuptlekyhs7mmdwkvry7h2jbvpqpzsijqe3a5ctxgodesq
dox.i2p,vk27cjdrtegfdnrjqutebgxkpyrfj42trdfbsupl5zn2kp34wb3a
duck.i2p,3u2mqm3mvcyc27yliky3xnr4khpgfd4eeadhwwjneaqhj25a65ua
-dudos.i2p,i7fv4cizrwylahm3mqhvkrltaeepwjj5mvl6nin4k36kybvluf3q
dumpteam.i2p,2fwlpuouwxlk2nj4xklvm43m52tqyhqnu2fcfiuv7clvf3wd5nwa
dust.i2p,u6xgh6zhhhvdvefbqksfljfs3nyjvqcrmyamp5bryz5f4injmniq
dvdr-core.i2p,fg6l2ej6qrk5rkyfzdptxx5xkcm4kvdla4gg2tun7z7fm5cxxw5q
dyad.i2p,7n2ljphvp2dep7imoujvydxp4myuxfld3axwfgcny5xc5x6jj6ka
e-reading.i2p,z54dnry6rxtmzcg7e6y3qtsig5yf5fmehuvakcg5wnuahx3iafuq
-eagle-net.i2p,kqkshpoytjq5zzpulvq74ifu5ubkga7qwvdip2ivcjcdroazfi4q
+easy.i2p,ndg6v7fw26bzjex3huvcxfyavpfbig2bdmfus5t2qnk2qte3wz7q
+easygpg2.i2p,bwxry5alzx5ihgrd3glah4eotddblzhalvpheppnw4zcajzqoora
easysoft.i2p,ecbhsjzyt3pjp6zv6btqin5cbhlwqsgritljgyx5tc4aoarojeva
-eblan254.i2p,gt7ktjaccfl47mbiuehrruogte4ytppbkr2v37q6ppwbjajbbqqa
-eboochka.i2p,ou7g64d5in4sugv5fgmmzwnunuw5hloixio7puthmrvrkwrp6egq
ebooks.i2p,bvpy6xf6ivyws6mshhqmdmr36pruh2hvoceznzeag52mpu647nzq
echelon.i2p,afvtspvugtd32rsalxircjglh3fhcjzk7gxrm3gw4s2yrpvzk6wq
echo.baffled.i2p,bfr3lyicr72psxvt2umqfb562rtex66w6q3hi3tktzkoyane2iha
-eclectic.i2p,33xxjd2z2poeqklufqnk6d6xrrmbebmlh4yabg4snvk7vur6iila
eco.i2p,2dq2o5h6c6a674qaduipp55mid5iktumjbswuwmpsrcqaeowdvwa
-eddysblog.i2p,ieac3ub4g5sy3wuhsbqfembnpp7f3a37xgcx537ytzsmgfzexnbq
edge.i2p,aknsl5wmzjmwyc4wxutfdwy2w5vgd3vcx52mqx647hcgvyurmqta
-eeeiue.i2p,ilzqzqvzpclqdhhrog5oycul2aaxtwb7ndy325aphsfg3oefluqq
eepdot.i2p,t6edyotbxmxvy56fofdvmragvsj65te2gkhvzv5qnblicutyvgoa
-eepme.i2p,i2dhxxmowponghj3tlxq43z7b2oqnht7pkxa5esoq2zcn4odussa
-eepsitelist.i2p,kplek3im5b4uad5qfi34tlfcrcu2pn2ph72gyood2zefygv36m4q
+eepshare-project.i2p,sn26kom4qyuzouppv4lwnk6bqabdydcegtrilybviibwiq2s4nfq
eepsites.i2p,isskhl4ak3g7qevrarlmblddgr4ugnn3ckalwpjcvxafk5rjgypq
-eldelirante.i2p,xgh6ke745jg2jwyreiua54oih3bjt5dpub225aw3ijj2fsw2czpq
electrico.i2p,65yj7dwjbne26e7pfvf4grwn3ohttvxtsbt5l5kyr3v67rjucyya
elf.i2p,duz6ey27ohpcp3llylklzdb63lylolzcixad6bh7rt5tkq42qqpa
elgoog.i2p,z6hrgkg2ajmuzlrddjlffrgctx7x7fkipm6c4hdzmohyn5wkr4ya
-eliza.i2p,2c5xvunc3y3xvtt7f3glwm2bdqfep7ydyshygcxmecheeezmzs5a
-elportal.i2p,26azjncf7esizipsyyfh65zy6boejxglanzguwuaheiox2nglmra
-emc.i2p,535p7yu2i365ffgrdku73jtzo6iqnsskicwtb7vc2pt5smjfl2mq
-emercoin.i2p,o6aga5qbgi555rulkuerbjzmmibupcpywownhuokl7b5s3ktmbsa
ems.i2p,734zw4jsegdf55zl3z6s22tqkbxcghu4qvk6q2wevjfmx7xhbn6q
-endchan.i2p,crdjt54gtdj2twfc4oxur2jwqc5u5mtzo44q57bfju33d2mbomna
-engruchat.i2p,zw3f44qty3nihjoc3kdgsmw6nbsx5cycom335s3rqzykfdn5s4iq
-epsilon.i2p,ze4bgohowgjzhoacnkuhb26stjktimoffyvt5nbfiuqis77fxgoa
epub-eepsite.i2p,yxvzjwd4vin6pnjauekdufh7lxaijal3kqe2bhakuf47g5zkb6xa
es.hiddenanswers.i2p,cw7ge5ey4ekp5iep2kaw6j54boebtqytpcbnvio2bfpccd5ejzfa
eschaton.i2p,xe75f5hzmrq6rkhsef2geslmi2v2yfngdiysmlmxvh7b4pyyjk4q
-eucent.i2p,64qe3xnofn3ah6ghjkaq3a5vk4eurmgraptnphpdhaoxkjchg36q
+esuwiki.i2p,cwxuiwcpymb72vm5vluba66ofhugyf5qeevvwo7e2fqrxl243coa
evil.i2p,ljfl7cujtmxfffcydq77pgkqfxhgbikbc6qxjgkvcpn4wzd73a4a
exch.i2p,vsyjsbbf2pyggtilpqwqnhgcc7mymjxblamarmxe5hmbxaxvcndq
exchange.gostcoin.i2p,n33uthzyqsbozl2qh5zii2bq2nnvbz6g6c4ew3mwp6uukk6u7wva
exchanged.i2p,ylmulgfskl6uiwac4hw4ecwqdzd3oxtwaemzj25zc6k5q4rkexra
-exe.i2p,varccyu3ythxext5xtb6u4j4pwl7neu3mh3nurwb2bpit4e2t6na
+exitpoint.i2p,5zmjurq3enudcenegnxu5hqmfmayz4lxvnik6ulch4xssa2ithta
exotrack.i2p,blbgywsjubw3d2zih2giokakhe3o2cko7jtte4risb3hohbcoyva
-f4u.i2p,seosrxtycclc7emif4etsv4kzmsmhzptg2ta237brbudq6rdizpa
+explorer.gostcoin.i2p,ktoacmumifddtqdw6ewns3szxths2hq2fat2o7xnwq4y3auga3za
fa.i2p,6n6p3aj6xqhevfojj36dixwbl4reopkhymxmatz7ai5sroh75rka
-fa1c0n.i2p,o5m4ckiiea3wv7qgb3iwvf6f3tr4rlaysitdxbgp2erhon6qmcra
+faksoc.i2p,l3lu7irgr2s24ot7eeqgutldoil33mv44qi5qdxwhwh6w5lyxcoa
false.i2p,77mpz4z6s4eenjexleclqb36uxvqjtztqikjfqa4sovojh6gwwha
+false2.i2p,j5i2tfumh3ti5sdtafwzzbpupmlcbg5drysfay2kxbdpsaljrosa
fantasy-worlds.i2p,62a4xcyyhvfrcq2bkckb7ia37fmrssrgx467tlkxp32fjpq577wq
-favicon.i2p,yp5jqyqanin5e3skwum2hmblkfgbbj3nssp6bvhlr5kw3xvyzcma
-fb2book.i2p,3a24ytysvevkcgtssyd6fjgy6efck3bfonkanh7bphal65fthfvq
fcp.entropy.i2p,de6h6ti5z3mcbdcwucu45vplikqyoeddsu3rqy7s2zy5i47j3peq
fcp.i2p,ndsznnipoeyapnsg3gj3yi2dzsqduxwalmujm5mzjm7e6x374tta
fedo.i2p,zoamh7e3k2vf2g6pfy46ho4taujk2f4mxqqsv3gbg554fxbvyfqq
@@ -309,131 +192,84 @@ feedspace.i2p,kvtnpx4jylgeyojfhix4x462sqn5uork3roml4sfzotkxx62i4wa
ferret.i2p,kkqie5qmja7bkf3iad4zxhrdarwj7kbrx2m3etn5kmba3shgwj4q
fido.r4sas.i2p,i522xmu63hfbaw2k54cthffcoqmeao6urjyq3jg4hddf6wf57p3q
fifi4all.i2p,v2stz6bsot7sbjzix5tky5dm5ej7gidmjnkvzqjju5xvz5sz6fwa
-filehub.i2p,rsbtaakwwfvodxa6xyn7ea6tmi2andrfmlhdcasgy2xx32no2cpa
-fileproxyxmpp.undefined.i2p,oc6caemyolql5xwav6y7kputwcb357qk2matzevmrlyrm3y7f5pa
files.hypercubus.i2p,qfglq25jwieszgyt7muz6dambzqsrmjhhszygzzx2ttubc77sffa
files.i2p,w2sy74xe6oqnuz6sfh5fhkzu7boholgzd5f3anhj47srxwpj2vaa
files.nickster.i2p,yil7dp2hg5pbqyovsiwb2ig6zjsq4tize3fnwemmqdrr6j5itdtq
fillament.i2p,udj2kiino4cylstsj4edpz2jsls77e32jvffn2a4knjn4222s2oq
-fireaxe.i2p,ov3ev5dplhdz6ipy442ftb4kzz4dembm3ifs2jo25qhiyw6f4ogq
firerabbit.i2p,awqh7n3wskzl3epyvkdwgarmfybsncm7vye6psg4tpkmplh3mj2q
-first-world.i2p,w35uyqjcbdrohmtwgk7pf36djxelyiq5gs76hzyrwovpnmkv2gcq
-flakka.i2p,dvqfprgxtomk5xk7yr3irjpowrhcixew7wyxw6ppilbgxrx66b5q
flibs.i2p,ocdm33e3h5tdml3yyholj4objdwsrhlugfqjnqgdkslmgdzb6b3a
flibusta.i2p,zmw2cyw2vj7f6obx3msmdvdepdhnw2ctc4okza2zjxlukkdfckhq
flipkick.i2p,aso5rzc4ym6g2bcbxjy2n573bmbenkjawva2jg7fhyqhwtwgu6lq
flock.i2p,hflpi33ko5bi2655lx6bpzstdnjqgzrz23inovqjx5zpntyzyb3q
-floff.i2p,umcssecfk4esz6fyr7gotsgcnbcxpf6atim5uqkxrxb62ky4iatq
floureszination.i2p,vitpvfb25sikuk3crgcvtcdi7hajxnnq2t6weay3no7ulur2wwwq
-fluxdirect.i2p,kudvuk4mc2rfqoi2f3khn5mz6af3hdaq4wx4bnvohut7hktoumua
-fmnet.i2p,zveaklfzb6xmcayvmmkdvqnboibmcddnk7tvcw56l4au5zuyrkqq
-forum.anoncoin.i2p,sytfn37x3exrre77ctjuo3g7nhnky32bqgpcn6jr7e5lijz75nuq
forum.fr.i2p,onvelkowkbuwrglhw2cnocggvbdudi75sll5mfirde3cbopjqivq
-forum.hiddengate.i2p,gsuejshp4433zxbrb4yg7sdxw4ln3b3n57i2gpzij4ddazed7tka
forum.i2p,33pebl3dijgihcdxxuxm27m3m4rgldi5didiqmjqjtg4q6fla6ya
forum.rus.i2p,zd37rfivydhkiyvau27qxwzmerlzbqtthsa5ohtcww62zrygjaga
forums.i2p,tmlxlzag7lmkgwf6g2msygby3qttxvm6ixlfkq6s6cpgwubp33ya
+foxatomic.i2p,obdyolrmtaxt4i2aeouun5shl7wqtxgbnkesty3sr5ofmhae32qq
fproxy.i2p,keknios3gm6kh6onez6x2bm2t7stv54oanvltuagphgdfjdw5e2a
fproxy.tino.i2p,fpaituvuvyxp6xdjnv3i27alnj2ifzcvqdweqb6yj5uybotzvyha
fproxy2.i2p,r4lgw4wmza25g7j5fjocjbwzwthfg4ymcbm52ref3hh2hogskcza
fr.i2p,ia6xlsnygorllplx2owokahtrkospukvsmysz7i7bzw3vejc4hdq
-freebel.i2p,itir2seplkvrcgvlcw4v7jp6zkzdhmu4tbu2kcev2zkn3foi77yq
-freech.i2p,upld2ui3i7iylcqt7j64s6rpwssbvlxiuxsellrg5br6ksikiwwq
freeciv.nightblade.i2p,rluupsgxbvw5t7jno3apyzlrdirjkljft4gdoy4mxxh4fmd4xzta
freedomarchives.i2p,4ck6oliqfjz3sccpya2q4rh5xkj5xdxkqs76ieml37537nfhwd2q
freedomforum.i2p,abzmusjcm3p3llj4z7b5kkkexpsxcnsylikokouk5txfim3evqua
-freedominthedeepweb.i2p,jajc3urxerox3f2gfpfdgcvwcghnpppyvurh4uo2wwue7yebhxoa
freefallheavens.i2p,giqnkltyugfmsb4ot5ywpvf3ievuswfurk6bjie4hxi2hh2axajq
+freemind.i2p,6kjq2ohdni4fgqcypcfgi42lz573juf3inzeievm3euxklq4qeuq
freenet.eco.i2p,2kf7ovb35ztqkrurkm76y34jfpwi6go25xj7peznnmxrl7aieo7a
-freenet.h0rde.i2p,2viwn35pgbotojfv2lky6c3tzxqd5reiujjxebisncykd236u76q
-freenode.i2p,f3wg7rq6mzlpef4mb675gpaohmbicmeu64jsgn7iahijljjpflva
-freeworld.i2p,c6jgsi4fqvu63flxdq3qq7e6whpyqpdmy25k65b4se7vjafow3va
-frenchsharingforce.i2p,jgj72ptq43shnabzljbza2o3kx7qryrpjqhotscalllr7yqiq3ga
freshcoffee.i2p,sscuukigp6alcb3ylhkcugoejjfw5jqgtqbsbafw4hyku42lgc3q
+fri3nds.i2p,y2s7xlezekt5ie5ij3mxhywol3rpo6hsu7velnh35vbdl25tj2ra
frooze.i2p,m6ofa5dmyse4b4jg7kfmluuuc4pw5jqu6zh4qnboin4vropxepja
frosk.i2p,63naq7zb3hvbcppj2ng7qwf6ztusp4kwpyrzbt4ptafcdbu4pfjq
frostmirror.i2p,ycz3imuz6yte2zhlapmsm3bsvc46senvc2jxzwsbfdct5c72qulq
fs.i2p,ah4r4vzunzfa67atljlbrdgtg3zak5esh7ablpm6xno6fhqij35q
-fsec.i2p,z432orw3ba45bxy2adkb7bdycva5xrraqu4fbzki5bnluxiqtvsa
fsoc.i2p,vaqc4jm2trq7lx2kkglve7rkzxhhaptcwwl32uicx4ehf5k3hx6q
-ftp.open4you.i2p,4ek4ltehr35aicnduha5gl3tiu6acnbk7v63yicjyd5sx6mzs5yq
-ftp65000.open4you.i2p,vzv2sjdkcgzyb47u7ump63sqgli75za5qcgilnzpt5cyvpyez5va
-ftp65001.open4you.i2p,e7sqiurf3njnhwbkeen5wjoqgfdhdpehcqgwyfpm62oew7c4lyzq
-fuubar.i2p,ptekidraefaa2k3333kyogg563jx7htwem7lova3tt5eqebpiebq
-fym.i2p,ecouprtbumzdn27s3qeg3bosoemgtp775bq3zgkkzvkwdxiz72na
+furry.i2p,nsp4dwzfkdldtly3z6fewmicrurncrie277catksd7mpt6xjmbna
galen.i2p,4weo7zkxscxbcouiqx4mlnb35uwl2lromikzk33er3fljktyvi2q
-gallery.i2p,2ps7wt3v67ni2d535lwaubpsuuhxsg3igifsy7qlzolbrxaimunq
games.nine.i2p,ov27guhkdyhgdkqcsi7ipxsbudytn7bj3qp6ovwk6ih2wwu6sl3q
gaming.i2p,rfxberwod6st2zc6gblqswxjl57nucgc3xrbwss43pe3dvqqzj4q
-gamnovik.i2p,ueukotwgp5xn2y4dh7rspe3q7rfcdpoo7r2xbpvrkx6n2niii2qq
garden.i2p,qkk2dqx6nocycgt3vinsoc76cxkb4jreybcpgz3fcps2dbe4rowq
gaytorrents.i2p,fnggbr2t2aulr6rvlo4aehotx6wecfob7u3k2nxsnvtm4xex424q
-gcopy.i2p,3pa2pmbix7cy6ihlydjohqudnwz5ssk6jvwqiouoc2lq2p77a5eq
-gdd.i2p,ddlxcqyifaajcshyzy7d5rw5ziqil362gljf33gjlstbkroaxi7q
-geekycritic.i2p,yaqnhwfrs7u5he3cwd76feocjxafqekj25hl7dngr3xwuti57tta
-gelboorumirror.i2p,lgjfssrj7sznvli7ebtadzo2leefvxi7uzyt7aprtgxyh3xmi2cq
+geekcraft.i2p,g2xbibxoskudufabbgwe3hdpy54vb4l5jq2tr4om5rmmzyutmsua
general.i2p,5fklrsztdqpl3hkkwwrrw2rdowrq7wwhwb6h7avvk4fhansp4vvq
gernika.i2p,wpzqv3lxpecdsvcaadvbmrhhwlc7kp4n2mijdv2qjw3zr3ye232a
-ghostsh.i2p,pp7p7ww7ug7qwkirgfrnwyxplp4cmyv3aksk2mroplterz4p6axa
ginnegappen.i2p,kbhfkzx5jeqhfgss4xixnf4cb3jpuo432l3hxc32feelcmnr3yja
git-ssh.crypthost.i2p,llcp7jvz3hgtt3yzkdgjolwobisgvhv4xqa5a4oddejllyozur5a
git.crypthost.i2p,7frihhdcisdcyrzdbax6jzvx5gvtgwsm7m6kcem2tlaw4jtahbqa
-git.devfs.i2p,yklo4bsbwi66r2wlbug5jrkpx6tlquo34knzaopsboiz5dnxn5rq
-git.nazgul.i2p,2o45uut7k4wdmup3nzncyjh4zuzwi4rm6xrucsf7b24zhlkoir2a
git.psi.i2p,em763732l4b7b7zhaolctpt6wewwr7zw3nsxfchr6qmceizzmgpa
git.repo.i2p,vsd2vtgtuua2vwqsal2mpmxm2b2cpn3qzmqjoeumrrw2p4aot7uq
-git.volatile.i2p,gwqdodo2stgwgwusekxpkh3hbtph5jjc3kovmov2e2fbfdxg3woq
glog.i2p,ciaqmqmd2wnws3hcpyboqymauyz4dbwmkb3gm2eckklgvdca4rgq
gloinsblog.i2p,zqazjq6ttjtbf2psrtmmjthjeuxaubi742ujrk2eptcsaoam4k7a
-glunews.i2p,2bka7rmfn75ollbwq2cgzf35yxx3qz3lttmwi7i5t7iptlj74yja
go.i2p,ll6q4lsirhwkln4dqxwqkh2xu4mu3jiy546b4uhe4fypyb4vvx2q
-gomi.i2p,wne265y2p6xuaefqnhk2rb4gfhfiw7udvilnujev33f7tlux42ja
gonzo2000.i2p,nogsv7okydhbvrewv6hb4xdojncvhkusnyib4lglluc4uw67a37a
google.i2p,4p3ajq4cotnflmuv7fhef3ptop5qpm3uzzgp5bahxif3nc4w3ffq
-gospelflicks.i2p,iz5ms5ta2gm53w4avunj4q22o67vfuz2yr5lcd3ehqwles35vzla
gostcoin.i2p,4gzcllfxktrqzv3uys5k4vgkzbth4gqednwhfpt755yivm3davuq
gott.i2p,dqows7dpftxxl2bd4bgcpkck6knrysdun6mtqy4ms5dxobbvg3ja
greenflog.i2p,zny5ftmhzxulxzyczmeat53qjnue2xtqv2clisc7dg76lwfceecq
-grimore.i2p,ij4lpzuyyng6cc4jw5mxibcyjv4rx4uk6x5jijoduglkgjh7mmya
-gsatdesk.i2p,yfcliyat7jjuj3qfdbaunlbt25icteuilkmru7unl2tdmq5lxaba
-gsn.i2p,r6o3boq27rhrnoc5xzt2l5azmnirnldt6lvpgs2xfybeb3caju6q
gstbtc.i2p,n33uthzyqsbozl2qh5zii2bq2nnvbz6g6c4ew3mwp6uukk6u7wva
gusion.i2p,4qyfdhizjixe2psu7wcvqufix5wlijocehpb2futurcmlhlktrta
guttersnipe.i2p,kizkhzes2bzp45widihremo6geepfk7dl6juourkvzuvlc6y3spq
-h.i2p,cdnb77zmuqudreubv5trohs5mx5qkg6rmue3wvkfcqmccpeciloq
-h0rde.i2p,m5w3ysm5yjwyhmtnx5wmp7y4undauilishz7pb5ls3jy3kn5buma
+h-f-j-i2p-site.i2p,bjtxnbci25zix2ydunmsin7cwsffleirat2aab7a7heksosdagha
h13.i2p,tozb4vssixoccyqtgnpaatkg2ql52kkjwnsdo3dltezges2na4bq
+hackerculture.i2p,pl4pccq65gaee64zgo2slvn3ggjui56ewrcgxkmfuua5p7dwek2q
hagen.i2p,e2t6rqd2ysbvs53t5nnaf7drllkgk6kfriq3lfuz6mip6xfg644q
-haisse.i2p,rqcuzhlqyxyi336rx42h5ve3bhapzgifkepob3u4mo4vcikvg4hq
-hansa.i2p,4yql32dohkor4kilyxk3ole4xajgo7eb25thxasfimoffsgebmxa
-hashshop.i2p,ltrposvzibc5ahwbcjgyk7akq52udeuetprotyy5sbclxp6v6yaq
+hax0r.i2p,brvsdtvx5vdjai7sxapgksivsamty4dvrpw7g6qc52hqtvpjznpq
heisenberg.i2p,jz4quyw7zt63tmw65jfp76fblwadjss4iyi4puqdg3dye7oaqlvq
-helikron.i2p,nuql7jdr3qw6n3n6rwcktuoboglh3cppk67rohlwwufbciv4n7iq
hello2600.i2p,khpazz3f747z5zet72s6g3dccw53bfdqyhxt5da4sv7ouve5veuq
-hellobs.i2p,e2ceaajfc6w3ts24rnschqc2cxhqqbr37klmwk7b5kwgbevbe2ca
-helpforyou012.i2p,qzvqga56u3oupv7ndhsj7zrc5yngysgg5ayyqbjtkj5maw23ibqa
-helpu.i2p,3rs5qlv5bdpvwmsxhnh4gjw7yrta7eoe6wjcrny6fudzottnxmua
-heron.i2p,wru22ps7g6xgv2ommt7p4ctxwmpddejqvh3gkti6ys47wtf5e22q
hidden.i2p,iqodhhqo473qv5gwhjcs2bsrbhlqtpzgpnuumpastfiyhuwb2kyq
hiddenanswers.i2p,kj2kbzt27naifij4ki6bklsa2qfewxnkzbkgvximr4ecm7y4ojdq
hiddenbooru.i2p,zma5du344hy2ip5xcu6xmt4c7dgibnlv5jm4c2fre5nxv44sln3q
hiddenchan.i2p,6y4tltjdgqwfdcz6tqwc7dxhhuradop2vejatisu64nwjzh5tuwa
hiddengate.i2p,rvblcu54jvkkfffp3fobhunsvpgfc6546crcgzielzwe2s5m5hbq
-hikiko.i2p,jwifa3ysjbrygc6szxchn2bck5zonnihhxwrotly24se5xob6p3q
home.duck.i2p,jsh7yfvm2t5urdcnmfzdy4n6vegqskdtlwem53chgxli4ipfmuma
hopekiller.i2p,kcaelbgsvrkiwpx36b4wxofebrl3njx7rgm5amzfmqwbomt44cxa
-hosting.i2p,ice6ax5qrzwfwzsy64bctffj6zlzpuzdr5np65zsxlbt7hztyc6a
+hostedtech.i2p,ja6nnovaq6j6umtzano54tvxq2zd5vwasymfad3av3ceixzxblea
hotline.i2p,6cczi27iuxkm3aivazaemzltdqgh42ljzurqp43uclbz2lid2uqq
+hound.i2p,ovh4pszqnqhperfwn5rboxljkjemx7dymecl35sxa3dpdsz5f5va
hq.postman.i2p,27ivgyi2xhbwjyqmnx3ufjvc2slg6mv7767hxct74cfwzksjemaq
-hsdn.i2p,3tndu37wufiazfoo5cbbtcxe42dhpjv6f7sho44vvlak6sexolla
http.entropy.i2p,ytu7kz5bdoc26nkpw2hajwt3q7n5rcbg2eokyefhmkxmmslimbdq
-http.i2p,ygzrfsuuytq6chx26qtdd5a3z5as3ylymqy7hxjnn4xaxisw4x6q
human.i2p,nrtcelq3humyfvoxmzmngpka6tmyifweouku5mbi5av4lc43hzaa
-humanresources.i2p,pwm7w5z44w7xblqpod5ou3nfvw3izybfrw5waeqa3vuvzwl6xhjq
-hypogeum.i2p,wryo5vzllas5g4hxjhofzmvp2cnrv6flpof7pwd7lrrdxeazb6tq
i.i2p,5lpdk3gft3wccs4npmadb5mh3hwb7uh63ehym2x5rdre77xtfleq
-i2chan.i2p,fu3imms3gjyroh3phqsehq6c32zszvyg6qrundumhuieiyjc3sza
-i2fund.i2p,ibtuscldyp6zog3dqxw43p5gcy57jfvmvaczohwqbydlj3rdf7dq
i2host.i2p,awdf3nnmxxup5q2i6dobhozgcbir7fxpccejwruqcde2ptld443q
i2jump.i2p,633kqgmwzzu6vhkevwvbf2pfyejt3gkes34i6upa4og57fgdfcxa
i2p-bt.postman.i2p,jeudwnx7mekjcowpqo6xpkwn7263c57y5piurrjrdzinjziu4fla
@@ -444,86 +280,63 @@ i2p-scene.i2p,cc6z3xuw67d2mpq5horgu4mpk7hybmhutotmwvmzzpvoudggifuq
i2pbote.i2p,tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a
i2pbuggenie.i2p,bioq5jbcnfopqwvk7qssaxcl7avzeta6mu72jmxjeowflpcrhf6q
i2pchan.i2p,tduxyvfs7fzi26znvph3mu2d2ewaess7emomfci22wvownajphuq
-i2pcocaine.i2p,s7bq7b7o4z3pcl2pej3dgzkk4zhtounnw2q6dab4vmb24k67laya
-i2pcollective.i2p,yhug4bpdj5mlmwlidnarhdjbn2owet4u4x7npqd2bbpt2p3jx5mq
i2pd.i2p,4bpcp4fmvyr46vb4kqjvtxlst6puz4r3dld24umooiy5mesxzspa
i2pdocs.str4d.i2p,yfvbtrhjac3jutdsqzugog6mbz3jtyhpwovrt2mqc5mzv534y7cq
-i2pdproject.i2p,5a7tngsj4ewoz3ufqoklzaxchyg26qojmoivoj2ianiokebri6ba
i2peek-a-boo.i2p,qgv64klyy4tgk4ranaznet5sjgi7ccsrawtjx3j5tvekvvfl67aa
+i2pforum.i2p,tmipbl5d7ctnz3cib4yd2yivlrssrtpmuuzyqdpqkelzmnqllhda
i2pjump.i2p,2mwcgdjvfvd3xwumzqzqntual3l57h3zo7lwdmkjboeraudpkyka
-i2pleaks.i2p,koi6osleq2ervyhkc26gwqr57x3gxbqzvwqkdlz73jmtjnmiykdq
i2plugins.i2p,bb63kmnmbpitsdu45ez54kmogvvljn3yudksurcxiyq7dn5abt7a
i2pnews.i2p,tc73n4kivdroccekirco7rhgxdg5f3cjvbaapabupeyzrqwv5guq
i2podisy.i2p,3c2jzypzjpxuq2ncr3wn3swn5d4isxlulqgccb6oq5f6zylcrvcq
-i2pr0xy.i2p,jgs274mwwt4zvwzk6nthbjpqsencoz75ujoceh3bisxyt4khyvsq
i2push.i2p,mabdiml4busx53hjh4el5wlyn4go5mgji2dxsfyelagi4v5mzjxq
-i2pvideo.i2p,n2ejmbpvf3ocisxmqeknrkzesyaoxaowsoltwc32qytios33g43q
i2pwiki.i2p,nrbnshsndzb6homcipymkkngngw4s6twediqottzqdfyvrvjw3pq
-i2vpn.i2p,bduw26oby3cjuwihuxbf6ruhyydupu43bpr4su23pdzugsnhh4ha
-icu812.i2p,bxgqwfsnr3bgnr6adn62anjcin5nuthqglotb3wn3dgynsfofeva
+iamevil.i2p,au7jhslyt4cxkjp365bvqvend3hhykrrhbohtjqlgoqrlijbezja
id3nt.i2p,ufuqdzsxltiz224vq5gnuslt3a3t72dhy5kq6i2xway53m6pzv6q
identiguy.i2p,3mzmrus2oron5fxptw7hw2puho3bnqmw2hqy7nw64dsrrjwdilva
-idlerpg.i2p,ghw3xixix5dk2y3pzjsvmlput7d3z6pawkwe6hme5jddxmzqkama
-ihands.i2p,c6qxr35an7xzxzymuismym2buwbkoi7rajchcljmiw6t2xkujsaq
ilcosmista.i2p,6u2rfuq3cyeb7ytjzjxgbfa73ipzpzen5wx3tihyast2f2oeo24q
ilita.i2p,isxls447iuumsb35pq5r3di6xrxr2igugvshqwhi5hj5gvhwvqba
imhotep.i2p,qegmmhy52bdes2wqot4kfyqyg7xnxm5jzbafdb42rfoafadj2q7a
in.i2p,r5vbv2akbp6txy5amkftia757klgdy44s6cglqhmstpg65xycyjq
-inach.i2p,nzusnipqsecluzj2ctbq5xywnfebcyg3e3i6ustodgk3kplnfeda
-inbox.i2p,rw6um4xv56eggo4bb2yzn7epdkyhggyjjc2rskx5nkqg55w2jq2q
inclib.i2p,ux6prousphswf56bym7yo7kst4ybh45y2z2wrnw7dujmrz56hq4q
-infamoussec.i2p,k5nlxksp2vrfj3ber3gvmt3wbsmxkirsywkoub6rqqbiozp44clq
infosecurity.i2p,v3gkh5kqzawn2l3uzhw6xnszsh6w3nztjmlwil7p4kyrwrsm2dba
infoserver.i2p,jd3agbakybnhfvkeoxrx7t33iln6suzomv3kxkxf77j7rkonch6q
-inlux.i2p,umhctznpitt7syzeto4rpsklqyzi7atzdbsvurwpv6wkqipr57da
inproxy.tino.i2p,ex5yf6eqqmjkrzxnkn6cgvefgne24qxsskqnpmarmajoit43pgma
inr.i2p,joajgazyztfssty4w2on5oaqksz6tqoxbduy553y34mf4byv6gpq
-interfray.i2p,qdlrga6er72kfbzwm7qrpq6m3c25ufu327gjamgfzwto544l7fza
-ioku.i2p,x45hrjo5ibm2gojbfbac3wi5kytp2bywms4houedo4pwdce4jviq
-ipfs-gw.i2p,6ox7c4vu2dwezfxbtlv62owd6n6ijgcpl66vv26q4sslfcp7yaxq
-ipfsgw.i2p,uxqdckmpvrvgz4rkudi7ndgnhcz2xgm6msbql6dwpyqwg6zgdyva
-ipredia.i2p,xnrx3wxiatblnustrikohrodrtddve36zsqaubtlf4wh2zazxgma
+insanity.i2p,j7c45wpdoxxu2f3kfsvi2vr7bi4tc6femnycqi24qde2uucqurkq
+io.i2p,tx22i6crnorzuti3x6va4mijsbhoqswy2cfdxjbvprgsq4eerg7q
+irc.00.i2p,bvcja52pppgfspp2ueuipoysjnvvoyblz2h6smpxcmanjquogirq
irc.arcturus.i2p,5nywlbn35p2nwsymwpfmicu6fxono6g64vwusxbsvmm2qwz6vupq
irc.baffled.i2p,5zmtoopscym6qagkvpgyn7jnkp6dwnfai745xevkxlou77c2fsjq
irc.carambar.i2p,hxzbpivxqxy6nuae4t6fnkhcgnhs4c72vt6mmsqfmfhrkn2ca6gq
irc.cerapadus.i2p,e4ckznxcxvgyikzjmjsu72i2dbj2d76ogexyukklbjvpcnhp6zzq
-irc.chatfreedom.i2p,n2y56bfettc7lyfdiw4uojt3ok3zfcgudwzispwj2a5po2k4gfxq
-irc.devfs.i2p,2tnl43crujj7gfko6ln4gp64zl5fkh4djvcjx2piyjvvsl76c5ba
+irc.chatfreedom.i2p,qaufwx3c47bnjyave4y2mpk7d4vsayxpz7tdi2kwpv6lykj2znja
irc.dg.i2p,fvp3pkcw4uvijqabwtekcdilklp73gyasuek67wdcs2mucep4caq
irc.duck.i2p,chdpmm4gxffyn24xx5dhxvfd5httu42i5gtoe6cctjlsf4mbofeq
irc.echelon.i2p,ez2czsvej5p3z5bquue5q3thujcodfze7ptybctqhnqc7hms5uzq
-irc.floff.i2p,5feedunnrtirrs4nqgo4jo5g6lhal4bxb3riok2523x7khoysunq
+irc.foxatomic.i2p,mkyylu5pmwvjo6koojlfcex3orjtbtoxaeelaybsb57ykub5hw5a
irc.freshcoffee.i2p,ubiu2ehtfnrleemgpzsqkahwnvzuaifqa3u4wmaz5maaisd5ycfa
irc.ilita.i2p,5xeoyfvtddmo5k3kxzv7b3d5risil6333ntqrr3yvx3yubz5tk3a
irc.ircbnc.i2p,4rqcsqd7xif6r4v55blqvmqu5er6due4eyene3mjorfkts4o3rxa
irc.killyourtv.i2p,wre4majmg2vnbi6id27et7yw6lnpf56wkbm6ftnlwpvxnktq73hq
-irc.kitsune.i2p,cpesprosbsuycn4ui3neidqdtqz5ufekthob7cobl3p7bcuaoh3q
-irc.kovri.i2p,o4hfe2fyc74rjfo6o36h4vcif2l23rv45l5v3h2sjtfa4lpxd2eq
-irc.nazgul.i2p,uot6nezrp2o5eabprnf4dzgtc3plfqy7yvdnowokzw7x5yhwvjza
irc.nickster.i2p,dhq3fhd5scw3jqhj5ge7kqfpprfolcgxfjbaw24obohaiqjtdu7a
irc.orz.i2p,7gifacog4aoons3syybojbbnyqqaaqijhngrehn2xlq3eucuyjcq
-irc.plain.i2p,y7f3c5s2n44j5pnsxncqpasluv6k7i5jtnhjfs5mfulcgcas6sqq
+irc.pacman.i2p,ckxfx7oo5qbufui2i7tshzs5hef4yafgpw4jsogsyetcgk5tbn7a
irc.postman.i2p,mpvr7qmek2yz2ekegp5rur573z7e77vp3xqt2lfbco5i6nkfppcq
irc.r4sas.i2p,hodhusp73gltozgrnianlbploon3rrvhrzfn5mf2g46o7aaau5la
-irc.undefined.i2p,t6phciy5wytbthyi6fxwz5towjtae44iqsgtlp56ygx725tetmhq
-irc.walker.i2p,epownolfv227hhzogufiieiofi53za3qctgim7xobsevvntuxiqq
-irc.welterde.i2p,424n5ty6bryfsn3m3buckx4njs4vaw2qch7drfdq32btsyycbflq
-irc2p-qdb.i2p,j6k3cqiviwqlr2oudf3pezowtpd44gm3jgg2wg6c6d4m5gq6jweq
-ircdnp.i2p,yraqgyioird5hrzwhruqdgkykurgrme4nt3g2vxvfeyhfkujvpva
+irc.trollirc.i2p,hci35hmgxc5xdieoqexyjgsbgsqlsoogxyhwnfkx6aioxkf2le6a
ircssl.cerapadus.i2p,4x2i745i4w52ss3he2kse6tzwt64pr62yvrcb72lgvrb63fup6ea
irongeeks.i2p,ecduxoion5uc5hnvzjxff6iiwhdwph6gse3dknyvlo7e6gaeho7a
-ironhawk.i2p,d5c3tbjvsyvlqqnkgofvssmdr546ccjfcy3c7kaeniu3hwhacewq
-ismismis.i2p,5bgjw3l4unhq2suqjosefozpbxlqfcb2ebuqmfh4awazgp6hr44q
-isonomia.i2p,dkuoddjlafw436wathmwvubtxmfxe22gpqglgytwsaukdnh5aa3a
+iscofsi.i2p,enjgdxs4um2dmhdb2ajff2egrdijkjji3g47m6unb74swbrqsddq
isotoxin.i2p,wue3ycaccf4texikza3fh6p5yrmtgnooisuypnepo5mo67lmpcqq
-itcooky.i2p,fpprghfrrwc4sbvnuzmnruk2es5mhhf7gkh3jha4cczwd2rl7sgq
itemname.i2p,o35ut7hgywy35okvgkjkv3ufzv2ejv4luap4oytwbyy2jqy6u4vq
ivorytower.i2p,fpwrfvidfexsz7dspofkwtkmmizm7lyralfz5kvykffk7gubvxsq
j.i2p,kjxvohlsf5sdrzxzfcrmvquccnoevi6ytbl63mstsru5wt2dx3ea
jabber-2.i2p,pvnmzgemetkwcuvt45omgowmeznwk5xw3nc3ygeoz7yekqxy57na
jabber.duck.i2p,rhdzvvzraqzzm67zpyegb7knpfrjeffitixqzeyymdoz56uh2rtq
+jabber.i2p,32dft3x7pnwmgmc24yzl22r7kevefk22k66ms2dssd4w3skcgzqq
jake.i2p,v2axvy6pqefnla7gun5fmqs4lqe4xfyqovgzcundhxrpcdvfd7cq
jar.i2p,2fthkmujup3xiiu3yple24n6g4emzdiiimbuqwvpdddtsr3c4nrq
+jaruga.i2p,bcqiblik2ccvhnjzammiujiluqzp2wz2bggp6o2vxmtivpmtq5nq
jazzy.i2p,ha5c3zafwkt6mwqwjcf4oqwvbwz473652ljjadiwrj4gfkfkjofa
jdot.i2p,kw4jr5qw4bhnj33avkwankjdh3zi7wtahlmgkjwvsv2isskkzgpq
jhor.i2p,c6rnm7oemydhuwzmhwwwxphkzanez5rnn7fkcs3lpgu6gkgtssoa
@@ -531,304 +344,205 @@ jikx.i2p,aazr55itvyns4lwppvx5njyx5tjdwemw4w6jbmpegdunznod2ieq
jisko.i2p,jxgfvr663uhr6m65hrgkscshysfshkq32ywdubc4ed7zda3e2pca
jmg.i2p,oglpnq7zungdukmk6gk5fzj5jp6wibuoihqgks453wztrwos4ggq
jnymo.i2p,nbfplxgykyfutyadlfko2rmizdsxox2pee2ahboj5mju4s3putda
-john000doe.i2p,5u6jikwqg445gd6uhmmc547qv5yrreuxevjyub5bsla6rxdpjknq
jrandom.dev.i2p,htynimemonyzqmn76gworxyfkmqtsa7zcprbrd3i5cxqqm75tuzq
jrandom.i2p,dqows7dpftxxl2bd4bgcpkck6knrysdun6mtqy4ms5dxobbvg3ja
-jrrecology.i2p,qxi24gpbum3w3kesuxvheyu3p5u5o6tuvoypaolub2gnvbld57xq
-js3.i2p,wlcagt4vcjzux45dfnvjlj6pyt2itkz4xlyrc733lwnsiub6x4ba
jwebcache.i2p,xdffxnxtjd6ji2zig3cgva7igvl2tiapyjoc7ylbzwqhxudbmvfa
k1773r.i2p,zam7u6vslhemddz347uusuzjdk5wma4h5hcmcqlng4ybbpdbjhnq
kaji.i2p,z5ic7gvm2k4doczphtrnrspl2w5sfbss2de4z3ihjijhtjw67ydq
kaji2.i2p,4lscgc6napekfx7ay5fdcjofeja4fnl7tqcd3fek63t4saavur2a
-karman.i2p,zkx46wwkic45cquosj6mnzrtzeyjpic26fxw4mwpq3lxapigkf2a
-kaufmich.i2p,xkbkyfgsfvbqhpcofqzwv4ekhyadrjzlrszghjajvv7uuyad2rsa
-kehaar.i2p,awzzfuvi7rrq3ue2qoiuso5n6s2cgm5zevsycg6qv7tcipok4eya
+kellett.i2p,cmhgn2lsgvfrhrgo5l2fqxkzpngrl2potp2v3jw7juti3jrr2rhq
keys.echelon.i2p,mwfpkdmjur5ytq4og36ym3ychinv36b2a57f4rmgqmtrwepq3fva
keys.i2p,6qv4x7ltaxckd4vbay5s4ntqqflq4efk6oke2d5yzicqrmk443ba
keyserver.sigterm.i2p,isoxvnflrdn7cm76yjlfg5tbcugoito2hur7eidbqmo33xmwz5ga
-kha0s.i2p,pgyrawdmaysc7fqfi4tn4uziv4izekgcndlw5wjcsshbekuzizvq
-kibykarni.i2p,xowcvzbeq72slpbrwmjl3zy6xkrkb2ncctpkkskeqts63vedtg7a
killyourtv.i2p,aululz24ugumppq56jsaw3d7mkbmcgo7dl2lgeanvpniyk2cbrda
-kitsune.i2p,mubckotdo3ju3fof4z6t4hh6a6rhzmkexclh4vfhddfyo6tkqtta
-knotwork.i2p,2yocdbcjiyfaqgxb4l6oenrrrrie6nydgmbnbfulqg7cik6bozxq
-kobato.i2p,l4kzozq64uv7azieh2ggmsb22biqdv2lodbxbb2tlbnozyxfyzya
kohaar.i2p,qchpjehbhqjbxdo7w3m55jbkrtsneb7oqoxcr24qttiq6j5g3z5q
-korea.i2p,eadov57a3jaj5x73ljhaxxltifv7xboujbwkrxdx552cqfjpygwq
-kovri.i2p,j3hdkil4juppzdz2z3hiybauoagcq4rz3lcqygge5tmg2ea7vs3q
krabs.i2p,3yamyk5bgfgovg6zpvtvpdjk37ivjj2wog2w7wha5agzgxxkqaca
-ksafe.i2p,wdu5eqgh2p3j4qbmnwvtaquk2wqqeogvnjxh6oaxvtd4f3bwgfmq
-kunik.i2p,yyx5p3f2l6njgwjabsg373g3euyiyltkzlwpp73ks6xomuehau7a
kuroneko.i2p,wbit2huhhwlyqp2j4undccuyrodh6qcmzdeyuaoy5o4ym7g5gdgq
-lainchan.i2p,7rov2od4lmtfswthoy7tziiuixupugkrexpdvyso5yj5pgicxvga
-larvalstage.i2p,h6de62jrrpn7s7omf3y5n666fyzwyzolkctsatrgshgp4juozeja
-lawiki.i2p,ddwc3z7tm6yuvh4mzmqne2ifn7qglbz73zyqxtkewlpzl7kpmqzq
-lawiki.mirror.i2p,4bgtexyhrbl5n2ah65tcpkup6kkur2qmflx45seozuq5btuigtrq
-lawiki2p.i2p,dkb5f63obsb6wmzcgilebjvmgvw4wmcgzbkczu3sntgckmtzweza
+kycklingar.i2p,gctswdhp4447yibxfbqg3uq2bvx63qjeqnaoaux75zw73leakyva
lazyguy.i2p,ia6xlsnygorllplx2owokahtrkospukvsmysz7i7bzw3vejc4hdq
legion.i2p,5oirascyhwfy2tr2horw6mixozsre7z6s7jfq7qbnj523q3bkebq
-legitimate.i2p,rjeymxhm76gabjcsdggyjaeskttt2kxnu5cba4j66hpkep6nleuq
lenta.i2p,nevfjzoo3eeef3lbj2nqsuwj5qh3veiztiw6gzeu2eokcowns3ra
-lg.i2p,3xqs2da7pnsqzmxqudsiq26vu6fcmd4ok7nsdytwyovz6omrggla
-lib.i2p,nqolhhg7wtr3wyjsxszjhjgh45uztj3xlrtydagwi4fi7ftnbqsq
libertor.i2p,7gajvk4dnnob6wlkoo2zcws7nor3gunvoi7ofalcps5lc76wruuq
library.i2p,brqqaq44vbeagesj5o3sxcnkc5yivkwouafyxa77ciu7l644ei2a
-library.openaccess.i2p,a4kb6pcm4er7r2j35z4vmfdu77qkl5m42nqj5x3moackbscmnjyq
-libretto.i2p,pa2osj63tq57g56dfn2ql2yhxbn6pwe2vra6qw4prw3drny5di5a
lifebox.i2p,pyqjnycm55cuxow22voqj62qysrjdnb6nbyladaiaiirqi7vp2yq
-lifeware.i2p,3rqm2yt4dre3ztabc7pksgle7rqryd3y7hq7tontaq5iytpfruoa
-linkz.i2p,x3layud2n2p5doors6c3xki6jzxbtqqrqrwra3f3oh4ubbu2b2kq
+linoleum.i2p,wvxi6vdf3jv75k2ib3cdzjuai7gxsxh36faf5y4tlk2jwiy2unua
linuxagent.i2p,ap5riaikrjq2uv5qvy7klzhhqywvqi7wqscyipsewcun7w2eynlq
lists.i2p2.i2p,vmfwbic2brek2ez223j6fc6bl5mmouzqvbsch45msvyyzih3iqua
lm.i2p,yeyar743vuwmm6fpgf3x6bzmj7fxb5uxhuoxx4ea76wqssdi4f3q
lodikon.i2p,u3f67staiwhqxpacya3clmvurdwd2kp7qcthzhstqnhrmlwc2g4a
-loinen.i2p,fhlhdpvi6mag7k3ojtmjcwbmkkvhdz5qidjepdcjfs6mkgia425q
lolicatgirls.i2p,a4lzmjyba7aq7hl6okqpds7znnwymolqnr7xhvno2wraqb7uhfla
-lolicore.i2p,houswh44wgppohpcr42jydnsqrngvwuwqs2z6jjoh3letwfg4tna
+lolifox.i2p,7fd2clkiotjnaoeigdtxlkkb24eik675ovezjf67x26ysham4zca
longhorn.i2p,pohcihzxzttjclrazhs3p76wt3ih737egb5bovqb6ym3du6z3o7a
-lostfaithinhumanity.i2p,xjv2xlfbipbyjptzgisescucanns7txvovq3ibntkc2cgzttftha
-lotnv.i2p,ziwehd4aooxlcdoixbb6xxlgd2s3snmalffca3pzwc6tmuf2sftq
-lotteryconnect.i2p,pic52h2sghmghyx4yhv3jmfwshslzumqbgc3dzlqjjxaekdbo7ua
-lowerorbit.i2p,s247h5gshsjab2yoviei7bftr37r7hrdqaljjgxnheivbs45pona
lp.i2p,jiklbujn3cbfikf4pca526jgmorx6mxhil3twqmfoteaplx6ddwq
+lua.i2p,kq33wpfdocw6sf5r3k36723tgjodb6csjnrthdsul7gsnmtay46a
lucky.i2p,wx36m3wnpt2y6bngdpg3ifrarvtkpwnluarx377bllpgvkuhybaa
luckypunk.i2p,y4t6cujjxnnrtln3rgmfbgbh46hic7wkef57krd7opitbgngohka
lunokhod.i2p,3yc6sp7xic4grmpfecbwuij6z3dp5kdgoo362pszaco7io42mnwa
-lurker.i2p,jb3ac7svh77v5e7p4wlrsex55anfio623ny3y7syzmdz4x3shcca
lyra.i2p,xfinw5aapff3ajbm3vnk4t5wor3lzcuwtq73rxz4yb7umlnmyl3q
-m3w2.i2p,pe2yxmkgemhg5gbum3guhagf7jj63injfdezus5sfmulnvddt5iq
mac7.i2p,3yjowssqzydciwa5zx55kazgf7q7w6g7rkocr7bngy35ii44t34q
-madfrog.i2p,madkultsfghzjsdbfi6qk2s5s5oqsuz5agg7jeiymhjdyywvgtuq
madman2003.i2p,a2sam2xbhxbzmeyobphbxrkdwlppoerewq5qvibbyk3ftsr643qq
+magix.i2p,cgfnyxv62msfynsfbv3kju22j2mt6tfnopshhmrcmpcrxyts6xwq
magnets.i2p,snz46nez6hrrpg6336neinflw56l3vwatk6bzzytwu77xmsfsoca
-makeworld.i2p,pcvzbhbqendkprcj3qfb35cgnmnqdl4bm573gixltdaxz7hifpia
+make.i2p,yr7r4o4ijrz5w4movfmfsn3yrlox2mjofrgiartn2qna7us7pd3q
manas.i2p,6qolj62ikkoq6wdn3hbvcbdmlvf2rcyv432kgi5uy7mvrczmjtba
-manofperdition.i2p,wy3gcnlkpgirkqnlv6gdo3jx6sh7wqxxudi4cklhmfvytojvxoya
manveru.i2p,pbmbofs76wpjnxi55eqtwg4y6ltyij72o4fm4sxfjol3y57ze5sq
-mapkin.i2p,tgvm3kgikmjxadymcwvnzt7wqxku7vse2nkoyuccho5accsmpsta
-maps.i2p,bve2bhqp3r4kfsdzmfrp7pue2osanqlwamo6mqqpzhn7vr7a4gaa
-mara.i2p,6ejek6q35k36gwvt37wli7abnlatjmxob2oe7rhl7rz6bexxknqq
marcos.i2p,vpo36bsil2voqaou53zshuegssqaroa5mbrzxfmhjywlbojckalq
marlin23732.i2p,wfpkmtqz5fzlkh4wpft2aei3itithbhthp5peyavx6zn3napipgq
marshmallow.i2p,svdqd6j3y3gwryufcl4fkzpmcujgvrvphvk2oy4r7m75xs327e2q
me.i2p,dbpegthe42sx2yendpesxgispuohjixm4bds7ts5gjxzni5nu6na
+mediabox.i2p,fpymagqfyjdcel3cddrj447fgic6ke3aztfkpwsg24gefoc62zvq
meeh.i2p,4oes3rlgrpbkmzv4lqcfili23h3cvpwslqcfjlk6vvguxyggspwa
-mei.i2p,ta6fwpneavr2lzwrguwx6y6v4l7ttjbih3eclkieblrogqvwl6lq
mesh.firerabbit.i2p,3x5wokr4bjy5z3ynji4fyhvwzv4fvgry3xafi5df5h75doezjytq
messageinabottle.i2p,avfhe3kvrrv7utxn2vre65lg7damxzzsewq3vukwie4llitd254a
metrics.i2p,z45ieamhex2ihqv7oowk5fz4qq47rbvxhhhbaaiinpajbhuevtpq
-metrohttp.i2p,lqp2pley42h2yxg7clrlnbacpq7kq5qnunln6wrtaab6u3vf7iea
microbleu.i2p,mtapervgibruizniems2yyr47pin2wpysyh7m632rigl26vjc6qa
microsoft.i2p,hvaqr5idszdyrjph34amb4mjosqd3ynggoxlnj7ciqhnx7q6plza
-mig.i2p,6npfff3ensyo3hcfqtkf3wcbbz3mp4vstrwcgor7g4apsdsvb73a
-milf.i2p,5qjobqgbnfe2lfl7jy2qjzoj4u3vazppadkzjeibcjpktho7akxq
-milis.i2p,73674l7jzhbkzzea2df6xhhqmkv5fzshex7ubkkp4clhlug5urua
-mincoop.i2p,wnhe3mehjos6iowxt32o276soshvyxra7gqj6hhyaeulzilq63ua
mindisl0st.i2p,u7rnqhvsuyxd3fabm4kyzn7brgz3i3cporj2emk2jmbpcmltyf7a
mindspore.i2p,uuh5dd3y2rqa7x2jpggm4p2pg6znarm5uanwsvybe4tk36ymwr4q
-minecraft.undefined.i2p,oynvlg4vyyvzttklbccgktj4xkbx5w4pah2bnjrqjtvy3jrghhba
-mirknig.i2p,daambhdto5cn7lhnb32l4laankzv55jpprlaghw2nxscvsyqifoa
-mirror.i2p,dfcysmvxvovmrhipxca3q4e3quz6akc3ls6q2zzputvo6sv4fcrq
-mirror1.lawiki2p.i2p,fzeuhovlrmtqim34337hqn65tsfiz6sxpo7ehfg7lnkqyaigx7ua
-misaka.i2p,4r6wonyrpjnuz6kpa2whyrbp7osfks6p44xrd4ucp2n7w4l5y4uq
-mochimochi.i2p,nijkdoagv343xps2pm5z2cjujz6pmrozrokrcyhhz3aeje3tfzqq
-modernmarx.i2p,tl3y4p7fbeycjymio4fj6zyr3n3gqa2cbk3jdvqgoylkbqhlhbgq
+miraiex.i2p,mbdyxyxj4tliyvcc54xknkyg7ficigoyvfnfesevr64nytr33tiq
modulus.i2p,ctz3o6hdefrzwt3hlg6rjhdcbjk6irppbndq32u6jnn4lz72f62a
+moeyoo.i2p,co6oemqjwvy563l7gar7ybb4nva3k6mnifakyk6bt4idfr2kjwka
monero-build.i2p,wc7qzr43g2o33wsluagjhhd4rvrcx7h5hhhtfwl6i42kk3iuouja
-monero-repo.i2p,rrhjp2h4665m2vydnqetyz7h4ic267woyneguczbz572nmtygzza
monerotools.i2p,5bal7dngxde2ddmhuzbtfken6w5nmxmixtjlrlmxt3wbhnemv73q
-moneroworld.i2p,dyuij25b2gxzq3hfvobwmrtcrdel2nuorntpuyngwr2lvv2kv2ma
-moonknight.i2p,gza3w4cf5pvdbvuah6fpop54qtg26m4n3v7ogn2u6thwvqfm4s3a
-morket.i2p,aofuard3ltrd4h7uq6qp23u3f35dxjbi6l4xfc6cfe7swljtzx2q
morph.i2p,iovyp2dao5rta6g5v6hke2s4ugx2btkpcljddak2yhxfrx3l4dqa
mosbot.i2p,5bhmrp43mjwlzf4x64xgdrkwmw4luvng6eq5waa663a7vnkp732a
mosfet.i2p,s5ynkgagndmpxpf2kmnenv4x72io664gzd2x3qef54ilammnte3q
-motorcycle.i2p,sfmytaey7ssmxsnvvgjw5q55ptnzqqnegfiq4topy6gxbkewcf7q
moxonom.i2p,gcjdrvnlobgexh7ebv276pwmnoj3yoyaqm3w4vmmdha4lgxfinqq
mp3.aum.i2p,n7bmu5dwux7f6gedmdik6zrm77bnls4lkzo2vo3bf4bwegk7vkjq
mp3.tc.i2p,w3ied5s7ldjcvnhxu2gyofe3oogzbplkyxshzfkhspiy2526snsa
mpaa.i2p,m6cqnglo7xlytwxkdsmwf3d23d6lq5r446c3tktb2tdmuah36zya
+mr-fox.i2p,kjxtkdcqqde2fvtrhrkpkpejth4vt2cudavqdjhnuglhlboups4a
mrbamboo.i2p,tmpmkx6wlbbrgsnexrqlrib7laoegpbfeop7bnyezegii7hecpxa
-mrbyte.i2p,6swunwgixw555gvpgehunlkyhovbbpjkz46v5wupiwq33ninjofq
mrflibble.i2p,u7k2qcmkrril6yvudvwxjqz7k3dzgp3jdejjjeapej7liselj3eq
mrplod.i2p,fjn5hxtybxyfyvdf6u5v5seg2sjd47hb5by6sa6ais4w3xnrxwyq
-mryuk.i2p,razf6cyxwygg5um3zud4zjvbc7pholxrma7jbzxinn4ewncv72da
mtn.i2p,xisk3h6sku3iqj52uriogaajmnku7pwjux7wa4omx2zloamuw6eq
mtn.i2p-projekt.i2p,f52x5fp6uhq53f5zle5d6rq5un34xgmxgazvilvmzcby37xcmsfa
mtn.i2p2.i2p,l6kuhtmgvbp57d7jwalj5nksi6nr4gfzbz4oit62lxgipb3llt5a
mtn.meeh.i2p,h7ylrsuzzynrxp3jql7anoozyqblavj7eqces6o3wngvuuxhs2la
mud.i2p,qcjtmicd3ow3q26iwcs62m5zu3dceu6emo3afezulh4c3fsgrkia
-mudgaard.i2p,yz32lk42gtoesknesfolq3tt4erxxcejcote5pontaeqev3bj2kq
-multiserver-console.i2p,fiuhzll4uw2xlkwtzw42o5ouhtj42y5ifpgajcxsgj372nopieua
-multiserver-torrents.i2p,hvtf7lw3kmtozlripp6kzhxzkbeorcg5pwmrfmeey2xohfzsnv4a
-murzilka.i2p,wu5ukmavxtb5334ncr6oi5a6fqutpurhmhzqtgl5ktkhycgq4s7q
mush.zeit.i2p,dk3sg23kljawxqp3cb6xz5mnzjlyckzvq5jhqs5gnvdsv7wqn6ha
music.i2p,akamh76yi6p7xxbvl3qv3yhaockne57yfuh77acogbgpjmwypvia
-musicfile.i2p,vyp42nsgzhb4wuf4rraeu2dd574cc5goskxcwh75uokqn4u3z7yq
mysterious.i2p,p66g2a4nzfkvidd3l7nwphcnfa3ttyu5kiolcb4czec2rn2kvwsq
mystery.i2p,ccea4jybmr3xbfiykaoagfw7ezbvzyhtg44x2jgwhv7wscsxaa7a
mywastedlife.i2p,ceumy3puvvsrru5bmfmtgsajsx5qyehqac7l7a23xpwtfs2bvcgq
nacl.i2p,bm2fib3tumer72lopjh4nmqomwvqu2sdfyb2hmr6lnk7jbw3vvia
-namesite.i2p,2uviv3enxrtwvrysyuzomh7yccvfnmryzzyqddzcyh7aqlrwo3oa
nano.i2p,ex5ssv7s3hj6jp7hvadxfw3wvbjbvnczxr4pbk7qw26ihiorjmba
-nastycomics.i2p,npws2lm55kcrdfk4fkaynxqzihduegwm5hlomhmhkaolie27vjrq
-nazgul.i2p,m6hx3udcpiabcx4mm6z3coqyyyjihkrypwrn7du6lum4wpnvvhsq
+nastycomics.i2p,rq4nabt5yzlkqfzqc7aqh6dex63pf4v6ip6tunb24jkqsh26ez4a
neodome.i2p,5hkhjehj3ct2pvcah7dcylwef2oti3xij5myxbv3pd7rocio5vkq
news.neodome.i2p,trhwcnygfkeqjj6g4xhmrdp4gsjqsye47lsxshbmwbten4ywt5oq
news.underscore.i2p,rl7t3kspoktuatjcu7gf7xleu7y6biibs4fspzo24kll6n7hbq4q
newsbyte.i2p,gsk3rgsejxxrfabjxu5w5plplxsu47aoeoke22vvhlwwllzosnxq
-newua.i2p,sl4dw7gpg3ravvmz4fsmj3mweaxyqpqdmb2aadqcxp3vozm4ticq
nibble.i2p,jmdxcpdzqafedn3clc4y7u6o56qocfiffrzbzncmtggqtio5qjpa
nic.i2p,vzu5ymab6klevpcdudv4ypisjqaznmt44e6lcg7dwiuza4saibxq
nickster.i2p,zkwsa6kvq2wdhovw5g5wqakpb7rlaylyhfriwmurots5pvwbqauq
nickster2.i2p,eofzi7npzpk4p5gb4qper4hmwgxo6kepo3dheeblakewedxj2bwq
nickyb.i2p,gmpxk4tje7mnud32kg2kjmf36f6cpwqakzc2dxuzjnnz4qr5w4sa
-niconiconi.i2p,p5h4klccaaldvphjw7fllgj3x5tfy7thqnqu5yr6py7dofemeqiq
nightblade.i2p,p4gkon7ytswxrbwkl7vruw6mg7kfw5aofovqjgt4c7tnqmbq6lha
-nightfort.i2p,6vth72b6i65jjbjvxvqxgsydpoy2i3hvn3rjcp73pvdm3l5xwevq
-niipp.i2p,uiob477tc7uktrfmj6tvkf6uq62xg2olwdys2vzzki2mbmwxtkfa
nine.i2p,gniusiswp2zhjwh6bxdlyzk2ocg2cx6xxjwcmih4mohjs5sokqsa
ninja.i2p,q6dg6hlb3egzdqz352ri5rc4fx4gcrdeu3tpiyfxlv73yfjgrhya
+nisankhacharjya.i2p,63env37dvsdtbcwh3kcskfkln7awly7hv42io6vsi6g4gmepqhma
+njust.i2p,gz7a3bgarghus4xaf4t7fgqvklrdwixxfzyexqrzp7g2b4cq6x3a
nm.i2p,3itdpqzyn3ii7sivppo4sxxwhvgtpskzkbokrdibim6gqpvlw5ya
nnm-club.i2p,xkk5fzxdmjra4xlijoa43h5cfcbusdjc6dbfplulvouxdbztokwq
-nnmclub.i2p,bntvsagecjxyrdpl7jshdrbh5m52gq7xt7sdtwxijofjwxrnae3a
-nntp-overchan.i2p,mqllejokgwjpp5kc2bl5x3alormjefpgvmosvf3kvzs2mhmddpta
+nnmc.i2p,7xizivpjkrpkb76x3yf2yktxscax3wf5vrpofwqgp3wcrnuru53a
nntp.baffled.i2p,kc6muo2tih5mttbpzecteegvtonuysjidk3emcy4cm4yifzild2a
nntp.duck.i2p,gvzzor4utsqxswvf6jaglfks7yxudlz2s326ftrk56i4lpd2s47q
nntp.fr.i2p,npoztnqadfnu4vrokoh6rusoi3yne47s6jurc3lzhcrzzia5eqva
nntp.i2p,wwdzmeyler4djegvyt2bxmkwrckfgg3epkkwowyb75s47he6df6q
no.i2p,lpsg4x4gdrf7antxcdy47cl6abcqei5ommgzt55retq7go5ku3ba
-noname56.i2p,oiyoslismzyxuw7ehxoigmtkdj35idim6flmlplddxuiiif6msfa
-nonick.i2p,rmzbmxr4nrsbs2qewmmcbld4qjhzkgnjh7c6qgusvwm2wn62zvqa
-noone.i2p,6w73w226acl4csyhancwk5jcxp5hk7dqosf5uo5d5bfvq57osboq
nop.i2p,ssag45lathm4gqp46si7c4w4tioyvjpcza5uvz5x2zuljnplylca
normal.i2p,j5fex634r2altzb3kjvu35qekt2r3hgsqzg5qxoy7dp53heu5pma
+nothingburger.i2p,tesfpn757ysc7nih7mxher2b3jstkc3l5fhfcyb5kxhzhvv52trq
+nothingspecial.i2p,wzrwqrp52bilqijrlboclynuev4kzpjzfzlvzl5aqxqt5fdnpbga
novospice.i2p,ukqap24nwac4gns77s4zy7j5cagt7l7syb5zo7eukfg3zn5gg5qq
-nozzlefish.i2p,qdxnthwyzynzl6kx2gbo2nkibyjhlpbieymz5gd7tfcu6voltd6a
-nuthxorzcl.i2p,d3ywc3epzry6kox4d74hmncd2jkovsscr4swwmu6wedb5k6hlaea
+noxan.i2p,yses7dxf262wxdwq4plpfv4eu5vb3pqijjkqw77ee3craudlefvq
+nsa.i2p,nsetvbclpomqxfcit4mghn6z7vdhnza6jdzczby4crnto32uykga
nvspc.i2p,anlncoi2fzbsadbujidqmtji7hshfw3nrkqvbgdleepbxx3d5xra
nxt-wallet.i2p,33pp74k4ivy67z332qpyl3qlcqmi6gxqumrow4bldkblxxlxqq5a
-obmen.i2p,vodkv54jaetjw7q2t2iethc4cbi4gjdrmw2ovfmr43mcybt7ekxa
obscuratus.i2p,i4j37hcmfssokfb6w3npup77v6v4awdxzxa65ranu34urjs4cota
-off.i2p,vvnuaoqhasmed44ml7oc3mew6y2ge6wrwpcn4w7ugz4y4apbg2na
-offair.i2p,7iyu7qscmm6gjmoqwuaadwto6bave2jk4gqzo7zgfnsw5ffwx6ya
ogg.aum.i2p,wchgsx6d6p3czloeqvna2db5jr7odw4v4kqrn4gr4qiipfyrbh5q
ogg.baffled.i2p,tfbvj2xal6lcuxv3hzuw7cw4g3whguombcv2zuotzvul4qtrimgq
ol.i2p,bnb46culzbssz6aipcjkuytanflz6dtndyhmlaxn3pfiv6zqrohq
-olanet.i2p,ymcs6sgtayeu72okqhxwstu6a47lkvzoyupifmfnduncrat34sbq
-omega-i2vpn.i2p,vjrjbpibj5hampiaailvhunltcslp7wxdz33a7isqvmegyabkkmq
onelon.i2p,irkvgdnlc6tidoqomre4qr7q4w4qcjfyvbovatgyolk6d4uvcyha
+onhax.i2p,m7i6oe4i3bygx6pn44vn22pgf5kzikw7edr2y5t4cpe5gnqpt3ta
+onhere.i2p,vwjowg5exhxxsmt4uhjeumuecf5tvticndq2qilfnhzrdumcnuva
oniichan.i2p,nnkikjorplul4dlytwfovkne66lwo7ln26xzuq33isvixw3wu3yq
onionforum.i2p,yadam2bp6hccgy7uvcigf5cabknovj5hrplcqxnufcu4ey33pu5q
ooo.i2p,iqp5wt326fyai5jajsa3vkkk5uk56ofn4anocgpe5iwlpisq6l7a
-op-faithless-electors.i2p,mrpdxxpafr6qrfgbsd7abhx4tnfi4373mpwv7iughasxgpdeglca
-op10.i2p,s6cjjt6zbikp4rj7ayprfp5b5zhom6nl35k6th65dtbzh552uwwq
opal.i2p,li5kue3hfaqhhvaoxiw2ollhhkw765myhwcijgock5rs4erdqdaa
-open-opera.i2p,r6enzfd6egyrlslcqaxbaw7bsvopsou54pa467bemooufceqp6ua
open4you.i2p,ice6ax5qrzwfwzsy64bctffj6zlzpuzdr5np65zsxlbt7hztyc6a
-openaccess.i2p,a5fjpssbkv7h6ygjugkfucyitx267y45cvgh2ygeo5cvurs3wdgq
-openarea.i2p,nmju26n2m7tyqbuis6ghykekrslqmpfwd6fspd4lvm2riqmtojnq
opendiftracker.i2p,bikpeyxci4zuyy36eau5ycw665dplun4yxamn7vmsastejdqtfoq
openforums.i2p,lho7cvuuzddql24utu7x6mzfsdmxqq7virxp5bcqsxzry2vmwj5q
-openspace.i2p,uy65dhftzexjgdncmpa64i4ndt3ztua3oq3fm6fxeenjqaqq4upq
opentracker.dg2.i2p,w7tpbzncbcocrqtwwm3nezhnnsw4ozadvi2hmvzdhrqzfxfum7wa
-opsec.i2p,rlsjbyy5beucaiedaggyo2tpbq75ituqwnfx4a4qghyifpdk3rra
orc.i2p,orcnge47kqnpdj4wb22bg6aqcv5v6yu7kmjf5ll3htvseiqayntq
-organizedresistance.i2p,kpspvipmqbfe3dft2sgl27km5ncalvugpphewnyde3yyup6q5pca
-orgasmic.i2p,yf5hcksrso2dj7etxonum63ijmk2gamp6m3ql3xpxh4q4f35afsq
-orignal.i2p,vrff7piadf5coa7za5r5zzu6pa5pfs55mza4yjz6g3veranbew6a
orion.i2p,5vntdqqckjex274sma3uqckwqep2czxs5zew25zlntwoofxk3sga
orz.i2p,oxomqkekybmyk6befjlouesit5mhstonzvzd2xnvsk7i6uyrqsfq
-ot.knotwork.i2p,cxhvvfkbp2qbv5qojph7zb46molpe2ffanghnerjag3xdmy6ltxq
+outproxy-tor.an0n.i2p,hpa7ojiz6wdjowwpaegzuczmufnaydggk5qw7vj6utakggkcd2kq
outproxy-tor.meeh.i2p,77igjr2pbg73ox5ngqy5ohzvrnur3ezqcogtl4vpuqtrcl3irsqq
outproxy.h2ik.i2p,nwgvfpfarpnyjjl4pwsxr2zdsppcx5we3kos2vlwicbiukopgaza
-outproxyhighanonymous.i2p,tujgzpy4yq3yoenbgybivrvsrzh4cmj67j2j43kik55dnpqlbhcq
outproxyng.h2ik.i2p,v32zse2zczzgegelwxbx7n5i2lm2xhh2avltg76h6fz5tb53sfxq
overchan.oniichan.i2p,g7c54d4b7yva4ktpbaabqeu2yx6axalh4gevb44afpbwm23xuuya
-p2pm.i2p,s7555tvon34lg5qjsp7w6vflqnsq65ms4wzdslow4crm3r4ochea
p4bl0.i2p,lkgdfm4w6e2kkjhcdzr4ahhz26s3aunhrn6t2or436o73qh4z7ga
-p4p.i2p,cdnb77zmuqudreubv5trohs5mx5qkg6rmue3wvkfcqmccpeciloq
+pacman.i2p,hlkzt7mbciez64gf325u5ko3353hfxseblbj7bu4loti3lk2zfha
pants.i2p,xez3clscjfafkqwk6f473ccp3yvac4kh6rdp6dptwxa2lhixizgq
papel.i2p,mxskjqntn2d34q4ovsnd5mud7cgde734tdjldd3lt4hczh2645zq
-parazite2.i2p,s2kgme5ye22woyzlrxbpoo63uzxnnlohmy3g4t6mdcnugvbiiieq
-passive.i2p,bncpjc4pylcdqezu5j77hgsqldpjzhfzt2lvwtupyksdy652ekea
passwd.i2p,ojugl3kbejhzcmyq7x52ms5lraxsig4ofkhvbgzleraer4zczroa
pasta-nojs.i2p,dkkl3ab6iovxfqnp44wsjgqaabznvu7u3hugpzyagbeqlxgvx3la
+paste.crypthost.i2p,2zaj4u4s4l3lgas2h5p6c6pvzr2dckylkrh5ngabursj4oh25ozq
paste.i2p2.i2p,b2gizskfea4sjxlw6ru2tb6kdrj47dsjc77cijsf5mzh4ogbmfvq
paste.r4sas.i2p,csen43keji3qiw6uobsgzysxyjd225g6446ylq5uuz6ur2glkzaa
pastebin.i2p,mnicncxrg2qqi55qftigiitaheugnj4rpysbk7zabdrirgktelqa
pastethis.i2p,erkqiwnjl7vtysqd3wvddv6tfvnhswarqkbn4blhdlhfxn7cf2ha
pdforge.i2p,wzeg3ehf6d2mqjqji3sd3rns776thvhe2vam2r6gjlmsqis2dctq
-pelicans.i2p,m2ob4u6fm7kayiy7dbkdtwnf4ssyalmvsh2ik2jjuc72h6fvgpha
-pepepaco.i2p,kkbfftddfu3qjk54k2kw3f5v4jfmqqr5jvrrj4mq3zut2jitb3xq
-permalink.i2p,vq5jx5cnmwu2bbvcwkv435i6hxb5qrhidaqmrpcurbqckm7mwxoa
perv.i2p,f3k3wm4ae7t7ottfjd4hu6is7zsls73izl2gm2qynzficxcdsiwq
pgp.duck.i2p,wujajyxj3cgsfsbtr3g7g7npv5ft3de6pcstxlav26zq6cxdjmha
phonebooth.i2p,noxia7rv6uvamoy2fkcgyj4ssjpdt4io6lzgx6jl6wujpufxedrq
photo.i2p,fqhuy77ugd5htnubzkyy5guvwboqn6goahtmn2g7feewvdj7k3iq
-phpsadness.i2p,7kjaywpkfmfg2xshgnebdv2g3pz345s4ih2livqk27dp6tc37daa
-pictureframeofthings.i2p,x76obr2xmp4s2feg25xoxs3fs2odthqeyyluqu4rq5mflj6jqo2a
piespy.i2p,vzusfjzcu5ntnvobcvyzc4dcu4j6ommtnpmba2puk3kexgdzrl7a
-pinkcloud.i2p,ah2vd6gmhkaivoshix56pxe3myk4yu5llug76wpzmjovojdn6tia
-pinkpaste.i2p,o5zdq6iuire5eatwehhhylj7vbsdfedhm7wkd2hoejh7wxwfbqnq
-pis.i2p,xwgyr3pqaxx6aromrhm266ptcigcegggosk4h4khms2g23cddbtq
pisekot.i2p,7yzdwhy723fodqz4onp6k3nyvixra2sa6dl45tcblhmyoa7i36nq
pizdabol.i2p,5vik2232yfwyltuwzq7ht2yocla46q76ioacin2bfofgy63hz6wa
-plain.i2p,y7f3c5s2n44j5pnsxncqpasluv6k7i5jtnhjfs5mfulcgcas6sqq
planet.i2p,y45f23mb2apgywmftrjmfg35oynzfwjed7rxs2mh76pbdeh4fatq
-plazsekta.i2p,ha25hr5qvs5eclqt4bq4fl4w7dc3p3d7cfbstkglcv4tf645lfxa
plugins.i2p,wwgtflbaa7od2fxbw4u7q7uugmdclxf56alddvizugwcz5edjgia
-plutonia.i2p,iisguuyvimvuwbrtehk2ufxxabimaz4ckx3jasbrnrb62ivuy63a
-pmail.i2p,4vuq2eku25cehr6yk5ly7ed2j2atliwhpzwnibxk7lpguunzk4ya
-podcast.i2p,yxxlvtvuiopr4u2rnk5hydkol6tf2kzv7izp34jz7q4orewzqsoa
-poladoircserverhttp.i2p,ir5qee4pzze3x7ztf5xs6dvhfkoawzkcmq4v6wicrvev747lcspa
polecat.i2p,het5jrdn35nhkanxmom5mjyggyvmn2wdj2agyqlrv4mhzhtmavwq
politguy.i2p,6dkkh3wnlwlr6k7wnlp4dbtf7pebjrph5afra2vqgfjnbihdglkq
pomoyka.i2p,omt56v4jxa4hurbwk44vqbbcwn3eavuynyc24c25cy7grucjh24q
pool.gostcoin.i2p,m4f4k3eeaj7otbc254ccj7d5hivguqgnohwelkibr4ddk43qhywa
-pools.plazsekta.i2p,ima2b6s3yjyvkab5qycexgsnkkvrhg57awjln4ctz6a5au4thqcq
pop.mail.i2p,bup6pmac7adgzkb5r6eknk2juczkxigolkwqkbmenawkes5s5qfq
pop.postman.i2p,ipkiowj7x4yjj7jc35yay3c6gauynkkl64gzzyxra3wmyhtfxlya
-ppif.i2p,gl4xn7yfnboymeiv6dwpc6y6gafaz3k56ee3cryf4zl6buvrhcua
+popeye.i2p,pbvpqyrtxe65flkry32fhms4ztq5y5yh4i6mecze53ykqk36wzua
pravtor.i2p,2sr27o5x2v2pyqro7wl5nl6krrsbizwrzsky5y7pkohwh24gn6xq
-preppers.i2p,nv3zav3qgmpc5bpdp6zdtlkgcxtb4h6w2ftg2ocg27btnoy2tuiq
+prepperse.i2p,tjyy6zebjp5ckkkriqcwv5vlrgyhs3wohzngzqmh6brrqo7ewiuq
pris.i2p,ahiwycgzuutdxvfqu3wseqffdnhy675nes57s4it2uysy5pxmz6a
-privacyhawk.i2p,qnfdfjfrcycygz5p7drylkv6pde7b5ehxemefjt63blqtal4cpaa
-privacysolutions.i2p,4m626tvfr4skzunz7tri6oti3alinbxnoglnvqeqmf4mwvdzyaeq
-privacytools.i2p,wfewiqkdt5bvowfp3igmkaksjvcvwj7bag2smqpqyu5x4hges2qa
-privatebin.i2p,anyvefii6vwgyrftdgzcqgeonjzeeje37ypt5ipf4tym5edyvdha
-progrider.i2p,t6aaazt7qrlw5z2ehlyddwxooc2jutmd5frxy2nq3v43dkuunnnq
+priv.i2p,h4asmxnsw2xz2ve43qt22mhoua7icerhx66ujog5msk6cretnaoq
project-future.i2p,ivqynpfwxzl746gxf376lxqvgktql2lqshzwnwjk2twut6xq7xta
+projectencrypt.i2p,lduaunhyg2ohkqth7srhwitnosnaq2dajfafgkhtvz7esluh7mha
+projectencrypt2.i2p,fiiwjpya6gewxnzw3n2s4uc3smfe5cty4ujyaf5p65kwjmkoggwa
projectmayhem2012-086.i2p,ehkjj4ptsagxlo27wpv4a5dk4zxqf4kg4p6fh35xrlz4y6mhe4eq
protokol.i2p,f4xre35ehc5l6ianjvt3zcktxkjlyp2iwdje65qnu2j6vurhy6nq
-pseudopolis.i2p,ungmgjs2w6dmugyc73k2tppwebp5xxeiw37xbbxmmxuyxz7nuwsa
psi.i2p,avviiexdngd32ccoy4kuckvc3mkf53ycvzbz6vz75vzhv4tbpk5a
-psp.i2p,2nfqfabeahfl3eeqxuum2sapzfedu4kkyydivlqjmp5ipvvqvmzq
+psy.i2p,s3elzoj3wo6v6wqu5ehd56vevpz2vrhhjc5m6mxoazicrl43y62q
pt.hiddenanswers.i2p,o5jlxbbnx3byzgmihqye3kysop5jgl3unsrkmurbtr2nrnl2y74a
ptm.i2p,7dna5745ynxgogpjermnq26hwrqyjdlsibpjfmjxlwig247bjisa
ptt.i2p,q7r32j7lc3xgrcw2ym33wv4lfgqbez7vtm4lts7n34qfe3iygeha
publicwww.i2p,oitoja234mwfbeuhtuibnxn6hd5v4nbtf7oxfgdhk5igrg6wkiqq
pull.git.repo.i2p,3so7htzxzz6h46qvjm3fbd735zl3lrblerlj2xxybhobublcv67q
push.git.repo.i2p,jef4g5vxnqybm4zpouum3lzbl6ti6456q57nbyj5kfyldkempm3a
-py-i2phosts.i2p,3tex4wm37lbtnbjolege3yiopmfi3ahj65vu6kmnjhwzgrcyf5ga
pycache.awup.i2p,w45lkxdnqhil4sgzanmxce62sv3q4szeowcjb2e72a5y5vbhm4ra
-r.i2p,pqajparec44p74uvpxvxhpd5u3neuqs2t4awwd6bcieku3juhwwa
-r0b3rd.i2p,bxnj37oz3lsuraivx7axas5e436aqxgir3u4mxfbsb6njvtl63ma
r4sas.i2p,2gafixvoztrndawkmhfxamci5lgd3urwnilxqmlo6ittu552cndq
radio.r4sas.i2p,cv72xsje5ihg6e24atitmhyk2cbml6eggi6b6fjfh2vgw62gdpla
ragnarok.i2p,jpzw6kbuzz3ll2mfi3emcaan4gidyt7ysdhu62r5k5xawrva7kca
-ratcat.i2p,lmur6cgjp2txuaor4zso2w6tvg54btb7iup552yp6qvnrlvw3rzq
-rblcom.i2p,dysjyfzd3pd7i6lp54mt6hv33xpdvcblvr7nnzy7bfc3lyo4vaiq
+ramsay.i2p,svezv4xrp4l57ankyhu6qisd5jnk423n7oa5as3zd2554aaz6lkq
+rasputin-sucks.i2p,fdozdbyak4rul4jwpqfisbkcx4xbrkuvf2o5r6fd3xryyrjgvjiq
rebel.i2p,nch2arl45crkyk6bklyk2hrdwjf5nztyxdtoshy6llhwqgxho5jq
-redpanda.i2p,3wcnp6afz4cikqzdu2ktb5wfz7hb3ejdbpn7ocpy7fmeqyzbaiea
+red.i2p,fzbdltgsg7jrpz7gmjfvhpcdnw5yrglwspnxqp4zoym3bglntzfa
redzara.i2p,ty7bt62rw5ryvk44dd3v5sua6c7wnbpxxqb6v4dohajmwmezi7va
reefer.i2p,4cde25mrrnt5n4nvp5tl62gej33nekfvq2viubmx4xdakhm5pfaa
-reg.r4sas.i2p,shx5vqsw7usdaunyzr2qmes2fq37oumybpudrd4jjj4e4vk4uusa
reg.rus.i2p,k2r2wda4eavt4hoq5hptprqfmixusirq3gi5bl3z2pqzcd6felwa
relatelist.i2p,utrer5zgnou72hs4eztmk37pmzdtfw3d6s23wwl7nk3lkqpzbdiq
-rep.i2pdproject.i2p,rexmpwqbkjzietrp6aabxdih6ek2imqhrn6hu3crym3mqce2v5zq
repo.i2p,uxe3lqueuuyklel23sf5h25zwgqgjwsofrqchhnptd5y6pedzbxa
repo.r4sas.i2p,ymzx5zgt6qzdg6nhxnecdgbqjd34ery6mpqolnbyo5kcwxadnodq
reseed.i2p,j7xszhsjy7orrnbdys7yykrssv5imkn4eid7n5ikcnxuhpaaw6cq
+retrobbs-nntp.i2p,fkyzl24oxcxvjzkx74t3533x7qjketzmvzk6bwn3d6hj5t7hlw6q
retrobbs.i2p,mnn77stihntxdoade3ca2vcf456w6vhhvdsfepdvq5qggikvprxq
retrobbs2.i2p,ejff7jtyaus37slkwgeqrrcmyhpj26carp7n27f5h6s5vlbeiy6q
revo-ua.i2p,hpojpumki22xjwhmhe6zkiy44oanyn7u4ctcfe3in2ibwm5l32hq
@@ -838,143 +552,108 @@ romster.i2p,eaf2stdqdbepylt53egvixdi34g2usvgi7a4oixsja6atkran43a
rootd.i2p,mzbe5wofwn7eaqq4yefrmxizqaxoslwqxrv5qcv2opx5lnhg64dq
rospravosudie.i2p,z55khrnlj6bzhs5zielutm6ae6t2bbhfuiujwlrp3teubqyc4w7q
rotten.i2p,j4bm3rvezlejnb44elniagi5v2gazh7jaqrzhbod2pbxmgeb2frq
+rpi.i2p,56p5qxsrvo5ereibevetw2qbj5bronmos7wxunku27g2s4kpbnlq
+rs-freenet.i2p,jhpvnnhfrozore2wlhi5m5bzggz5jcz5uwhou4w62ylkewtoxqba
+rs-tor.i2p,zv2etzurnqjuuajmeb5gg3sjhfdcotxvlae6igxbfyahkjhhsx4a
+rslight.i2p,bitag46q3465nylvzuikfwjcj7ewi4gjkjtvuxhn73f6vsxffyiq
rsync.thetower.i2p,w4brpcdod7wnfqhwqrxyt4sbf2acouqfk5wyosfpq4mxq4s35kqa
ru.hiddenanswers.i2p,o6rmndvggfwnuvxwyq54y667fmmurgveerlzufyrhub6w3vkagva
ru.i2p,m7fqktjgtmsb3x7bvfrdx4tf7htnhytnz5qi2ujjcnph33u3hnja
-ruanonirc.i2p,epownolfv227hhzogufiieiofi53za3qctgim7xobsevvntuxiqq
rufurus.i2p,7msryymfdta3ssyz34qur6gi4jyfkvca5iyfmnceviipwu7g2wca
rus.i2p,gh6655arkncnbrzq5tmq4xpn36734d4tdza6flbw5xppye2dt6ga
ruslibgen.i2p,kk566cv37hivbjafiij5ryoui2ebxnm7b25gb3troniixopaj6nq
+rust.i2p,xbl2dh2qugfgoobebkvkjje3ovp5owhqdlu3l4briiqnhyuihjwa
rutor.i2p,tro5tvvtd2qg34naxhvqp4236it36jjaipbda5vnjmggp55navdq
rutracker.i2p,ujyqbawolalwvdpy33v2wjuaspnu4ym3fsl3fd6mldjblzzqlvlq
s.i2p,bnpc454fvuzqk22ywguqb4m4vkhrcfj3pydrbfw4esqklymd7t3a
-s01.0chan.i2p,v2ymvk4suxl2zghx6bhjn3yz32echagnxqwrkklul4iynmoqydrq
-s02.0chan.i2p,znn2mmwnypu4hrwo75nzoibe5dzj6napwcmzzic5yqty7wnqfyya
-s03.0chan.i2p,af2penimq2z3xprlnhpzkssc45bplfg73osqjcfezobgnwqcqfcq
-s04.0chan.i2p,kpxqwmwciyz4q7dfsawmgdotwrv525cmc3n5cet3je4ngtact37q
-s4src.i2p,of647qmuhpfo42hlisedifu5jydihyd22hshtynsjf63p736nrwa
-safegram.i2p,a22lv2ls2qg3ilx7znjy5ojwpiobttvvmbtkh7xn7iqh35a3kadq
salt.i2p,6aflphlze6btsbez5cm4x53ydrmwhqrkxsud535d3qjh4wq62rxq
-sam.i2p,w2nzdyx7ppkjg7alcehqymsxbg2rlwgqvhdcw6rpuwcfhhpntfqq
sasquotch.i2p,p6535uyfk2y6etc3t47vd3oqxydznqior5jxcvq5bdxe5kw5th6q
-schematics.i2p,tv7tcsa2gdzw4zj2yepmvsv22usouaqdgilerd54gbbooyucn6kq
schwarzwald.i2p,4gokilzy73mmudufy3pohgatm42fcstx7uzg5hjvnfyphxpnphuq
sciencebooks.i2p,ypftjpgck75swz3bnsu4nw7rmrlr2vqsn4mwivwt3zcc3rxln5cq
scp.duck.i2p,ghbpsolpnveizxu4wbs7jbs2vj3kntnsexfcdleyhpqdhfpxleda
-scussuni.i2p,f6mb7qcd72i3e4hec57nvysifeza5lmklhokpkrf554avv7johvq
search.i2p,nz4qj6xaw5fda3rsmsax6yjthqy4c7uak2j3dzcehtkgyso4q46q
searx.i2p,lcjxhuo5lbrol3e5ijj3ga4gdhhelzdyslc7bm4blw6jy6cx4p5a
-secondrealm.i2p,ykkgrp4u6kmcqiyefiahcbcc5bxkutwketp4n4dmgkgawwitcolq
+secretchat.i2p,cl3j2zxhpw6u6jevny45i557ojhwfxn4g375nnuqhy6lp27mry2q
secure.thetinhat.i2p,4q3qyzgz3ub5npbmt3vqqege5lg4zy62rhbgage4lpvnujwfpala
-securedebian.i2p,qewoxexwtvub5xdwpzqaj6mofflymidpojzppmqcyiqoi5mwblla
seeker.i2p,ipll7sit24oyhnwawpvokz5u7dabq6klveuqpx3sbi6o5qemy2bq
-senorcontento.i2p,g7f7vufsaam3yoehrb5s5lyq5g57zk5nxayqqczhxjxi7jfxlqna
-sentralintellijenzeigency.i2p,kqq6r6z7twhz5nmqpy3hdqo5iifzaz2urker3zscs7m5mt77llta
+sendyourdreamswherenobodyhides.i2p,jvdg3yqjqthtcfjitzqdp2cc3zjloit46xafprevl3bhpeqxf5pq
seomon.i2p,5mvpsy4h45w4fx7upen7ay3vkrs5klphz5nptmtcqvc3fsajsm4q
septu.i2p,5lqvih7yzbqacfi63hwnmih57dxopu5g2o5o4e2aorq7bt4ooyra
serien.i2p,3z5k3anbbk32thinvwcy4g5al7dmb75fagcm3zgh4rzrt3maphda
ses.i2p,5qfoz6qfgbo7z5sdi26naxstpi2xiltamkcdbhmj6y6q2bo4inja
-sfor.i2p,75kjzjxnxiwcqlygfv33ev7b5dlriaagtau2enrikxcde5yit23a
-sglg.i2p,5sybuxmdtmzseu5svpitrm3pvxcfjdz7lzwyajih7sd65yjbt7qq
-shades.i2p,ydgygpmvypw2liyqvldnv7v36etddvpr6ndwiheoc6n6ybhqt4fa
-shadowlife.i2p,jme44x4m5k3ikzwk3sopi6huyp5qsqzr27plno2ds65cl4nv2b4a
shiftfox.i2p,wpvnuzslu7hjy4gujvnphtyckchdoxccrlhbyomsmjizykczyseq
shoieq3.i2p,3fjk4nfk3mccch4hdreghnyijcvovsi3yucjz3qzj5sxngqk5j6q
shoronil.i2p,7shqzgmb6tabiwrnwlasruq7pswy2d3emvfhaitehkqgod7i62sa
-sigterm.i2p,5tuw3uj6x4p5xousgqg53ygbsi5ixozxnnkgzzwdqlhtoe2fbzqa
silc2p.i2p,wt4mvbvnpqniywcpkrrjubvcwyskskujxjkhk24xmhrojdeisoja
-silentbob.i2p,yskw76bdsncszta3cp7cs4kcj3fub5h5i6zshvukoxnwjxoqln3q
+silence.i2p,v4oc37covf4tze2wjhtgn3xkpgg4cx6oam44xvnpw2snhtvpslyq
sion.i2p,lcbmmw2tvplvqh2dq5lmpxl3vnd5o4j3bdul5moa23deakjrso5q
sirup.i2p,aohdp4yajnkitrtw7v2mo3sp7swuqhjfwlsi5xwd7dudzftumsma
site.games.i2p,zeuczucfxeev3k7tvqlfcdpfbnqggheiknyyb5r2q4utn3d2auja
skank.i2p,qiii4iqrj3fwv4ucaji2oykcvsob75jviycv3ghw7dhzxg2kq53q
-sky-rc.i2p,hzd4piu7ds7rggelc3qiuy5hhe2guzdw7orjcwykehx33kyyjjja
-skypippo.i2p,puuscuxwvt7b4fsfth56mcxx2ghqudqaakycy2l6yetp2iccclbq
slack.i2p,gfcsh2yrb2tx7hyvmobriv52skz7qoobn7n7y7n6xaehhh4rpbja
slacker.i2p,wq7m2wdguzweleb666ygv3bmfhha63zj74rub76vfesbyhsyk6iq
-sleepwalker.i2p,d6x3d3yyck5etn4qao6kcucbqnlshyrrgfinhleruhmoho7rkztq
-slump.i2p,pzo24fb6lfum67ovmyjd32ohthy7h35tk2puneqeilndtyr44mfa
smeghead.i2p,ojf4czveeuekxqkjvkszvv7eiop5dg7x2p6rgfzl4ng4xrjk6lja
-smlr-torrent.i2p,clwvfegt2avmf3uyxkojtbdalbsf3gahpf6rjxjn5l7l7aciyuhq
-smlr-tracker.i2p,nhha4d47uddnb7lvsjxk4dxd7jcqenuixh3c3rk4t7gwfqyxxlsq
smtp.mail.i2p,kdn7zx7fgoe4bn5abaaj5cb3e4ql22fklb5veui5yajpj4cxapya
smtp.postman.i2p,jj7pt6chsziz6oxxnzpqj7mzhxm2xfhcrbh7dl3tegifb577vx5q
-snowflake.i2p,tjo44eqilj6ygjl7etqzvx7gopkrw4jvcea55qlrkotpq7pzmvsa
-society.i2p,d6atkbmzbvh3tqflgieqe6pa2sma5x24q2nsz6mzdl3x5qhzreea
+snscib.i2p,x2jvcrskymvnfxnrtpji5orivskmltl3ochad4cedxe4ceklc4va
socks1.tor.i2p,sifawcdexgdmoc3krv46pvvz74nzd6fkju2vzykjxsx3egqsb6wq
-somosanon.i2p,gaekqon34xidtzqyzsgirq3lkv3avclo22v6464w6hjuf4bwzkua
sonax.i2p,jmuxdhlok5ggojehesfjlit2e2q3fhzwwfxjndts7vzdshucbjjq
sponge.i2p,o5hu7phy7udffuhts6w5wn5mw3sepwe3hyvw6kthti33wa2xn5tq
squid.i2p,r4ll5zkbokgxlttqc2lrojvvey5yar4xr5prnndvnmggnqzjaeoq
squid2.i2p,hum4wlwizbsckbudcklflei66qxhpxsdkyo4l2rn256smmjleila
-sr-ocho.i2p,7my7fc6glh2mwxtdup33gni3gzwycu7avsg2paschpcj54c7n2ka
+sqz.i2p,3jvbwc7sy4lnhj25nj7yepx7omli4ulqirnawv3mz6qlhgokjgzq
ssh.i2p,xpvdadaouc4qr75pteymyozc7mcsynjfkuqqkkla542lpcsqionq
-startdash.i2p,q7ed6xshnz5y3ch634rqitshg6cmsknqwl6nbkrpwmcaq2db3wba
stasher.i2p,6ilgpudnba4kroleunc2weh5txgoxys5yucij5gla6pjyki4oewa
-static.stealth.i2p,vwzhvxtomztdzg6wkzsz7iv2snnjzcfcka2ujv3kd7qq6bkw4dnq
stats.i2p,7tbay5p4kzeekxvyvbf6v7eauazemsnnl2aoyqhg5jzpr5eke7tq
status.str4d.i2p,ycyyjo3psqbo45nuz243xvgvwnmzlanzqbzxv3kh6gyjztv7425q
-stealth.i2p,wa43xn4jws2oy34i4wazuolaiknghow7zdhvnlnw2q3qtq5tnf5a
-sto-man.i2p,rg4eilfpe24ws6nctix63qw2dlvd2tqgwdcgdxzji6l5bc4dc7aa
-stoliczek.i2p,2gj54r434fvpbzf3opbqnshrdew63qa3sswmbwvgfpqqul65do6q
str4d.i2p,wrrwzdgsppwl2g2bdohhajz3dh45ui6u3y7yuop5ivvfzxtwnipa
stream.i2p,prmbv3xm63ksoetnhbzqg4nzu2lhqdnqytgsydb7u3quxfrg7rna
striker.i2p,4gswsrfpbd44hwjoj33jbqfbwzxfkwpuplb3ydq5zm7nfu2pxvdq
+studentbookshop.i2p,d2ejfxjt3n2nsj6hlkepwjgxua5jg766znrxz65d5eixsmiwvr3q
subrosa.i2p,g3lnglrnoual7wyabnwwv37uwhadgbxiqz36pf3f5cwfuxsx4mxq
subterra.i2p,vdmhe4u26unzgd7ysq6w36ubjncms5wzbhzr2gq576sq4xut5zwq
sugadude.i2p,yzjn76iyqard64wgggfrnywkxi7tbfkw7mjhpviqz3p2dguey4yq
+suicidal.i2p,yfamynllow5xiqbbca7eh5xn733wtnuti5bi4ovc7dwycntqmiuq
+sun.i2p,33mt3psjrtauk6wzt35ke7w4bkyizesnsjlal45fbosja2j5i74q
sungo.i2p,h67s3jw56rwfyoxqxj3fngrluybsgxc2meendngkehzqowxnpj3q
-sunspotblog.i2p,mwtki4x66lgadduuvmtbrgwm3vteldo7tv647ls7aopljxwpi4va
surrender.adab.i2p,jgz7xglgfgnjfklrytyn427np2ubipztlm5bxrtbiucayglukrta
susi.i2p,qc6g2qfi2ccw7vjwpst6rwuofgzbeoewsb2usv7rubutf4gzqveq
-svs.i2p,zys6mammgvbu7h7n3gxp4dxnxs5u3u3giadgrq7vthjq5lwnkntq
syncline.i2p,5kcqmhislu3lmr7llgmdl72yu3efhyriljdc6wp774ftpwlcs5ra
syndie-project.i2p,xa63tpfoaqt3zru2ehxjjfbpadwj4ha6qsdvtcqtyr3b7hmt4iaq
syndie.echelon.i2p,vwrl2qmcif722fdkn3ldxcgz76df5cq4qypbndzthxwgmykyewta
syndie.i2p,7lm3yzpuejhpl4tt4l7o4ndqlu7hgijohofh7oaydx7q7kelenbq
-syndie.meeh.i2p,tautkpuqt3qa2u66ghprubljks4hkfvopvrjjtec5etanz5xvlba
syndiemedia.i2p,4lrbbblclodhobn3jadt5bf2yab2pxzoz4ey4a2cvrl44tdv3jma
+t3chkommie.i2p,o5avgwuwjdyefw4xddn77jxaljs5gg3adg3gnpu26s2hijnrfvca
tabak.i2p,y5o2vwb6kart7ivpnbpk4yte3i7kf2dsx7fy3i6w7htqtxhmbzia
-tahoe.fatsvin.i2p,jf2g5hus6gp2jfgk7zgc2cxtzeedxbstr3ju374amtoaq6p2ax6a
tahoeserve.i2p,yhs7tsjeznxdenmdho5gjmk755wtredfzipb5t272oi5otipfkoa
-takepage.i2p,aavaxdlgfm5cn3ztircmotdmzb4xd5fwyzmyhhpcukut7idox27a
-tandasbackend.i2p,trodg6o522t4ywcijvdoxpaeksnunvya33xbbsesd4ophhvl7lwq
+tbofh.i2p,lmj2gu6d27pgrknbxxsyapjxnlprau4ayamcam6csljzlupr2rtq
tc.i2p,qkv2yk6rof3rh7n3eelg5niujae6cmdzcpqbv3wsttedxtqqqj7a
-techno.i2p,dx444pxqxytqdltutvjdydrasvta3if4djptrojidgenxybcauaa
-tecsoc.i2p,kng3ri7scfoqdogy6pkschn5son2ls7z4kpwgnosi7zknit7lr2q
-telegraph.i2p,iai263cdubvmfedc3uxedt4tzula62nnbjaxeeyqhaahgemmm4wq
+telegram.i2p,i6jow7hymogz2s42xq62gqgej2zdm4xtnmpc6vjcwktdxpdoupja
templar.i2p,zxeralsujowfpyi2ynyjooxy222pzz4apc2qcwrfx5ikhf64et7q
-tenic.i2p,lkvzspewzfbk2mfo2mionmlxzdzuhypzkddwk7exxcub3re7njsa
-terextools.i2p,3yglb32qhjlrettzgdlxi6o4hpe7jwxpxkfmkmf6bg3cwcbmgk3a
+templeofmetal.i2p,cwtbmqx3cg7ae3jcrzgjzwcilpypnyz2biojrn4ca7ry5gukaixa
terror.i2p,wsijm6aqz4qtuyn2jedpx6imar5uq4yuhjdgtfqumxbqww47vbnq
-test.tino.i2p,fijhlcnzjnkxmmclua32nlgohd3kfxbwboltkjcdlhmcoaxcir6a
-theblackbay.i2p,kmo6ainnf2k5begl66qqq7mh3nteb3kki735mc5memnurw5pmrpa
thebland.i2p,oiviukgwapzxsrwxsoucpqa47s3wt6nfuhfjxvgbqsyrze2mwrda
thebreton.i2p,woutbsflcrlgppx4y7ag2kawlqijyenvlwrhbbvbkoaksuhf2hkq
+theclonedome.i2p,jyezrlobwwbhar2xbntf2d64yugcje6z2d3oxb5addyho72co2gq
thedarkside.i2p,fxt3z33nzkrg5kjrk7bp5vvmu7w2vsn4i6jo6cily3hsm6u664ca
-thefilehub.i2p,fsojgg55w6vvpzcuw3e7nflmhublfdlb3mspnebuvjwgrvdwcz2q
theland.i2p,26ppxbseda6xmim37ksarccdb4q5ctdagfmt2u5aba6xjh452zsa
-theslackpipe.i2p,hxw6ncycnyd7gttrsnushggmcerozrfybsqqvxe4h5casbck5fxq
-thetinhat.i2p,udvz7opxck6knhsww5ii6dgufbstxzctilwnenzhw4iaxfdeia2a
+thematrix.i2p,kgh3va66n5fqrtlhqsen2km6x7k2362hn5edk5o5q5dcr72nnajq
+therealprojectencrypt.i2p,vrdaftozwabkzy26adg77adhszpyil4xbswkogbituhkhsl7tlzq
thetower.i2p,3xqa5nype64y6fxgqjq6r5w2qpiqftoraj2niebumseat4cj654a
-thewanderer.i2p,d5mautqn2zrvq3ex3caoeihljurp7y2amf6bdicttyozra2ysrha
-theyosh.i2p,ixd2ygz4xnfwu6cajexlguit2t72wdfpevgl5bbgn5g37jkt5amq
+thisthingimade.i2p,bga2ae2ff3s5p2nskg2l37ns2ad6smczpvgjhm2olgxequogepja
thornworld.i2p,vinz4ygmodxarocntyjlfwk2wjpvzndlf4hxss2w2t3fk52oplva
+thoughtfoundryblog.i2p,beoipfwqq5ebx2ywh2rcjwi7th5diaax23mvktppl4gk2pddrf5a
tino.i2p,e4bfnhvaofu4s67ztcgiskos2mqyhskid64dvlqexxs2c2bno3iq
tinyurl.i2p,mc4oxv3v7dnyzpvok7v5qxkwtgjprgyz6w7x3tag4fipsen6rdwa
tipped8.i2p,5l2mzforxf5kok7ndc6m53nfxve75m5tozb37m6eg2xsaf6hdlmq
tome.i2p,qktkxwawgixrm5lzofnj5n24zspbnzxy4pvjm7uvaxvmgwrsuvgq
-tomsseite.i2p,pfs53432q5qwaincyjemcn6xfku6nhod6vzdukc7qoazya6rebpa
+tooman.i2p,auo7cuq4dovgniwojq5fbwyjuvmks3zv7aopu5f6onsckuihsdpa
top4ek.i2p,hm3fpmxchlvqc3p4atnu7igwbenqpn7f3czbptnnqataemputl4q
-topkek.i2p,3f3rgvhbiccckgsktvdwn5xifinpap32uwitlkvwqbpryecswwgq
tor-gw.meeh.i2p,ounrqi7cfemnt66yhnhigt2u27fkctbvct527cp2522ozy3btjza
tor-www-proxy.i2p,xov45rvjks5fe4ofmpblkj23bnwxgslbypbgvchbr7yul2ujej2q
torapa.i2p,eejqjtpko6mdd4opvntbpsuandstrebxpbymfhix7avp5obrw5ta
-torcache.i2p,fwzuwkk5pgnbhc2bl4ouqunznqifpnezj4vkfeu7kfxe3wvaania
-torcache.sam.i2p,sd7x44s4fe25eem44wi22hx55gcg3vvydmhckllvr5acdcfb3yra
-tori2p.i2p,6xonfs3xvpowy3rbhaezyhlyhct3ndm5eflspw3kwkuajphvassa
+tordox.i2p,3wv6wn3h5tr57evns5bgf2rbwivai7zhajlgt5fr3blxvp6bybbq
torrentfinder.i2p,mpc73okj7wq2xl6clofl64cn6v7vrvhpmi6d524nrsvbeuvjxalq
-torrezno.i2p,ewtlezlikyspoc5xq2hpnbq2utolvil6euz5wfe6vxjq5ofirh5q
torrfreedom.i2p,nfrjvknwcw47itotkzmk6mdlxmxfxsxhbhlr5ozhlsuavcogv4hq
trac.i2p,kyioa2lgdi2za2fwfwajnb3ljz6zwlx7yzjdpnxnch5uw3iqn6ca
trac.i2p2.i2p,i43xzkihpdq34f2jlmtgiyyay5quafg5rebog7tk7xil2c6kbyoa
@@ -982,7 +661,6 @@ tracker-fr.i2p,qfrvqrfoqkistgzo2oxpfduz4ktkhtqopleozs3emblmm36fepea
tracker.awup.i2p,dl47cno335ltvqm6noi5zcij5hpvbj7vjkzuofu262efvu6yp6cq
tracker.crypthost.i2p,ri5a27ioqd4vkik72fawbcryglkmwyy4726uu5j3eg6zqh2jswfq
tracker.fr.i2p,rzwqr7pfibq5wlcq4a7akm6ohfyhz7hchmy4wz5t55lhd7dwao5q
-tracker.h0rde.i2p,25jvwmgenm3erf5f2uaapephpqijwrpuyer2oovvl37dpjv72hja
tracker.i2p,lsjcplya2b4hhmezz2jy5gqh6zlk3nskisjkhhwapy3jjly4ds5q
tracker.lodikon.i2p,q2a7tqlyddbyhxhtuia4bmtqpohpp266wsnrkm6cgoahdqrjo3ra
tracker.mastertracker.i2p,tiwurhqvaaguwpz2shdahqmcfze5ejre52ed2rmoadnjkkilskda
@@ -992,61 +670,40 @@ tracker.thebland.i2p,s5ikrdyjwbcgxmqetxb3nyheizftms7euacuub2hic7defkh3xhq
tracker.welterde.i2p,cfmqlafjfmgkzbt4r3jsfyhgsr5abgxryl6fnz3d3y5a365di5aa
tracker2.postman.i2p,ahsplxkbhemefwvvml7qovzl5a2b5xo5i7lyai7ntdunvcyfdtna
traditio.i2p,wkpjjloylf6jopu2itgpktr45t2xvpjijxilxd5tq4i7wkqgwhhq
-transrants.i2p,kyhfice4vw3jn7k6tgbipxgdd3ifmulwcwfm5pwqu7nsuahc3c6a
-trash.i2p,tmuf4rit5kv2z64ttdb7vg6gijceo4ijmvpjlwqr74h6vczoklua
-treason.i2p,cuwirmyojwrer65et3cphhqpr6hdh3juyyar4b6mlshrfewuzs3a
trevorreznik.i2p,wc2z6o5fxm2saqzpfcawr63lejwccvzkysmgtfudkrigqopzfdma
true.i2p,pdilhl5vmefyzrrnmak5bnmxqxk2pmw7rpy4f7wbaeppqu2vvugq
-truevoiceman.i2p,ae4xaz7bv76wwkuggdbz77ejb2hjgotganyo6bkpayzqukvxsaoa
trumpusa.i2p,vopyffqj3il2uapcvfxq2zkcdybf7ekmpvnrt6d4dbeuecbvs2ea
trwcln.i2p,evml6jiiujhulsgxkdu3wcmkwbokxlv4is6w5qj46tp3ajz3hqzq
ts.i2p,nebcjgfx3f7q4wzihqmguwcdeopaf7f6wyk2dojw4bcuku472zxq
ttc.i2p,wb4tsfyvfv4idgrultsq6o7inza4fxkc7dijsfpncbx7zko4cdlq
ttp.i2p,uuczclxejmetohwf2vqewovx3qcumdfh5zecjb3xkcdmk6e5j72a
-tumbach.i2p,u6pciacxnpbsq7nwc3tgutywochfd6aysgayijr7jxzoysgxklvq
tutorials.i2p,zy37tq6ynucp3ufoyeegswqjaeofmj57cpm5ecd7nbanh2h6f2ja
ugha.i2p,z3f3owc72awbywk4p6qb5l2mxgitvs6ejztggbpn2a3ddmymfjda
uk.i2p,vydbychnep3mzkzhg43ptewp242issy47whamfbxodc4ma6wc63a
-ukraine.i2p,msk6mls32w6nh65r7ke5bjozf2r3z563ti7iwewts72jtkxhq4oq
-undefined.i2p,ui33hsq7r3vhh3l3lu43n3b7o7icf5mympp33rvsyi7mrbbwygja
+ukiyo.i2p,ytd3loo226pogdcx3ajdtew6vl5rsidppqzh6phbo5vlmigdxclq
underground.i2p,dlnuthb6tpw3kchlb7xoztyspy4ehlggjhl44l64vbcrulrfeica
underscore.i2p,3gmezyig6gvsjbpkq2kihoskpuqpkfrajmhhm7hpyrjuvtasgepa
+unqueued.i2p,3gvn4kwd7z74jxc2sn4ucx52dpvpscxbzjluux3ul4t3eu5g64xq
up.i2p,25it5olgdo7pht25z6buzd32sw7jvc65oziqeuocfozfhgua655q
update.dg.i2p,iqj6ysfh3wl26m4buvyna73yhduifv523l7bwuexxak4mgldexja
update.killyourtv.i2p,gqdfg25jlqtm35qnmt4b7r53d6u2vep4ob23fwd42iyy4j6cvdqq
update.postman.i2p,u5rbu6yohfafplp6lgbbmmcuip34s7g3zqdd63cp27dl3nbd7gtq
-uprprc.i2p,j4xh4zamxxawkgfszyhmm63uximohqqbt5vtnwbdkaqn3eauesfq
-useful.i2p,h7jovk5wflhcpvulddundjbeqrwencbd5klplfutfnvwmgeykfaa
utansans.i2p,u2oyre7ygqv4qs5xjjijfg3x7ddwtod6nqwgbomuuzljzvnq4rda
v2mail.i2p,4gg7fykcqe7oaqt4w5fmlarnia7vtmwkv3h45zzgoj6o6crryg5a
vadino.i2p,aalttzlt3z25ktokesceweabm5yyhhvml2z3rfotndgpfyh6myra
-verge.i2p,wjpt2blspvkqzp6hcpv4u73j6ni4mxhbgh26i4qdhgi4w3xzq57q
-verifiablethoughts.i2p,htam5mq6teacna7h74dtmuyp6tjuzjogkgac3mwcypbvzz2enwma
-virus.i2p,zgd4u2vci4urne2bcvkqwk6wrutamfqggaj6nby2skn6k43mzp7a
visibility.i2p,pwgma3snbsgkddxgb54mrxxkt3l4jzchrtp52vxmw7rbkjygylxq
-vivaladedsec.i2p,2djqflzynva6g4ofxohzlxullzhzwb44s6hsrwrgj7wctq5aklmq
-vivalarevolucion.i2p,p3cvte4ggxzdomm5habok2ib3joowdqlphzx3y6tixylocqr4lzq
-volatile.i2p,q6rve733tvhgyys57jfw4fymqf3xsnza6dqailcdjcq7w4fa5m3a
+vpnbest.i2p,ov5f74ndsy5rfkuyps56waf42vxncufqu5rzm3vsnxkdtogccaea
w.i2p,j2xorlcb3qxubnthzqu7lt4fvxqn63it4ikwmze55yjkzeeampuq
wa11ed.city.i2p,7mxwtmala3ycg2sybjwwfil7s6dqck2fbemeutghhwu73rznmqoa
wahoo.i2p,vqe5vkpe5wbda7lwekcd2jaj44ar3rawgv54u5rcolezbg5f5vwa
-wait.i2p,slcobyp6eorbpef4qx7vb256du5p3uxdynisl6fhlrkyqv7d57fq
-walker.i2p,mv4vrczqpiq27qzzfdepefxhfkl7p45ep5nm4wvbh4i6cb5xhr4a
wallet.gostcoin.i2p,reuvum7lgetglafn72chypesvto773oy53zumagrpigkckybrwda
wallsgetbombed.i2p,tzhea5d65fllm4263wztghgw4ijdgibsca5xsecp6lk4xlsbdeuq
-wanderer.i2p,zhzpf7bugq3rspkjw46yjqhufqrontrdudq4fas5i47zttrn6xwa
webviewer.aktie.i2p,gvofjbuvkl65f2npmyyig6wmi4ryvzdyli2pj4ufu56vtabc5pmq
-who.i2p,ttzbmkgg4m6gntu37j2h37v2dwwssz4pkeu2onaqfqkwow4yyijq
-whoopboo.i2p,7i4err7ik6r5sno33sfmanmu4x7tsbqc6a7dmg3ijel57zhoosma
wiht.i2p,yojmpj3sh76g3i6ogzgsf7eouipdgdij5o2blcpdgmu5oyjk5xca
wiki.fr.i2p,lrqa7hw52uxjb5q3pedmjs6hzos5zrod4y6a4e25hu7vcjhohvxq
wiki.ilita.i2p,r233yskmowqe4od4he4b37wydr5fqzvj3z77v5fdei2etp2kg34a
-wiki.meeh.i2p,df47gapq2gftoy25cqoldvgp5v7c4aaz5x3exee6jdulun3tim3q
wintermute.i2p,4gvlfrdy2rkmem33c342tjntpvqik65wekcvm4275qbkuwotoila
-wizwhite.i2p,odzp77icxjf3xw662h43vjhzozyk3ug6qnjjprqcehrlz5zrvpsq
-wlrs.i2p,43j5ziu3w5bhlwaay53e5fbst36kjr44uerd7p4lh2mqsvvw5cba
wspucktracker.i2p,ubd2txda3kllumx7ftg4unzgqy536cn6dd2ax6mlhodczfas7rgq
-wvf.i2p,zzr4nntctf3u7piwqvbxvusov7v2wp6kwg5yxdegh2kjb3tbd4oq
www.aum.i2p,3xolizygkzkqrldncjqsb734szznw2u36lliceuacqnbs2n65aeq
www.baffled.i2p,lqrsfslwu4xnubkk2hofhmuvvr4dia2zevxefinbzdsjurvehtqq
www.fr.i2p,rmkgvlfwo3vkb3xrr6epoypxasdzzuilv3sckcqbo6c4os5jo2ea
@@ -1056,42 +713,24 @@ www.imule.i2p,657xcllunctawyjtar5kgh3wpt6z4l7ba6mmam5rf7hev5w2lsvq
www.infoserver.i2p,fq7xhxkdcauhwn4loufcadiiy24zbei25elnup33a3gfrdzrtlyq
www.janonymous.i2p,vosqx5qw22hwrzcgsm4ib7hymf5ryovsbtaexqrzmnzshy5bhakq
www.mail.i2p,nctas6ioo7aaekfstv3o45yh6ywzwa3vznrdae52ouupzke5pyba
-www.mud.i2p,rsp476ktqgewy6fadpotcxr7jf6shlu4zkbf5f2hvtvt3ye3hcxa
www.nntp.i2p,kly3o7zmetuwyz7xonnhttw4lj2244pkbibjz26uflyfte3b3dka
www.postman.i2p,rb3srw2gaooyw63q62cp4udrxxa6molr2irbkgrloveylpkkblhq
www.syndie.i2p,vojgy5ep4wffmtpjmpnbpa4gq64bgn4yicuw6qmhbm6nqa2ysrva
www1.squid.i2p,vbh3bltd2duwbukafgj6f6vfi6aigwso7snucp5zohnf66a2hkpa
-wwwasw.i2p,5i52aunacpixsenexdu4gk2tjc5fa7eurxedvx2osekwsxyt5hwq
-xakaton.i2p,ehue6yjbhiei7ihwas4aqyxeqcvj2ykgkv5wda7kia533dpgyv6a
-xecut.i2p,y5mbioxpa5gocffimnhjudv7lq5rggh4njkvovur7mrcmfcxxloq
+xc.i2p,mt45a2z3sb2iyy2mwauj4rwa2lwu4peanfy6gx6ybidwnbasusyq
xeha.i2p,oartgetziabrdemxctowp7bbeggc7ktmj7tr4qgk5y5jcz4prbtq
-xico.i2p,x7nppmjae37nh3n6l5btnrg3e655thnidbse2ts3tgarpuktyzwq
xilog.i2p,eoc5i5q52hutnmsmq56edvooulutaxfikddgdz27otmgtsxmiloq
-xl33tvill3.i2p,5u74czg4t3x7l6ttvn7cmuhpo3xlq4k2mlssedx5lxdehadoiriq
-xmpp.hashshop.i2p,kidikkdex4yesfmh6cymtoycgxukftqu5kbtsi67lw3nqocndpra
-xmpp.helpu.i2p,j6utejalk3mglymq3zaurbuxgpmiuoupr6px3lszy4mbreio7tfq
-xmpp.shades.i2p,csvynxul3xgddeoknc3ndqfkdymnmx6zwv2vqwwbgczu7l5ij62a
-xmpp.undefined.i2p,i7ihpnio5keiakl6i55ub26lxnpdo6yoguzikbamwhuoewi7e4dq
-xmppfree.i2p,axzxqfmir6ixkx6np5zh3uuzoca27beonuaxhxhwdl2xt7ufjzaa
-xmr.i2p,uxiiiqlehaojb2kcghjzzladdeg6wohubbz4pvhptkptjl6epjza
+xmpp.crypthost.i2p,ittkqpjuliwsdewdugkhvgzstejr2jp5tzou7p332lxx4xw7srba
+xmpp.rpi.i2p,3yv65pfwiwfuv4ciwtx34clqps6o2mc3vtyltcbqdkcki6untbca
+xn--l2bl5aw.i2p,d2epikjh5crt2l5xjmtceqw2ho44hzp6x3u7hgjrd4mi4wywikwa
xolotl.i2p,rwr6rrlmrotxfkxt22mah42cycliy2g5k7hgxyxkpcyyxkd2bgwq
xotc.i2p,gqgvzum3xdgtaahkjfw3layb33vjrucmw5btyhrppm463cz3c5oq
-xpx.i2p,oeesnqdgzp33rb4j5t3r2cik6yh4v4nantv2mfrh4cjk6zbxe6yq
xpyxpy.i2p,vwzdbqs7p4z5i6zob4gqrl7kejnkaxfo7haabowdq6tjqwltatuq
-yankie.i2p,2xezu6yhbzo46fd574lm7eeqwmja4vygu2pehft5ldiznbrk74wa
-yfambt.i2p,fh5w6sui6soh3upen75dkhs4ktgs4tat4yedhfrqm7gw244s25ja
-yfcbl.i2p,gq2k6uklykeoxhfkz7opvhe3zahu6jho42kvyhnpcywqzbzaecma
-yfus.i2p,ihpvzf4llwqmc2wfdsu2dxtxwvlhiqcu7vxhcvfujyq65fxjyv5a
-yo7vdz5evrktdl7a.i2p,xahfwygq6ozmhdxjsxqhv5vrh6o7lgw6dglklg6mnozc2dwivh2q
-yobyrf.i2p,suomfhdrqoedznx3dsc2vxve34bqm6j4broc4e5prgeysx4vu43q
yottabyte.i2p,zsdqh2ozauksuyeiaqypgcxus5ldmxgxxgz4yp76pglrjxzzu2ra
-zankyou.i2p,hfzprhla6lcy5xajwk4rr6v7yo6ykcuw2v2zfvdri7o7egie3ckq
-zazil.i2p,izvmzwxuy3geaq6dekhlvu3bo4aasavj24ekfnaqlhjsdwi7rvpa
+zab.i2p,n4xen5sohufgjhv327ex4qra77f4tpqohlcyoa3atoboknzqazeq
zcash.i2p,zcashmliuw3yd2ptfyd5sadatcpyxj4ldiqahtjzg73cgoevxp4q
-zerlina.i2p,lf4bjjww2gnon3qdk327yu55tgxu5c3wgi7q42irhq7pajhfnkaq
zerobin.i2p,3564erslxzaoucqasxsjerk4jz2xril7j2cbzd4p7flpb4ut67hq
-zerolag.i2p,d5om6pvuzfb7czbkxrd7gv22ejw5fzoa4wcwxzrpehg464w4p7fq
+zeroman.i2p,gq77fmto535koofcd53f6yzcc5y57ccrxg3pb6twhcodc7v5dutq
zeronet.i2p,fe6pk5sibhkr64veqxkfochdfptehyxrrbs3edwjs5ckjbjn4bna
znc.str4d.i2p,ufkajv3stxpxlwgwwb2ae6oixdjircnbwog77qxpxv7nt67rpcxq
-zootopia.i2p,evlpg2m7n3nnqtu3jjy52zxhglj52teqgl4cgei7egccxjg3shva
zzz.i2p,ukeu3k5oycgaauneqgtnvselmt4yemvoilkln7jpvamvfx7dnkdq
diff --git a/windows/build/i2pd/certificates/reseed/hottuna_at_mail.i2p.crt b/windows/build/i2pd/certificates/reseed/hottuna_at_mail.i2p.crt
new file mode 100644
index 0000000..d0ff7c3
--- /dev/null
+++ b/windows/build/i2pd/certificates/reseed/hottuna_at_mail.i2p.crt
@@ -0,0 +1,33 @@
+-----BEGIN CERTIFICATE-----
+MIIFxzCCA6+gAwIBAgIQZfqn0yiJL3dGgCjeOeWS6DANBgkqhkiG9w0BAQsFADBw
+MQswCQYDVQQGEwJYWDELMAkGA1UEBxMCWFgxCzAJBgNVBAkTAlhYMR4wHAYDVQQK
+ExVJMlAgQW5vbnltb3VzIE5ldHdvcmsxDDAKBgNVBAsTA0kyUDEZMBcGA1UEAwwQ
+aG90dHVuYUBtYWlsLmkycDAeFw0xNjExMDkwMzE1MzJaFw0yNjExMDkwMzE1MzJa
+MHAxCzAJBgNVBAYTAlhYMQswCQYDVQQHEwJYWDELMAkGA1UECRMCWFgxHjAcBgNV
+BAoTFUkyUCBBbm9ueW1vdXMgTmV0d29yazEMMAoGA1UECxMDSTJQMRkwFwYDVQQD
+DBBob3R0dW5hQG1haWwuaTJwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC
+AgEA21Bfgcc9VVH4l2u1YvYlTw2OPUyQb16X2IOW0PzdsUO5W78Loueu974BkiKi
+84lQZanLr0OwEopdfutGc6gegSLmwaWx5YCG5uwpLOPkDiObfX+nptH6As/B1cn+
+mzejYdVKRnWd7EtHW0iseSsILBK1YbGw4AGpXJ8k18DJSzUt2+spOkpBW6XqectN
+8y2JDSTns8yiNxietVeRN/clolDXT9ZwWHkd+QMHTKhgl3Uz1knOffU0L9l4ij4E
+oFgPfQo8NL63kLM24hF1hM/At7XvE4iOlObFwPXE+H5EGZpT5+A7Oezepvd/VMzM
+tCJ49hM0OlR393tKFONye5GCYeSDJGdPEB6+rBptpRrlch63tG9ktpCRrg2wQWgC
+e3aOE1xVRrmwiTZ+jpfsOCbZrrSA/C4Bmp6AfGchyHuDGGkRU/FJwa1YLJe0dkWG
+ITLWeh4zeVuAS5mctdv9NQ5wflSGz9S8HjsPBS5+CDOFHh4cexXRG3ITfk6aLhuY
+KTMlkIO4SHKmnwAvy1sFlsqj6PbfVjpHPLg625fdNxBpe57TLxtIdBB3C7ccQSRW
++UG6Cmbcmh80PbsSR132NLMlzLhbaOjxeCWWJRo6cLuHBptAFMNwqsXt8xVf9M0N
+NdJoKUmblyvjnq0N8aMEqtQ1uGMTaCB39cutHQq+reD/uzsCAwEAAaNdMFswDgYD
+VR0PAQH/BAQDAgKEMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNV
+HRMBAf8EBTADAQH/MBkGA1UdDgQSBBBob3R0dW5hQG1haWwuaTJwMA0GCSqGSIb3
+DQEBCwUAA4ICAQCibFV8t4pajP176u3jx31x1kgqX6Nd+0YFARPZQjq99kUyoZer
+GyHGsMWgM281RxiZkveHxR7Hm7pEd1nkhG3rm+d7GdJ2p2hujr9xUvl0zEqAAqtm
+lkYI6uJ13WBjFc9/QuRIdeIeSUN+eazSXNg2nJhoV4pF9n2Q2xDc9dH4GWO93cMX
+JPKVGujT3s0b7LWsEguZBPdaPW7wwZd902Cg/M5fE1hZQ8/SIAGUtylb/ZilVeTS
+spxWP1gX3NT1SSvv0s6oL7eADCgtggWaMxEjZhi6WMnPUeeFY8X+6trkTlnF9+r/
+HiVvvzQKrPPtB3j1xfQCAF6gUKN4iY+2AOExv4rl/l+JJbPhpd/FuvD8AVkLMZ8X
+uPe0Ew2xv30cc8JjGDzQvoSpBmVTra4f+xqH+w8UEmxnx97Ye2aUCtnPykACnFte
+oT97K5052B1zq+4fu4xaHZnEzPYVK5POzOufNLPgciJsWrR5GDWtHd+ht/ZD37+b
++j1BXpeBWUBQgluFv+lNMVNPJxc2OMELR1EtEwXD7mTuuUEtF5Pi63IerQ5LzD3G
+KBvXhMB0XhpE6WG6pBwAvkGf5zVv/CxClJH4BQbdZwj9HYddfEQlPl0z/XFR2M0+
+9/8nBfGSPYIt6KeHBCeyQWTdE9gqSzMwTMFsennXmaT8gyc7eKqKF6adqw==
+-----END CERTIFICATE-----
diff --git a/windows/build/i2pd/i2pd.conf b/windows/build/i2pd/i2pd.conf
index 5a46a78..dcdca1a 100644
--- a/windows/build/i2pd/i2pd.conf
+++ b/windows/build/i2pd/i2pd.conf
@@ -21,7 +21,7 @@ name = I2Pd
verify = true
[addressbook]
-subscriptions = http://inr.i2p/export/alive-hosts.txt
+subscriptions = http://inr.i2p/export/alive-hosts.txt,http://identiguy.i2p/hosts.txt,http://stats.i2p/cgi-bin/newhosts.txt,http://i2p-projekt.i2p/hosts.txt
[http]
enabled = true
@@ -42,3 +42,8 @@ port = 4447
enabled = true
address = 127.0.0.1
port = 7656
+
+[ntcp]
+enabled = true
+#publish = false
+#port =
diff --git a/windows/build/preferences/browser/defaults/profile/bookmarks.html b/windows/build/preferences/browser/defaults/profile/bookmarks.html
new file mode 100644
index 0000000..e69de29
diff --git a/windows/build/preferences/browser/override.ini b/windows/build/preferences/browser/override.ini
new file mode 100644
index 0000000..00d051e
--- /dev/null
+++ b/windows/build/preferences/browser/override.ini
@@ -0,0 +1,2 @@
+[XRE]
+EnableProfileMigrator=0
diff --git a/windows/build/preferences/cck2/chrome.manifest b/windows/build/preferences/cck2/chrome.manifest
new file mode 100644
index 0000000..b1b9a9b
--- /dev/null
+++ b/windows/build/preferences/cck2/chrome.manifest
@@ -0,0 +1 @@
+resource cck2 modules/
diff --git a/windows/build/preferences/cck2/modules/CAPSCheckLoadURIFramescript.js b/windows/build/preferences/cck2/modules/CAPSCheckLoadURIFramescript.js
new file mode 100644
index 0000000..806fb3c
--- /dev/null
+++ b/windows/build/preferences/cck2/modules/CAPSCheckLoadURIFramescript.js
@@ -0,0 +1,154 @@
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+const EXPORTED_SYMBOLS = [];
+
+var gForceExternalHandler = false;
+
+XPCOMUtils.defineLazyServiceGetter(this, "extProtocolSvc",
+ "@mozilla.org/uriloader/external-protocol-service;1", "nsIExternalProtocolService");
+
+var documentObserver = {
+ observe: function observe(subject, topic, data) {
+ if (subject instanceof Ci.nsIDOMWindow && topic == 'content-document-global-created') {
+ var doc = subject.document;
+ doc.addEventListener("DOMContentLoaded", function onLoad(event) {
+ event.target.removeEventListener("DOMContentLoaded", onLoad, false);
+ // If the parent document is a local file, don't do anything
+ // Links will just work
+ if (doc.location.href.indexOf("file://") == 0) {
+ return;
+ }
+ var links = event.target.getElementsByTagName("a");
+ for (var i=0; i < links.length; i++) {
+ var link = links[i];
+ if (link.href.indexOf("file://") != 0) {
+ continue;
+ }
+ link.addEventListener("click", function(link) {
+ return function(event) {
+ event.preventDefault();
+ if (gForceExternalHandler) {
+ extProtocolSvc.loadUrl(Services.io.newURI(link.href, null, null));
+ } else {
+ var target = "_self";
+ if (link.hasAttribute("target")) {
+ target = link.getAttribute("target");
+ }
+ // If we were told somewhere other than current (based on modifier keys), use it
+ var where = whereToOpenLink(event);
+ if (where != "current" || target == "_blank") {
+ sendAsyncMessage("cck2:open-url", {
+ "url": link.href,
+ "where": (target == "_blank") ? "tab" : where
+ });
+ return;
+ }
+ switch (target) {
+ case "_self":
+ link.ownerDocument.location = link.href;
+ break;
+ case "_parent":
+ link.ownerDocument.defaultView.parent.document.location = link.href;
+ break;
+ case "_top":
+ link.ownerDocument.defaultView.top.document.location = link.href;
+ break;
+ default:
+ // Attempt to find the iframe that this goes into
+ var iframes = doc.defaultView.parent.document.getElementsByName(target);
+ if (iframes.length > 0) {
+ iframes[0].contentDocument.location = link.href;
+ } else {
+ link.ownerDocument.location = link.href;
+ }
+ break;
+ }
+ }
+ }
+ }(link), false);
+ }
+ }, false);
+ }
+ }
+}
+
+// Don't do this check before Firefox 29
+if (Services.vc.compare(Services.appinfo.version, "29") > 0) {
+ try {
+ if (Services.prefs.getCharPref("capability.policy.default.checkloaduri.enabled") == "allAccess") {
+ gForceExternalHandler = !extProtocolSvc.isExposedProtocol('file');
+ Services.obs.addObserver(documentObserver, "content-document-global-created", false);
+ addEventListener("unload", function() {
+ Services.obs.removeObserver(documentObserver, "content-document-global-created", false);
+ })
+ }
+ } catch (e) {}
+}
+
+
+/* Copied from http://mxr.mozilla.org/mozilla-central/source/browser/base/content/utilityOverlay.js?raw=1 */
+
+function getBoolPref(prefname, def)
+{
+ try {
+ return Services.prefs.getBoolPref(prefname);
+ }
+ catch(er) {
+ return def;
+ }
+}
+
+/* whereToOpenLink() looks at an event to decide where to open a link.
+ *
+ * The event may be a mouse event (click, double-click, middle-click) or keypress event (enter).
+ *
+ * On Windows, the modifiers are:
+ * Ctrl new tab, selected
+ * Shift new window
+ * Ctrl+Shift new tab, in background
+ * Alt save
+ *
+ * Middle-clicking is the same as Ctrl+clicking (it opens a new tab).
+ *
+ * Exceptions:
+ * - Alt is ignored for menu items selected using the keyboard so you don't accidentally save stuff.
+ * (Currently, the Alt isn't sent here at all for menu items, but that will change in bug 126189.)
+ * - Alt is hard to use in context menus, because pressing Alt closes the menu.
+ * - Alt can't be used on the bookmarks toolbar because Alt is used for "treat this as something draggable".
+ * - The button is ignored for the middle-click-paste-URL feature, since it's always a middle-click.
+ */
+function whereToOpenLink( e, ignoreButton, ignoreAlt )
+{
+ Components.utils.import("resource://gre/modules/AppConstants.jsm");
+
+ // This method must treat a null event like a left click without modifier keys (i.e.
+ // e = { shiftKey:false, ctrlKey:false, metaKey:false, altKey:false, button:0 })
+ // for compatibility purposes.
+ if (!e)
+ return "current";
+
+ var shift = e.shiftKey;
+ var ctrl = e.ctrlKey;
+ var meta = e.metaKey;
+ var alt = e.altKey && !ignoreAlt;
+
+ // ignoreButton allows "middle-click paste" to use function without always opening in a new window.
+ var middle = !ignoreButton && e.button == 1;
+ var middleUsesTabs = true;
+
+ // Don't do anything special with right-mouse clicks. They're probably clicks on context menu items.
+
+ var metaKey = AppConstants.platform == "macosx" ? meta : ctrl;
+ if (metaKey || (middle && middleUsesTabs))
+ return shift ? "tabshifted" : "tab";
+
+ if (alt && getBoolPref("browser.altClickSave", false))
+ return "save";
+
+ if (shift || (middle && !middleUsesTabs))
+ return "window";
+
+ return "current";
+}
diff --git a/windows/build/preferences/cck2/modules/CAPSClipboardFramescript.js b/windows/build/preferences/cck2/modules/CAPSClipboardFramescript.js
new file mode 100644
index 0000000..ffadb9d
--- /dev/null
+++ b/windows/build/preferences/cck2/modules/CAPSClipboardFramescript.js
@@ -0,0 +1,183 @@
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+Cu.import("resource://gre/modules/Services.jsm");
+
+const EXPORTED_SYMBOLS = [];
+
+var gAllowedPasteSites = [];
+var gAllowedCutCopySites = [];
+var gDeniedPasteSites = [];
+var gDeniedCutCopySites = [];
+var gDefaultPastePolicy = false;
+var gDefaultCutCopyPolicy = false;
+
+function allowCutCopy(doc) {
+ var win = doc.defaultView;
+ if (win !== win.top) {
+ // It's an iframe. Use the top level window
+ // for security purposes
+ win = win.top;
+ }
+
+ if (gDefaultCutCopyPolicy == true) {
+ for (var i=0; i < gDeniedCutCopySites.length; i++) {
+ if (win.location.href.indexOf(gDeniedCutCopySites[i]) == 0) {
+ return false;
+ }
+ }
+ return true;
+ } else {
+ for (var i=0; i < gAllowedCutCopySites.length; i++) {
+ if (win.location.href.indexOf(gAllowedCutCopySites[i]) == 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
+function allowPaste(doc) {
+ var win = doc.defaultView;
+ if (win !== win.top) {
+ // It's an iframe. Use the top level window
+ // for security purposes
+ win = win.top;
+ }
+
+ if (gDefaultPastePolicy == true) {
+ for (var i=0; i < gDeniedPasteSites.length; i++) {
+ if (win.location.href.indexOf(gDeniedPasteSites[i]) == 0) {
+ return false;
+ break;
+ }
+ }
+ return true;
+ } else {
+ for (var i=0; i < gAllowedPasteSites.length; i++) {
+ if (win.location.href.indexOf(gAllowedPasteSites[i]) == 0) {
+ return true;
+ break;
+ }
+ }
+ return false;
+ }
+}
+
+function myExecCommand(doc, originalExecCommand) {
+ return function(aCommandName, aShowDefaultUI, aValueArgument) {
+ switch (aCommandName.toLowerCase()) {
+ case "cut":
+ case "copy":
+ if (allowCutCopy(doc)) {
+ var win = Services.wm.getMostRecentWindow("navigator:browser");
+ win.goDoCommand("cmd_" + aCommandName.toLowerCase());
+ return true;
+ }
+ break;
+ case "paste":
+ if (allowPaste(doc)) {
+ var win = Services.wm.getMostRecentWindow("navigator:browser");
+ win.goDoCommand("cmd_" + aCommandName.toLowerCase());
+ return true;
+ }
+ break;
+ }
+ return originalExecCommand.call(doc, aCommandName, aShowDefaultUI, aValueArgument);
+ }
+}
+
+function myQueryCommandSupported(doc, originalQueryCommandSupported) {
+ return function(aCommandName) {
+ switch (aCommandName.toLowerCase()) {
+ case "cut":
+ case "copy":
+ if (allowCutCopy(doc)) {
+ return true;
+ }
+ break;
+ case "paste":
+ if (allowPaste(doc)) {
+ return true;
+ }
+ break;
+ }
+ return originalQueryCommandSupported.call(doc, aCommandName, aShowDefaultUI, aValueArgument);
+ }
+}
+
+var documentObserver = {
+ observe: function observe(subject, topic, data) {
+ if (subject instanceof Ci.nsIDOMWindow && topic == 'content-document-global-created') {
+ var doc = subject.document;
+ var cutCopyAllowed = allowCutCopy(doc);
+ var pasteAllowed = allowPaste(doc);
+ if (!cutCopyAllowed && !pasteAllowed) {
+ return;
+ }
+ var originalExecCommand = Cu.waiveXrays(doc).execCommand;
+ Cu.exportFunction(myExecCommand(doc, originalExecCommand), doc, {defineAs: "execCommand"});
+ var originalQueryCommandSupported = Cu.waiveXrays(doc).queryCommandSupported;
+ Cu.exportFunction(myQueryCommandSupported(doc, originalQueryCommandSupported), doc, {defineAs: "queryCommandSupported"});
+ var originalQueryCommandEnabled = Cu.waiveXrays(doc).queryCommandEnabled;
+ Cu.exportFunction(myQueryCommandSupported(doc, originalQueryCommandEnabled), doc, {defineAs: "queryCommandEnabled"});
+ }
+ }
+}
+
+// Don't do this check before Firefox 29
+if (Services.vc.compare(Services.appinfo.version, "29") > 0) {
+ try {
+ if (Services.prefs.getCharPref("capability.policy.default.Clipboard.cutcopy") == "allAccess") {
+ gDefaultCutCopyPolicy = true;
+ }
+ } catch (e) {}
+ try {
+ if (Services.prefs.getCharPref("capability.policy.default.Clipboard.paste") == "allAccess") {
+ gDefaultPastePolicy = true;
+ }
+ } catch (e) {}
+ try {
+ var policies = [];
+ policies = Services.prefs.getCharPref("capability.policy.policynames").split(', ');
+ for (var i=0; i < policies.length; i++ ) {
+ try {
+ if (Services.prefs.getCharPref("capability.policy." + policies[i] + ".Clipboard.cutcopy") == "allAccess") {
+ var allowedCutCopySites = Services.prefs.getCharPref("capability.policy." + policies[i] + ".sites").split(" ");
+ for (var j=0; j < allowedCutCopySites.length; j++) {
+ gAllowedCutCopySites.push(allowedCutCopySites[j]);
+ }
+ }
+ } catch(e) {}
+ try {
+ if (Services.prefs.getCharPref("capability.policy." + policies[i] + ".Clipboard.cutcopy") == "noAccess") {
+ var deniedCutCopySites = Services.prefs.getCharPref("capability.policy." + policies[i] + ".sites").split(" ");
+ for (var j=0; j < deniedCutCopySites.length; j++) {
+ gDeniedCutCopySites.push(deniedCutCopySites[j]);
+ }
+ }
+ } catch(e) {}
+ try {
+ if (Services.prefs.getCharPref("capability.policy." + policies[i] + ".Clipboard.paste") == "allAccess") {
+ var allowedPasteSites = Services.prefs.getCharPref("capability.policy." + policies[i] + ".sites").split(" ");
+ for (var j=0; j < allowedPasteSites.length; j++) {
+ gAllowedPasteSites.push(allowedPasteSites[j]);
+ }
+ }
+ } catch(e) {}
+ try {
+ if (Services.prefs.getCharPref("capability.policy." + policies[i] + ".Clipboard.paste") == "noAccess") {
+ var deniedPasteSites = Services.prefs.getCharPref("capability.policy." + policies[i] + ".sites").split(" ");
+ for (var j=0; j < deniedPasteSites.length; j++) {
+ gDeniedPasteSites.push(deniedPasteSites[j]);
+ }
+ }
+ } catch(e) {}
+ }
+ } catch (e) {}
+ if (gDefaultCutCopyPolicy || gDefaultPastePolicy ||
+ gAllowedCutCopySites.length > 0 || gAllowedPasteSites> 0) {
+ Services.obs.addObserver(documentObserver, "content-document-global-created", false);
+ addEventListener("unload", function() {
+ Services.obs.removeObserver(documentObserver, "content-document-global-created", false);
+ })
+ }
+}
diff --git a/windows/build/preferences/cck2/modules/CCK2.jsm b/windows/build/preferences/cck2/modules/CCK2.jsm
new file mode 100644
index 0000000..2a63260
--- /dev/null
+++ b/windows/build/preferences/cck2/modules/CCK2.jsm
@@ -0,0 +1,1495 @@
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+var EXPORTED_SYMBOLS = ["CCK2"];
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/NetUtil.jsm");
+Cu.import("resource://gre/modules/FileUtils.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/PlacesUtils.jsm");
+try {
+ Cu.import("resource://gre/modules/Timer.jsm");
+} catch (ex) {
+ Cu.import("resource://cck2/Timer.jsm");
+}
+Cu.import("resource://cck2/Preferences.jsm");
+Cu.import("resource://cck2/CTPPermissions.jsm");
+Cu.import("resource:///modules/distribution.js");
+
+XPCOMUtils.defineLazyServiceGetter(this, "bmsvc",
+ "@mozilla.org/browser/nav-bookmarks-service;1", "nsINavBookmarksService");
+XPCOMUtils.defineLazyServiceGetter(this, "annos",
+ "@mozilla.org/browser/annotation-service;1", "nsIAnnotationService");
+XPCOMUtils.defineLazyServiceGetter(this, "override",
+ "@mozilla.org/security/certoverride;1", "nsICertOverrideService");
+XPCOMUtils.defineLazyServiceGetter(this, "uuid",
+ "@mozilla.org/uuid-generator;1", "nsIUUIDGenerator");
+
+Cu.importGlobalProperties(["XMLHttpRequest"]);
+
+/* Hack to work around bug that AutoConfig is loaded in the wrong charset */
+/* Not used for Firefox 44 and above (see CCK2.init) */
+let fixupUTF8 = function(str) {
+ if (!str) {
+ return null;
+ }
+ var out, i, len, c;
+ var char2, char3;
+
+ out = "";
+ len = str.length;
+ i = 0;
+ while(i < len) {
+ c = str.charCodeAt(i++);
+ switch(c >> 4)
+ {
+ case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
+ // 0xxxxxxx
+ out += str.charAt(i-1);
+ break;
+ case 12: case 13:
+ // 110x xxxx 10xx xxxx
+ char2 = str.charCodeAt(i++);
+ out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
+ break;
+ case 14:
+ // 1110 xxxx 10xx xxxx 10xx xxxx
+ char2 = str.charCodeAt(i++);
+ char3 = str.charCodeAt(i++);
+ out += String.fromCharCode(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0));
+ break;
+ }
+ }
+
+ return out;
+};
+
+/* Crazy hack to work around distribution.ini bug */
+/* Basically if the distribution can't be parsed, make it null */
+let dirSvc = Cc["@mozilla.org/file/directory_service;1"].
+ getService(Ci.nsIProperties);
+let iniFile = dirSvc.get("XREAppDist", Ci.nsIFile);
+iniFile.leafName = "distribution";
+iniFile.append("distribution.ini");
+if (iniFile.exists()) {
+ try {
+ let ini = Cc["@mozilla.org/xpcom/ini-parser-factory;1"].
+ getService(Ci.nsIINIParserFactory).
+ createINIParser(iniFile);
+ } catch (e) {
+ DistributionCustomizer.prototype.__defineGetter__("_iniFile", function() { return null;});
+ }
+}
+
+var networkPrefMapping = {
+ proxyType: "network.proxy.type",
+ proxyHTTP: "network.proxy.http",
+ proxyHTTPPort: "network.proxy.http_port",
+ proxySSL: "network.proxy.ssl",
+ proxySSLPort: "network.proxy.ssl_port",
+ proxyFTP: "network.proxy.ftp",
+ proxyFTPPort: "network.proxy.ftp_port",
+ proxySOCKS: "network.proxy.socks",
+ proxySOCKSPort: "network.proxy.socks_port",
+ proxySocksVersion: "network.proxy.socks_version",
+ proxyNone: "network.proxy.no_proxies_on",
+ proxyAutoConfig: "network.proxy.autoconfig_url",
+ shareAllProxies: "network.proxy.share_proxy_settings",
+ proxySOCKSRemoteDNS: "network.proxy.socks_remote_dns",
+ proxyAutologin: "signon.autologin.proxy"
+}
+
+
+function alert(string) {
+ Services.prompt.alert(Services.wm.getMostRecentWindow("navigator:browser"), "", string);
+}
+
+var gBundlePrefFiles = [];
+
+var CCK2 = {
+ configs: {},
+ firstrun: false,
+ upgrade: false,
+ installedVersion: null,
+ initialized: false,
+ aboutFactories: [],
+ init: function(config, a, b) {
+ if (a == b) {
+ /* See bugzilla 1193625/1137799 */
+ fixupUTF8 = function(str) { return str };
+ }
+ // Bring back default profiles for >= FF46
+ if (Services.vc.compare(Services.appinfo.version, "46") >= 0) {
+ // If it is a new profile
+ if (!Preferences.isSet("browser.startup.homepage_override.mstone")) {
+ var defaultProfileDir = Services.dirsvc.get("GreD", Ci.nsIFile);
+ defaultProfileDir.append("defaults");
+ defaultProfileDir.append("profile");
+ if (defaultProfileDir.exists()) {
+ var profileDir = Services.dirsvc.get("ProfD", Ci.nsIFile);
+ try {
+ copyDir(defaultProfileDir, profileDir);
+ } catch(e) {
+ Components.utils.reportError("Error copying default profile directory: " + e);
+ }
+ }
+ }
+ }
+ try {
+ for (var id in this.configs) {
+ if (id == config.id) {
+ // We've already processed this config
+ return;
+ }
+ }
+ if (!config) {
+ // Try to get config from default preference. If it is there, default
+ // preference always wins
+ var configJSON = Preferences.defaults.get("extensions.cck2.config");
+ if (!configJSON) {
+ configJSON = Preferences.defaults.get("extensions.cck2.config");
+ }
+ if (!configJSON) {
+ // Try something else. Grou policy?
+ }
+ try {
+ config = JSON.parse(configJSON);
+ } catch (ex) {
+ return;
+ }
+ }
+
+ if (!config)
+ return;
+ if (!config.id) {
+ alert("Missing ID in config");
+ }
+ config.firstrun = Preferences.get("extensions.cck2." + config.id + ".firstrun", true);
+ Preferences.set("extensions.cck2." + config.id + ".firstrun", false);
+ if (!config.firstrun) {
+ config.installedVersion = Preferences.get("extensions.cck2." + config.id + ".installedVersion");
+ config.upgrade = (config.installedVersion != config.version);
+ }
+ Preferences.set("extensions.cck2." + config.id + ".installedVersion", config.version);
+ Preferences.lock("distribution.id", config.id);
+ Preferences.lock("distribution.version", config.version + " (CCK2)");
+// Preferences.lock("distribution.about", String(config.id + " - " + config.version + " (CCK2)"));
+
+ if (config.removeDefaultSearchEngines) {
+ Services.io.getProtocolHandler("resource").QueryInterface(Components.interfaces.nsIResProtocolHandler)
+ .setSubstitution("search-plugins", null);
+ }
+ if (config.noAddonCompatibilityCheck) {
+ Preferences.reset("extensions.lastAppVersion");
+ }
+ if (config.preferences) {
+ for (var i in config.preferences) {
+ // For plugin.disable_full_page_plugin_for_types, there is
+ // a default user value (application/pdf).
+ // Because of this, setting the default value doesn't work.
+ // So if a user is trying to set the default value, we set
+ // the user value instead.
+ // But we only do that if it's set to application/pdf
+ // or not set (startup), or it's a CCK2 upgrade or first install
+ // As a side note, at Firefox install, application/pdf is added
+ // to the pref no matter what
+ if (i == "plugin.disable_full_page_plugin_for_types") {
+ if (!config.preferences[i].userset &&
+ !config.preferences[i].locked &&
+ !config.preferences[i].clear) {
+ if (Preferences.get(i) == "application/pdf" ||
+ !Preferences.get(i) || // firstrun
+ config.upgrade ||
+ config.firstrun) {
+ Preferences.set(i, config.preferences[i].value);
+ continue;
+ }
+ }
+ }
+ // Workaround bug where this pref is coming is as a string from import
+ if (i == "toolkit.telemetry.prompted") {
+ config.preferences[i].value = parseInt(config.preferences[i].value);
+ }
+ if (config.preferences[i].locked) {
+ Preferences.lock(i, config.preferences[i].value);
+ } else if (config.preferences[i].userset) {
+ Preferences.set(i, config.preferences[i].value);
+ } else if (config.preferences[i].clear) {
+ Preferences.reset(i);
+ } else {
+ if (i == "browser.startup.homepage" ||
+ i == "gecko.handlerService.defaultHandlersVersion" ||
+ i == "browser.menu.showCharacterEncoding" ||
+ i == "intl.accept_languages" ||
+ i.indexOf("browser.search.defaultenginename") == 0 ||
+ i.indexOf("browser.search.order") == 0 ||
+ i.indexOf("browser.contentHandlers.types") == 0 ||
+ i.indexOf("gecko.handlerService.schemes") == 0) {
+ // If it's a complex preference, we need to set it differently
+ Preferences.defaults.set(i, "data:text/plain," + i + "=" + config.preferences[i].value);
+ } else {
+ Preferences.defaults.set(i, config.preferences[i].value);
+ }
+ }
+ }
+ }
+ if (config.registry && "@mozilla.org/windows-registry-key;1" in Cc) {
+ for (var i in config.registry) {
+ addRegistryKey(config.registry[i].rootkey,
+ config.registry[i].key,
+ config.registry[i].name,
+ config.registry[i].value,
+ config.registry[i].type);
+ }
+ }
+ if (config.permissions) {
+ for (var i in config.permissions) {
+ for (var j in config.permissions[i]) {
+ if (i.indexOf("http") == 0) {
+ Services.perms.add(NetUtil.newURI(i), j, config.permissions[i][j]);
+ } else {
+ var domain = i.replace(/^\*\./g, '');
+ Services.perms.add(NetUtil.newURI("http://" + domain), j, config.permissions[i][j]);
+ Services.perms.add(NetUtil.newURI("https://" + domain), j, config.permissions[i][j]);
+ }
+ if (j == "plugins") {
+ var plugins = Cc["@mozilla.org/plugin/host;1"].getService(Ci.nsIPluginHost).getPluginTags({});
+ for (var k=0; k < plugins.length; k++) {
+ if (i.indexOf("http") == 0) {
+ Services.perms.add(NetUtil.newURI(i), "plugin:" + CTP.getPluginPermissionFromTag(plugins[k]), config.permissions[i][j]);
+ Services.perms.add(NetUtil.newURI(i), "plugin-vulnerable:" + CTP.getPluginPermissionFromTag(plugins[k]), config.permissions[i][j]);
+ } else {
+ var domain = i.replace(/^\*\./g, '');
+ Services.perms.add(NetUtil.newURI("http://" + domain), "plugin:" + CTP.getPluginPermissionFromTag(plugins[k]), config.permissions[i][j]);
+ Services.perms.add(NetUtil.newURI("http://" + domain), "plugin-vulnerable:" + CTP.getPluginPermissionFromTag(plugins[k]), config.permissions[i][j]);
+ Services.perms.add(NetUtil.newURI("https://" + domain), "plugin:" + CTP.getPluginPermissionFromTag(plugins[k]), config.permissions[i][j]);
+ Services.perms.add(NetUtil.newURI("https://" + domain), "plugin-vulnerable:" + CTP.getPluginPermissionFromTag(plugins[k]), config.permissions[i][j]);
+ }
+ }
+ }
+ }
+ if (Object.keys(config.permissions[i]).length === 0) {
+ let perms = Services.perms.enumerator;
+ while (perms.hasMoreElements()) {
+ let perm = perms.getNext();
+ try {
+ // Firefox 41 and below
+ if (perm.host == i) {
+ Services.perms.remove(perm.host, perm.type);
+ }
+ } catch(e) {
+ if (i.indexOf("http") == 0) {
+ if (perm.matchesURI(NetUtil.newURI(i), false)) {
+ perm.remove(NetUtil.newURI(i), perm.type);
+ }
+ } else {
+ var domain = i.replace(/^\*\./g, '');
+ if (perm.matchesURI(NetUtil.newURI("http://" + domain), false)) {
+ perm.remove(NetUtil.newURI("http://" + domain), perm.type);
+ }
+ if (perm.matchesURI(NetUtil.newURI("https://" + i), false)) {
+ perm.remove(NetUtil.newURI("https://" + domain), perm.type);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ if (config.disablePrivateBrowsing) {
+ Preferences.lock("browser.taskbar.lists.tasks.enabled", false);
+ Preferences.lock("browser.privatebrowsing.autostart", false);
+ var aboutPrivateBrowsing = {};
+ aboutPrivateBrowsing.classID = Components.ID(uuid.generateUUID().toString());
+ aboutPrivateBrowsing.factory = disableAbout(aboutPrivateBrowsing.classID,
+ "Disable about:privatebrowsing - CCK",
+ "privatebrowsing");
+ CCK2.aboutFactories.push(aboutPrivateBrowsing);
+ }
+ if (config.noGetAddons) {
+ Preferences.lock("extensions.getAddons.showPane", false);
+ }
+ if (config.noAddons) {
+ Preferences.lock("xpinstall.enabled", false);
+ }
+ if (config.disablePDFjs) {
+ Preferences.lock("pdfjs.disabled", true);
+ }
+ if (config.disableHello) {
+ Preferences.lock("loop.enabled", false);
+ }
+ if (config.disablePocket) {
+ Preferences.lock("browser.pocket.enabled", false);
+ Preferences.lock("extensions.pocket.enabled", false);
+ Preferences.lock("browser.newtabpage.activity-stream.feeds.section.topstories", false);
+ }
+ if (config.disableHeartbeat) {
+ Preferences.lock("browser.selfsupport.url", "");
+ }
+ if (config.disableInContentPrefs) {
+ Preferences.lock("browser.preferences.inContent", false);
+ }
+ if (config.disableSync) {
+ var aboutAccounts = {};
+ aboutAccounts.classID = Components.ID(uuid.generateUUID().toString());
+ aboutAccounts.factory = disableAbout(aboutAccounts.classID,
+ "Disable about:accounts - CCK",
+ "accounts");
+ CCK2.aboutFactories.push(aboutAccounts);
+ var aboutSyncLog = {};
+ aboutSyncLog.classID = Components.ID(uuid.generateUUID().toString());
+ aboutSyncLog.factory = disableAbout(aboutSyncLog.classID,
+ "Disable about:sync-log - CCK",
+ "sync-log");
+ CCK2.aboutFactories.push(aboutSyncLog);
+ var aboutSyncProgress = {};
+ aboutSyncProgress.classID = Components.ID(uuid.generateUUID().toString());
+ aboutSyncProgress.factory = disableAbout(aboutSyncProgress.classID,
+ "Disable about:sync-progress - CCK",
+ "sync-progress");
+ CCK2.aboutFactories.push(aboutSyncProgress);
+ var aboutSyncTabs = {};
+ aboutSyncTabs.classID = Components.ID(uuid.generateUUID().toString());
+ aboutSyncTabs.factory = disableAbout(aboutSyncTabs.classID,
+ "Disable about:sync-tabs - CCK",
+ "sync-tabs");
+ CCK2.aboutFactories.push(aboutSyncTabs);
+ Preferences.lock("browser.syncPromoViewsLeftMap", JSON.stringify({bookmarks:0, passwords:0, addons:0}));
+ Preferences.lock("browser.newtabpage.activity-stream.migrationExpired", true);
+ Preferences.lock("identity.fxaccounts.enabled", false);
+ }
+ var disableAboutConfigFactory = null;
+ if (config.disableAboutConfig) {
+ var aboutConfig = {};
+ aboutConfig.classID = Components.ID(uuid.generateUUID().toString());
+ aboutConfig.factory = disableAbout(aboutConfig.classID,
+ "Disable about:config - CCK",
+ "config");
+ CCK2.aboutFactories.push(aboutConfig);
+ }
+ if (config.disableAboutProfiles) {
+ var aboutProfiles = {};
+ aboutProfiles.classID = Components.ID(uuid.generateUUID().toString());
+ aboutProfiles.factory = disableAbout(aboutProfiles.classID,
+ "Disable about:profiles - CCK",
+ "profiles");
+ CCK2.aboutFactories.push(aboutProfiles);
+ }
+ if (config.disableAboutSupport) {
+ var aboutSupport = {};
+ aboutSupport.classID = Components.ID(uuid.generateUUID().toString());
+ aboutSupport.factory = disableAbout(aboutSupport.classID,
+ "Disable about:support - CCK",
+ "support");
+ CCK2.aboutFactories.push(aboutSupport);
+ }
+ if (config.disableAddonsManager) {
+ var aboutAddons = {};
+ aboutAddons.classID = Components.ID(uuid.generateUUID().toString());
+ aboutAddons.factory = disableAbout(aboutAddons.classID,
+ "Disable about:addons - CCK",
+ "addons");
+ CCK2.aboutFactories.push(aboutAddons);
+ }
+
+ if (config.alwaysDefaultBrowser) {
+ var shellSvc = Cc["@mozilla.org/browser/shell-service;1"].getService(Ci.nsIShellService);
+ if (shellSvc) {
+ try {
+ var isDefault = shellSvc.isDefaultBrowser(true, false);
+ if (!isDefault) {
+ shellSvc.setDefaultBrowser(true, false);
+ }
+ } catch (e) {
+ // setDefaultBrowser errors on Yosemite, so we're just ignoring the error.
+ // See Bugzilla bug #1063529
+ }
+ }
+ }
+ if (config.dontCheckDefaultBrowser) {
+ Preferences.lock("browser.shell.checkDefaultBrowser", false);
+ }
+ if (config.dontUseDownloadDir) {
+ Preferences.lock("browser.download.useDownloadDir", false);
+ }
+ if (config.disableFormFill) {
+ Preferences.lock("browser.formfill.enable", false);
+ }
+ if (config.removeSmartBookmarks) {
+ Preferences.lock("browser.places.smartBookmarksVersion", -1);
+ }
+ if (config.disableCrashReporter) {
+ Preferences.lock("toolkit.crashreporter.enabled", false);
+ Preferences.lock("browser.crashReports.unsubmittedCheck.autoSubmit", false);
+ try {
+ Cc["@mozilla.org/toolkit/crash-reporter;1"].
+ getService(Ci.nsICrashReporter).submitReports = false;
+ } catch (e) {
+ // There seem to be cases where the crash reporter isn't defined
+ }
+ var aboutCrashes = {};
+ aboutCrashes.classID = Components.ID(uuid.generateUUID().toString());
+ aboutCrashes.factory = disableAbout(aboutCrashes.classID,
+ "Disable about:crashes - CCK",
+ "crashes");
+ CCK2.aboutFactories.push(aboutCrashes);
+ }
+ if (config.disableTelemetry) {
+ Preferences.lock("toolkit.telemetry.enabled", false);
+ Preferences.lock("toolkit.telemetry.prompted", 999);
+ Preferences.lock("datareporting.policy.dataSubmissionPolicyBypassNotification", true);
+ var aboutTelemetry = {};
+ aboutTelemetry.classID = Components.ID(uuid.generateUUID().toString());
+ aboutTelemetry.factory = disableAbout(aboutTelemetry.classID,
+ "Disable about:telemetry - CCK",
+ "telemetry");
+ CCK2.aboutFactories.push(aboutTelemetry);
+ }
+ if (config.removeDeveloperTools) {
+ Preferences.lock("devtools.scratchpad.enabled", false);
+ Preferences.lock("devtools.responsiveUI.enabled", false);
+ Preferences.lock("devtools.toolbar.enabled", false);
+ Preferences.lock("devtools.styleeditor.enabled", false);
+ Preferences.lock("devtools.debugger.enabled", false);
+ Preferences.lock("devtools.profiler.enabled", false);
+ Preferences.lock("devtools.errorconsole.enabled", false);
+ Preferences.lock("devtools.inspector.enabled", false);
+ }
+ if (config.homePage && !config.lockHomePage) {
+ Preferences.defaults.set("browser.startup.homepage", "data:text/plain,browser.startup.homepage=" + config.homePage);
+ /* If you have a distribution.ini, browser.startup.homepage gets wiped out */
+ /* We need to save it */
+ if (!Preferences.isSet("browser.startup.homepage")) {
+ Preferences.set("browser.startup.homepage", config.homePage);
+ }
+ }
+ if (config.lockHomePage) {
+ if (config.homePage) {
+ Preferences.lock("browser.startup.homepage", config.homePage);
+ } else {
+ Preferences.lock("browser.startup.homepage");
+ }
+ Preferences.lock("pref.browser.homepage.disable_button.current_page", true);
+ Preferences.lock("pref.browser.homepage.disable_button.bookmark_page", true);
+ Preferences.lock("pref.browser.homepage.disable_button.restore_default", true);
+ }
+ if (config.noWelcomePage) {
+ Preferences.lock("startup.homepage_welcome_url", "");
+ Preferences.lock("startup.homepage_welcome_url.additional", "");
+ Preferences.lock("browser.usedOnWindows10", true);
+
+ } else if (config.welcomePage) {
+ Preferences.lock("startup.homepage_welcome_url", config.welcomePage);
+ }
+ if (config.noUpgradePage) {
+ Preferences.lock("browser.startup.homepage_override.mstone", "ignore");
+ } else if (config.upgradePage) {
+ Preferences.lock("startup.homepage_override_url", config.upgradePage);
+ }
+ if (config.dontShowRights) {
+ Preferences.lock("browser.rights.override", true);
+ var rightsVersion = Preferences.get("browser.rights.version");
+ Preferences.lock("browser.rights." + rightsVersion + ".shown", true);
+ }
+ if (config.dontRememberPasswords) {
+ Preferences.lock("signon.rememberSignons", false);
+ }
+ if (config.disableFirefoxHealthReport) {
+ Preferences.lock("datareporting.healthreport.uploadEnabled", false);
+ var aboutHealthReport = {};
+ aboutHealthReport.classID = Components.ID(uuid.generateUUID().toString());
+ aboutHealthReport.factory = disableAbout(aboutHealthReport.classID,
+ "Disable about:healthreport - CCK",
+ "healthreport");
+ CCK2.aboutFactories.push(aboutHealthReport);
+ }
+ if (config.disableFirefoxHealthReportUpload) {
+ Preferences.lock("datareporting.healthreport.uploadEnabled", false);
+ }
+ if (config.disableResetFirefox) {
+ try {
+ Cu.import("resource:///modules/UITour.jsm");
+ UITour.origOnPageEvent = UITour.onPageEvent;
+ UITour.onPageEvent = function(a, b) {
+ var aEvent = b;
+ if (!aEvent) {
+ aEvent = a;
+ }
+ if (aEvent.detail.action == "resetFirefox") {
+ Services.prompt.alert(null, "CCK2", "This has been disabled by your administrator");
+ return;
+ }
+ UITour.origOnPageEvent(a, b);
+ }
+ Preferences.lock("browser.disableResetPrompt ", true);
+ } catch (e) {}
+ }
+ if (config.disableFirefoxUpdates) {
+ Preferences.lock("app.update.auto", false);
+ Preferences.lock("app.update.enabled", false);
+ }
+ if (config.network) {
+ for (var i in networkPrefMapping) {
+ if (i in config.network) {
+ Preferences.defaults.set(networkPrefMapping[i], config.network[i]);
+ }
+ if (config.network.locked) {
+ Preferences.lock(networkPrefMapping[i]);
+ }
+ }
+ }
+ if (config.removeSnippets) {
+ Preferences.lock("browser.newtabpage.activity-stream.disableSnippets", true);
+ }
+ // Fixup bad strings
+ if ("helpMenu" in config) {
+ if ("label" in config.helpMenu) {
+ config.helpMenu.label = fixupUTF8(config.helpMenu.label);
+ }
+ if ("accesskey" in config.helpMenu) {
+ config.helpMenu.accesskey = fixupUTF8(config.helpMenu.accesskey);
+ }
+ }
+ if ("titlemodifier" in config) {
+ config.titlemodifier = fixupUTF8(config.titlemodifier);
+ }
+ if ("defaultSearchEngine" in config) {
+ config.defaultSearchEngine = fixupUTF8(config.defaultSearchEngine);
+ }
+ this.configs[config.id] = config;
+ } catch (e) {
+ errorCritical(e);
+ }
+ },
+ getConfigs: function() {
+ return this.configs;
+ },
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "distribution-customization-complete":
+ for (var id in this.configs) {
+ var config = this.configs[id];
+ // Due to bug 947838, we have to reinitialize default preferences
+ {
+ var iniFile = Services.dirsvc.get("XREAppDist", Ci.nsIFile);
+ iniFile.leafName = "distribution";
+ iniFile.append("distribution.ini");
+ if (iniFile.exists()) {
+ if (config.preferences) {
+ for (var i in config.preferences) {
+ // Workaround bug where this pref is coming is as a string from import
+ if (i == "toolkit.telemetry.prompted") {
+ config.preferences[i].value = parseInt(config.preferences[i].value);
+ }
+ if (!("locked" in config.preferences[i]) &&
+ !("userset" in config.preferences[i]) &&
+ !("clear" in config.preferences[i])) {
+ if (Preferences.defaults.has(i)) {
+ try {
+ // If it's a complex preference, we need to set it differently
+ Services.prefs.getComplexValue(i, Ci.nsIPrefLocalizedString).data;
+ Preferences.defaults.set(i, "data:text/plain," + i + "=" + config.preferences[i].value);
+ } catch (ex) {
+ Preferences.defaults.set(i, config.preferences[i].value);
+ }
+ } else {
+ Preferences.defaults.set(i, config.preferences[i].value);
+ }
+ }
+ }
+ }
+ }
+ if (config.homePage && !config.lockHomePage) {
+ Preferences.defaults.set("browser.startup.homepage", "data:text/plain,browser.startup.homepage=" + config.homePage);
+ /* If you have a distribution.ini, we changed browser.startup.homepage */
+ /* Put it back */
+ if (Preferences.get("browser.startup.homepage") == config.homePage) {
+ Preferences.reset("browser.startup.homepage");
+ }
+ }
+ if (config.network) {
+ for (var i in networkPrefMapping) {
+ if (i in config.network) {
+ Preferences.defaults.set(networkPrefMapping[i], config.network[i]);
+ }
+ }
+ }
+ }
+ // Try to install devices every time just in case get added after install
+ if ("certs" in config && "devices" in config.certs) {
+ let pkcs11;
+ try {
+ pkcs11 = Components.classes["@mozilla.org/security/pkcs11;1"].getService(Ci.nsIPKCS11);
+ } catch (e) {
+ pkcs11 = Components.classes["@mozilla.org/security/pkcs11moduledb;1"].getService(Ci.nsIPKCS11ModuleDB);
+ }
+ for (var i=0; i < config.certs.devices.length; i++) {
+ var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
+ try {
+ file.initWithPath(config.certs.devices[i].path);
+ if (file.exists()) {
+ pkcs11.addModule(config.certs.devices[i].name, config.certs.devices[i].path, 0, 0);
+ }
+ } catch(e) {
+ // Ignore path errors in case we are on different OSes
+ }
+ }
+ }
+ if (!config.firstrun && config.installedVersion == config.version) {
+ continue;
+ }
+ if (config.removeSmartBookmarks) {
+ var smartBookmarks = annos.getItemsWithAnnotation("Places/SmartBookmark", {});
+ for (var i = 0; i < smartBookmarks.length; i++) {
+ try {
+ bmsvc.removeItem(smartBookmarks[i]);
+ } catch (ex) {}
+ }
+ }
+ let syncBookmarks = false;
+ if ("getIdForItemAt" in bmsvc) {
+ syncBookmarks = true;
+ }
+ if (config.removeDefaultBookmarks) {
+ if (syncBookmarks) {
+ var firefoxFolder = bmsvc.getIdForItemAt(bmsvc.bookmarksMenuFolder, 3);
+ if ((firefoxFolder != -1) && (bmsvc.getItemType(firefoxFolder) == bmsvc.TYPE_FOLDER)) {
+ var aboutMozilla = bmsvc.getIdForItemAt(firefoxFolder, 3);
+ if (aboutMozilla != -1 &&
+ bmsvc.getItemType(aboutMozilla) == bmsvc.TYPE_BOOKMARK &&
+ /https?:\/\/www.mozilla.(com|org)\/.*\/about/.test(bmsvc.getBookmarkURI(aboutMozilla).spec)) {
+ bmsvc.removeItem(firefoxFolder);
+ }
+ }
+ var userAgentLocale = Preferences.defaults.get("general.useragent.locale");
+ var gettingStartedURL = "https://www.mozilla.org/" + userAgentLocale + "/firefox/central/";
+ var bookmarks = bmsvc.getBookmarkIdsForURI(NetUtil.newURI("https://www.mozilla.org/" + userAgentLocale + "/firefox/central/"));
+ if (bookmarks.length == 0) {
+ bookmarks = bmsvc.getBookmarkIdsForURI(NetUtil.newURI("http://www.mozilla.com/" + userAgentLocale + "/firefox/central/"));
+ }
+ if (bookmarks.length > 0) {
+ bmsvc.removeItem(bookmarks[0])
+ }
+ var bookmarks = bmsvc.getBookmarkIdsForURI(NetUtil.newURI("https://www.mozilla.org/" + userAgentLocale + "/about/"));
+ if (bookmarks.length == 0) {
+ bookmarks = bmsvc.getBookmarkIdsForURI(NetUtil.newURI("http://www.mozilla.com/" + userAgentLocale + "/about/"));
+ }
+ if (bookmarks.length > 0) {
+ var mozillaFolder = bmsvc.getFolderIdForItem(bookmarks[0]);
+ if (mozillaFolder != -1) {
+ var mozillaFolderIndex = bmsvc.getItemIndex(mozillaFolder);
+ var mozillaFolderParent = bmsvc.getFolderIdForItem(mozillaFolder);
+ bmsvc.removeItem(mozillaFolder);
+ if (config.removeSmartBookmarks) {
+ var separator = bmsvc.getIdForItemAt(mozillaFolderParent, mozillaFolderIndex-1);
+ if (separator != -1) {
+ bmsvc.removeItem(separator);
+ }
+ }
+ }
+ }
+
+ } else {
+ removeDefaultBookmarks();
+ }
+ }
+
+ // If we detect an old CCK Wizard, remove it's bookmarks
+ var bookmarksToRemove = [];
+ if ("extension" in config) {
+ var oldCCKVersion = Preferences.get("extensions." + config.extension.id + ".version", null);
+ if (oldCCKVersion) {
+ Preferences.reset("extensions." + config.extension.id + ".version");
+ bookmarksToRemove = bookmarksToRemove.concat(annos.getItemsWithAnnotation(config.extension.id + "/" + oldCCKVersion, {}));
+ }
+ }
+ if (config.installedVersion != config.version) {
+ bookmarksToRemove = bookmarksToRemove.concat(annos.getItemsWithAnnotation(config.id + "/" + config.installedVersion, {}));
+ bookmarksToRemove = bookmarksToRemove.concat(annos.getItemsWithAnnotation(config.installedVersion + "/" + config.installedVersion, {}));
+ }
+ // Just in case, remove bookmarks for this version too
+ bookmarksToRemove = bookmarksToRemove.concat(annos.getItemsWithAnnotation(config.id + "/" + config.version, {}));
+ if (syncBookmarks) {
+ let bmFolders = [];
+ for (var i = 0; i < bookmarksToRemove.length; i++) {
+ try {
+ var itemType = bmsvc.getItemType(bookmarksToRemove[i]);
+ if (itemType == bmsvc.TYPE_FOLDER) {
+ bmFolders.push(bookmarksToRemove[i]);
+ } else {
+ bmsvc.removeItem(bookmarksToRemove[i]);
+ }
+ } catch (e) {
+ Components.utils.reportError(e);
+ }
+ }
+ if (bmFolders.length > 0) {
+ // Only remove folders if they are empty
+ for (var i = 0; i < bmFolders.length; i++) {
+ try {
+ var bmID = bmsvc.getIdForItemAt(bmFolders[i], 0);
+ if (bmID == -1) {
+ bmsvc.removeItem(bmFolders[i]);
+ } else {
+ var newTitle = bmsvc.getItemTitle(bmFolders[i]) + " (" + (oldCCKVersion || config.installedVersion) + ")";
+ bmsvc.setItemTitle(bmFolders[i], newTitle);
+ }
+ } catch (e) {
+ bmsvc.removeItem(bmFolders[i]);
+ }
+ }
+ }
+ } else {
+ removeOldBookmarks(bookmarksToRemove, oldCCKVersion || config.installedVersion);
+ }
+ if (config.bookmarks) {
+ if (config.bookmarks.toolbar) {
+ if (syncBookmarks) {
+ addBookmarksSync(config.bookmarks.toolbar, bmsvc.toolbarFolder, config.id + "/" + config.version, config.removeDuplicateBookmarkNames);
+ } else {
+ addBookmarks(config.bookmarks.toolbar, PlacesUtils.bookmarks.toolbarGuid, config.id + "/" + config.version, config.removeDuplicateBookmarkNames);
+ }
+ }
+ if (config.bookmarks.menu) {
+ if (syncBookmarks) {
+ addBookmarksSync(config.bookmarks.menu, bmsvc.bookmarksMenuFolder, config.id + "/" + config.version, config.removeDuplicateBookmarkNames);
+ } else {
+ addBookmarks(config.bookmarks.menu, PlacesUtils.bookmarks.menuGuid, config.id + "/" + config.version, config.removeDuplicateBookmarkNames);
+ }
+ }
+ }
+ if (config.searchplugins || config.defaultSearchEngine) {
+ searchInitRun(function() {
+ if (Array.isArray(config.searchplugins)) {
+ for (var i=0; i < config.searchplugins.length; i++) {
+ Services.search.addEngine(config.searchplugins[i], Ci.nsISearchEngine.DATA_XML, null, false, {
+ onSuccess: function (engine) {
+ if (engine.name == config.defaultSearchEngine) {
+ Services.search.currentEngine = engine;
+ }
+ },
+ onError: function (errorCode) {
+ Components.utils.reportError("Engine install error: " + errorCode);
+ // Ignore errors
+ }
+ });
+ }
+ } else {
+ for (let enginename in config.searchplugins) {
+ var engine = Services.search.getEngineByName(enginename);
+ if (engine) {
+ Services.search.removeEngine(engine);
+ }
+ Services.search.addEngine(config.searchplugins[enginename], Ci.nsISearchEngine.DATA_XML, null, false, {
+ onSuccess: function (engine) {
+ if (engine.name == config.defaultSearchEngine) {
+ Services.search.currentEngine = engine;
+ }
+ },
+ onError: function (errorCode) {
+ Components.utils.reportError("Engine install error: " + errorCode);
+ }
+ });
+ }
+ }
+
+ var defaultSearchEngine = Services.search.getEngineByName(config.defaultSearchEngine);
+ if (defaultSearchEngine) {
+ Services.search.currentEngine = defaultSearchEngine;
+ }
+ });
+ }
+ if (config.disableSearchEngineInstall) {
+ try {
+ Cu.import("resource:///modules/ContentLinkHandler.jsm");
+ ContentLinkHandler.origOnLinkAdded = ContentLinkHandler.onLinkAdded;
+ ContentLinkHandler.onLinkAdded = function(event, chromeGlobal) {
+ if (event.originalTarget.rel == "search") {
+ return;
+ }
+ ContentLinkHandler.origOnLinkAdded(event, chromeGlobal);
+ };
+ } catch (e) {
+ // Just in case we are pre Firefox 31
+ }
+ }
+ }
+ break;
+ case "browser-ui-startup-complete":
+ var disableWebApps = false;
+ for (var id in this.configs) {
+ var config = this.configs[id];
+ if (config.disableWebApps) {
+ disableWebApps = true;
+ break;
+ }
+ }
+ if (!disableWebApps) {
+ return;
+ }
+ try {
+ Cu.import("resource://gre/modules/WebappManager.jsm");
+ } catch (e) {
+ try {
+ Cu.import("resource:///modules/WebappManager.jsm");
+ } catch (e) {}
+ }
+ try {
+ WebappManager.doInstall = function() {
+ var win = Services.wm.getMostRecentWindow("navigator:browser");
+ var gBrowser = win.gBrowser;
+ var gNavigatorBundle = win.gNavigatorBundle
+ messageString = gNavigatorBundle.getString("xpinstallDisabledMessageLocked");;
+ var options = {
+ timeout: Date.now() + 30000
+ };
+ win.PopupNotifications.show(gBrowser.selectedBrowser, "xpinstall-disabled",
+ messageString, "addons-notification-icon",
+ null, null, options);
+ };
+ } catch(e) {
+ // Web Apps was removed
+ }
+ break;
+ case "final-ui-startup":
+ for (var id in this.configs) {
+ var config = this.configs[id];
+ // Delay loading unnecessary modules
+ // We should do this on a timeout
+ loadModules(config);
+ if (!config.firstrun && config.installedVersion == config.version) {
+ return;
+ }
+ if ("certs" in config) {
+ if ("override" in config.certs) {
+ for (var i=0; i < config.certs.override.length; i++) {
+ var xhr = new XMLHttpRequest();
+ try {
+ xhr.open("GET", "https://" + config.certs.override[i]);
+ xhr.channel.notificationCallbacks = SSLExceptions;
+ xhr.send(null);
+ } catch (ex) {}
+ }
+ }
+ var certdb = Cc["@mozilla.org/security/x509certdb;1"].getService(Ci.nsIX509CertDB);
+ var certdb2 = certdb;
+ try {
+ certdb2 = Cc["@mozilla.org/security/x509certdb;1"].getService(Ci.nsIX509CertDB2);
+ } catch (e) {}
+ if (config.certs.ca) {
+ for (var i=0; i < config.certs.ca.length; i++) {
+ var certTrust;
+ if (config.certs.ca[i].trust){
+ certTrust = config.certs.ca[i].trust
+ } else {
+ certTrust = ",,";
+ }
+ if (config.certs.ca[i].url) {
+ try {
+ download(config.certs.ca[i].url, function(file, extraParams) {
+ var istream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
+ istream.init(file, -1, -1, false);
+ var bstream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Ci.nsIBinaryInputStream);
+ bstream.setInputStream(istream);
+ var cert = bstream.readBytes(bstream.available());
+ bstream.close();
+ istream.close();
+ if (/-----BEGIN CERTIFICATE-----/.test(cert)) {
+ certdb2.addCertFromBase64(fixupCert(cert), extraParams.trust, "");
+ } else {
+ certdb.addCert(cert, extraParams.trust, "");
+ }
+ }, errorCritical, {trust: certTrust});
+ } catch (e) {
+ errorCritical("Unable to install " + config.certs.ca[i].url + " - " + e);
+ }
+ } else if (config.certs.ca[i].cert) {
+ certdb2.addCertFromBase64(fixupCert(config.certs.ca[i].cert), certTrust, "");
+ }
+ }
+ }
+ if (config.certs.server) {
+ for (var i=0; i < config.certs.server.length; i++) {
+ try {
+ download(config.certs.server[i], function(file) {
+ try {
+ certdb.importCertsFromFile(null, file, Ci.nsIX509Cert.SERVER_CERT);
+ } catch(e) {
+ // API removed in bugzilla #1064402 (FF47)
+ }
+ }, errorCritical);
+ } catch (e) {
+ errorCritical("Unable to install " + config.certs.server[i] + " - " + e);
+ }
+ }
+ }
+ }
+ if (config.persona) {
+ var temp = {};
+ Components.utils.import("resource://gre/modules/LightweightThemeManager.jsm", temp);
+ temp.LightweightThemeManager.currentTheme = config.persona;
+ }
+ if (config.addons) {
+ Cu.import("resource://gre/modules/AddonManager.jsm");
+ var numAddonsInstalled = 0;
+ var numAddons = config.addons.length;
+ let listener = {
+ onInstallEnded: function(install, addon) {
+ if (addon.isActive) {
+ // restartless add-on, so we don't need to restart
+ numAddons--;
+ } else {
+ numAddonsInstalled++;
+ }
+ if (numAddonsInstalled > 0 &&
+ numAddonsInstalled == numAddons) {
+ Services.startup.quit(Services.startup.eRestart | Services.startup.eAttemptQuit);
+ }
+ }
+ }
+ for (var i=0; i < config.addons.length; i++) {
+ try {
+ AddonManager.getInstallForURL(config.addons[i], function(addonInstall) {
+ addonInstall.addListener(listener);
+ addonInstall.install();
+ }, "application/x-xpinstall");
+ } catch (e) {
+ try {
+ AddonManager.getInstallForURL(config.addons[i], "application/x-xpinstall").then(addonInstall => {
+ addonInstall.addListener(listener);
+ addonInstall.install();
+ });
+ } catch (e) {
+ errorCriticial(e);
+ }
+ }
+ }
+ }
+ }
+ break;
+ case "load-extension-defaults":
+ if (gBundlePrefFiles.length > 0) {
+ // Create a temporary scope so the pref function works
+ var temp = {};
+ temp.pref = function(a, b) {
+ Preferences.defaults.set(a, b);
+ }
+ gBundlePrefFiles.forEach(function(prefFile) {
+ Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
+ .getService(Components.interfaces.mozIJSSubScriptLoader)
+ .loadSubScript(prefFile, temp);
+ });
+ }
+ break;
+ case "quit-application":
+ var registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
+ for (var i=0; i < CCK2.aboutFactories.length; i++)
+ registrar.unregisterFactory(CCK2.aboutFactories[i].classID, CCK2.aboutFactories[i].factory);
+ break;
+ }
+ }
+}
+
+async function removeDefaultBookmarks() {
+ var firefoxFolder = await PlacesUtils.bookmarks.fetch({
+ parentGuid: PlacesUtils.bookmarks.menuGuid,
+ index: 0});
+ if (firefoxFolder && firefoxFolder.type == PlacesUtils.bookmarks.TYPE_FOLDER) {
+ await PlacesUtils.bookmarks.remove(firefoxFolder);
+ }
+ var userAgentLocale = Preferences.defaults.get("general.useragent.locale");
+ if (!userAgentLocale) {
+ userAgentLocale = Services.locale.getRequestedLocales()[0];
+ }
+ var userAgentLocale = "en-US";
+ var gettingStartedURL = "https://www.mozilla.org/" + userAgentLocale + "/firefox/central/";
+ let bookmarks = [];
+ await PlacesUtils.bookmarks.fetch({url: gettingStartedURL}, b => bookmarks.push(b));
+ for (let bookmark of bookmarks) {
+ await PlacesUtils.bookmarks.remove(bookmark);
+ }
+}
+
+async function removeOldBookmarks(oldBookmarks, oldVersion) {
+ let bmFolders = [];
+ for (var i = 0; i < oldBookmarks.length; i++) {
+ try {
+ let guid = await PlacesUtils.promiseItemGuid(oldBookmarks[i]);
+ let bookmark = await PlacesUtils.bookmarks.fetch(guid);
+ if (bookmark.type == PlacesUtils.bookmarks.TYPE_FOLDER) {
+ bmFolders.push(bookmark);
+ } else {
+ await PlacesUtils.bookmarks.remove(bookmark);
+ }
+ } catch (ex) {
+ Components.utils.reportError(ex);
+ }
+ }
+ if (bmFolders.length > 0) {
+ // Only remove folders if they are empty
+ for (var i = 0; i < bmFolders.length; i++) {
+ let bookmarks = [];
+ await PlacesUtils.bookmarks.fetch({parentGuid: bmFolders[i].guid, index: 0}, b => bookmarks.push(b));
+ if (bookmarks.length == 0) {
+ await PlacesUtils.bookmarks.remove(bmFolders[i]);
+ } else {
+ PlacesUtils.bookmarks.update({guid: bmFolders[i].guid,
+ title: `${bmFolders[i].title} (${oldVersion})`});
+ }
+ }
+ }
+}
+
+function loadModules(config) {
+ let globalMM = Cc["@mozilla.org/globalmessagemanager;1"].getService();
+ globalMM.addMessageListener("cck2:get-configs", function(message) {
+ return CCK2.configs;
+ });
+ globalMM.addMessageListener("cck2:open-url", function(message) {
+ var win = Services.wm.getMostRecentWindow("navigator:browser");
+ if (win) {
+ win.openUILinkIn(message.data.url, message.data.where);
+ }
+ });
+ Cu.import("resource://cck2/CCK2AboutDialogOverlay.jsm");
+ Cu.import("resource://cck2/CCK2AboutAddonsOverlay.jsm");
+ Cu.import("resource://cck2/CCK2PreferencesOverlay.jsm");
+ globalMM.loadFrameScript("resource://cck2/CCK2Framescript.js", true);
+ globalMM.loadFrameScript("resource://cck2/CCK2AboutHomeFramescript.js", true);
+ globalMM.loadFrameScript("resource://cck2/CAPSCheckLoadURIFramescript.js", true);
+ globalMM.loadFrameScript("resource://cck2/CAPSClipboardFramescript.js", true);
+ Cu.import("resource://cck2/CCK2AboutSupportOverlay.jsm");
+ Cu.import("resource://cck2/CCK2BrowserOverlay.jsm");
+ Cu.import("resource://cck2/CCK2FileBlock.jsm");
+}
+
+function addRegistryKey(RootKey, Key, Name, NameValue, Type) {
+ const nsIWindowsRegKey = Ci.nsIWindowsRegKey;
+ var key = null;
+
+ try {
+ key = Cc["@mozilla.org/windows-registry-key;1"]
+ .createInstance(nsIWindowsRegKey);
+ var rootKey;
+ switch (RootKey) {
+ case "HKEY_CLASSES_ROOT":
+ rootKey = nsIWindowsRegKey.ROOT_KEY_CLASSES_ROOT;
+ break;
+ case "HKEY_CURRENT_USER":
+ rootKey = nsIWindowsRegKey.ROOT_KEY_CURRENT_USER;
+ break;
+ default:
+ rootKey = nsIWindowsRegKey.ROOT_KEY_LOCAL_MACHINE;
+ break;
+ }
+
+ key.create(rootKey, Key, nsIWindowsRegKey.ACCESS_WRITE);
+
+ switch (Type) {
+ case "REG_DWORD":
+ key.writeIntValue(Name, NameValue);
+ break;
+ case "REG_QWORD":
+ key.writeInt64Value(Name, NameValue);
+ break;
+ case "REG_BINARY":
+ key.writeBinaryValue(Name, NameValue);
+ break;
+ case "REG_SZ":
+ default:
+ key.writeStringValue(Name, NameValue);
+ break;
+ }
+ key.close();
+ } catch (ex) {
+ /* This could fail if you don't have the right authority on Windows */
+ if (key) {
+ key.close();
+ }
+ }
+}
+
+function addBookmarksSync(bookmarks, destination, annotation, removeDuplicateBookmarkNames) {
+ for (var i =0; i < bookmarks.length; i++) {
+ if (bookmarks[i].folder) {
+ var newFolderId = bmsvc.createFolder(destination, fixupUTF8(bookmarks[i].name), bmsvc.DEFAULT_INDEX);
+ annos.setItemAnnotation(newFolderId, annotation, "true", 0, annos.EXPIRE_NEVER);
+ addBookmarksSync(bookmarks[i].folder, newFolderId, annotation, removeDuplicateBookmarkNames);
+ } else if (bookmarks[i].type == "separator") {
+ var separatorId = bmsvc.insertSeparator(destination, bmsvc.DEFAULT_INDEX);
+ annos.setItemAnnotation(separatorId, annotation, "true", 0, annos.EXPIRE_NEVER);
+ } else {
+ try {
+ var uri = NetUtil.newURI(bookmarks[i].location);
+ var title = fixupUTF8(bookmarks[i].name);
+ var bookmarkIds = bmsvc.getBookmarkIdsForURI(uri, {}, {});
+ if (bookmarkIds.length > 0) {
+ // Remove duplicate bookmarks
+ for (var j=0; j < bookmarkIds.length; j++) {
+ // Unfortunately there's no way to generically
+ // check for any annotation, so we assume it is ours.
+ // We at least check if the destination is the same
+ let folderID = bmsvc.getFolderIdForItem(bookmarkIds[j]);
+ if (bmsvc.getItemTitle(bookmarkIds[j]) == title &&
+ destination == folderID) {
+ bmsvc.removeItem(bookmarkIds[j]);
+ }
+ }
+ }
+ if (removeDuplicateBookmarkNames) {
+ // This is hideous. There's no way to get the number of children
+ // in a folder, so we do a loop to get a quick count so we can
+ // work backwards.
+ let numItems = 0;
+ do {
+ let bmId = bmsvc.getIdForItemAt(destination, numItems);
+ if (bmId == -1) {
+ break;
+ }
+ numItems++;
+ } while (numItems < 50) // Failsafe just in case we somehow end up in a loop
+ for (var k=numItems; k > 0; k--) {
+ let bmId = bmsvc.getIdForItemAt(destination, k-1);
+ if (bmId == -1) { // Shouldn't happen
+ break;
+ }
+ if (bmsvc.getItemTitle(bmId) == title) {
+ bmsvc.removeItem(bmId);
+ }
+ }
+ }
+ var newBookmarkId = bmsvc.insertBookmark(destination, uri, bmsvc.DEFAULT_INDEX, title);
+ annos.setItemAnnotation(newBookmarkId, annotation, "true", 0, annos.EXPIRE_NEVER);
+ } catch(e) {
+ Components.utils.reportError(e);
+ }
+ }
+ }
+}
+
+let BOOKMARK_GUID_PREFIX = "CCKB-";
+let FOLDER_GUID_PREFIX = "CCKF-";
+let SEPARATOR_GUID_PREFIX = "CCKS-";
+
+function generateGuidWithPrefix(prefix) {
+ // Generates a random GUID and replace its beginning with the given
+ // prefix. We do this instead of just prepending the prefix to keep
+ // the correct character length.
+ return prefix + PlacesUtils.history.makeGuid().substring(prefix.length);
+}
+
+async function addBookmarks(bookmarks, parentGuid, annotation, removeDuplicateBookmarkNames) {
+ for (var i =0; i < bookmarks.length; i++) {
+ if (bookmarks[i].folder) {
+ let guid = generateGuidWithPrefix(FOLDER_GUID_PREFIX);
+ await PlacesUtils.bookmarks.insert({
+ type: PlacesUtils.bookmarks.TYPE_FOLDER,
+ title: fixupUTF8(bookmarks[i].name),
+ guid,
+ parentGuid
+ });
+ let newFolderId = await PlacesUtils.promiseItemId(guid);
+ annos.setItemAnnotation(newFolderId, annotation, "true", 0, annos.EXPIRE_NEVER);
+ addBookmarks(bookmarks[i].folder, guid, annotation, removeDuplicateBookmarkNames);
+ } else if (bookmarks[i].type == "separator") {
+ let guid = generateGuidWithPrefix(SEPARATOR_GUID_PREFIX);
+ await PlacesUtils.bookmarks.insert({
+ type: PlacesUtils.bookmarks.TYPE_SEPARATOR,
+ guid,
+ parentGuid
+ });
+ let newSeparatorId = await PlacesUtils.promiseItemId(guid);
+ annos.setItemAnnotation(newSeparatorId, annotation, "true", 0, annos.EXPIRE_NEVER);
+ } else {
+ try {
+ var title = fixupUTF8(bookmarks[i].name);
+ let bookmarksArray = [];
+ await PlacesUtils.bookmarks.fetch({url: bookmarks[i].location}, b => bookmarksArray.push(b));
+ for (let bookmark of bookmarksArray) {
+ // Unfortunately there's no way to generically
+ // check for any annotation, so we assume it is ours.
+ // We at least check if the destination is the same
+ if (bookmark.title == title &&
+ bookmark.parentGuid == parentGuid) {
+ }
+ await PlacesUtils.bookmarks.remove(bookmark);
+ }
+ if (removeDuplicateBookmarkNames) {
+ try {
+ await PlacesUtils.bookmarks.fetch({parentGuid}, b => bookmarksArray.push(b));
+ for (var k=bookmarksArray.length; k > 0; k--) {
+ if (bookmarks[i].title == title) {
+ await PlacesUtils.bookmarks.remove(bookmarksArray[i]);
+ }
+ }
+ } catch(e) {
+ // Bad index errors in some cases
+ }
+ }
+ let guid = generateGuidWithPrefix(BOOKMARK_GUID_PREFIX);
+ await PlacesUtils.bookmarks.insert({
+ url: bookmarks[i].location,
+ title: fixupUTF8(bookmarks[i].name),
+ guid,
+ parentGuid
+ });
+ let newBookmarkId = await PlacesUtils.promiseItemId(guid);
+ annos.setItemAnnotation(newBookmarkId, annotation, "true", 0, annos.EXPIRE_NEVER);
+ } catch(e) {
+ Components.utils.reportError(e);
+ }
+ }
+ }
+}
+
+function errorCritical(e) {
+ var stack = e.stack;
+ if (!stack) {
+ stack = Error().stack;
+ }
+ Components.utils.reportError("CCK2: " + e + "\n\n" + stack);
+}
+
+/**
+ * If the search service is not available, passing function
+ * to search service init
+ */
+function searchInitRun(func)
+{
+ if (Services.search.init && !Services.search.isInitialized)
+ Services.search.init(func);
+ else
+ func();
+}
+
+/**
+ * Remove all extraneous info from a certificates. addCertFromBase64 requires
+ * just the cert with no whitespace or anything.
+ *
+ * @param {String} certificate text
+ * @returns {String} certificate text cleaned up
+ */
+function fixupCert(cert) {
+ var beginCert = "-----BEGIN CERTIFICATE-----";
+ var endCert = "-----END CERTIFICATE-----";
+
+ cert = cert.replace(/[\r\n]/g, "");
+ var begin = cert.indexOf(beginCert);
+ var end = cert.indexOf(endCert);
+ return cert.substring(begin + beginCert.length, end);
+}
+
+/**
+ * Download the given URL to the user's download directory
+ *
+ * @param {String} URL of the file
+ * @param {function} Function to call on success - called with nsIFile
+ * @param {String} Function to call on failure
+ * @param {Object} extraParams passed to callback
+ * @returns {nsIFile} Downloaded file
+ */
+function download(url, successCallback, errorCallback, extraParams) {
+ var uri = Services.io.newURI(url, null, null);
+
+ var channel = Services.io.newChannelFromURI(uri);
+
+ var downloader = Cc["@mozilla.org/network/downloader;1"].createInstance(Ci.nsIDownloader);
+ var listener = {
+ onDownloadComplete: function(downloader, request, ctxt, status, result) {
+ if (Components.isSuccessCode(status)) {
+ result.QueryInterface(Ci.nsIFile);
+ if (result.exists() && result.fileSize > 0) {
+ successCallback(result, extraParams);
+ return;
+ }
+ }
+ errorCallback(new Error("Download failed (" + status + " for " + url));
+ }
+ }
+ downloader.init(listener, null);
+ channel.asyncOpen(downloader, null);
+}
+
+/**
+ * Used to allow the overriding of certificates
+ */
+var SSLExceptions = {
+ getInterface: function(uuid) {
+ return this.QueryInterface(uuid);
+ },
+ QueryInterface: function(uuid) {
+ if (uuid.equals(Ci.nsIBadCertListener2) ||
+ uuid.equals(Ci.nsISupports))
+ return this;
+ throw Components.results.NS_ERROR_NO_INTERFACE;
+ },
+
+ notifyCertProblem: function (socketInfo, status, targetSite) {
+ status.QueryInterface(Ci.nsISSLStatus);
+
+ let flags = 0;
+
+ if (status.isUntrusted)
+ flags |= override.ERROR_UNTRUSTED;
+ if (status.isDomainMismatch)
+ flags |= override.ERROR_MISMATCH;
+ if (status.isNotValidAtThisTime)
+ flags |= override.ERROR_TIME;
+
+ var hostInfo = targetSite.split(":");
+
+ override.rememberValidityOverride(
+ hostInfo[0],
+ hostInfo[1],
+ status.serverCert,
+ flags,
+ false);
+ return true; // Don't show error UI
+ }
+};
+
+var gAboutXHTML = '' +
+'' +
+' ' +
+' ' +
+' ' +
+' ' +
+' ' +
+' ' +
+' ' +
+'
' +
+'
%s
' +
+' ' +
+'
' +
+'
' +
+'
Access to %s has been disabled by your administrator.
' +
+'
' +
+'
' +
+'
' +
+' ' +
+' ' +
+'' +
+'';
+
+/**
+ * Register a component that replaces an about page
+ *
+ * @param {String} The ClassID of the class being registered.
+ * @param {String} The name of the class being registered.
+ * @param {String} The type of about to be disabled (config/addons/privatebrowsing)
+ * @returns {Object} The factory to be used to unregister
+ */
+function disableAbout(aClass, aClassName, aboutType) {
+ var gAbout = {
+ newChannel : function (aURI, aLoadInfo) {
+ var url = "data:text/html," + gAboutXHTML;
+ var channel = Services.io.newChannelFromURIWithLoadInfo(NetUtil.newURI(url), aLoadInfo);
+ channel.originalURI = aURI;
+ return channel;
+ },
+ getURIFlags : function getURIFlags(aURI) {
+ return Ci.nsIAboutModule.HIDE_FROM_ABOUTABOUT;
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIAboutModule]),
+
+ createInstance: function(outer, iid) {
+ return this.QueryInterface(iid);
+ },
+ };
+
+ var registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
+ registrar.registerFactory(aClass, aClassName, "@mozilla.org/network/protocol/about;1?what=" + aboutType, gAbout);
+ return gAbout;
+}
+
+var documentObserver = {
+ observe: function observe(subject, topic, data) {
+ if (subject instanceof Ci.nsIDOMWindow) {
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ if (topic == "chrome-document-global-created" ||
+ (topic == "content-document-global-created" && win.document.documentURIObject.scheme == "about")) {
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var configs = CCK2.getConfigs();
+ for (var id in configs) {
+ var config = configs[id];
+ if (config.hiddenUI) {
+ for (var i=0; i < config.hiddenUI.length; i++) {
+ var uiElements = doc.querySelectorAll(config.hiddenUI[i]);
+ for (var j=0; j < uiElements.length; j++) {
+ var uiElement = uiElements[j];
+ uiElement.setAttribute("hidden", "true");
+ }
+ }
+ }
+ }
+ }, false);
+ }
+ }
+ }
+}
+
+function copyDir(aOriginal, aDestination) {
+ var enumerator = aOriginal.directoryEntries;
+ while (enumerator.hasMoreElements()) {
+ var file = enumerator.getNext().QueryInterface(Components.interfaces.nsIFile);
+ if (file.isDirectory()) {
+ var subdir = aDestination.clone();
+ subdir.append(file.leafName);
+ subdir.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
+ copyDir(file, subdir);
+ } else {
+ file.copyTo(aDestination, null);
+ }
+ }
+}
+
+function loadBundleDirs() {
+ var cck2BundleDir = Services.dirsvc.get("GreD", Ci.nsIFile);
+ cck2BundleDir.append("cck2");
+ cck2BundleDir.append("bundles");
+ if (!cck2BundleDir.exists() || !cck2BundleDir.isDirectory()) {
+ return;
+ }
+ var enumerator = cck2BundleDir.directoryEntries;
+ while (enumerator.hasMoreElements()) {
+ var file = enumerator.getNext().QueryInterface(Ci.nsIFile);
+ var dirName = file.leafName;
+ file.append("chrome.manifest");
+ Components.manager.QueryInterface(Ci.nsIComponentRegistrar).autoRegister(file);
+ file.leafName = "defaults";
+ file.append("preferences");
+ if (!file.exists() || !file.isDirectory()) {
+ continue;
+ }
+ // In order to load prefs, we have to use a chrome URL.
+ // Create a resource that maps to the prefs directory.
+ var prefAlias = Services.io.newFileURI(file);
+ var resource = Services.io.getProtocolHandler("resource")
+ .QueryInterface(Ci.nsIResProtocolHandler);
+ resource.setSubstitution(dirName + "_prefs", prefAlias);
+ var prefEnumerator = file.directoryEntries;
+ while (prefEnumerator.hasMoreElements()) {
+ var prefFile = prefEnumerator.getNext().QueryInterface(Ci.nsIFile);
+ gBundlePrefFiles.push("resource://" + dirName + "_prefs/" + prefFile.leafName);
+ }
+ }
+}
+
+Services.obs.addObserver(CCK2, "distribution-customization-complete", false);
+Services.obs.addObserver(CCK2, "final-ui-startup", false);
+Services.obs.addObserver(CCK2, "browser-ui-startup-complete", false);
+Services.obs.addObserver(documentObserver, "chrome-document-global-created", false);
+Services.obs.addObserver(documentObserver, "content-document-global-created", false);
+Services.obs.addObserver(CCK2, "load-extension-defaults", false);
+try {
+ loadBundleDirs()
+} catch (e) {
+ Components.utils.reportError(e);
+}
diff --git a/windows/build/preferences/cck2/modules/CCK2AboutAddonsOverlay.jsm b/windows/build/preferences/cck2/modules/CCK2AboutAddonsOverlay.jsm
new file mode 100644
index 0000000..ea1bbd1
--- /dev/null
+++ b/windows/build/preferences/cck2/modules/CCK2AboutAddonsOverlay.jsm
@@ -0,0 +1,111 @@
+/* This file overlays about:addons. It does the following: */
+/* Workaround https://bugzilla.mozilla.org/show_bug.cgi?id=1132971 */
+/* Hide the "Install Add-on From File" menu if xpinstall.enabled is false */
+/* Hides the discover pane if xpinstall.enabled is false */
+/* Hides the add-on entry if specified in the CCK2 config */
+
+const EXPORTED_SYMBOLS = [];
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://cck2/CCK2.jsm");
+
+var addonId = "cck2wizard@kaply.com";
+
+var observer = {
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "chrome-document-global-created":
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var url = doc.location.href.split("?")[0].split("#")[0];
+ switch (url) {
+ case "about:addons":
+ case "chrome://mozapps/content/extensions/extensions.xul":
+ var configs = CCK2.getConfigs();
+ var hiddenAddons = [];
+ var requiredAddons = [];
+ for (let id in configs) {
+ var config = configs[id];
+ if (config && "extension" in config && config.extension.hide) {
+ hiddenAddons.push(config.extension.id);
+ }
+ if (config.requiredAddons) {
+ requiredAddons.push.apply(requiredAddons, config.requiredAddons.split(","));
+ }
+ }
+ if (hiddenAddons.length > 0 || requiredAddons.length > 0) {
+ var ss;
+ for (var i = 0; i < doc.styleSheets.length; i++) {
+ if (doc.styleSheets[i].href == "chrome://mozapps/skin/extensions/extensions.css") {
+ ss = doc.styleSheets[i];
+ break;
+ }
+ }
+ for (var i=0; i < hiddenAddons.length; i++) {
+ ss.insertRule("richlistitem[value='" + hiddenAddons[i] + "'] { display: none;}", ss.cssRules.length);
+ }
+ for (var i=0; i < requiredAddons.length; i++) {
+ ss.insertRule("richlistitem[value='" + requiredAddons[i] + "'] button[anonid='disable-btn'] { display: none;}", ss.cssRules.length);
+ ss.insertRule("richlistitem[value='" + requiredAddons[i] + "'] button[anonid='remove-btn'] { display: none;}", ss.cssRules.length);
+ }
+ if (requiredAddons.length > 0) {
+ win.gViewController.commands.cmd_disableItem.origIsEnabled = win.gViewController.commands.cmd_disableItem.isEnabled;
+ win.gViewController.commands.cmd_disableItem.isEnabled = function(aAddon) { if (aAddon && requiredAddons.indexOf(aAddon.id) != -1) return false; return this.origIsEnabled;}
+ win.gViewController.commands.cmd_uninstallItem.origIsEnabled = win.gViewController.commands.cmd_disableItem.isEnabled;
+ win.gViewController.commands.cmd_uninstallItem.isEnabled = function(aAddon) { if (aAddon && requiredAddons.indexOf(aAddon.id) != -1) return false; return this.origIsEnabled;}
+ }
+ }
+ var showDiscoverPane = true;
+ var xpinstallEnabled = true;
+ try {
+ xpinstallEnabled = Services.prefs.getBoolPref("xpinstall.enabled");
+ } catch (e) {}
+ try {
+ showDiscoverPane = Services.prefs.getBoolPref("extensions.getAddons.showPane");
+ } catch (e) {}
+ if (!xpinstallEnabled || !showDiscoverPane) {
+ // Work around Mozilla bug 1132971
+ // Hide the discover pane if it is the selected pane
+ if (E("view-port", doc) && E("view-port", doc).selectedIndex == 0) {
+ try {
+ win.gViewController.loadView("addons://list/extension");
+ } catch (ex) {
+ // This fails with Webconverger installed. Ignore it.
+ }
+ }
+ }
+ if (!xpinstallEnabled) {
+ // Hide the "Install Add-on From File" separator
+ hide(E("utils-installFromFile-separator", doc));
+ // Hide the "Install Add-on From File" menuitem
+ hide(E("utils-installFromFile", doc));
+ win.gDragDrop.onDragOver = function(event) {
+ event.dataTransfer.dropEffect = "none";
+ event.stopPropagation();
+ event.preventDefault();
+ };
+ }
+ break;
+ }
+ }, false);
+ break;
+ }
+ }
+}
+
+Services.obs.addObserver(observer, "chrome-document-global-created", false);
+
+function E(id, context) {
+ var element = context.getElementById(id);
+ return element;
+}
+
+function hide(element) {
+ if (element) {
+ element.setAttribute("hidden", "true");
+ }
+}
diff --git a/windows/build/preferences/cck2/modules/CCK2AboutDialogOverlay.jsm b/windows/build/preferences/cck2/modules/CCK2AboutDialogOverlay.jsm
new file mode 100644
index 0000000..630e27b
--- /dev/null
+++ b/windows/build/preferences/cck2/modules/CCK2AboutDialogOverlay.jsm
@@ -0,0 +1,33 @@
+/* This file is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1139509 */
+/* It bolds the Firefox version in the about dialog and unbolds the distribution information */
+/* It can be removed once Firefox 38 ESR is out of support */
+
+const EXPORTED_SYMBOLS = [];
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+var observer = {
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "chrome-document-global-created":
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var url = doc.location.href.split("?")[0].split("#")[0];
+ switch (url) {
+ case "chrome://browser/content/aboutDialog.xul":
+ doc.querySelector("#version").style.fontWeight = "bold";
+ doc.querySelector("#distribution").style.fontWeight = "normal";
+ doc.querySelector("#distributionId").style.fontWeight = "normal";
+ break;
+ }
+ }, false);
+ break;
+ }
+ }
+}
+
+Services.obs.addObserver(observer, "chrome-document-global-created", false);
diff --git a/windows/build/preferences/cck2/modules/CCK2AboutHomeFramescript.js b/windows/build/preferences/cck2/modules/CCK2AboutHomeFramescript.js
new file mode 100644
index 0000000..98e5b3d
--- /dev/null
+++ b/windows/build/preferences/cck2/modules/CCK2AboutHomeFramescript.js
@@ -0,0 +1,79 @@
+/* This file overrides about:home. It does the following:
+ * Remove the sync button if Sync is disabled
+ * Remove the Addons button if Sync is disabled
+ * Remove the snippets if snippets are disabled
+ */
+
+const EXPORTED_SYMBOLS = [];
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+var configs = null;
+
+var observer = {
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "content-document-global-created":
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var url = doc.location.href.split("?")[0].split("#")[0];
+ switch (url) {
+ case "about:home":
+ case "chrome://browser/content/abouthome/aboutHome.xhtml":
+ if (!configs) {
+ // TODO - Make this Async
+ configs = sendSyncMessage("cck2:get-configs")[0];
+ }
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.disableSync) {
+ remove(E("sync", doc));
+ }
+ if (config.disableAddonsManager) {
+ remove(E("addons", doc));
+ }
+ if (config.disableWebApps) {
+ remove(E("apps", doc));
+ }
+ if (config.removeSnippets) {
+ var snippets = E("snippets", doc);
+ if (snippets) {
+ snippets.style.display = "none";
+ }
+ }
+ if (config.hiddenUI) {
+ for (var i=0; i < config.hiddenUI.length; i++) {
+ var uiElements = doc.querySelectorAll(config.hiddenUI[i]);
+ for (var j=0; j < uiElements.length; j++) {
+ var uiElement = uiElements[j];
+ uiElement.setAttribute("hidden", "true");
+ }
+ }
+ }
+ }
+ break;
+ }
+ }, false);
+ break;
+ }
+ }
+}
+Services.obs.addObserver(observer, "content-document-global-created", false);
+
+addEventListener("unload", function() {
+ Services.obs.removeObserver(observer, "content-document-global-created", false);
+})
+
+function E(id, context) {
+ var element = context.getElementById(id);
+ return element;
+}
+
+function remove(element) {
+ if (element && element.parentNode)
+ element.parentNode.removeChild(element);
+}
diff --git a/windows/build/preferences/cck2/modules/CCK2AboutSupportOverlay.jsm b/windows/build/preferences/cck2/modules/CCK2AboutSupportOverlay.jsm
new file mode 100644
index 0000000..4da8fba
--- /dev/null
+++ b/windows/build/preferences/cck2/modules/CCK2AboutSupportOverlay.jsm
@@ -0,0 +1,62 @@
+/* This file overrides about:support It does the following:
+ * Remove the reset Firefox button if disableResetFirefox is set
+ * Remove the safe mode Button if disableSafeMode is set
+ * Remove the box if both are set
+ */
+
+const EXPORTED_SYMBOLS = [];
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://cck2/CCK2.jsm");
+
+var configs = null;
+
+var observer = {
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "chrome-document-global-created":
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var url = doc.location.href.split("?")[0].split("#")[0];
+ switch (url) {
+ case "about:support":
+ case "chrome://global/content/aboutSupport.xhtml":
+ if (!configs) {
+ configs = CCK2.getConfigs();
+ }
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.disableResetFirefox) {
+ remove(E("reset-box", doc));
+ }
+ if (config.disableSafeMode) {
+ remove(E("safe-mode-box", doc));
+ }
+ if (config.disableResetFirefox &&
+ config.disableSafeMode) {
+ remove(E("action-box", doc));
+ }
+ }
+ break;
+ }
+ }, false);
+ break;
+ }
+ }
+}
+Services.obs.addObserver(observer, "chrome-document-global-created", false);
+
+function E(id, context) {
+ var element = context.getElementById(id);
+ return element;
+}
+
+
+function remove(element) {
+ if (element && element.parentNode)
+ element.parentNode.removeChild(element);
+}
diff --git a/windows/build/preferences/cck2/modules/CCK2BrowserOverlay.jsm b/windows/build/preferences/cck2/modules/CCK2BrowserOverlay.jsm
new file mode 100644
index 0000000..52d59fb
--- /dev/null
+++ b/windows/build/preferences/cck2/modules/CCK2BrowserOverlay.jsm
@@ -0,0 +1,373 @@
+/* This file modifies the main browser window. It does the following:
+ * Goes through the hiddenUI list and hides any UI
+ *
+ */
+
+const EXPORTED_SYMBOLS = [];
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource:///modules/CustomizableUI.jsm");
+Cu.import("resource://gre/modules/PrivateBrowsingUtils.jsm");
+Cu.import("resource://cck2/CCK2.jsm");
+
+var configs = null;
+
+var observer = {
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "chrome-document-global-created":
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var url = doc.location.href.split("?")[0].split("#")[0];
+ switch (url) {
+ case "chrome://browser/content/browser.xul":
+ // Workaround https://bugzilla.mozilla.org/show_bug.cgi?id=1149617
+ var origSetReportPhishingMenu = win.gSafeBrowsing.setReportPhishingMenu;
+ win.gSafeBrowsing.setReportPhishingMenu = function() {
+ try {
+ origSetReportPhishingMenu();
+ } catch (e) {}
+ }
+
+ win.addEventListener("unload", function onUnload(event) {
+ win.removeEventListener("unload", onUnload, false);
+ var panelUIPopup = doc.getElementById("PanelUI-popup");
+ if (panelUIPopup) {
+ E("PanelUI-popup", doc).removeEventListener("popupshowing", onPanelShowing, false);
+ }
+ });
+ var panelUIPopup = doc.getElementById("PanelUI-popup");
+ if (panelUIPopup) {
+ E("PanelUI-popup", doc).addEventListener("popupshowing", onPanelShowing, false);
+ }
+ var appMenuPopup = doc.getElementById("appMenu-popup");
+ if (appMenuPopup) {
+ E("appMenu-popup", doc).addEventListener("popupshowing", onAppMenuShowing, false);
+ }
+ configs = CCK2.getConfigs();
+ for (let id in configs) {
+ config = configs[id];
+ if (config.disablePrivateBrowsing &&
+ PrivateBrowsingUtils.isWindowPrivate(win)) {
+ win.setTimeout(function() {
+ Services.prompt.alert(win, "Private Browsing", "Private Browsing has been disabled by your administrator");
+ win.close();
+ }, 0, false);
+ }
+ if (config.disablePrivateBrowsing) {
+ disablePrivateBrowsing(doc);
+ }
+ if (config.disableSync) {
+ disableSync(doc);
+ }
+ if (config.disableAddonsManager) {
+ disableAddonsManager(doc);
+ }
+ if (config.removeDeveloperTools) {
+ Services.tm.mainThread.dispatch(function() {
+ removeDeveloperTools(doc);
+ }, Ci.nsIThread.DISPATCH_NORMAL);
+ }
+ if (config.disableErrorConsole) {
+ disableErrorConsole(doc);
+ }
+ if (config.disableFirefoxHealthReport) {
+ var healthReportMenu = doc.getElementById("healthReport");
+ if (healthReportMenu) {
+ healthReportMenu.parentNode.removeChild(healthReportMenu);
+ }
+ }
+ if (config.removeSafeModeMenu) {
+ hide(E("helpSafeMode", doc));
+ }
+ if (config.titlemodifier) {
+ doc.getElementById("main-window").setAttribute("titlemodifier", config.titlemodifier);
+ }
+ if (config.removeSetDesktopBackground) {
+ // Because this is on a context menu, we can't use "hidden"
+ if (E("context-setDesktopBackground", doc)) {
+ E("context-setDesktopBackground", doc).setAttribute("style", "display: none;");
+ }
+ }
+ if (config.disableWebApps) {
+ CustomizableUI.destroyWidget("web-apps-button");
+ hide(E("menu_openApps", doc));
+ }
+ if (config.disableHello) {
+ CustomizableUI.destroyWidget("loop-button");
+ hide(E("menu_openLoop", doc));
+ }
+ if (config.disablePocket) {
+ CustomizableUI.destroyWidget("pocket-button");
+ }
+ if (config.disableSharePage) {
+ CustomizableUI.destroyWidget("social-share-button");
+ // Because these are on a context menu, we can't use "hidden"
+ if (E("context-sharelink", doc)) {
+ E("context-sharelink", doc).setAttribute("style", "display: none;");
+ }
+ if (E("context-shareselect", doc)) {
+ E("context-shareselect", doc).setAttribute("style", "display: none;");
+ }
+ if (E("context-shareimage", doc)) {
+ E("context-shareimage", doc).setAttribute("style", "display: none;");
+ }
+ if (E("context-sharevideo", doc)) {
+ E("context-sharevideo", doc).setAttribute("style", "display: none;");
+ }
+ if (E("context-sharepage", doc)) {
+ E("context-sharepage", doc).setAttribute("style", "display: none;");
+ }
+ }
+ if (config.disableSocialAPI) {
+ win.SocialActivationListener = {};
+ }
+ if (config.disableForget) {
+ CustomizableUI.destroyWidget("panic-button");
+ }
+ if (config.hiddenUI) {
+ hideUIElements(doc, config.hiddenUI);
+ }
+ if (config.helpMenu) {
+ // We need to run this function on a delay, because we won't know
+ // if the about menu is hidden for mac until after it is run.
+ Services.tm.mainThread.dispatch(function() {
+ var helpMenuPopup = doc.getElementById("menu_HelpPopup");
+ var menuitem = doc.createElement("menuitem");
+ menuitem.setAttribute("label", config.helpMenu.label);
+ if ("accesskey" in config.helpMenu) {
+ menuitem.setAttribute("accesskey", config.helpMenu.accesskey);
+ }
+ menuitem.setAttribute("oncommand", "openUILink('" + config.helpMenu.url + "');");
+ menuitem.setAttribute("onclick", "checkForMiddleClick(this, event);");
+ if (!E("aboutName", doc) || E("aboutName", doc).hidden) {
+ // Mac
+ helpMenuPopup.appendChild(menuitem);
+ } else {
+ helpMenuPopup.insertBefore(menuitem, E("aboutName", doc));
+ helpMenuPopup.insertBefore(doc.createElement("menuseparator"),
+ E("aboutName", doc));
+ }
+ }, Ci.nsIThread.DISPATCH_NORMAL);
+ }
+ if (config.firstrun || config.upgrade) {
+ if (config.displayBookmarksToolbar || (config.bookmarks && config.bookmarks.toolbar)) {
+ CustomizableUI.setToolbarVisibility("PersonalToolbar", "true");
+ }
+ if (config.displayMenuBar) {
+ CustomizableUI.setToolbarVisibility("toolbar-menubar", "true");
+ }
+ if (config.showSearchBar) {
+ CustomizableUI.addWidgetToArea("search-container", CustomizableUI.AREA_NAVBAR,
+ CustomizableUI.getPlacementOfWidget("urlbar-container").position + 1);
+ }
+ config.firstrun = false;
+ config.upgrade = false;
+ }
+ }
+ break;
+ case "chrome://browser/content/places/places.xul":
+ case "chrome://browser/content/bookmarks/bookmarksPanel.xul":
+ case "chrome://browser/content/history/history-panel.xul":
+ configs = CCK2.getConfigs();
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.disablePrivateBrowsing) {
+ if (E("placesContext_open:newprivatewindow", doc)) {
+ E("placesContext_open:newprivatewindow", doc).setAttribute("style", "display: none;");
+ }
+ }
+ if (config.hiddenUI) {
+ hideUIElements(doc, config.hiddenUI);
+ }
+ }
+ break;
+ }
+ }, false);
+ break;
+ }
+ }
+}
+Services.obs.addObserver(observer, "chrome-document-global-created", false);
+
+function disableSync(doc) {
+ var win = doc.defaultView;
+ if (win.gSyncUI) {
+ var mySyncUI = {
+ init: function() {
+ return;
+ },
+ initUI: function() {
+ return;
+ },
+ updateUI: function() {
+ hide(E("sync-setup-state", doc));
+ hide(E("sync-syncnow-state", doc));
+ hide(E("sync-setup", doc));
+ hide(E("sync-syncnowitem", doc));
+ }
+ }
+ win.gSyncUI = mySyncUI;
+ }
+ CustomizableUI.destroyWidget("sync-button");
+ CustomizableUI.removeWidgetFromArea("sync-button");
+ var toolbox = doc.getElementById("navigator-toolbox");
+ if (toolbox && toolbox.palette) {
+ let element = toolbox.palette.querySelector("#sync-button");
+ if (element) {
+ element.parentNode.removeChild(element);
+ }
+ }
+ hide(E("sync-setup-state", doc));
+ hide(E("sync-syncnow-state", doc));
+ hide(E("sync-setup", doc));
+ hide(E("sync-syncnowitem", doc));
+}
+
+function disablePrivateBrowsing(doc) {
+ disable(E("Tools:PrivateBrowsing", doc));
+ hide(E("menu_newPrivateWindow", doc));
+ // Because this is on a context menu, we can't use "hidden"
+ if (E("context-openlinkprivate", doc))
+ E("context-openlinkprivate", doc).setAttribute("style", "display: none;");
+ if (E("placesContext_open:newprivatewindow", doc))
+ E("placesContext_open:newprivatewindow", doc).setAttribute("style", "display: none;");
+ CustomizableUI.destroyWidget("privatebrowsing-button")
+}
+
+function disableAddonsManager(doc) {
+ hide(E("menu_openAddons", doc));
+ disable(E("Tools:Addons", doc)); // Ctrl+Shift+A
+ CustomizableUI.destroyWidget("add-ons-button")
+}
+
+function removeDeveloperTools(doc) {
+ var win = doc.defaultView;
+ // Need to delay this because devtools is created dynamically
+ win.setTimeout(function() {
+ CustomizableUI.destroyWidget("developer-button")
+ hide(E("webDeveloperMenu", doc));
+ var devtoolsKeyset = doc.getElementById("devtoolsKeyset");
+ if (devtoolsKeyset) {
+ for (var i = 0; i < devtoolsKeyset.childNodes.length; i++) {
+ devtoolsKeyset.childNodes[i].removeAttribute("oncommand");
+ devtoolsKeyset.childNodes[i].removeAttribute("command");
+ }
+ }
+ }, 0);
+ try {
+ doc.getElementById("Tools:ResponsiveUI").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:Scratchpad").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:BrowserConsole").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:BrowserToolbox").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:DevAppsMgr").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:DevToolbar").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:DevToolbox").removeAttribute("oncommand");
+ } catch (e) {}
+ try {
+ doc.getElementById("Tools:DevToolbarFocus").removeAttribute("oncommand");
+ } catch (e) {}
+ CustomizableUI.destroyWidget("developer-button")
+}
+
+function disableErrorConsole(doc) {
+ doc.getElementById("Tools:ErrorConsole").removeAttribute("oncommand");
+}
+
+function onPanelShowing(event) {
+ var configs = CCK2.getConfigs();
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.disableSync) {
+ hide(E("PanelUI-fxa-status", event.target.ownerDocument));
+ hide(E("PanelUI-footer-fxa", event.target.ownerDocument)); // Firefox 42+
+ }
+ }
+}
+
+function onAppMenuShowing(event) {
+ var configs = CCK2.getConfigs();
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.disableSync) {
+ hide(E("appMenu-fxa-container", event.target.ownerDocument));
+ }
+ if (config.removeDeveloperTools) {
+ hide(E("appMenu-developer-button", event.target.ownerDocument));
+ }
+ }
+}
+
+function E(id, context) {
+ var element = context.getElementById(id);
+ return element;
+}
+
+function hide(element) {
+ if (element) {
+ element.setAttribute("hidden", "true");
+ }
+}
+
+function disable(element) {
+ if (element) {
+ element.disabled = true;
+ element.setAttribute("disabled", "true");
+ }
+}
+
+function hideUIElements(doc, hiddenUI) {
+ for (var i=0; i < hiddenUI.length; i++) {
+ var uiElements = doc.querySelectorAll(hiddenUI[i]);
+ // Don't use .hidden since it doesn't work sometimes
+ var style = doc.getElementById("cck2-hidden-style");
+ if (!style) {
+ style = doc.createElementNS("http://www.w3.org/1999/xhtml", "style");
+ style.setAttribute("id", "cck2-hidden-style");
+ style.setAttribute("type", "text/css");
+ doc.documentElement.appendChild(style);
+ }
+ style.textContent = style.textContent + hiddenUI[i] + "{display: none !important;}";
+ if (!uiElements || uiElements.length == 0) {
+ continue;
+ }
+ for (var j=0; j < uiElements.length; j++) {
+ var uiElement = uiElements[j];
+ if (uiElement.nodeName == "menuitem") {
+ uiElement.removeAttribute("key");
+ uiElement.removeAttribute("oncommand");
+ if (uiElement.hasAttribute("command")) {
+ var commandId = uiElement.getAttribute("command");
+ uiElement.removeAttribute("command");
+ var command = doc.getElementById(commandId);
+ command.removeAttribute("oncommand");
+ var keys = doc.querySelectorAll("key[command='" + commandId + "']")
+ for (var k=0; k < keys.length; k++) {
+ keys[k].removeAttribute("command");
+ }
+ }
+ }
+ // Horrible hack to work around the crappy Australis help menu
+ // Items on the menu always show up in the Australis menu, so we have to remove them.
+ if (uiElements[j].parentNode.id == "menu_HelpPopup") {
+ uiElements[j].parentNode.removeChild(uiElements[j]);
+ }
+ }
+ }
+}
diff --git a/windows/build/preferences/cck2/modules/CCK2FileBlock.jsm b/windows/build/preferences/cck2/modules/CCK2FileBlock.jsm
new file mode 100644
index 0000000..5cad7de
--- /dev/null
+++ b/windows/build/preferences/cck2/modules/CCK2FileBlock.jsm
@@ -0,0 +1,47 @@
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+var EXPORTED_SYMBOLS = [];
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+let CCK2FileBlock = {
+ chromeBlacklist: ["browser", "mozapps", "marionette", "specialpowers",
+ "branding", "alerts"],
+ shouldLoad: function(aContentType, aContentLocation, aRequestOrigin, aContext, aMimeTypeGuess, aExtra) {
+ // Prevent the loading of chrome URLs into the main browser window
+ if (aContentLocation.scheme == "chrome") {
+ if (aRequestOrigin &&
+ (aRequestOrigin.spec == "chrome://browser/content/browser.xul" ||
+ aRequestOrigin.scheme == "moz-nullprincipal")) {
+ for (var i=0; i < this.chromeBlacklist.length; i++) {
+ if (aContentLocation.host == this.chromeBlacklist[i]) {
+ if (aContentLocation.spec.includes(".xul")) {
+ return Ci.nsIContentPolicy.REJECT_REQUEST;
+ }
+ }
+ }
+ }
+ }
+ return Ci.nsIContentPolicy.ACCEPT;
+ },
+ shouldProcess: function(aContentType, aContentLocation, aRequestOrigin, aContext, aMimeTypeGuess, aExtra) {
+ return Ci.nsIContentPolicy.ACCEPT;
+ },
+ classDescription: "CCK2 FileBlock Service",
+ contractID: "@kaply.com/cck2-fileblock-service;1",
+ classID: Components.ID('{26e7afc9-e22d-4d12-bb57-c184fe24b828}'),
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPolicy]),
+ createInstance: function(outer, iid) {
+ return this.QueryInterface(iid);
+ },
+};
+
+var registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
+registrar.registerFactory(CCK2FileBlock.classID,
+ CCK2FileBlock.classDescription,
+ CCK2FileBlock.contractID,
+ CCK2FileBlock);
+
+var cm = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager);
+cm.addCategoryEntry("content-policy", CCK2FileBlock.contractID,
+ CCK2FileBlock.contractID, false, true);
diff --git a/windows/build/preferences/cck2/modules/CCK2Framescript.js b/windows/build/preferences/cck2/modules/CCK2Framescript.js
new file mode 100644
index 0000000..fda925c
--- /dev/null
+++ b/windows/build/preferences/cck2/modules/CCK2Framescript.js
@@ -0,0 +1,51 @@
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+Cu.import("resource://gre/modules/Services.jsm");
+
+var disableSearchEngineInstall = false;
+
+var documentObserver = {
+ observe: function observe(subject, topic, data) {
+ if (subject instanceof Ci.nsIDOMWindow && topic == 'content-document-global-created') {
+ var doc = subject.document;
+ doc.addEventListener("DOMContentLoaded", function onLoad(event) {
+ event.target.removeEventListener("DOMContentLoaded", onLoad, false);
+ if (disableSearchEngineInstall) {
+ subject.wrappedJSObject.external.AddSearchProvider = function() {};
+ }
+ if (!doc.documentURI.startsWith("about:")) {
+ return;
+ }
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.hiddenUI) {
+ for (var i=0; i < config.hiddenUI.length; i++) {
+ // Don't use .hidden since it doesn't work sometimes
+ var style = doc.getElementById("cck2-hidden-style");
+ if (!style) {
+ style = doc.createElementNS("http://www.w3.org/1999/xhtml", "style");
+ style.setAttribute("id", "cck2-hidden-style");
+ style.setAttribute("type", "text/css");
+ doc.documentElement.appendChild(style);
+ }
+ style.textContent = style.textContent + config.hiddenUI[i] + "{display: none !important;}";
+ }
+ }
+ }
+ }, false);
+ }
+ }
+}
+
+var configs = sendSyncMessage("cck2:get-configs")[0];
+for (var id in configs) {
+ var config = configs[id];
+ if (config.disableSearchEngineInstall) {
+ disableSearchEngineInstall = true;
+ break;
+ }
+}
+
+Services.obs.addObserver(documentObserver, "content-document-global-created", false);
+addEventListener("unload", function() {
+ Services.obs.removeObserver(documentObserver, "content-document-global-created", false);
+})
diff --git a/windows/build/preferences/cck2/modules/CCK2PreferencesOverlay.jsm b/windows/build/preferences/cck2/modules/CCK2PreferencesOverlay.jsm
new file mode 100644
index 0000000..3f165bd
--- /dev/null
+++ b/windows/build/preferences/cck2/modules/CCK2PreferencesOverlay.jsm
@@ -0,0 +1,123 @@
+/* This file modifies the preferences dialogs. It does the following:
+ * Removes private browsing from the pref UI if it is disabled
+ * Removes Sync from the pref UI if it is diabled
+ * Disables the crash reporter button if crash reporter is disabled
+ * Removed the master password UI if it is disabled
+ * Goes through the hiddenUI list and hides any UI
+ *
+ */
+
+const EXPORTED_SYMBOLS = [];
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://cck2/CCK2.jsm");
+
+var configs = null;
+
+var observer = {
+ observe: function observe(subject, topic, data) {
+ switch (topic) {
+ case "chrome-document-global-created":
+ var win = subject.QueryInterface(Components.interfaces.nsIDOMWindow);
+ win.addEventListener("load", function onLoad(event) {
+ win.removeEventListener("load", onLoad, false);
+ var doc = event.target;
+ var url = doc.location.href.split("?")[0].split("#")[0];
+ switch (url) {
+ case "chrome://browser/content/preferences/preferences.xul":
+ configs = CCK2.getConfigs();
+ win.addEventListener("paneload", function(event) {
+ updatePrefUI(event.target.ownerDocument);
+ }, false);
+ updatePrefUI(doc);
+ for (let id in configs) {
+ var config = configs[id];
+ if (!config.disableSync) {
+ continue;
+ }
+ var prefWindow = E("BrowserPreferences", doc);
+ var paneSyncRadio = doc.getAnonymousElementByAttribute(prefWindow, "pane", "paneSync");
+ hide(paneSyncRadio);
+ var paneDeck = doc.getAnonymousElementByAttribute(prefWindow, "anonid", "paneDeck");
+ var paneSync = E("paneSync", doc);
+ paneSync.removeAttribute("helpTopic");
+ var weavePrefsDeck = E("weavePrefsDeck", doc);
+ if (weavePrefsDeck)
+ weavePrefsDeck.parentNode.removeChild(weavePrefsDeck);
+ if (prefWindow.currentPane == E("paneSync", doc))
+ prefWindow.showPane(E("paneMain", doc));
+ }
+ break;
+ case "about:preferences":
+ case "chrome://browser/content/preferences/in-content/preferences.xul":
+ configs = CCK2.getConfigs();
+ for (let id in configs) {
+ var config = configs[id];
+ if (config.disableSync) {
+ hide(E("category-sync", doc));
+ }
+ }
+ updatePrefUI(doc);
+ break;
+ }
+ }, false);
+ break;
+ }
+ }
+}
+Services.obs.addObserver(observer, "chrome-document-global-created", false);
+
+// The IDs are the same, so I can reuse this for regular and in-content prefs
+function updatePrefUI(doc) {
+ for (var id in configs) {
+ var config = configs[id];
+ if (config.disablePrivateBrowsing) {
+ hide(E("privateBrowsingAutoStart", doc));
+ var privateBrowsingMenu = doc.querySelector("menuitem[value='dontremember']");
+ hide(privateBrowsingMenu, doc);
+ }
+ if (config.disableCrashReporter) {
+ disable(E("submitCrashesBox", doc));
+ }
+ if (config.disableSync) {
+ hide(E("noFxaAccount", doc));
+ hide(E("hasFxaAccount", doc));
+ }
+ if (config.noMasterPassword == true) {
+ hide(E("useMasterPassword", doc));
+ hide(E("changeMasterPassword", doc));
+ }
+ if (config.hiddenUI) {
+ for (var i=0; i < config.hiddenUI.length; i++) {
+ // Don't use .hidden since it doesn't work sometimes
+ var style = doc.getElementById("cck2-hidden-style");
+ if (!style) {
+ style = doc.createElementNS("http://www.w3.org/1999/xhtml", "style");
+ style.setAttribute("id", "cck2-hidden-style");
+ style.setAttribute("type", "text/css");
+ doc.documentElement.appendChild(style);
+ }
+ style.textContent = style.textContent + config.hiddenUI[i] + "{display: none !important;}";
+ }
+ }
+ }
+}
+
+function E(id, context) {
+ var element = context.getElementById(id);
+ return element;
+}
+
+function hide(element) {
+ if (element) {
+ element.setAttribute("hidden", "true");
+ }
+}
+
+function disable(element) {
+ if (element) {
+ element.disabled = true;
+ }
+}
diff --git a/windows/build/preferences/cck2/modules/CTPPermissions.jsm b/windows/build/preferences/cck2/modules/CTPPermissions.jsm
new file mode 100644
index 0000000..862ea48
--- /dev/null
+++ b/windows/build/preferences/cck2/modules/CTPPermissions.jsm
@@ -0,0 +1,123 @@
+/**
+ * Copied from https://github.com/jvillalobos/CTP-Manager/blob/master/extension/modules/permissions.js
+ **/
+
+/**
+ * Copyright 2013 Jorge Villalobos
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ **/
+
+var EXPORTED_SYMBOLS = ["CTP"];
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+
+Components.utils.import("resource://gre/modules/Services.jsm");
+
+var CTP = {
+ /**
+ * Cleans up the plugin name to a more readable form.
+ * Taken from /browser/base/content/pageinfo/permissions.js (Firefox 20)
+ * @param aPluginName the name to clean up.
+ * @return cleaned up plugin name.
+ */
+ makeNicePluginName : function(aPluginName) {
+ let newName =
+ aPluginName.replace(/[\s\d\.\-\_\(\)]+$/, "").
+ replace(/\bplug-?in\b/i, "").trim();
+
+ return newName;
+ },
+
+ /**
+ * Gets the plugin permission string from the tag object. In Firefox 20, this
+ * is the plugin filename. In 21 an above, the file extension is removed and
+ * Flash and Java are special-cased.
+ * @param aTag the tag object with the plugin information.
+ * @return permission string that corresponds to the plugin in the tag.
+ */
+ getPluginPermissionFromTag : function(aTag) {
+ let permission = null;
+ let majorVersion = Services.appinfo.platformVersion.split(".")[0];
+
+ if (21 <= majorVersion) {
+ let mimeTypes = aTag.getMimeTypes();
+
+ if (CTP.isFlashPlugin(mimeTypes)) {
+ permission = "flash";
+ } else if (CTP.isJavaPlugin(mimeTypes)) {
+ permission = "java";
+ } else {
+ let lastPeriod = aTag.filename.lastIndexOf(".");
+
+ permission =
+ ((0 < lastPeriod) ? aTag.filename.substring(0, lastPeriod) :
+ aTag.filename);
+ // Remove digits at the end
+ permission = permission.replace(/[0-9]+$/, "");
+ permission = permission.toLowerCase();
+ }
+ } else {
+ permission = aTag.filename;
+ }
+
+ return permission;
+ },
+
+ /**
+ * Checks if the tag object corresponds to the Java plugin.
+ * @param aMimeTypes the list of MIME types for the plugin.
+ * @return true if the tag corresponds to the Java plugin.
+ */
+ isJavaPlugin : function(aMimeTypes) {
+ let isJava = false;
+ let mimeType;
+
+ for (let i = 0; i < aMimeTypes.length; i++) {
+ mimeType =
+ ((null != aMimeTypes[i].type) ? aMimeTypes[i].type : aMimeTypes[i]);
+
+ if ((0 == mimeType.indexOf("application/x-java-vm")) ||
+ (0 == mimeType.indexOf("application/x-java-applet")) ||
+ (0 == mimeType.indexOf("application/x-java-bean"))) {
+ isJava = true;
+ break;
+ }
+ }
+
+ return isJava;
+ },
+
+ /**
+ * Checks if the tag object corresponds to the Flash plugin.
+ * @param aMimeTypes the list of MIME types for the plugin.
+ * @return true if the tag corresponds to the Flash plugin.
+ */
+ isFlashPlugin : function(aMimeTypes) {
+ let isFlash = false;
+ let mimeType;
+
+ for (let i = 0; i < aMimeTypes.length; i++) {
+ mimeType =
+ ((null != aMimeTypes[i].type) ? aMimeTypes[i].type : aMimeTypes[i]);
+
+ if (0 == mimeType.indexOf("application/x-shockwave-flash")) {
+ isFlash = true;
+ break;
+ }
+ }
+
+ return isFlash;
+ }
+};
diff --git a/windows/build/preferences/cck2/modules/Preferences.jsm b/windows/build/preferences/cck2/modules/Preferences.jsm
new file mode 100644
index 0000000..2100911
--- /dev/null
+++ b/windows/build/preferences/cck2/modules/Preferences.jsm
@@ -0,0 +1,629 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Preferences.
+ *
+ * The Initial Developer of the Original Code is Mozilla.
+ * Portions created by the Initial Developer are Copyright (C) 2008
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Myk Melez
+ * Daniel Aquino
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+let EXPORTED_SYMBOLS = ["Preferences"];
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cr = Components.results;
+const Cu = Components.utils;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+// The minimum and maximum integers that can be set as preferences.
+// The range of valid values is narrower than the range of valid JS values
+// because the native preferences code treats integers as NSPR PRInt32s,
+// which are 32-bit signed integers on all platforms.
+const MAX_INT = Math.pow(2, 31) - 1;
+const MIN_INT = -MAX_INT;
+
+function Preferences(args) {
+ if (isObject(args)) {
+ if (args.branch)
+ this._prefBranch = args.branch;
+ }
+ else if (args)
+ this._prefBranch = args;
+ this.isDefaultBranch = false;
+}
+
+Preferences.prototype = {
+ /**
+ * Get the value of a pref, if any; otherwise return the default value.
+ *
+ * @param prefName {String|Array}
+ * the pref to get, or an array of prefs to get
+ *
+ * @param defaultValue
+ * the default value, if any, for prefs that don't have one
+ *
+ * @returns the value of the pref, if any; otherwise the default value
+ */
+ get: function(prefName, defaultValue) {
+ if (isArray(prefName))
+ return prefName.map(v => this.get(v, defaultValue));
+
+ return this._get(prefName, defaultValue);
+ },
+
+// In all cases below, the preference might exist as a user pref, but not
+// have a default value. In those cases, get* throws. Return the default value.
+ _get: function(prefName, defaultValue) {
+ switch (this._prefSvc.getPrefType(prefName)) {
+ case Ci.nsIPrefBranch.PREF_STRING:
+ try {
+ return this._prefSvc.getComplexValue(prefName, Ci.nsISupportsString).data;
+ } catch (ex) {
+ if (this.isDefaultBranch)
+ return defaultValue;
+ else
+ return this._prefSvc.getCharPref(prefName);
+ }
+
+ case Ci.nsIPrefBranch.PREF_INT:
+ try {
+ return this._prefSvc.getIntPref(prefName);
+ } catch (ex) {
+ return defaultValue;
+ }
+
+ case Ci.nsIPrefBranch.PREF_BOOL:
+ try {
+ return this._prefSvc.getBoolPref(prefName);
+ } catch (ex) {
+ return defaultValue;
+ }
+
+ case Ci.nsIPrefBranch.PREF_INVALID:
+ return defaultValue;
+
+ default:
+ // This should never happen.
+ throw "Error getting pref " + prefName + "; its value's type is " +
+ this._prefSvc.getPrefType(prefName) + ", which I don't know " +
+ "how to handle.";
+ }
+ },
+
+ /**
+ * Set a preference to a value.
+ *
+ * You can set multiple prefs by passing an object as the only parameter.
+ * In that case, this method will treat the properties of the object
+ * as preferences to set, where each property name is the name of a pref
+ * and its corresponding property value is the value of the pref.
+ *
+ * @param prefName {String|Object}
+ * the name of the pref to set; or an object containing a set
+ * of prefs to set
+ *
+ * @param prefValue {String|Number|Boolean}
+ * the value to which to set the pref
+ *
+ * Note: Preferences cannot store non-integer numbers or numbers outside
+ * the signed 32-bit range -(2^31-1) to 2^31-1, If you have such a number,
+ * store it as a string by calling toString() on the number before passing
+ * it to this method, i.e.:
+ * Preferences.set("pi", 3.14159.toString())
+ * Preferences.set("big", Math.pow(2, 31).toString()).
+ */
+ set: function(prefName, prefValue) {
+ if (isObject(prefName)) {
+ for (let [name, value] in Iterator(prefName))
+ this.set(name, value);
+ return;
+ }
+
+ this._set(prefName, prefValue);
+ },
+
+ _set: function(prefName, prefValue) {
+ let prefType;
+ if (typeof prefValue != "undefined" && prefValue != null)
+ prefType = prefValue.constructor.name;
+
+ var existingPrefType = this._prefSvc.getPrefType(prefName);
+ if (existingPrefType != Ci.nsIPrefBranch.PREF_INVALID)
+ {
+ // convert
+ if (existingPrefType == Ci.nsIPrefBranch.PREF_INT && prefType == "String")
+ {
+ prefValue = parseInt(prefValue);
+ if (isNaN(prefValue))
+ throw "Incompatible pref value type - " + prefName;
+ prefType = "Number";
+ }
+ else if (existingPrefType == Ci.nsIPrefBranch.PREF_BOOL && prefType == "String")
+ {
+ if (prefValue == "true")
+ prefValue = true;
+ else if (prefValue == "false")
+ prefValue = false;
+ else
+ throw "Incompatible pref value type - " + prefName;
+ prefType = "Boolean";
+ }
+ else if (existingPrefType == Ci.nsIPrefBranch.PREF_BOOL && prefType == "Number")
+ {
+ prefValue = prefValue != 0;
+ prefType = "Boolean";
+ }
+ }
+
+ switch (prefType) {
+ case "String":
+ {
+ try {
+ this._prefSvc.setStringPref(prefName, prefValue);
+ } catch (e) {
+ try {
+ let string = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
+ string.data = prefValue;
+ this._prefSvc.setComplexValue(prefName, Ci.nsISupportsString, string);
+ } catch (e2) {
+ Components.utils.reportError(e2);
+ }
+ }
+ }
+ break;
+
+ case "Number":
+ // We throw if the number is outside the range, since the result
+ // will never be what the consumer wanted to store, but we only warn
+ // if the number is non-integer, since the consumer might not mind
+ // the loss of precision.
+ if (prefValue > MAX_INT || prefValue < MIN_INT)
+ throw("you cannot set the " + prefName + " pref to the number " +
+ prefValue + ", as number pref values must be in the signed " +
+ "32-bit integer range -(2^31-1) to 2^31-1. To store numbers " +
+ "outside that range, store them as strings.");
+ try {
+ this._prefSvc.setIntPref(prefName, prefValue);
+ } catch (e) {
+ throw new Error(e.toString() + " - " + prefName);
+ }
+ if (prefValue % 1 != 0)
+ Cu.reportError("Warning: setting the " + prefName + " pref to the " +
+ "non-integer number " + prefValue + " converted it " +
+ "to the integer number " + this.get(prefName) +
+ "; to retain fractional precision, store non-integer " +
+ "numbers as strings.");
+ break;
+
+ case "Boolean":
+ this._prefSvc.setBoolPref(prefName, prefValue);
+ break;
+
+ default:
+ throw "can't set pref " + prefName + " to value '" + prefValue +
+ "'; it isn't a String, Number, or Boolean";
+ }
+ },
+
+ /**
+ * Whether or not the given pref has a value. This is different from isSet
+ * because it returns true whether the value of the pref is a default value
+ * or a user-set value, while isSet only returns true if the value
+ * is a user-set value.
+ *
+ * @param prefName {String|Array}
+ * the pref to check, or an array of prefs to check
+ *
+ * @returns {Boolean|Array}
+ * whether or not the pref has a value; or, if the caller provided
+ * an array of pref names, an array of booleans indicating whether
+ * or not the prefs have values
+ */
+ has: function(prefName) {
+ if (isArray(prefName))
+ return prefName.map(this.has, this);
+
+ return this._has(prefName);
+ },
+
+ _has: function(prefName) {
+ return (this._prefSvc.getPrefType(prefName) != Ci.nsIPrefBranch.PREF_INVALID);
+ },
+
+ /**
+ * Whether or not the given pref has a user-set value. This is different
+ * from |has| because it returns true only if the value of the pref is a user-
+ * set value, while |has| returns true if the value of the pref is a default
+ * value or a user-set value.
+ *
+ * @param prefName {String|Array}
+ * the pref to check, or an array of prefs to check
+ *
+ * @returns {Boolean|Array}
+ * whether or not the pref has a user-set value; or, if the caller
+ * provided an array of pref names, an array of booleans indicating
+ * whether or not the prefs have user-set values
+ */
+ isSet: function(prefName) {
+ if (isArray(prefName))
+ return prefName.map(this.isSet, this);
+
+ return (this.has(prefName) && this._prefSvc.prefHasUserValue(prefName));
+ },
+
+ /**
+ * Whether or not the given pref has a user-set value. Use isSet instead,
+ * which is equivalent.
+ * @deprecated
+ */
+ modified: function(prefName) { return this.isSet(prefName) },
+
+ reset: function(prefName) {
+ if (isArray(prefName)) {
+ prefName.map(v => this.reset(v));
+ return;
+ }
+
+ this._reset(prefName);
+ },
+
+ _reset: function(prefName) {
+ try {
+ this._prefSvc.clearUserPref(prefName);
+ }
+ catch(ex) {
+ // The pref service throws NS_ERROR_UNEXPECTED when the caller tries
+ // to reset a pref that doesn't exist or is already set to its default
+ // value. This interface fails silently in those cases, so callers
+ // can unconditionally reset a pref without having to check if it needs
+ // resetting first or trap exceptions after the fact. It passes through
+ // other exceptions, however, so callers know about them, since we don't
+ // know what other exceptions might be thrown and what they might mean.
+ if (ex.result != Cr.NS_ERROR_UNEXPECTED)
+ throw ex;
+ }
+ },
+
+ /**
+ * If you need to know the default values, without resetting the actual
+ * user prefs, you can use this.
+ * @returns {Preferences} a new Preferences object, which accesses
+ * the defaults rather than the user prefs.
+ * *Only* call get() on this.
+ * If you call set(), you will modify the defaults, so don't do that!
+ */
+ get defaults() {
+ // nsIPrefService
+ let defaultBranch = Services.prefs.
+ getDefaultBranch(this._prefBranch).
+ QueryInterface(Ci.nsIPrefBranch);
+ let prefs = new Preferences(this._prefBranch);
+ // override. nasty, but this is internal, so OK.
+ Object.defineProperty(prefs, "_prefSvc", {
+ get: function() {
+ return defaultBranch;
+ }
+ });
+ prefs.isDefaultBranch = true;
+ return prefs;
+ },
+
+ /**
+ * Lock a pref so it can't be changed.
+ *
+ * @param prefName {String|Array}
+ * the pref to lock, or an array of prefs to lock
+ * @param prefValue {String} (optional)
+ * default value of pref to lock only works if prefName isn't an array
+ */
+ lock: function(prefName, prefValue) {
+ if (isArray(prefName))
+ prefName.map(this.lock, this);
+ else if (typeof prefValue != "undefined")
+ this.defaults.set(prefName, prefValue);
+
+ this._prefSvc.lockPref(prefName);
+ },
+
+ /**
+ * Unlock a pref so it can be changed.
+ *
+ * @param prefName {String|Array}
+ * the pref to lock, or an array of prefs to lock
+ */
+ unlock: function(prefName) {
+ if (isArray(prefName))
+ prefName.map(this.unlock, this);
+
+ this._prefSvc.unlockPref(prefName);
+ },
+
+ /**
+ * Whether or not the given pref is locked against changes and
+ * if it is set to the passedi n value
+ *
+ * @param prefName {String|Array}
+ * the pref to check, or an array of prefs to check
+ * @param prefValue {String|Number|Boolean}}
+ * the pref value to compare against
+ *
+ * @returns {Boolean|Array}
+ * whether or not the pref is locked; or, if the caller
+ * provided an array of pref names, an array of booleans indicating
+ * whether or not the prefs are locked
+ * If a pref value was specified returns whether or not the pref
+ * was locked and equal to the passed in value.
+ */
+ locked: function(prefName, prefValue) {
+ if (isArray(prefName))
+ return prefName.map(this.locked, this);
+
+ if (prefValue)
+ return this._prefSvc.prefIsLocked(prefName) && (this.get(prefName) == prefValue);
+ else
+ return this._prefSvc.prefIsLocked(prefName);
+ },
+
+ /**
+ * Start observing a pref.
+ *
+ * The callback can be a function or any object that implements nsIObserver.
+ * When the callback is a function and thisObject is provided, it gets called
+ * as a method of thisObject.
+ *
+ * @param prefName {String}
+ * the name of the pref to observe
+ *
+ * @param callback {Function|Object}
+ * the code to notify when the pref changes;
+ *
+ * @param thisObject {Object} [optional]
+ * the object to use as |this| when calling a Function callback;
+ *
+ * @returns the wrapped observer
+ */
+ observe: function(prefName, callback, thisObject) {
+ let fullPrefName = this._prefBranch + (prefName || "");
+
+ let observer = new PrefObserver(fullPrefName, callback, thisObject);
+ Preferences._prefSvc.addObserver(fullPrefName, observer, true);
+ observers.push(observer);
+
+ return observer;
+ },
+
+ /**
+ * Stop observing a pref.
+ *
+ * You must call this method with the same prefName, callback, and thisObject
+ * with which you originally registered the observer. However, you don't have
+ * to call this method on the same exact instance of Preferences; you can call
+ * it on any instance. For example, the following code first starts and then
+ * stops observing the "foo.bar.baz" preference:
+ *
+ * let observer = function() {...};
+ * Preferences.observe("foo.bar.baz", observer);
+ * new Preferences("foo.bar.").ignore("baz", observer);
+ *
+ * @param prefName {String}
+ * the name of the pref being observed
+ *
+ * @param callback {Function|Object}
+ * the code being notified when the pref changes
+ *
+ * @param thisObject {Object} [optional]
+ * the object being used as |this| when calling a Function callback
+ */
+ ignore: function(prefName, callback, thisObject) {
+ let fullPrefName = this._prefBranch + (prefName || "");
+
+ // This seems fairly inefficient, but I'm not sure how much better we can
+ // make it. We could index by fullBranch, but we can't index by callback
+ // or thisObject, as far as I know, since the keys to JavaScript hashes
+ // (a.k.a. objects) can apparently only be primitive values.
+ let [observer] = observers.filter(v => v.prefName == fullPrefName &&
+ v.callback == callback &&
+ v.thisObject == thisObject);
+
+ if (observer) {
+ Preferences._prefSvc.removeObserver(fullPrefName, observer);
+ observers.splice(observers.indexOf(observer), 1);
+ }
+ },
+
+ /**
+ * Same as observe(), but automatically unregisters itself when
+ * the window closes, saving you from writing an unload handler and
+ * calling ignore().
+ * @param win {nsIDOMWindow} your |window|
+ */
+ observeAuto: function(win, prefName, callback, thisObject) {
+ if (!win instanceof Ci.nsIDOMWindow)
+ throw "Need your |window| as first parameter";
+ this.observe(prefName, callback, thisObject);
+ var self = this;
+ win.addEventListener("unload", function()
+ {
+ self.ignore(prefName, callback, thisObject);
+ }, false);
+ win = null; // don't let closure hold on to window unnecessarily
+ },
+
+ resetBranch: function(prefBranch) {
+ try {
+ this._prefSvc.resetBranch(prefBranch);
+ }
+ catch(ex) {
+ // The current implementation of nsIPrefBranch in Mozilla
+ // doesn't implement resetBranch, so we do it ourselves.
+ if (ex.result == Cr.NS_ERROR_NOT_IMPLEMENTED)
+ this.reset(this._prefSvc.getChildList(prefBranch, []));
+ else
+ throw ex;
+ }
+ },
+
+ /**
+ * Returns all child prefs of this pref branch.
+ * This equals nsIPrefBranch.getChildList().
+ * This allows you to do e.g.
+ * var myPrefs = new Preferences("extensions.cooler.");
+ * var contents = myPrefs.branch("contents.");
+ * for each (let prefname in contents.childPrefNames())
+ * dump("have " + contents.get(prefname) + " " + prefname + "\n");
+ *
+ * @returns {Array of String} The names of the children,
+ * without the base pref branch, but with subbranch.
+ */
+ childPrefNames : function() {
+ return this._prefSvc.getChildList("", []);
+ },
+
+ /**
+ * Returns an nsIPrefBranch for the pref branch that this object stands for.
+ * You can use this to use functions that are not supported here.
+ * @returns {nsIPrefBranch}
+ */
+ get mozillaPrefBranch() {
+ return this._prefSvc;
+ },
+
+ /**
+ * Returns the base pref name that this object stands for.
+ * E.g. "extensions.yourcooler.";
+ * @returns {String}
+ */
+ get prefBranchName() {
+ return this._prefBranch;
+ },
+
+ /**
+ * Returns an Preferences object for an sub pref branch
+ * underneath the current pref branch.
+ * @param subbranch {String} Will be appended to the
+ * current pref branch. Don't forget the trailing dot,
+ * where necessary.
+ * E.g. "contents."
+ * @returns {Preferences}
+ */
+ branch : function(subbranch) {
+ return new Preferences(this._prefBranch + subbranch);
+ },
+
+ /**
+ * The branch of the preferences tree to which this instance provides access.
+ * @private
+ */
+ _prefBranch: "",
+
+ /**
+ * Preferences Service
+ * @private
+ */
+ get _prefSvc() {
+ // nsIPrefService
+ let prefSvc = Services.prefs.
+ getBranch(this._prefBranch).
+ QueryInterface(Ci.nsIPrefBranch);
+ Object.defineProperty(this, "_prefSvc", {
+ get: function() {
+ return prefSvc;
+ }
+ });
+ return this._prefSvc;
+ }
+
+};
+
+// Give the constructor the same prototype as its instances, so users can access
+// preferences directly via the constructor without having to create an instance
+// first.
+Preferences.__proto__ = Preferences.prototype;
+
+/**
+ * A cache of pref observers.
+ *
+ * We use this to remove observers when a caller calls Preferences::ignore.
+ *
+ * All Preferences instances share this object, because we want callers to be
+ * able to remove an observer using a different Preferences object than the one
+ * with which they added it. That means we have to identify the observers
+ * in this object by their complete pref name, not just their name relative to
+ * the root branch of the Preferences object with which they were created.
+ */
+let observers = [];
+
+function PrefObserver(prefName, callback, thisObject) {
+ this.prefName = prefName;
+ this.callback = callback;
+ this.thisObject = thisObject;
+}
+
+PrefObserver.prototype = {
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
+
+ observe: function(subject, topic, data) {
+ // The pref service only observes whole branches, but we only observe
+ // individual preferences, so we check here that the pref that changed
+ // is the exact one we're observing (and not some sub-pref on the branch).
+ if (data != this.prefName)
+ return;
+
+ if (typeof this.callback == "function") {
+ let prefValue = Preferences.get(this.prefName);
+
+ if (this.thisObject)
+ this.callback.call(this.thisObject, prefValue);
+ else
+ this.callback(prefValue);
+ }
+ else // typeof this.callback == "object" (nsIObserver)
+ this.callback.observe(subject, topic, data);
+ }
+};
+
+function isArray(val) {
+ // We can't check for |val.constructor == Array| here, since the value
+ // might be from a different context whose Array constructor is not the same
+ // as ours, so instead we match based on the name of the constructor.
+ return (typeof val != "undefined" && val != null && typeof val == "object" &&
+ val.constructor.name == "Array");
+}
+
+function isObject(val) {
+ // We can't check for |val.constructor == Object| here, since the value
+ // might be from a different context whose Object constructor is not the same
+ // as ours, so instead we match based on the name of the constructor.
+ return (typeof val != "undefined" && val != null && typeof val == "object" &&
+ val.constructor.name == "Object");
+}
diff --git a/windows/build/preferences/cck2/modules/Timer.jsm b/windows/build/preferences/cck2/modules/Timer.jsm
new file mode 100644
index 0000000..d405b28
--- /dev/null
+++ b/windows/build/preferences/cck2/modules/Timer.jsm
@@ -0,0 +1,43 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+/**
+ * JS module implementation of nsIDOMJSWindow.setTimeout and clearTimeout.
+ */
+
+this.EXPORTED_SYMBOLS = ["setTimeout", "clearTimeout"];
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cu = Components.utils;
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+// This gives us >=2^30 unique timer IDs, enough for 1 per ms for 12.4 days.
+let gNextTimeoutId = 1; // setTimeout must return a positive integer
+
+let gTimeoutTable = new Map(); // int -> nsITimer
+
+this.setTimeout = function setTimeout(aCallback, aMilliseconds) {
+ let id = gNextTimeoutId++;
+ let args = Array.slice(arguments, 2);
+ let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ timer.initWithCallback(function setTimeout_timer() {
+ gTimeoutTable.delete(id);
+ aCallback.apply(null, args);
+ }, aMilliseconds, timer.TYPE_ONE_SHOT);
+
+ gTimeoutTable.set(id, timer);
+ return id;
+}
+
+this.clearTimeout = function clearTimeout(aId) {
+ if (gTimeoutTable.has(aId)) {
+ gTimeoutTable.get(aId).cancel();
+ gTimeoutTable.delete(aId);
+ }
+}
+
diff --git a/windows/build/preferences/cck2/modules/Utils.jsm b/windows/build/preferences/cck2/modules/Utils.jsm
new file mode 100644
index 0000000..559bb0b
--- /dev/null
+++ b/windows/build/preferences/cck2/modules/Utils.jsm
@@ -0,0 +1,10 @@
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+var EXPORTED_SYMBOLS = ["errorCritical"];
+
+Components.utils.import("resource://gre/modules/Services.jsm");
+
+function errorCritical(e)
+{
+ Services.prompt.alert(null, "", e);
+}
diff --git a/windows/build/preferences/cck2/resources/certs/purplei2p_ca.pem b/windows/build/preferences/cck2/resources/certs/purplei2p_ca.pem
new file mode 100644
index 0000000..bbbcc77
--- /dev/null
+++ b/windows/build/preferences/cck2/resources/certs/purplei2p_ca.pem
@@ -0,0 +1,23 @@
+-----BEGIN CERTIFICATE-----
+MIID7DCCAtSgAwIBAgIJAKXaTovgoTIUMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD
+VQQGEwJXVzEUMBIGA1UECAwLSTJQIE5ldHdvcmsxEjAQBgNVBAoMCVB1cnBsZUky
+UDEqMCgGA1UEAwwhUHVycGxlSTJQIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR0w
+GwYJKoZIhvcNAQkBFg5yNHNhc0BtYWlsLmkycDAeFw0xODA4MjQyMTQ3NTJaFw0y
+MzA4MjMyMTQ3NTJaMIGCMQswCQYDVQQGEwJXVzEUMBIGA1UECAwLSTJQIE5ldHdv
+cmsxEjAQBgNVBAoMCVB1cnBsZUkyUDEqMCgGA1UEAwwhUHVycGxlSTJQIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MR0wGwYJKoZIhvcNAQkBFg5yNHNhc0BtYWlsLmky
+cDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALAZnN/U5bgkmiBqp/Np
+yiMOkUPjr2tLhV78Oba46xDLA6AiQ7yTPg+/ZYPIfbF2dPBTpfgGdly2M1xymRKc
+3Pa+IUXkLw6oCA+lFzOFW0Swtekk9HRAgGyHgj6/Hvagva5Wer4HJIO1qRsFPew+
+XcM3uhhiXoiO8o+YGpJ/7kz0gED3p2b9OVsLPd8G/GfdR3miD+Au+kUx/27z/WdJ
+ISfFILFnYeYZGffrpRcFtoGwuZUCugwnbLtpQpNKuGq8jDidm1v6Rb85JmkoH3Sg
+lRaX1MK0aPhM4WfCf7aWCNe669FAWPNB3Ya2lue7ewPLI84ZUEqcoJwmWn2ci2SU
+EXUCAwEAAaNjMGEwHQYDVR0OBBYEFG3hwzikpXqMasw678OHM8uLyjEoMB8GA1Ud
+IwQYMBaAFG3hwzikpXqMasw678OHM8uLyjEoMA8GA1UdEwQIMAYBAf8CAQAwDgYD
+VR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQA07URxJMI/Ta9y1wIg+k7o
+1aHXsl6YOXmd2ymhKZhZHrZlutE2U19IQSoEV0SBddP9D05xD6Ovsrwo7caeYzNt
++2DJnlJ2IY61NqYUIDEoJyNPL/S7WleH+xO+bcSqWvbntTNYAD6WQVfHCAimVE6P
+RnSZGqG089i84DRCyrh/6F1OxnBd6j14z+2ctQD+h6NlQXiCAUIwzVirYoE7oGpH
+Xta7Ei+RDvBXLXLAQRdXpzSP/Ddf7MCJzmH3VYAy+0sVuHr09hpFMtC59hTrdLVD
+/qma0eKrBr1DGH6QrZMZDqpNfv4wUPyVQBsRbbn2/1fL9IqK43CIj8RUllCOsmyU
+-----END CERTIFICATE-----
diff --git a/windows/build/preferences/i2pdbrowser.cfg b/windows/build/preferences/i2pdbrowser.cfg
index ebcc93f..dfaf614 100644
--- a/windows/build/preferences/i2pdbrowser.cfg
+++ b/windows/build/preferences/i2pdbrowser.cfg
@@ -17,38 +17,39 @@
* For more information, see http://www.mozilla.org/unix/customizing.html#prefs
*/
-lockPref("accessibility.force_disabled", 1);
-pref("app.normandy.first_run", false);
-lockPref("app.update.auto", false);
-lockPref("app.update.channel", "no");
-lockPref("app.update.enabled", false);
-lockPref("app.update.interval", 0);
-lockPref("app.update.service.enabled", false);
-pref("app.update.staging.enabled", false);
-pref("app.update.timer", 0);
+// defaultPref("browser.startup.firstrunSkipsHomepage", false);
+// pref("browser.display.use_document_fonts", 0);
+// pref("browser.urlbar.suggest.history", false);
+// pref("dom.indexedDB.enabled", false);
+// pref("gfx.font_rendering.opentype_svg.enabled", false);
+// pref("javascript.options.asmjs", false);
+// pref("media.gmp-provider.enabled", false);
+// pref("network.cookie.cookieBehavior", 1);
+// pref("network.cookie.lifetimePolicy", 2);
+// pref("network.cookie.thirdparty.sessionOnly", true);
+// pref("network.dns.blockDotOnion", true);
+// pref("network.http.referer.spoofSource", true);
+// pref("network.http.referer.XOriginPolicy", 2);
+// pref("plugin.state.flash", 0);
+// pref("privacy.clearOnShutdown.cache", true);
+// pref("privacy.clearOnShutdown.cookies", true);
+// pref("privacy.clearOnShutdown.downloads", true);
+// pref("privacy.clearOnShutdown.formdata", true);
+// pref("privacy.clearOnShutdown.history", true);
+// pref("privacy.clearOnShutdown.offlineApps", true);
+// pref("privacy.clearOnShutdown.openWindows", true);
+// pref("privacy.clearOnShutdown.sessions", true);
+// pref("privacy.donottrackheader.enabled", true); // doesn't make sense anyway
+// pref("privacy.sanitize.sanitizeOnShutdown", true);
+// pref("shumway.disabled", true);
defaultPref("beacon.enabled", false);
-pref("breakpad.reportURL", "");
-pref("browser.aboutHomeSnippets.updateUrl", "");
defaultPref("browser.cache.disk.capacity", 131072);
defaultPref("browser.casting.enabled", false);
-pref("browser.crashReports.unsubmittedCheck.enabled", false);
-// pref("browser.display.use_document_fonts", 0);
-pref("browser.download.manager.retention", 0);
defaultPref("browser.download.useDownloadDir", false);
defaultPref("browser.feeds.showFirstRunUI", false);
defaultPref("browser.fixup.alternate.enabled", false);
-pref("browser.fixup.hide_user_pass", true);
defaultPref("browser.formfill.enable", false);
-// PREF: Delete Search and Form History
defaultPref("browser.formfill.expire_days", 0);
-// PREF: Delete temporary files on exit
-pref("browser.helperApps.deleteTempFileOnExit", true);
-lockPref("browser.newtabpage.activity-stream.default.sites", "http://i2pd.i2p/,http://333.i2p/,http://inr.i2p/,http://102chan.i2p/,http://flibusta.i2p/,http://fsoc.i2p/,http://lifebox.i2p/,http://onelon.i2p/,http://wiki.ilita.i2p/");
-lockPref("browser.newtabpage.activity-stream.feeds.section.highlights", false);
-lockPref("browser.newtabpage.activity-stream.feeds.snippets", false);
-lockPref("browser.newtabpage.activity-stream.showSearch", false);
-pref("browser.newtabpage.activity-stream.topSitesRows", 2);
-pref("browser.newtabpage.enhanced", false);
defaultPref("browser.newtabpage.introShown", true);
defaultPref("browser.onboarding.tour.onboarding-tour-addons.completed", true);
defaultPref("browser.onboarding.tour.onboarding-tour-customize.completed", true);
@@ -56,13 +57,7 @@ defaultPref("browser.onboarding.tour.onboarding-tour-default-browser.completed",
defaultPref("browser.onboarding.tour.onboarding-tour-performance.completed", true);
defaultPref("browser.onboarding.tour.onboarding-tour-private-browsing.completed", true);
defaultPref("browser.onboarding.tour.onboarding-tour-screenshots.completed", true);
-// PREF: Do not create screenshots of visited pages
-pref("browser.pagethumbnails.capturing_disabled", true);
-pref("browser.places.smartBookmarksVersion", -1);
defaultPref("browser.pocket.enabled", false);
-pref("browser.pocket.useLocaleList", false);
-pref("browser.reader.detectedFirstArticle", false);
-pref("browser.rights.3.shown", true);
defaultPref("browser.safebrowsing.appRepURL", "");
defaultPref("browser.safebrowsing.blockedURIs.enabled", false);
defaultPref("browser.safebrowsing.downloads.enabled", false);
@@ -89,60 +84,166 @@ defaultPref("browser.safebrowsing.reportURL", "");
defaultPref("browser.safebrowsing.updateURL", "");
defaultPref("browser.safebrowsing.warning.infoURL", "");
defaultPref("browser.search.countryCode", "US");
-defaultPref("browser.search.defaultenginename", "DuckDuckGo");
+defaultPref("browser.search.defaultenginename", "YaCy 'legwork'");
+defaultPref("browser.search.geoip.url", "");
defaultPref("browser.search.geoSpecificDefaults", false);
defaultPref("browser.search.geoSpecificDefaults.url", "");
-defaultPref("browser.search.geoip.url", "");
-defaultPref("browser.search.order.1", "DuckDuckGo");
+defaultPref("browser.search.hiddenOneOffs", "Amazon.com,Bing,DuckDuckGo,eBay,Google,Twitter,Wikipedia (en)");
+defaultPref("browser.search.official", false);
+defaultPref("browser.search.order.1", "YaCy 'legwork'");
defaultPref("browser.search.redirectWindowsSearch", false);
defaultPref("browser.search.region", "US");
defaultPref("browser.search.searchEnginesURL", "");
defaultPref("browser.search.suggest.enabled", false);
defaultPref("browser.search.update", false);
+pref("browser.search.widget.inNavBar", true);
+defaultPref("browser.shell.checkDefaultBrowser", false);
+defaultPref("browser.uitour.enabled", false);
+defaultPref("browser.urlbar.suggest.searches", false);
+defaultPref("datareporting.healthreport.about.reportUrl", "");
+defaultPref("datareporting.healthreport.about.reportUrlUnified", "");
+defaultPref("datareporting.healthreport.documentServerURI", "");
+defaultPref("datareporting.healthreport.pendingDeleteRemoteData", true);
+defaultPref("datareporting.healthreport.service.firstRun", false);
+defaultPref("datareporting.healthreport.uploadEnabled", false);
+defaultPref("extensions.update.enabled", false);
+defaultPref("geo.enabled", false);
+defaultPref("geo.wifi.uri", "");
+defaultPref("intl.locale.matchOS", true);
+defaultPref("media.eme.enabled", false);
+defaultPref("media.getusermedia.audiocapture.enabled", false);
+defaultPref("media.getusermedia.screensharing.enabled", false);
+defaultPref("media.navigator.enabled", false);
+defaultPref("media.navigator.video.enabled", false);
+defaultPref("media.peerconnection.enabled", false);
+defaultPref("media.peerconnection.ice.no_host", true);
+defaultPref("media.video_stats.enabled", false);
+defaultPref("media.webspeech.recognition.enable", false);
+defaultPref("media.webspeech.synth.enabled", false);
+defaultPref("network.dns.disableIPv6", true);
+defaultPref("network.dns.disableprefetch", true);
+defaultPref("network.dns.disablePrefetchFromHTTPS", true);
+defaultPref("network.prefetch-next", false);
+defaultPref("network.proxy.backup.ftp", "127.0.0.1");
+defaultPref("network.proxy.backup.ftp_port", 4444);
+defaultPref("network.proxy.backup.socks", "127.0.0.1");
+defaultPref("network.proxy.backup.socks_port", 4444);
+defaultPref("network.proxy.backup.ssl", "127.0.0.1");
+defaultPref("network.proxy.backup.ssl_port", 4444);
+defaultPref("network.proxy.ftp", "127.0.0.1");
+defaultPref("network.proxy.ftp_port", 4444);
+defaultPref("network.proxy.http", "127.0.0.1");
+defaultPref("network.proxy.http_port", 4444);
+defaultPref("network.proxy.share_proxy_settings", true);
+defaultPref("network.proxy.socks", "127.0.0.1");
+defaultPref("network.proxy.socks_port", 4444);
+defaultPref("network.proxy.socks_remote_dns", true);
+defaultPref("network.proxy.ssl", "127.0.0.1");
+defaultPref("network.proxy.ssl_port", 4444);
+defaultPref("pdfjs.disabled", true);
+defaultPref("pdfjs.enableWebGL", false);
+defaultPref("permissions.default.camera", 2);
+defaultPref("permissions.default.desktop-notification", 2);
+defaultPref("permissions.default.geo", 2);
+defaultPref("permissions.default.microphone", 2);
+defaultPref("plugin.default_plugin_disabled", true);
+defaultPref("plugin.state.java", 0);
+defaultPref("plugin.state.libgnome-shell-browser-plugin", 0);
+defaultPref("plugins.click_to_play", true);
+defaultPref("plugins.load_appdir_plugins", false);
+defaultPref("plugins.update.notifyUser", false);
+defaultPref("plugins.update.url", "");
+defaultPref("privacy.resistFingerprinting", true);
+defaultPref("privacy.spoof_english", 2);
+defaultPref("privacy.trackingprotection.enabled", true);
+defaultPref("privacy.trackingprotection.pbmode.enabled", true);
+defaultPref("security.insecure_field_warning.contextual.enabled", false);
+defaultPref("security.insecure_password.ui.enabled", false);
+defaultPref("services.blocklist.update_enabled", false);
+defaultPref("services.sync.prefs.sync.browser.search.update", false);
+defaultPref("services.sync.prefs.sync.extensions.update.enabled", false);
+defaultPref("startup.homepage_welcome_url", "http://i2pd.i2p/");
+defaultPref("toolkit.telemetry.archive.enabled", false);
+defaultPref("toolkit.telemetry.optoutSample", false);
+defaultPref("toolkit.telemetry.reportingpolicy.firstRun", false);
+defaultPref("toolkit.telemetry.unified", false);
+defaultPref("toolkit.telemetry.unifiedIsOptIn", true);
+defaultPref("webgl.disable-extensions", true);
+defaultPref("webgl.disable-fail-if-major-performance-caveat", true);
+defaultPref("webgl.disabled", true);
+defaultPref("webgl.enable-debug-renderer-info", false);
+defaultPref("webgl.min_capability_mode", true);
+lockPref("accessibility.force_disabled", 1);
+lockPref("app.update.auto", false);
+lockPref("app.update.channel", "no");
+lockPref("app.update.enabled", false);
+lockPref("app.update.interval", 0);
+lockPref("app.update.service.enabled", false);
+lockPref("browser.newtabpage.activity-stream.default.sites", "http://i2pd.i2p/,http://333.i2p/,http://inr.i2p/,http://102chan.i2p/,http://flibusta.i2p/,http://fsoc.i2p/,http://lifebox.i2p/,http://onelon.i2p/,http://wiki.ilita.i2p/");
+lockPref("browser.newtabpage.activity-stream.feeds.section.highlights", false);
+lockPref("browser.newtabpage.activity-stream.feeds.snippets", false);
+defaultPref("browser.newtabpage.activity-stream.showSearch", true);
+lockPref("browser.newtabpage.activity-stream.telemetry", false);
+lockPref("browser.tabs.crashReporting.sendReport", false);
+lockPref("browser.usedOnWindows10", false);
+lockPref("browser.usedOnWindows10.introURL", "");
+lockPref("camera.control.face_detection.enabled", false);
+lockPref("datareporting.healthreport.service.enabled", false);
+lockPref("general.platform.override", "Win32");
+lockPref("general.useragent.locale", "en-US");
+lockPref("general.useragent.override", "Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0");
+lockPref("geo.wifi.logging.enabled", false);
+lockPref("identity.fxaccounts.enabled", false);
+lockPref("network.proxy.type", 1);
+lockPref("services.sync.enabled", false);
+lockPref("toolkit.telemetry.enabled", false);
+lockPref("toolkit.telemetry.server", "");
+defaultPref("app.normandy.first_run", false);
+pref("app.update.staging.enabled", false);
+pref("app.update.timer", 0);
+pref("breakpad.reportURL", "");
+pref("browser.aboutHomeSnippets.updateUrl", "");
+pref("browser.cache.offline.enable", false);
+pref("browser.crashReports.unsubmittedCheck.enabled", false);
+pref("browser.download.manager.retention", 0);
+pref("browser.fixup.hide_user_pass", true);
+pref("browser.helperApps.deleteTempFileOnExit", true);
+pref("browser.newtabpage.activity-stream.topSitesRows", 2);
+pref("browser.newtabpage.enhanced", false);
+pref("browser.pagethumbnails.capturing_disabled", true);
+pref("browser.places.smartBookmarksVersion", -1);
+pref("browser.pocket.useLocaleList", false);
+pref("browser.reader.detectedFirstArticle", false);
+pref("browser.rights.3.shown", true);
+pref("browser.selfsupport.url", "");
pref("browser.send_pings", false);
pref("browser.send_pings.require_same_host", true);
-pref("browser.selfsupport.url", "");
-defaultPref("browser.shell.checkDefaultBrowser", false);
-//defaultPref("browser.startup.firstrunSkipsHomepage", false);
pref("browser.startup.homepage", "http://i2pd.i2p/");
pref("browser.tabs.closeWindowWithLastTab", false);
-lockPref("browser.tabs.crashReporting.sendReport", false);
pref("browser.tabs.loadInBackground", true);
-defaultPref("browser.uitour.enabled", false);
pref("browser.urlbar.filter.javascript", true);
pref("browser.urlbar.formatting.enabled", false);
pref("browser.urlbar.maxRichResults", 12);
-// pref("browser.urlbar.suggest.history", false);
-defaultPref("browser.urlbar.suggest.searches", false);
+pref("browser.urlbar.speculativeConnect.enabled", false);
pref("browser.urlbar.trimURLs", false);
-lockPref("browser.usedOnWindows10", false);
-lockPref("browser.usedOnWindows10.introURL", "");
-lockPref("camera.control.face_detection.enabled", false);
pref("canvas.capturestream.enabled", false);
pref("clipboard.autocopy", false);
-defaultPref("datareporting.healthreport.about.reportUrl", "");
-defaultPref("datareporting.healthreport.about.reportUrlUnified", "");
-defaultPref("datareporting.healthreport.documentServerURI", "");
-defaultPref("datareporting.healthreport.pendingDeleteRemoteData", true);
-lockPref("datareporting.healthreport.service.enabled", false);
-defaultPref("datareporting.healthreport.service.firstRun", false);
-defaultPref("datareporting.healthreport.uploadEnabled", false);
pref("datareporting.policy.dataSubmissionEnabled", false);
pref("datareporting.policy.dataSubmissionEnabled.v2", false);
pref("datareporting.policy.dataSubmissionPolicyAccepted", false);
pref("datareporting.policy.dataSubmissionPolicyBypassAcceptance", false);
pref("datareporting.policy.dataSubmissionPolicyNotifiedTime", "0");
-pref("datareporting.policy.dataSubmissionPolicyResponseType", "accepted-info-bar-dismissed");
pref("datareporting.policy.dataSubmissionPolicyResponseTime", "0");
+pref("datareporting.policy.dataSubmissionPolicyResponseType", "accepted-info-bar-dismissed");
pref("datareporting.policy.firstRunTime", "0");
pref("datareporting.sessions.current.clean", true);
pref("device.sensors.enabled", false);
pref("devtools.chrome.enabled", false);
-pref("devtools.debugger.remote-enabled", false);
pref("devtools.debugger.force-local", true);
-pref("devtools.webide.enabled", false);
+pref("devtools.debugger.remote-enabled", false);
pref("devtools.webide.autoinstallADBHelper", false);
pref("devtools.webide.autoinstallFxdtAdapters", false);
+pref("devtools.webide.enabled", false);
pref("dom.allow_cut_copy", false);
pref("dom.archivereader.enabled", false);
pref("dom.battery.enabled", false);
@@ -154,7 +255,7 @@ pref("dom.flyweb.enabled", false);
pref("dom.gamepad.enabled", false);
pref("dom.ipc.plugins.flash.subprocess.crashreporter.enabled", false);
pref("dom.ipc.plugins.reportCrashURL", false);
-// pref("dom.indexedDB.enabled", false);
+pref("dom.maxHardwareConcurrency", 2);
pref("dom.mozTCPSocket.enabled", false);
pref("dom.netinfo.enabled", false);
pref("dom.network.enabled", false);
@@ -165,9 +266,9 @@ pref("dom.vr.enabled", false);
pref("dom.webaudio.enabled", false);
pref("dom.webnotifications.enabled", false);
pref("dom.workers.enabled", false);
-pref("experiments.supported", false);
pref("experiments.enabled", false);
pref("experiments.manifest.uri", "");
+pref("experiments.supported", false);
pref("extensions.autoDisableScopes", 0);
pref("extensions.blocklist.enabled", false);
pref("extensions.blocklist.url", "");
@@ -178,128 +279,57 @@ pref("extensions.pocket.enabled", false);
pref("extensions.shownSelectionUI", true);
pref("extensions.ui.lastCategory", "addons://list/extension");
pref("extensions.update.autoUpdateDefault", false);
-defaultPref("extensions.update.enabled", false);
pref("full-screen-api.approval-required", false);
pref("full-screen-api.warning.timeout", 0);
pref("general.buildID.override", "19700101");
pref("general.warnOnAboutConfig", false);
-defaultPref("geo.enabled", false);
-defaultPref("geo.wifi.uri", "");
-lockPref("geo.wifi.logging.enabled", false);
-// pref("gfx.font_rendering.opentype_svg.enabled", false);
-lockPref("identity.fxaccounts.enabled", false);
-defaultPref("intl.locale.matchOS", true);
-// pref("javascript.options.asmjs", false);
pref("javascript.use_us_english_locale", true);
pref("keyword.enabled", false);
pref("lightweightThemes.update.enabled", false);
-defaultPref("media.eme.enabled", false);
-defaultPref("media.getusermedia.screensharing.enabled", false);
-defaultPref("media.getusermedia.audiocapture.enabled", false);
+pref("loop.logDomains", false);
pref("media.gmp-eme-adobe.enabled", false);
pref("media.gmp-gmpopenh264.enabled", false);
pref("media.gmp-gmpopenh264.provider.enabled", false);
pref("media.gmp-manager.url", "");
-// pref("media.gmp-provider.enabled", false);
-defaultPref("media.navigator.enabled", false);
-defaultPref("media.navigator.video.enabled", false);
-defaultPref("media.peerconnection.enabled", false);
-defaultPref("media.peerconnection.ice.no_host", true);
-defaultPref("media.video_stats.enabled", false);
-defaultPref("media.webspeech.recognition.enable", false);
-defaultPref("media.webspeech.synth.enabled", false);
+pref("media.peerconnection.ice.default_address_only", true);
+pref("media.peerconnection.identity.timeout", 1);
+pref("media.peerconnection.turn.disable", true);
+pref("media.peerconnection.use_document_iceservers", false);
pref("network.allow-experiments", false);
-// pref("network.cookie.cookieBehavior", 1);
-// PREF: Cookies expires at the end of the session (when the browser closes)
-// pref("network.cookie.lifetimePolicy", 2);
pref("network.cookie.prefsMigrated", true);
-// pref("network.cookie.thirdparty.sessionOnly", true);
-// pref("network.dns.blockDotOnion", true);
-defaultPref("network.dns.disableIPv6", true);
-defaultPref("network.dns.disableprefetch", true);
-defaultPref("network.dns.disableprefetchFromHTTPS", true);
-defaultPref("network.dns.disablePrefetch", true);
-defaultPref("network.dns.disablePrefetchFromHTTPS", true);
-// pref("network.http.referer.spoofSource", true);
-// pref("network.http.referer.XOriginPolicy", 2);
pref("network.http.speculative-parallel-limit", 0);
pref("network.IDN_show_punycode", true);
pref("network.jar.open-unsafe-types", false);
pref("network.manage-offline-status", false);
pref("network.negotiate-auth.allow-insecure-ntlm-v1", false);
pref("network.predictor.enabled", false);
-defaultPref("network.prefetch-next", false);
-pref("network.protocol-handler.warn-external-default", true);
-pref("network.protocol-handler.external.http", false);
-pref("network.protocol-handler.external.https", false);
-pref("network.protocol-handler.external.javascript", false);
-pref("network.protocol-handler.external.moz-extension", false);
-pref("network.protocol-handler.external.ftp", false);
-pref("network.protocol-handler.external.file", false);
-pref("network.protocol-handler.external.about", false);
pref("network.protocol-handler.expose-all", false);
+pref("network.protocol-handler.expose.about", true);
+pref("network.protocol-handler.expose.file", true);
+pref("network.protocol-handler.expose.ftp", true);
pref("network.protocol-handler.expose.http", true);
pref("network.protocol-handler.expose.https", true);
pref("network.protocol-handler.expose.javascript", true);
pref("network.protocol-handler.expose.moz-extension", true);
-pref("network.protocol-handler.expose.ftp", true);
-pref("network.protocol-handler.expose.file", true);
-pref("network.protocol-handler.expose.about", true);
-lockPref("network.proxy.backup.ftp", "127.0.0.1");
-lockPref("network.proxy.backup.ftp_port", 4444);
-lockPref("network.proxy.backup.socks", "127.0.0.1");
-lockPref("network.proxy.backup.socks_port", 4444);
-lockPref("network.proxy.backup.ssl", "127.0.0.1");
-lockPref("network.proxy.backup.ssl_port", 4444);
-lockPref("network.proxy.ftp", "127.0.0.1");
-lockPref("network.proxy.ftp_port", 4444);
-lockPref("network.proxy.http", "127.0.0.1");
-lockPref("network.proxy.http_port", 4444);
-lockPref("network.proxy.share_proxy_settings", true);
-lockPref("network.proxy.socks", "127.0.0.1");
-lockPref("network.proxy.socks_port", 4444);
-lockPref("network.proxy.socks_remote_dns", true);
-lockPref("network.proxy.ssl", "127.0.0.1");
-lockPref("network.proxy.ssl_port", 4444);
-lockPref("network.proxy.type", 1);
-pref("network.cookie.prefsMigrated", true);
-pref("pdfjs.disabled", true);
-pref("pdfjs.enableWebGL", false);
-defaultPref("permissions.default.camera", 2);
-defaultPref("permissions.default.desktop-notification", 2);
-defaultPref("permissions.default.geo", 2);
-defaultPref("permissions.default.microphone", 2);
-defaultPref("plugin.default_plugin_disabled", true);
-// pref("plugin.state.flash", 0);
-pref("plugin.state.java", 0);
-pref("plugin.state.libgnome-shell-browser-plugin", 0);
-pref("plugins.click_to_play", true);
-pref("plugins.load_appdir_plugins", false);
-pref("plugins.update.notifyUser", false);
-pref("plugins.update.url", "");
-// PREF: Clear history when Firefox closes
-// pref("privacy.sanitize.sanitizeOnShutdown", true);
-// pref("privacy.clearOnShutdown.cache", true);
-// pref("privacy.clearOnShutdown.cookies", true);
-// pref("privacy.clearOnShutdown.downloads", true);
-// pref("privacy.clearOnShutdown.formdata", true);
-// pref("privacy.clearOnShutdown.history", true);
-// pref("privacy.clearOnShutdown.offlineApps", true);
-// pref("privacy.clearOnShutdown.sessions", true);
-// pref("privacy.clearOnShutdown.openWindows", true);
-pref("privacy.cpd.offlineApps", true);
+pref("network.protocol-handler.external.about", false);
+pref("network.protocol-handler.external.file", false);
+pref("network.protocol-handler.external.ftp", false);
+pref("network.protocol-handler.external.http", false);
+pref("network.protocol-handler.external.https", false);
+pref("network.protocol-handler.external.javascript", false);
+pref("network.protocol-handler.external.moz-extension", false);
+pref("network.protocol-handler.warn-external-default", true);
+pref("network.proxy.no_proxies_on", "localhost, 127.0.0.1");
pref("privacy.cpd.cache", true);
pref("privacy.cpd.cookies", true);
pref("privacy.cpd.downloads", true);
pref("privacy.cpd.formdata", true);
pref("privacy.cpd.history", true);
+pref("privacy.cpd.offlineApps", true);
pref("privacy.cpd.sessions", true);
-pref("privacy.donottrackheader.enabled", true);
+pref("privacy.firstparty.isolate", true);
pref("privacy.resistFingerprinting", true);
pref("privacy.sanitize.timeSpan", 0);
-defaultPref("privacy.spoof_english", 2);
-pref("privacy.trackingprotection.enabled", true);
-pref("privacy.trackingprotection.pbmode.enabled", true);
pref("privacy.userContext.enabled", true);
pref("reader.parse-on-load.enabled", false);
pref("reader.parse-on-load.force-enabled", false);
@@ -307,55 +337,106 @@ pref("security.csp.enable", true);
pref("security.csp.experimentalEnabled", true);
pref("security.dialog_enable_delay", 1000);
pref("security.fileuri.strict_origin_policy", true);
-pref("security.insecure_field_warning.contextual.enabled", false);
-// PREF: Enable insecure password warnings (login forms in non-HTTPS pages)
-pref("security.insecure_password.ui.enabled", false);
pref("security.mixed_content.block_active_content", true);
pref("security.mixed_content.block_display_content", true);
-pref("services.blocklist.update_enabled", false);
pref("security.sri.enable", true);
pref("security.ssl.errorReporting.automatic", false);
pref("security.ssl.errorReporting.enabled", false);
-lockPref("services.sync.enabled", false);
pref("services.sync.prefs.sync.browser.download.manager.scanWhenDone", false);
pref("services.sync.prefs.sync.browser.safebrowsing.enabled", false);
-defaultPref("services.sync.prefs.sync.browser.search.update", false);
-defaultPref("services.sync.prefs.sync.extensions.update.enabled", false);
-// pref("shumway.disabled", true);
pref("signon.autofillForms", false);
-// PREF: Disable password manager
pref("signon.rememberSignons", false);
-defaultPref("startup.homepage_welcome_url", "http://i2pd.i2p/");
pref("startup.homepage_welcome_url.additional", "about:blank");
-pref("toolkit.telemetry.archive.enabled", false);
-lockPref("toolkit.telemetry.enabled", false);
-pref("toolkit.telemetry.optoutSample", false);
-defaultPref("toolkit.telemetry.reportingpolicy.firstRun", false);
-lockPref("toolkit.telemetry.server", "");
-defaultPref("toolkit.telemetry.unified", false);
-pref("toolkit.telemetry.unifiedIsOptIn", true);
-pref("webgl.disabled", true);
-pref("webgl.disable-extensions", true);
-pref("webgl.disable-fail-if-major-performance-caveat", true);
-pref("webgl.enable-debug-renderer-info", false);
-pref("webgl.min_capability_mode", true);
-// Ensure domain logging is disabled
-pref("loop.logDomains", false);
-// Spoof to dual-core cpu
-pref("dom.maxHardwareConcurrency", 2);
-// Disable offline cache
-pref("browser.cache.offline.enable", false);
-// Prevent tracking over multiple domains
-pref("privacy.firstparty.isolate", true);
-pref("network.proxy.no_proxies_on", "localhost, 127.0.0.1");
-// In relation to webrtc
-pref("media.peerconnection.turn.disable", true);
-pref("media.peerconnection.use_document_iceservers", false);
-pref("media.peerconnection.identity.timeout", 1);
-pref("media.peerconnection.ice.default_address_only", true);
-// Disable url prefetch
-pref("browser.urlbar.speculativeConnect.enabled", false);
-// Set platform, user-agent and locale to same values as Tor Browser 7.0.10
-pref("general.useragent.override", "Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0");
-pref("general.useragent.locale", "en-US");
-pref("general.platform.override", "Win32");
+
+var config = {
+ "cckVersion": "2.2.9",
+ "name": "I2Pd Browser",
+ "description": "Preconfigured for use with I2P browser",
+ "version": "1.2.8",
+ "homePage": "http://i2pd.i2p/",
+ "welcomePage": "http://i2pd.i2p/",
+ "titlemodifier": "I2Pd Browser",
+ "extension": {
+ "name": "I2Pd Browser"
+ },
+ "noWelcomePage": true,
+ "noUpgradePage": true,
+ "removeSetDesktopBackground": true,
+ "removeSafeModeMenu": true,
+ "noGetAddons": true,
+ "noAddonCompatibilityCheck": true,
+ "disableSearchEngineInstall": true,
+ "removeDefaultSearchEngines": false,
+ "displayBookmarksToolbar": true,
+ "removeSmartBookmarks": true,
+ "removeDefaultBookmarks": true,
+ "removeDuplicateBookmarkNames": true,
+ "dontCheckDefaultBrowser": true,
+ "dontUseDownloadDir": true,
+ "disableFormFill": true,
+ "disableSync": true,
+ "disableCrashReporter": true,
+ "disableTelemetry": true,
+ "disableFirefoxHealthReportUpload": true,
+ "disableFirefoxHealthReport": true,
+ "disableFirefoxUpdates": true,
+ "removeSnippets": true,
+ "disableResetFirefox": true,
+ "disableWebApps": true,
+ "disableHello": true,
+ "disableSharePage": true,
+ "disableForget": true,
+ "disableHeartbeat": true,
+ "disablePocket": true,
+ "disableAboutSupport": true,
+ "disableAboutProfiles": true,
+ "showSearchBar": true,
+ "autoconfig": {
+ "disableProfileMigrator": true
+ },
+ "id": "i2pdbrowser",
+ "hiddenUI": [
+ "#defaultBrowserBox",
+ "#enableSearchUpdate",
+ "#dataCollectionCategory",
+ "#dataCollectionGroup",
+ ".help-button",
+ "#onboarding-overlay-button",
+ ".prefs-modal-inner-wrapper > section:nth-child(6)"
+ ],
+ "searchplugins": {
+ "YaCy 'legwork'": "http://legwork.i2p/opensearchdescription.xml"
+ },
+ "defaultSearchEngine": "YaCy 'legwork'",
+ "certs": {
+ "ca": [
+ {
+ "url": "resource://cck2_i2pdbrowser/certs/purplei2p_ca.pem",
+ "trust": "CTc,CTc,CTc"
+ }
+ ]
+ }
+};
+
+var io = Components.classes["@mozilla.org/network/io-service;1"]
+ .getService(Components.interfaces.nsIIOService);
+var resource = io.getProtocolHandler("resource")
+ .QueryInterface(Components.interfaces.nsIResProtocolHandler);
+
+var greDir = Components.classes["@mozilla.org/file/directory_service;1"]
+ .getService(Components.interfaces.nsIProperties)
+ .get("GreD", Components.interfaces.nsIFile);
+var cck2ModuleDir = greDir.clone();
+cck2ModuleDir.append("cck2");
+cck2ModuleDir.append("modules");
+var cck2Alias = io.newFileURI(cck2ModuleDir);
+resource.setSubstitution("cck2", cck2Alias);
+
+var configModuleDir = greDir.clone();
+configModuleDir.append("cck2");
+configModuleDir.append("resources");
+var configAlias = io.newFileURI(configModuleDir);
+resource.setSubstitution("cck2_i2pdbrowser", configAlias);
+
+Components.utils.import("resource://cck2/CCK2.jsm");
+CCK2.init(config, "ä"[0], "ä");