From 9188271b0635a25fc293ac81eaab1ea181ad7a91 Mon Sep 17 00:00:00 2001 From: R4SAS Date: Wed, 26 Sep 2018 22:58:26 +0300 Subject: [PATCH] 1.2.8 pre1 What is CCK2? Answer here: https://mike.kaply.com/cck2/ Updated configuration Add new old reseed certificate Update addressbook Now time to think about one problem - user agent. In FF 60+ removed ability to change it without addons. Former-commit-id: 6e9eeba2096bc36b3521ebc040f733ad8ba06a27 --- .../browser/defaults/profile/bookmarks.html | 0 linux/build/preferences/browser/override.ini | 2 + linux/build/preferences/cck2/chrome.manifest | 1 + .../modules/CAPSCheckLoadURIFramescript.js | 154 ++ .../cck2/modules/CAPSClipboardFramescript.js | 183 ++ linux/build/preferences/cck2/modules/CCK2.jsm | 1495 +++++++++++++++++ .../cck2/modules/CCK2AboutAddonsOverlay.jsm | 111 ++ .../cck2/modules/CCK2AboutDialogOverlay.jsm | 33 + .../cck2/modules/CCK2AboutHomeFramescript.js | 79 + .../cck2/modules/CCK2AboutSupportOverlay.jsm | 62 + .../cck2/modules/CCK2BrowserOverlay.jsm | 373 ++++ .../cck2/modules/CCK2FileBlock.jsm | 47 + .../cck2/modules/CCK2Framescript.js | 51 + .../cck2/modules/CCK2PreferencesOverlay.jsm | 123 ++ .../cck2/modules/CTPPermissions.jsm | 123 ++ .../preferences/cck2/modules/Preferences.jsm | 629 +++++++ .../build/preferences/cck2/modules/Timer.jsm | 43 + .../build/preferences/cck2/modules/Utils.jsm | 10 + .../cck2/resources/certs/purplei2p_ca.pem | 23 + linux/build/preferences/i2pdbrowser.cfg | 455 ++--- linux/i2pd/addressbook/addresses.csv | 617 ++----- linux/i2pd/i2pd.conf | 7 +- osx/build/build | 2 +- osx/build/i2pd/addressbook/addresses.csv | 617 ++----- .../reseed/hottuna_at_mail.i2p.crt | 33 + osx/build/i2pd/i2pd.conf | 7 +- .../browser/defaults/profile/bookmarks.html | 0 osx/build/preferences/browser/override.ini | 2 + osx/build/preferences/cck2/chrome.manifest | 1 + .../modules/CAPSCheckLoadURIFramescript.js | 154 ++ .../cck2/modules/CAPSClipboardFramescript.js | 183 ++ osx/build/preferences/cck2/modules/CCK2.jsm | 1495 +++++++++++++++++ .../cck2/modules/CCK2AboutAddonsOverlay.jsm | 111 ++ .../cck2/modules/CCK2AboutDialogOverlay.jsm | 33 + .../cck2/modules/CCK2AboutHomeFramescript.js | 79 + .../cck2/modules/CCK2AboutSupportOverlay.jsm | 62 + .../cck2/modules/CCK2BrowserOverlay.jsm | 373 ++++ .../cck2/modules/CCK2FileBlock.jsm | 47 + .../cck2/modules/CCK2Framescript.js | 51 + .../cck2/modules/CCK2PreferencesOverlay.jsm | 123 ++ .../cck2/modules/CTPPermissions.jsm | 123 ++ .../preferences/cck2/modules/Preferences.jsm | 629 +++++++ osx/build/preferences/cck2/modules/Timer.jsm | 43 + osx/build/preferences/cck2/modules/Utils.jsm | 10 + .../cck2/resources/certs/purplei2p_ca.pem | 23 + osx/build/preferences/i2pdbrowser.cfg | 455 ++--- windows/build/build.cmd | 25 +- windows/build/i2pd/addressbook/addresses.csv | 617 ++----- .../reseed/hottuna_at_mail.i2p.crt | 33 + windows/build/i2pd/i2pd.conf | 7 +- .../browser/defaults/profile/bookmarks.html | 0 .../build/preferences/browser/override.ini | 2 + .../build/preferences/cck2/chrome.manifest | 1 + .../modules/CAPSCheckLoadURIFramescript.js | 154 ++ .../cck2/modules/CAPSClipboardFramescript.js | 183 ++ .../build/preferences/cck2/modules/CCK2.jsm | 1495 +++++++++++++++++ .../cck2/modules/CCK2AboutAddonsOverlay.jsm | 111 ++ .../cck2/modules/CCK2AboutDialogOverlay.jsm | 33 + .../cck2/modules/CCK2AboutHomeFramescript.js | 79 + .../cck2/modules/CCK2AboutSupportOverlay.jsm | 62 + .../cck2/modules/CCK2BrowserOverlay.jsm | 373 ++++ .../cck2/modules/CCK2FileBlock.jsm | 47 + .../cck2/modules/CCK2Framescript.js | 51 + .../cck2/modules/CCK2PreferencesOverlay.jsm | 123 ++ .../cck2/modules/CTPPermissions.jsm | 123 ++ .../preferences/cck2/modules/Preferences.jsm | 629 +++++++ .../build/preferences/cck2/modules/Timer.jsm | 43 + .../build/preferences/cck2/modules/Utils.jsm | 10 + .../cck2/resources/certs/purplei2p_ca.pem | 23 + windows/build/preferences/i2pdbrowser.cfg | 455 ++--- 70 files changed, 11921 insertions(+), 2035 deletions(-) create mode 100644 linux/build/preferences/browser/defaults/profile/bookmarks.html create mode 100644 linux/build/preferences/browser/override.ini create mode 100644 linux/build/preferences/cck2/chrome.manifest create mode 100644 linux/build/preferences/cck2/modules/CAPSCheckLoadURIFramescript.js create mode 100644 linux/build/preferences/cck2/modules/CAPSClipboardFramescript.js create mode 100644 linux/build/preferences/cck2/modules/CCK2.jsm create mode 100644 linux/build/preferences/cck2/modules/CCK2AboutAddonsOverlay.jsm create mode 100644 linux/build/preferences/cck2/modules/CCK2AboutDialogOverlay.jsm create mode 100644 linux/build/preferences/cck2/modules/CCK2AboutHomeFramescript.js create mode 100644 linux/build/preferences/cck2/modules/CCK2AboutSupportOverlay.jsm create mode 100644 linux/build/preferences/cck2/modules/CCK2BrowserOverlay.jsm create mode 100644 linux/build/preferences/cck2/modules/CCK2FileBlock.jsm create mode 100644 linux/build/preferences/cck2/modules/CCK2Framescript.js create mode 100644 linux/build/preferences/cck2/modules/CCK2PreferencesOverlay.jsm create mode 100644 linux/build/preferences/cck2/modules/CTPPermissions.jsm create mode 100644 linux/build/preferences/cck2/modules/Preferences.jsm create mode 100644 linux/build/preferences/cck2/modules/Timer.jsm create mode 100644 linux/build/preferences/cck2/modules/Utils.jsm create mode 100644 linux/build/preferences/cck2/resources/certs/purplei2p_ca.pem create mode 100644 osx/build/i2pd/certificates/reseed/hottuna_at_mail.i2p.crt create mode 100644 osx/build/preferences/browser/defaults/profile/bookmarks.html create mode 100644 osx/build/preferences/browser/override.ini create mode 100644 osx/build/preferences/cck2/chrome.manifest create mode 100644 osx/build/preferences/cck2/modules/CAPSCheckLoadURIFramescript.js create mode 100644 osx/build/preferences/cck2/modules/CAPSClipboardFramescript.js create mode 100644 osx/build/preferences/cck2/modules/CCK2.jsm create mode 100644 osx/build/preferences/cck2/modules/CCK2AboutAddonsOverlay.jsm create mode 100644 osx/build/preferences/cck2/modules/CCK2AboutDialogOverlay.jsm create mode 100644 osx/build/preferences/cck2/modules/CCK2AboutHomeFramescript.js create mode 100644 osx/build/preferences/cck2/modules/CCK2AboutSupportOverlay.jsm create mode 100644 osx/build/preferences/cck2/modules/CCK2BrowserOverlay.jsm create mode 100644 osx/build/preferences/cck2/modules/CCK2FileBlock.jsm create mode 100644 osx/build/preferences/cck2/modules/CCK2Framescript.js create mode 100644 osx/build/preferences/cck2/modules/CCK2PreferencesOverlay.jsm create mode 100644 osx/build/preferences/cck2/modules/CTPPermissions.jsm create mode 100644 osx/build/preferences/cck2/modules/Preferences.jsm create mode 100644 osx/build/preferences/cck2/modules/Timer.jsm create mode 100644 osx/build/preferences/cck2/modules/Utils.jsm create mode 100644 osx/build/preferences/cck2/resources/certs/purplei2p_ca.pem create mode 100644 windows/build/i2pd/certificates/reseed/hottuna_at_mail.i2p.crt create mode 100644 windows/build/preferences/browser/defaults/profile/bookmarks.html create mode 100644 windows/build/preferences/browser/override.ini create mode 100644 windows/build/preferences/cck2/chrome.manifest create mode 100644 windows/build/preferences/cck2/modules/CAPSCheckLoadURIFramescript.js create mode 100644 windows/build/preferences/cck2/modules/CAPSClipboardFramescript.js create mode 100644 windows/build/preferences/cck2/modules/CCK2.jsm create mode 100644 windows/build/preferences/cck2/modules/CCK2AboutAddonsOverlay.jsm create mode 100644 windows/build/preferences/cck2/modules/CCK2AboutDialogOverlay.jsm create mode 100644 windows/build/preferences/cck2/modules/CCK2AboutHomeFramescript.js create mode 100644 windows/build/preferences/cck2/modules/CCK2AboutSupportOverlay.jsm create mode 100644 windows/build/preferences/cck2/modules/CCK2BrowserOverlay.jsm create mode 100644 windows/build/preferences/cck2/modules/CCK2FileBlock.jsm create mode 100644 windows/build/preferences/cck2/modules/CCK2Framescript.js create mode 100644 windows/build/preferences/cck2/modules/CCK2PreferencesOverlay.jsm create mode 100644 windows/build/preferences/cck2/modules/CTPPermissions.jsm create mode 100644 windows/build/preferences/cck2/modules/Preferences.jsm create mode 100644 windows/build/preferences/cck2/modules/Timer.jsm create mode 100644 windows/build/preferences/cck2/modules/Utils.jsm create mode 100644 windows/build/preferences/cck2/resources/certs/purplei2p_ca.pem 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], "ä");