Author: toad
Date: 2008-08-07 18:30:55 +0000 (Thu, 07 Aug 2008)
New Revision: 21657

Added:
   branches/db4o/freenet/src/freenet/clients/http/staticfiles/startssl.pem
   branches/db4o/freenet/src/freenet/node/SeedServerTestPeerNode.java
   branches/db4o/freenet/src/freenet/node/fcp/SubscribedUSKMessage.java
   branches/db4o/freenet/src/freenet/node/simulator/SeednodePingTest.java
   branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoader.java
   branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderFile.java
   branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderFreenet.java
   branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderOfficial.java
   branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderURL.java
   branches/db4o/freenet/test/freenet/clients/
   branches/db4o/freenet/test/freenet/clients/http/
   branches/db4o/freenet/test/freenet/clients/http/filter/
   branches/db4o/freenet/test/freenet/clients/http/filter/ContentFilterTest.java
Removed:
   branches/db4o/freenet/test/freenet/clients/http/
   branches/db4o/freenet/test/freenet/clients/http/filter/
   branches/db4o/freenet/test/freenet/clients/http/filter/ContentFilterTest.java
Modified:
   branches/db4o/freenet/.settings/org.eclipse.jdt.core.prefs
   branches/db4o/freenet/README
   branches/db4o/freenet/build.xml
   branches/db4o/freenet/src/freenet/client/ArchiveContext.java
   branches/db4o/freenet/src/freenet/client/HighLevelSimpleClient.java
   branches/db4o/freenet/src/freenet/client/HighLevelSimpleClientImpl.java
   branches/db4o/freenet/src/freenet/client/Metadata.java
   
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerNonPersistent.java
   branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java
   branches/db4o/freenet/src/freenet/clients/http/ConfigToadlet.java
   branches/db4o/freenet/src/freenet/clients/http/ConnectionsToadlet.java
   branches/db4o/freenet/src/freenet/clients/http/ConnectivityToadlet.java
   branches/db4o/freenet/src/freenet/clients/http/FProxyToadlet.java
   branches/db4o/freenet/src/freenet/clients/http/PageMaker.java
   branches/db4o/freenet/src/freenet/clients/http/PproxyToadlet.java
   branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java
   branches/db4o/freenet/src/freenet/clients/http/SimpleToadletServer.java
   branches/db4o/freenet/src/freenet/clients/http/StartupToadlet.java
   branches/db4o/freenet/src/freenet/clients/http/StatisticsToadlet.java
   branches/db4o/freenet/src/freenet/clients/http/WelcomeToadlet.java
   branches/db4o/freenet/src/freenet/clients/http/bookmark/Bookmark.java
   
branches/db4o/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java
   branches/db4o/freenet/src/freenet/clients/http/filter/HTMLFilter.java
   
branches/db4o/freenet/src/freenet/clients/http/staticfiles/defaultbookmarks.dat
   branches/db4o/freenet/src/freenet/config/FilePersistentConfig.java
   branches/db4o/freenet/src/freenet/config/FreenetFilePersistentConfig.java
   branches/db4o/freenet/src/freenet/config/PersistentConfig.java
   branches/db4o/freenet/src/freenet/config/StringOption.java
   branches/db4o/freenet/src/freenet/crypt/Global.java
   branches/db4o/freenet/src/freenet/crypt/Yarrow.java
   branches/db4o/freenet/src/freenet/io/comm/DMT.java
   branches/db4o/freenet/src/freenet/io/comm/Peer.java
   branches/db4o/freenet/src/freenet/io/comm/UdpSocketHandler.java
   branches/db4o/freenet/src/freenet/io/xfer/PacketThrottle.java
   branches/db4o/freenet/src/freenet/l10n/L10n.java
   branches/db4o/freenet/src/freenet/l10n/freenet.l10n.de.properties
   branches/db4o/freenet/src/freenet/l10n/freenet.l10n.en.properties
   branches/db4o/freenet/src/freenet/l10n/freenet.l10n.es.properties
   branches/db4o/freenet/src/freenet/l10n/freenet.l10n.fr.properties
   branches/db4o/freenet/src/freenet/l10n/freenet.l10n.it.properties
   branches/db4o/freenet/src/freenet/l10n/freenet.l10n.zh-cn.properties
   branches/db4o/freenet/src/freenet/l10n/freenet.l10n.zh-tw.properties
   branches/db4o/freenet/src/freenet/node/Announcer.java
   branches/db4o/freenet/src/freenet/node/FNPPacketMangler.java
   branches/db4o/freenet/src/freenet/node/KeyTracker.java
   branches/db4o/freenet/src/freenet/node/LocationManager.java
   branches/db4o/freenet/src/freenet/node/LowLevelGetException.java
   branches/db4o/freenet/src/freenet/node/Node.java
   branches/db4o/freenet/src/freenet/node/NodeClientCore.java
   branches/db4o/freenet/src/freenet/node/NodeCrypto.java
   branches/db4o/freenet/src/freenet/node/NodeDispatcher.java
   branches/db4o/freenet/src/freenet/node/NodeIPDetector.java
   branches/db4o/freenet/src/freenet/node/NodeStarter.java
   branches/db4o/freenet/src/freenet/node/NodeStats.java
   branches/db4o/freenet/src/freenet/node/OpennetManager.java
   branches/db4o/freenet/src/freenet/node/PeerManager.java
   branches/db4o/freenet/src/freenet/node/PeerNode.java
   branches/db4o/freenet/src/freenet/node/PeerNodeStatus.java
   branches/db4o/freenet/src/freenet/node/Persister.java
   branches/db4o/freenet/src/freenet/node/ProbeCallback.java
   branches/db4o/freenet/src/freenet/node/RequestHandler.java
   branches/db4o/freenet/src/freenet/node/RequestScheduler.java
   branches/db4o/freenet/src/freenet/node/RequestStarter.java
   branches/db4o/freenet/src/freenet/node/RequestStarterGroup.java
   branches/db4o/freenet/src/freenet/node/ResettingHTLProbeRequestSender.java
   branches/db4o/freenet/src/freenet/node/SeedClientPeerNode.java
   branches/db4o/freenet/src/freenet/node/TextModeClientInterface.java
   branches/db4o/freenet/src/freenet/node/UptimeEstimator.java
   branches/db4o/freenet/src/freenet/node/Version.java
   branches/db4o/freenet/src/freenet/node/fcp/ClientGet.java
   branches/db4o/freenet/src/freenet/node/fcp/ClientPut.java
   branches/db4o/freenet/src/freenet/node/fcp/ClientPutBase.java
   branches/db4o/freenet/src/freenet/node/fcp/ClientRequest.java
   branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
   branches/db4o/freenet/src/freenet/node/fcp/PersistentGet.java
   branches/db4o/freenet/src/freenet/node/fcp/SubscribeUSKMessage.java
   branches/db4o/freenet/src/freenet/node/fcp/URIGeneratedMessage.java
   branches/db4o/freenet/src/freenet/node/simulator/RealNodeBusyNetworkTest.java
   
branches/db4o/freenet/src/freenet/node/simulator/RealNodeNetworkColoringTest.java
   branches/db4o/freenet/src/freenet/node/simulator/RealNodePingTest.java
   
branches/db4o/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java
   branches/db4o/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java
   branches/db4o/freenet/src/freenet/node/simulator/RealNodeSecretPingTest.java
   branches/db4o/freenet/src/freenet/node/simulator/RealNodeULPRTest.java
   branches/db4o/freenet/src/freenet/node/updater/NodeUpdateManager.java
   branches/db4o/freenet/src/freenet/node/updater/NodeUpdater.java
   
branches/db4o/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java
   branches/db4o/freenet/src/freenet/node/useralerts/UserAlertManager.java
   branches/db4o/freenet/src/freenet/pluginmanager/PluginManager.java
   branches/db4o/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
   branches/db4o/freenet/src/freenet/support/FileLoggerHook.java
   branches/db4o/freenet/src/freenet/support/LibraryLoader.java
   branches/db4o/freenet/src/freenet/support/Serializer.java
   branches/db4o/freenet/src/freenet/support/SimpleFieldSet.java
   branches/db4o/freenet/src/freenet/support/URIPreEncoder.java
   branches/db4o/freenet/src/freenet/support/io/NativeThread.java
   branches/db4o/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
   branches/db4o/freenet/test/freenet/config/ConfigTest.java
   branches/db4o/freenet/test/freenet/support/SimpleFieldSetTest.java
Log:
Merge 1155 (all changes on trunk from 19963 to 21652) into db4o branch.



Modified: branches/db4o/freenet/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- branches/db4o/freenet/.settings/org.eclipse.jdt.core.prefs  2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/.settings/org.eclipse.jdt.core.prefs  2008-08-07 
18:30:55 UTC (rev 21657)
@@ -1,15 +1,15 @@
-#Sun Jul 09 17:12:16 CEST 2006
+#Thu Jul 17 14:26:28 BST 2008
 eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.4
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
+org.eclipse.jdt.core.compiler.compliance=1.5
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.source=1.4
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
 org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
 org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL,HIGH
 org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,REDFLAG

Modified: branches/db4o/freenet/README
===================================================================
--- branches/db4o/freenet/README        2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/README        2008-08-07 18:30:55 UTC (rev 21657)
@@ -11,7 +11,7 @@
 - Mantissa is under the modified BSD license. See README.Mantissa. According 
   to the FSF, modified BSD is compatible with GPL; we must include both 
   licenses.
-
+
 The installer creates a firefox profile. If you don't use it, you should have 
a 
 look at user.js in the firefox_profile directory for some useful settings for 
 browsing Freenet (both for performance and security).

Modified: branches/db4o/freenet/build.xml
===================================================================
--- branches/db4o/freenet/build.xml     2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/build.xml     2008-08-07 18:30:55 UTC (rev 21657)
@@ -3,7 +3,10 @@

 <project name="Freenet" default="dist" basedir=".">
        <description>
-               This file builds freenet...
+               This file builds Freenet: What is Freenet?
+
+               Freenet is free software which lets you publish and obtain 
information on the Internet without fear of censorship. To achieve this 
freedom, the network is entirely decentralized and publishers and consumers of 
information are anonymous. Without anonymity there can never be true freedom of 
speech, and without decentralization the network would be vulnerable to attack.
+
                Possible targets: compile, dist (default), clean
        </description>

@@ -72,8 +75,7 @@

                <!-- Create the build directory structure used by compile -->

-               <!-- FIXME: remove the debug and replace with optimize -->
-               <javac srcdir="${src}" destdir="${build}" debug="on" 
optimize="on" source="1.4">
+               <javac srcdir="${src}" destdir="${build}" debug="on" 
optimize="on" source="1.5">
                        <classpath>
                                <pathelement 
location="${freenet-ext.location}"/>
                                <pathelement location="gnu-crypto.jar"/>
@@ -107,8 +109,6 @@
        <target name="dist" depends="compile,unit"
                description="generate the distribution" >
                <!-- Create the distribution directory -->
-               <!--<mkdir dir="."/>-->
-               <!-- Put everything in ${build} into the freenet-${DSTAMP}.jar 
file -->
                <jar jarfile="${lib}/freenet-cvs-snapshot.jar" 
basedir="${build}">
                        <manifest>
                                <attribute name="Main-Class" 
value="freenet/node/Node"/>
@@ -127,8 +127,8 @@

        <!-- ================================================== -->

-       <target name="unit-build" depends="compile" if="junit.present">
-               <javac srcdir="${test}" destdir="${build-test}" debug="on" 
optimize="on" source="1.4">
+       <target name="unit-build" depends="compile" if="junit.present" 
unless="skip_tests">
+               <javac srcdir="${test}" destdir="${build-test}" debug="on" 
optimize="on" source="1.5">
                        <classpath>
                                <pathelement path="${build}"/>
                                <pathelement 
location="${freenet-ext.location}"/>
@@ -139,7 +139,7 @@
                </javac>
        </target>

-       <target name="unit" depends="unit-build" if="junit.present">
+       <target name="unit" depends="unit-build" if="junit.present" 
unless="skip_tests">
                <junit printsummary="yes" fork="yes" haltonfailure="yes">
                        <classpath>
                                <pathelement path="${build}"/>

Modified: branches/db4o/freenet/src/freenet/client/ArchiveContext.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/ArchiveContext.java        
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/client/ArchiveContext.java        
2008-08-07 18:30:55 UTC (rev 21657)
@@ -8,6 +8,7 @@

 /**
  * @author amphibian (Matthew Toseland)
+ *
  * Object passed down a full fetch, including all the recursion.
  * Used, at present, for detecting archive fetch loops, hence the
  * name.
@@ -23,11 +24,11 @@

        /**
         * Check for a loop.
+        *
         * The URI provided is expected to be a reasonably unique identifier 
for the archive.
         */
        public synchronized void doLoopDetection(FreenetURI key) throws 
ArchiveFailureException {
                if(soFar.size() > maxArchiveLevels)
                        throw new 
ArchiveFailureException(ArchiveFailureException.TOO_MANY_LEVELS);
        }
-
 }

Modified: branches/db4o/freenet/src/freenet/client/HighLevelSimpleClient.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/HighLevelSimpleClient.java 
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/client/HighLevelSimpleClient.java 
2008-08-07 18:30:55 UTC (rev 21657)
@@ -6,6 +6,7 @@
 import java.util.HashMap;
 import java.util.Set;

+import freenet.client.async.ClientCallback;
 import freenet.client.events.ClientEventListener;
 import freenet.keys.FreenetURI;
 import freenet.node.RequestClient;
@@ -39,6 +40,11 @@
        public FetchResult fetch(FreenetURI uri, long maxSize, RequestClient 
context) throws FetchException;

        /**
+        * Non-blocking fetch of a URI with a configurable max-size, context 
object, callback and context.
+        */
+       public void fetch(FreenetURI uri, long maxSize, RequestClient context, 
ClientCallback callback, FetchContext fctx) throws FetchException;
+       
+       /**
         * Blocking insert.
         * @param filenameHint If set, insert a single-file manifest containing 
only this file, under the given filename.
         * @throws InsertException If there is an error inserting the data
@@ -46,6 +52,11 @@
        public FreenetURI insert(InsertBlock insert, boolean getCHKOnly, String 
filenameHint) throws InsertException;

        /**
+        * Non-blocking insert.
+        */
+       public void insert(InsertBlock insert, boolean getCHKOnly, String 
filenameHint, boolean isMetadata, InsertContext ctx, ClientCallback cb) throws 
InsertException;
+       
+       /**
         * Blocking insert of a redirect.
         */
        public FreenetURI insertRedirect(FreenetURI insertURI, FreenetURI 
target) throws InsertException;

Modified: 
branches/db4o/freenet/src/freenet/client/HighLevelSimpleClientImpl.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/HighLevelSimpleClientImpl.java     
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/client/HighLevelSimpleClientImpl.java     
2008-08-07 18:30:55 UTC (rev 21657)
@@ -128,6 +128,12 @@
                return fw.waitForCompletion();
        }

+       public void fetch(FreenetURI uri, long maxSize, RequestClient 
clientContext, ClientCallback callback, FetchContext fctx) throws 
FetchException {
+               if(uri == null) throw new NullPointerException();
+               ClientGetter get = new ClientGetter(callback, 
core.requestStarters.chkFetchScheduler, core.requestStarters.sskFetchScheduler, 
uri, fctx, priorityClass, clientContext, null, null);
+               core.clientContext.start(get);
+       }
+       
        public FreenetURI insert(InsertBlock insert, boolean getCHKOnly, String 
filenameHint) throws InsertException {
                return insert(insert, getCHKOnly, filenameHint, false);
        }
@@ -141,6 +147,13 @@
                core.clientContext.start(put, false);
                return pw.waitForCompletion();
        }
+       
+       public void insert(InsertBlock insert, boolean getCHKOnly, String 
filenameHint, boolean isMetadata, InsertContext ctx, ClientCallback cb) throws 
InsertException {
+               ClientPutter put = new ClientPutter(cb, insert.getData(), 
insert.desiredURI, insert.clientMetadata, 
+                               ctx, core.requestStarters.chkPutScheduler, 
core.requestStarters.sskPutScheduler, priorityClass, 
+                               getCHKOnly, isMetadata, this, null, 
filenameHint, false);
+               core.clientContext.start(put, false);
+       }

        public FreenetURI insertRedirect(FreenetURI insertURI, FreenetURI 
targetURI) throws InsertException {
                Metadata m = new Metadata(Metadata.SIMPLE_REDIRECT, targetURI, 
new ClientMetadata());

Modified: branches/db4o/freenet/src/freenet/client/Metadata.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/Metadata.java      2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/client/Metadata.java      2008-08-07 
18:30:55 UTC (rev 21657)
@@ -15,8 +15,7 @@
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.Map;
-import java.util.Map.Entry;
-
+import java.util.Set;
 import freenet.keys.BaseClientKey;
 import freenet.keys.ClientCHK;
 import freenet.keys.FreenetURI;
@@ -33,7 +32,7 @@
        static final long FREENET_METADATA_MAGIC = 0xf053b2842d91482bL;
        static final int MAX_SPLITFILE_PARAMS_LENGTH = 32768;
        /** Soft limit, to avoid memory DoS */
-       static final int MAX_SPLITFILE_BLOCKS = 100*1000;
+       static final int MAX_SPLITFILE_BLOCKS = 1000*1000;

        // URI at which this Metadata has been/will be inserted.
        FreenetURI resolvedURI;
@@ -652,6 +651,22 @@
        public Metadata getDefaultDocument() throws MetadataParseException {
                return getDocument("");
        }
+       
+       /**
+     * Get all documents in the manifest (ignores default doc).
+     * @throws MetadataParseException
+     */
+    public HashMap<String, Metadata> getDocuments() {
+       HashMap<String, Metadata> docs = new HashMap<String, Metadata>();
+        Set s = manifestEntries.keySet();
+        Iterator i = s.iterator();
+        while (i.hasNext()) {
+               String st = (String) i.next();
+               if (st.length()>1)
+                       docs.put(st, (Metadata) manifestEntries.get(st));
+        }
+        return docs;
+    }

        /**
         * Does the metadata point to a single URI?

Modified: 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerNonPersistent.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerNonPersistent.java
     2008-08-07 16:48:54 UTC (rev 21656)
+++ 
branches/db4o/freenet/src/freenet/client/async/ClientRequestSchedulerNonPersistent.java
     2008-08-07 18:30:55 UTC (rev 21657)
@@ -132,7 +132,7 @@
                                                        if(complain)
                                                                
Logger.normal(this, "Not found: "+getter+" for "+key+" removing ("+getsLength+" 
getters)");
                                                        return false; // not 
here
-                                               }
+                                               } // else is a contradiction, 
let it get an ArrayIndexOutOfBounds.
                                        }
                                        if(gets[j] == null) continue;
                                        if(gets[j].isCancelled(container)) 
continue;

Modified: branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java
===================================================================
--- branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java      
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/client/async/SingleFileInserter.java      
2008-08-07 18:30:55 UTC (rev 21657)
@@ -22,6 +22,7 @@
 import freenet.support.SimpleFieldSet;
 import freenet.support.api.Bucket;
 import freenet.support.compress.Compressor;
+import freenet.support.io.BucketChainBucketFactory;
 import freenet.support.io.BucketTools;

 /**
@@ -307,7 +308,7 @@

                boolean tryCompress = (origSize > blockSize) && 
(!ctx.dontCompress) && (!dontCompress);
                if(tryCompress) {
-                       InsertCompressor.start(container, context, this, 
origData, oneBlockCompressedSize, context.getBucketFactory(persistent), 
persistent);
+                       InsertCompressor.start(container, context, this, 
origData, oneBlockCompressedSize, new 
BucketChainBucketFactory(context.getBucketFactory(persistent), 
CHKBlock.DATA_LENGTH), persistent);
                } else {
                        CompressionOutput output = new CompressionOutput(data, 
null);
                        onCompressed(output, container, context);

Modified: branches/db4o/freenet/src/freenet/clients/http/ConfigToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/ConfigToadlet.java   
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/clients/http/ConfigToadlet.java   
2008-08-07 18:30:55 UTC (rev 21657)
@@ -29,8 +29,6 @@
 public class ConfigToadlet extends Toadlet {
        // If a setting has to be more than a meg, something is seriously wrong!
        private static final int MAX_PARAM_VALUE_SIZE = 1024*1024;
-       private static final int MODE_SIMPLE = 1;
-       private static final int MODE_ADVANCED = 2;
        private final Config config;
        private final NodeClientCore core;
        private final Node node;
@@ -142,30 +140,9 @@

                contentNode.addChild(core.alerts.createSummary());

-               // Mode can be changed by a link, not just by the default
+               final int mode = 
ctx.getPageMaker().drawModeSelectionArray(core, req, contentNode);

-               int mode = core.isAdvancedModeEnabled() ? MODE_ADVANCED : 
MODE_SIMPLE;
-               
-               if(req.isParameterSet("mode")) {
-                       mode = req.getIntParam("mode", mode);
-               }
-               
-               // FIXME style this properly
-               HTMLNode table = contentNode.addChild("table", "border", "1");
-               HTMLNode row = table.addChild("tr");
-               HTMLNode cell = row.addChild("td");
-               
-               if(mode != MODE_SIMPLE)
-                       cell.addChild("a", new String[] { "href", "title" }, 
new String[] { "/config/?mode=1", l10n("modeSimpleTooltip") }, 
l10n("modeSimple"));
-               else
-                       cell.addChild("b", "title", l10n("modeSimpleTooltip"), 
l10n("modeSimple"));
-               cell = row.addChild("td");
-               if(mode != MODE_ADVANCED)
-                       cell.addChild("a", new String[] { "href", "title" }, 
new String[] { "/config/?mode=2", l10n("modeAdvancedTooltip") }, 
l10n("modeAdvanced"));
-               else
-                       cell.addChild("b", "title", 
l10n("modeAdvancedTooltip"), l10n("modeAdvanced"));
-               
-               if(mode >= MODE_ADVANCED){
+               if(mode >= PageMaker.MODE_ADVANCED){
                        HTMLNode navigationBar = 
ctx.getPageMaker().getInfobox("navbar", l10n("configNavTitle"));
                        HTMLNode navigationContent = 
ctx.getPageMaker().getContentNode(navigationBar).addChild("ul");
                        
if(!L10n.getSelectedLanguage().equals(L10n.FALLBACK_DEFAULT))
@@ -207,13 +184,13 @@
                        HTMLNode configGroupUlNode = new HTMLNode("ul", 
"class", "config");

                        for(int j=0; j<o.length; j++){
-                               if(! (mode == MODE_SIMPLE && o[j].isExpert())){
+                               if(! (mode == PageMaker.MODE_SIMPLE && 
o[j].isExpert())){
                                        displayedConfigElements++;
                                        String configName = o[j].getName();

                                        HTMLNode configItemNode = 
configGroupUlNode.addChild("li");
                                        configItemNode.addChild("span", new 
String[]{ "class", "title", "style" },
-                                                       new String[]{ 
"configshortdesc", L10n.getString("ConfigToadlet.defaultIs", new String[] { 
"default" }, new String[] { o[j].getDefault() }) + (mode >= MODE_ADVANCED ? " 
["+sc[i].getPrefix() + '.' + o[j].getName() + ']' : ""), 
+                                                       new String[]{ 
"configshortdesc", L10n.getString("ConfigToadlet.defaultIs", new String[] { 
"default" }, new String[] { o[j].getDefault() }) + (mode >= 
PageMaker.MODE_ADVANCED ? " ["+sc[i].getPrefix() + '.' + o[j].getName() + ']' : 
""), 
                                                        "cursor: help;" 
}).addChild(L10n.getHTMLNode(o[j].getShortDesc()));
                                        HTMLNode configItemValueNode = 
configItemNode.addChild("span", "class", "config");
                                        if(o[j].getValueString() == null){

Modified: branches/db4o/freenet/src/freenet/clients/http/ConnectionsToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/ConnectionsToadlet.java      
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/clients/http/ConnectionsToadlet.java      
2008-08-07 18:30:55 UTC (rev 21657)
@@ -82,6 +82,23 @@
                                return result < 0 ? -1 : 1;
                        }
                }
+               
+               // TODO: use Long.valueOf().compare when we switch to 1.5
+               private int compareLongs(long long1, long long2) {
+                       long diff = long1 - long2;
+                       if(diff == 0)
+                               return 0;
+                       else
+                               return (diff > 0 ? 1 : -1);
+               }
+               
+               private int compareInts(int int1, int int2) {
+                       int diff = int1 -int2;
+                       if(diff == 0)
+                               return 0;
+                       else
+                               return (diff > 0 ? 1 : -1);
+               }

                protected int customCompare(PeerNodeStatus firstNode, 
PeerNodeStatus secondNode, String sortBy2) {
                        if(sortBy.equals("address")){
@@ -90,6 +107,24 @@
                                return compareLocations(firstNode, secondNode);
                        }else if(sortBy.equals("version")){
                                return 
Version.getArbitraryBuildNumber(firstNode.getVersion(), -1) - 
Version.getArbitraryBuildNumber(secondNode.getVersion(), -1);
+                       }else if(sortBy.equals("backoff")){
+                               return 
Double.compare(firstNode.getBackedOffPercent(), 
secondNode.getBackedOffPercent());
+                       }else if(sortBy.equals(("overload_p"))){
+                               return Double.compare(firstNode.getPReject(), 
secondNode.getPReject());
+                       }else if(sortBy.equals(("idle"))){
+                               return 
compareLongs(firstNode.getTimeLastConnectionCompleted(), 
secondNode.getTimeLastConnectionCompleted());
+                       }else if(sortBy.equals("time_routable")){
+                               return 
Double.compare(firstNode.getPercentTimeRoutableConnection(), 
secondNode.getPercentTimeRoutableConnection());
+                       }else if(sortBy.equals("total_traffic")){
+                               long total1 = 
firstNode.getTotalInputBytes()+firstNode.getTotalOutputBytes();
+                               long total2 = 
secondNode.getTotalInputBytes()+secondNode.getTotalOutputBytes();
+                               return compareLongs(total1, total2);
+                       }else if(sortBy.equals("selection_percentage")){
+                               return 
compareLongs(firstNode.getNumberOfSelections(), 
secondNode.getNumberOfSelections());
+                       }else if(sortBy.equals("time_delta")){
+                               return compareLongs(firstNode.getClockDelta(), 
secondNode.getClockDelta());
+                       }else if(sortBy.equals(("uptime"))){
+                               return 
compareInts(firstNode.getReportedUptimePercentage(), 
secondNode.getReportedUptimePercentage());
                        }else
                                return 0;
                }
@@ -163,7 +198,6 @@
                        return;
                }

-               final boolean advancedModeEnabled = 
node.isAdvancedModeEnabled();
                final boolean fProxyJavascriptEnabled = 
node.isFProxyJavascriptEnabled();
                boolean drawMessageTypes = 
path.endsWith("displaymessagetypes.html");

@@ -189,7 +223,7 @@
                int numberOfSimpleConnected = numberOfConnected + 
numberOfRoutingBackedOff;
                int numberOfNotConnected = numberOfTooNew + numberOfTooOld + 
numberOfDisconnected + numberOfNeverConnected + numberOfDisabled + 
numberOfBursting + numberOfListening + numberOfListenOnly + 
numberOfClockProblem + numberOfConnError;
                String titleCountString = null;
-               if(advancedModeEnabled) {
+               if(node.isAdvancedModeEnabled()) {
                        titleCountString = "(" + numberOfConnected + '/' + 
numberOfRoutingBackedOff + '/' + numberOfTooNew + '/' + numberOfTooOld + '/' + 
numberOfRoutingDisabled + '/' + numberOfNotConnected + ')';
                } else {
                        titleCountString = (numberOfNotConnected + 
numberOfSimpleConnected)>0 ? String.valueOf(numberOfSimpleConnected) : "";
@@ -203,6 +237,7 @@

                if(ctx.isAllowedFullAccess())
                        contentNode.addChild(core.alerts.createSummary());
+               final int mode = 
ctx.getPageMaker().drawModeSelectionArray(core, request, contentNode);

                if(peerNodeStatuses.length>0){

@@ -226,7 +261,7 @@
                        HTMLNode nextTableCell = 
overviewTableRow.addChild("td", "class", "first");

                        /* node status overview box */
-                       if(advancedModeEnabled) {
+                       if(mode >= PageMaker.MODE_ADVANCED) {
                                HTMLNode overviewInfobox = 
nextTableCell.addChild("div", "class", "infobox");
                                overviewInfobox.addChild("div", "class", 
"infobox-header", "Node status overview");
                                HTMLNode overviewInfoboxContent = 
overviewInfobox.addChild("div", "class", "infobox-content");
@@ -251,21 +286,21 @@
                        activityInfobox.addChild("div", "class", 
"infobox-header", l10n("activityTitle"));
                        HTMLNode activityInfoboxContent = 
activityInfobox.addChild("div", "class", "infobox-content");
                        HTMLNode activityList = 
StatisticsToadlet.drawActivity(activityInfoboxContent, node);
-                       if (advancedModeEnabled && activityList != null) {
+                       if ((mode >= PageMaker.MODE_ADVANCED) && (activityList 
!= null)) {
                                if (numARKFetchers > 0) {
                                        activityList.addChild("li", 
"ARK\u00a0Fetch\u00a0Requests:\u00a0" + numARKFetchers);
                                }
-                               StatisticsToadlet.drawBandwidth(activityList, 
node, nodeUptimeSeconds, advancedModeEnabled);
+                               StatisticsToadlet.drawBandwidth(activityList, 
node, nodeUptimeSeconds, mode >= PageMaker.MODE_ADVANCED);
                        }

-                       nextTableCell = advancedModeEnabled ? 
overviewTableRow.addChild("td") : overviewTableRow.addChild("td", "class", 
"last");
+                       nextTableCell = (mode >= PageMaker.MODE_ADVANCED) ? 
overviewTableRow.addChild("td") : overviewTableRow.addChild("td", "class", 
"last");

                        // Peer statistics box
                        HTMLNode peerStatsInfobox = 
nextTableCell.addChild("div", "class", "infobox");
-                       StatisticsToadlet.drawPeerStatsBox(peerStatsInfobox, 
advancedModeEnabled, numberOfConnected, numberOfRoutingBackedOff, 
numberOfTooNew, numberOfTooOld, numberOfDisconnected, numberOfNeverConnected, 
numberOfDisabled, numberOfBursting, numberOfListening, numberOfListenOnly, 0, 
0, numberOfRoutingDisabled, numberOfClockProblem, numberOfConnError, 
numberOfDisconnecting);
+                       StatisticsToadlet.drawPeerStatsBox(peerStatsInfobox, 
mode >= PageMaker.MODE_ADVANCED, numberOfConnected, numberOfRoutingBackedOff, 
numberOfTooNew, numberOfTooOld, numberOfDisconnected, numberOfNeverConnected, 
numberOfDisabled, numberOfBursting, numberOfListening, numberOfListenOnly, 0, 
0, numberOfRoutingDisabled, numberOfClockProblem, numberOfConnError, 
numberOfDisconnecting);

                        // Peer routing backoff reason box
-                       if(advancedModeEnabled) {
+                       if(mode >= PageMaker.MODE_ADVANCED) {
                                nextTableCell = overviewTableRow.addChild("td", 
"class", "last");
                                HTMLNode backoffReasonInfobox = 
nextTableCell.addChild("div", "class", "infobox");
                                backoffReasonInfobox.addChild("div", "class", 
"infobox-header", "Peer backoff reasons");
@@ -322,7 +357,7 @@
                        HTMLNode peerTableInfobox = contentNode.addChild("div", 
"class", "infobox infobox-normal");
                        HTMLNode peerTableInfoboxHeader = 
peerTableInfobox.addChild("div", "class", "infobox-header");
                        peerTableInfoboxHeader.addChild("#", 
getPeerListTitle());
-                       if (advancedModeEnabled) {
+                       if (mode >= PageMaker.MODE_ADVANCED) {
                                if (!path.endsWith("displaymessagetypes.html")) 
{
                                        peerTableInfoboxHeader.addChild("#", " 
");
                                        peerTableInfoboxHeader.addChild("a", 
"href", "displaymessagetypes.html", "(more detailed)");
@@ -348,29 +383,30 @@
                                peerTableHeaderRow.addChild("th").addChild("a", 
"href", sortString(isReversed, "status")).addChild("#", l10n("statusTitle"));
                                if(hasNameColumn())
                                        
peerTableHeaderRow.addChild("th").addChild("a", "href", sortString(isReversed, 
"name")).addChild("span", new String[] { "title", "style" }, new String[] { 
l10n("nameClickToMessage"), "border-bottom: 1px dotted; cursor: help;" }, 
l10n("nameTitle"));
-                               if (advancedModeEnabled) {
+                               if (mode >= PageMaker.MODE_ADVANCED) {
                                        
peerTableHeaderRow.addChild("th").addChild("a", "href", sortString(isReversed, 
"address")).addChild("span", new String[] { "title", "style" }, new String[] { 
l10n("ipAddress"), "border-bottom: 1px dotted; cursor: help;" }, 
l10n("ipAddressTitle"));
                                }
                                peerTableHeaderRow.addChild("th").addChild("a", 
"href", sortString(isReversed, "version")).addChild("#", l10n("versionTitle"));
-                               if (advancedModeEnabled) {
+                               if (mode >= PageMaker.MODE_ADVANCED) {
                                        
peerTableHeaderRow.addChild("th").addChild("a", "href", sortString(isReversed, 
"location")).addChild("#", "Location");
-                                       
peerTableHeaderRow.addChild("th").addChild("span", new String[] { "title", 
"style" }, new String[] { "Other node busy? Display: Percentage of time the 
node is overloaded, Current wait time remaining (0=not overloaded)/total/last 
overload reason", "border-bottom: 1px dotted; cursor: help;" }, "Backoff");
+                                       
peerTableHeaderRow.addChild("th").addChild("a", "href", sortString(isReversed, 
"backoff")).addChild("span", new String[] { "title", "style" }, new String[] { 
"Other node busy? Display: Percentage of time the node is overloaded, Current 
wait time remaining (0=not overloaded)/total/last overload reason", 
"border-bottom: 1px dotted; cursor: help;" }, "Backoff");

-                                       
peerTableHeaderRow.addChild("th").addChild("span", new String[] { "title", 
"style" }, new String[] { "Probability of the node rejecting a request due to 
overload or causing a timeout.", "border-bottom: 1px dotted; cursor: help;" }, 
"Overload Probability");
+                                       
peerTableHeaderRow.addChild("th").addChild("a", "href", sortString(isReversed, 
"overload_p")).addChild("span", new String[] { "title", "style" }, new String[] 
{ "Probability of the node rejecting a request due to overload or causing a 
timeout.", "border-bottom: 1px dotted; cursor: help;" }, "Overload 
Probability");
                                }
-                               
peerTableHeaderRow.addChild("th").addChild("span", new String[] { "title", 
"style" }, new String[] { l10n("idleTime"), "border-bottom: 1px dotted; cursor: 
help;" }, l10n("idleTimeTitle"));
+                               peerTableHeaderRow.addChild("th").addChild("a", 
"href", sortString(isReversed, "idle")).addChild("span", new String[] { 
"title", "style" }, new String[] { l10n("idleTime"), "border-bottom: 1px 
dotted; cursor: help;" }, l10n("idleTimeTitle"));
                                if(hasPrivateNoteColumn())
                                        
peerTableHeaderRow.addChild("th").addChild("a", "href", sortString(isReversed, 
"privnote")).addChild("span", new String[] { "title", "style" }, new String[] { 
l10n("privateNote"), "border-bottom: 1px dotted; cursor: help;" }, 
l10n("privateNoteTitle"));

-                               if(advancedModeEnabled) {
-                                       peerTableHeaderRow.addChild("th", 
"%\u00a0Time Routable");
-                                       peerTableHeaderRow.addChild("th", 
"Total\u00a0Traffic\u00a0(in/out/resent)");
+                               if(mode >= PageMaker.MODE_ADVANCED) {
+                                       
peerTableHeaderRow.addChild("th").addChild("a", "href", sortString(isReversed, 
"time_routable")).addChild("#", "%\u00a0Time Routable");
+                                       
peerTableHeaderRow.addChild("th").addChild("a", "href", sortString(isReversed, 
"selection_percentage")).addChild("#", "%\u00a0Selection");
+                                       
peerTableHeaderRow.addChild("th").addChild("a", "href", sortString(isReversed, 
"total_traffic")).addChild("#", "Total\u00a0Traffic\u00a0(in/out/resent)");
                                        peerTableHeaderRow.addChild("th", 
"Congestion\u00a0Control");
-                                       peerTableHeaderRow.addChild("th", 
"Time\u00a0Delta");
-                                       peerTableHeaderRow.addChild("th", 
"Reported\u00a0Uptime");
+                                       
peerTableHeaderRow.addChild("th").addChild("a", "href", sortString(isReversed, 
"time_delta")).addChild("#", "Time\u00a0Delta");
+                                       
peerTableHeaderRow.addChild("th").addChild("a", "href", sortString(isReversed, 
"uptime")).addChild("#", "Reported\u00a0Uptime");
                                }

-                               SimpleColumn[] endCols = 
endColumnHeaders(advancedModeEnabled);
+                               SimpleColumn[] endCols = endColumnHeaders(mode 
>= PageMaker.MODE_ADVANCED);
                                if(endCols != null) {
                                        for(int i=0;i<endCols.length;i++) {
                                                SimpleColumn col = endCols[i];
@@ -382,22 +418,23 @@
                                        }
                                }

+                               long numberOfSelectionSamples = 
peers.getNumberOfSelectionSamples();
                                for (int peerIndex = 0, peerCount = 
peerNodeStatuses.length; peerIndex < peerCount; peerIndex++) {

                                        PeerNodeStatus peerNodeStatus = 
peerNodeStatuses[peerIndex];
-                                       drawRow(peerTable, peerNodeStatus, 
advancedModeEnabled, fProxyJavascriptEnabled, now, path, enablePeerActions, 
endCols, drawMessageTypes);
+                                       drawRow(peerTable, peerNodeStatus, mode 
>= PageMaker.MODE_ADVANCED, fProxyJavascriptEnabled, now, path, 
enablePeerActions, endCols, drawMessageTypes, numberOfSelectionSamples);

                                }

                                if(peerForm != null) {
-                                       drawPeerActionSelectBox(peerForm, 
advancedModeEnabled);
+                                       drawPeerActionSelectBox(peerForm, mode 
>= PageMaker.MODE_ADVANCED);
                                }
                        }
                        // END PEER TABLE
                }

                // our reference
-               if(shouldDrawNoderefBox(advancedModeEnabled)) {
+               if(shouldDrawNoderefBox(mode >= PageMaker.MODE_ADVANCED)) {
                        drawAddPeerBox(contentNode, ctx);
                        drawNoderefBox(contentNode, ctx);
                }
@@ -466,9 +503,9 @@

                if (request.isPartSet("add")) {
                        // add a new node
-                       String urltext = request.getPartAsString("url", 100);
+                       String urltext = request.getPartAsString("url", 200);
                        urltext = urltext.trim();
-                       String reftext = request.getPartAsString("ref", 2000);
+                       String reftext = request.getPartAsString("ref", 
Integer.MAX_VALUE);
                        reftext = reftext.trim();
                        if (reftext.length() < 200) {
                                reftext = request.getPartAsString("reffile", 
2000);
@@ -488,7 +525,7 @@
                                        // FIXME get charset encoding from 
uc.getContentType()
                                        in = new BufferedReader(new 
InputStreamReader(uc.getInputStream()));
                                        String line;
-                                       while ( (line = in.readLine()) != null) 
{
+                                       while ((line = in.readLine()) != null) {
                                                ref.append( line ).append('\n');
                                        }
                                } catch (IOException e) {
@@ -656,7 +693,7 @@

        abstract protected SimpleFieldSet getNoderef();

-       private void drawRow(HTMLNode peerTable, PeerNodeStatus peerNodeStatus, 
boolean advancedModeEnabled, boolean fProxyJavascriptEnabled, long now, String 
path, boolean enablePeerActions, SimpleColumn[] endCols, boolean 
drawMessageTypes) {
+       private void drawRow(HTMLNode peerTable, PeerNodeStatus peerNodeStatus, 
boolean advancedModeEnabled, boolean fProxyJavascriptEnabled, long now, String 
path, boolean enablePeerActions, SimpleColumn[] endCols, boolean 
drawMessageTypes, long numberOfSelectionSamples) {
                HTMLNode peerRow = peerTable.addChild("tr");

                if(enablePeerActions) {
@@ -691,7 +728,14 @@

                // location column
                if (advancedModeEnabled) {
-                       peerRow.addChild("td", "class", "peer-location", 
String.valueOf(peerNodeStatus.getLocation()));
+                       HTMLNode locationNode = peerRow.addChild("td", "class", 
"peer-location");
+                       locationNode.addChild("b", 
String.valueOf(peerNodeStatus.getLocation()));
+                       locationNode.addChild("br");
+                       double[] peersLoc = peerNodeStatus.getPeersLocation();
+                       if(peersLoc != null) {
+                               for(double loc : peersLoc)
+                                       locationNode.addChild("i", 
String.valueOf(loc)).addChild("br");
+                       }
                }

                if (advancedModeEnabled) {
@@ -730,6 +774,8 @@
                if(advancedModeEnabled) {
                        // percent of time connected column
                        peerRow.addChild("td", "class", "peer-idle" /* FIXME 
*/).addChild("#", 
fix1.format(peerNodeStatus.getPercentTimeRoutableConnection()));
+                       // selection stats
+                       peerRow.addChild("td", "class", "peer-idle" /* FIXME 
*/).addChild("#", (numberOfSelectionSamples > 0 ? 
((peerNodeStatus.getNumberOfSelections()*100/numberOfSelectionSamples)+"%") : 
"N/A"));
                        // total traffic column
                        peerRow.addChild("td", "class", "peer-idle" /* FIXME 
*/).addChild("#", SizeUtil.formatSize(peerNodeStatus.getTotalInputBytes())+" / 
"+SizeUtil.formatSize(peerNodeStatus.getTotalOutputBytes())+"/"+SizeUtil.formatSize(peerNodeStatus.getResendBytesSent()));
                        // congestion control

Modified: 
branches/db4o/freenet/src/freenet/clients/http/ConnectivityToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/ConnectivityToadlet.java     
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/clients/http/ConnectivityToadlet.java     
2008-08-07 18:30:55 UTC (rev 21657)
@@ -63,6 +63,7 @@
                /* add alert summary box */
                if(ctx.isAllowedFullAccess())
                        contentNode.addChild(core.alerts.createSummary());
+               final int mode = 
ctx.getPageMaker().drawModeSelectionArray(core, request, contentNode);

                // Add connection type box.

@@ -84,7 +85,7 @@
                        row.addChild("td", 
AddressTracker.statusString(tracker.getPortForwardStatus()));
                }

-               if(node.isAdvancedModeEnabled()) {
+               if(mode >= PageMaker.MODE_ADVANCED) {

                // One box per port


Modified: branches/db4o/freenet/src/freenet/clients/http/FProxyToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/FProxyToadlet.java   
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/clients/http/FProxyToadlet.java   
2008-08-07 18:30:55 UTC (rev 21657)
@@ -110,7 +110,7 @@

        }

-       public static void handleDownload(ToadletContext context, Bucket data, 
BucketFactory bucketFactory, String mimeType, String requestedMimeType, String 
forceString, boolean forceDownload, String basePath, FreenetURI key, String 
extras, String referrer, boolean downloadLink, ToadletContext ctx) throws 
ToadletContextClosedException, IOException {
+       public static void handleDownload(ToadletContext context, Bucket data, 
BucketFactory bucketFactory, String mimeType, String requestedMimeType, String 
forceString, boolean forceDownload, String basePath, FreenetURI key, String 
extras, String referrer, boolean downloadLink, ToadletContext ctx, 
NodeClientCore core) throws ToadletContextClosedException, IOException {
                if(Logger.shouldLog(Logger.MINOR, FProxyToadlet.class))
                        Logger.minor(FProxyToadlet.class, 
"handleDownload(data.size="+data.size()+", mimeType="+mimeType+", 
requestedMimeType="+requestedMimeType+", forceDownload="+forceDownload+", 
basePath="+basePath+", key="+key);
                String extrasNoMime = extras; // extras will not include MIME 
type to start with - REDFLAG maybe it should be an array
@@ -225,6 +225,11 @@
                        HTMLNode option = optionList.addChild("li");
                        L10n.addL10nSubstitution(option, 
"FProxyToadlet.openAsText", new String[] { "link", "/link" }, new String[] { 
"<a href=\""+basePath+key.toString()+"?type=text/plain"+extrasNoMime+"\">", 
"</a>" });
                        // FIXME: is this safe? See bug #131
+                       
+                       if((mimeType.equals("application/x-freenet-index")) && 
(core.node.pluginManager.isPluginLoaded("plugins.ThawIndexBrowser.ThawIndexBrowser")))
 {
+                               option = optionList.addChild("li");
+                               L10n.addL10nSubstitution(option, 
"FProxyToadlet.openAsThawIndex", new String[] { "link", "/link" }, new String[] 
{ "<a href=\""+basePath + 
"plugins/plugins.ThawIndexBrowser.ThawIndexBrowser/?key=" + key.toString() + 
"\">", "</a>" });
+                       }
                        option = optionList.addChild("li");
                        L10n.addL10nSubstitution(option, 
"FProxyToadlet.openForceDisk", new String[] { "link", "/link" }, new String[] { 
"<a href=\""+basePath+key.toString()+"?forcedownload"+extras+"\">", "</a>" });
                        if(!(mimeType.equals("application/octet-stream") || 
mimeType.equals("application/x-msdownload"))) {
@@ -302,7 +307,7 @@
                int bufProgress = 0;
                while(offset < buf.length) {
                        byte b = buf[offset];
-                       if((int)b == (int)find.charAt(bufProgress)) {
+                       if(b == find.charAt(bufProgress)) {
                                bufProgress++;
                                if(bufProgress == find.length()) return true;
                        } else {
@@ -337,7 +342,12 @@
                                }

                                if(logMINOR) Logger.minor(this, "Redirecting to 
FreenetURI: "+newURI);
-                               headers.put("Location", "/"+newURI);
+                               String type = httprequest.getParam("type");
+                               if ((type != null) && (type.length() > 0)) {
+                                       headers.put("Location", "/"+newURI + 
"?type=" + type);
+                               } else {
+                                       headers.put("Location", "/"+newURI);
+                               }
                                ctx.sendReplyHeaders(302, "Found", headers, 
null, 0);
                                return;
                        }
@@ -435,8 +445,9 @@

                        String referer = sanitizeReferer(ctx);

-                       handleDownload(ctx, data, ctx.getBucketFactory(), 
mimeType, requestedMimeType, httprequest.getParam("force", null), 
httprequest.isParameterSet("forcedownload"), "/", key, maxSize != MAX_LENGTH ? 
"&max-size="+maxSize : "", referer, true, ctx);

+                       handleDownload(ctx, data, ctx.getBucketFactory(), 
mimeType, requestedMimeType, httprequest.getParam("force", null), 
httprequest.isParameterSet("forcedownload"), "/", key, maxSize != MAX_LENGTH ? 
"&max-size="+maxSize : "", referer, true, ctx, core);
+                       
                } catch (FetchException e) {
                        String msg = e.getMessage();
                        if(Logger.shouldLog(Logger.MINOR, this))
@@ -527,7 +538,7 @@
                                option = optionList.addChild("li");
                                
option.addChild(ctx.getPageMaker().createBackLink(ctx, l10n("goBackToPrev")));

-                               this.writeHTMLReply(ctx, 500 /* close enough - 
FIXME probably should depend on status code */,
+                               this.writeHTMLReply(ctx, (e.mode == 10) ? 404 : 
500 /* close enough - FIXME probably should depend on status code */,
                                                "Internal Error", 
pageNode.generate());
                        }
                } catch (SocketException e) {

Modified: branches/db4o/freenet/src/freenet/clients/http/PageMaker.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/PageMaker.java       
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/clients/http/PageMaker.java       
2008-08-07 18:30:55 UTC (rev 21657)
@@ -16,8 +16,10 @@
 import java.util.jar.JarFile;

 import freenet.l10n.L10n;
+import freenet.node.NodeClientCore;
 import freenet.support.HTMLNode;
 import freenet.support.Logger;
+import freenet.support.api.HTTPRequest;
 import freenet.support.io.FileUtil;

 /** Simple class to output standard heads and tail for web interface pages. 
@@ -25,6 +27,8 @@
 public final class PageMaker {

        public static final String DEFAULT_THEME = "clean";
+       public static final int MODE_SIMPLE = 1;
+       public static final int MODE_ADVANCED = 2;
        private String theme;
        private File override;
        private final List navigationLinkTexts = new ArrayList();
@@ -258,4 +262,35 @@

                return result;
        }
+       
+       protected int drawModeSelectionArray(NodeClientCore core, HTTPRequest 
req, HTMLNode contentNode) {
+               // Mode can be changed by a link, not just by the default
+               
+               int mode = core.isAdvancedModeEnabled() ? MODE_ADVANCED : 
MODE_SIMPLE;
+               
+               if(req.isParameterSet("mode")) {
+                       mode = req.getIntParam("mode", mode);
+               }
+               
+               // FIXME style this properly
+               HTMLNode table = contentNode.addChild("table", "border", "1");
+               HTMLNode row = table.addChild("tr");
+               HTMLNode cell = row.addChild("td");
+               
+               if(mode != MODE_SIMPLE)
+                       cell.addChild("a", new String[] { "href", "title" }, 
new String[] { "?mode=1", l10n("modeSimpleTooltip") }, l10n("modeSimple"));
+               else
+                       cell.addChild("b", "title", l10n("modeSimpleTooltip"), 
l10n("modeSimple"));
+               cell = row.addChild("td");
+               if(mode != MODE_ADVANCED)
+                       cell.addChild("a", new String[] { "href", "title" }, 
new String[] { "?mode=2", l10n("modeAdvancedTooltip") }, l10n("modeAdvanced"));
+               else
+                       cell.addChild("b", "title", 
l10n("modeAdvancedTooltip"), l10n("modeAdvanced"));
+               
+               return mode;
+       }
+       
+       private static final String l10n(String string) {
+               return L10n.getString("PageMaker." + string);
+       }
 }

Modified: branches/db4o/freenet/src/freenet/clients/http/PproxyToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/PproxyToadlet.java   
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/clients/http/PproxyToadlet.java   
2008-08-07 18:30:55 UTC (rev 21657)
@@ -118,19 +118,35 @@
                else
                {
                        PageMaker pageMaker = ctx.getPageMaker();
-
-                       if (request.isPartSet("submit-official") || 
request.isPartSet("submit-other")) {
+                       
+                       if (request.isPartSet("submit-official")) {
                                String pluginName = null;
-                               if (request.isPartSet("submit-official")) {
-                                       pluginName = 
request.getPartAsString("plugin-name", 40);
-                               } else {
-                                       pluginName = 
request.getPartAsString("plugin-url", 200);
-                               }
-                               pm.startPlugin(pluginName, true);
+                               pluginName = 
request.getPartAsString("plugin-name", 40);
+                               pm.startPluginOfficial(pluginName, true);
                                headers.put("Location", ".");
                                ctx.sendReplyHeaders(302, "Found", headers, 
null, 0);
                                return;
                        }
+                       if (request.isPartSet("submit-other")) {
+                               String pluginName = null;
+                               pluginName = 
request.getPartAsString("plugin-url", 200);
+                               boolean fileonly = 
"on".equalsIgnoreCase(request.getPartAsString("fileonly", 20));
+                               if (fileonly) 
+                                       pm.startPluginFile(pluginName, true);
+                               else
+                                       pm.startPluginURL(pluginName, true);
+                               headers.put("Location", ".");
+                               ctx.sendReplyHeaders(302, "Found", headers, 
null, 0);
+                               return;
+                       }
+                       if (request.isPartSet("submit-freenet")) {
+                               String pluginName = null;
+                               pluginName = 
request.getPartAsString("plugin-uri", 300);
+                               pm.startPluginFreenet(pluginName, true);
+                               headers.put("Location", ".");
+                               ctx.sendReplyHeaders(302, "Found", headers, 
null, 0);
+                               return;
+                       }
                        if (request.isPartSet("dismiss-user-alert")) {
                                int userAlertHashCode = 
request.getIntPart("disable", -1);
                                core.alerts.dismissAlert(userAlertHashCode);
@@ -211,7 +227,8 @@
                                        if (purge) {
                                                pm.removeCachedCopy(fn);
                                        }
-                                       pm.startPlugin(fn, true);
+                                       // FIXME
+                                       pm.startPluginAuto(fn, true);

                                        headers.put("Location", ".");
                                        ctx.sendReplyHeaders(302, "Found", 
headers, null, 0);
@@ -299,7 +316,7 @@
                                }

                                /* find which plugins have already been loaded. 
*/
-                               List/*<String>*/ availablePlugins = 
findAvailablePlugins();
+                               List<String> availablePlugins = 
pm.findAvailablePlugins();
                                Iterator/*<PluginInfoWrapper>*/ loadedPlugins = 
pm.getPlugins().iterator();
                                while (loadedPlugins.hasNext()) {
                                        PluginInfoWrapper pluginInfoWrapper = 
(PluginInfoWrapper) loadedPlugins.next();
@@ -317,6 +334,7 @@
                                showPluginList(ctx, pm, contentNode);
                                showOfficialPluginLoader(ctx, contentNode, 
availablePlugins);
                                showUnofficialPluginLoader(ctx, contentNode);
+                               showFreenetPluginLoader(ctx, contentNode);

                                writeHTMLReply(ctx, 200, "OK", 
pageNode.generate());
                        } else {
@@ -358,31 +376,6 @@
        }

        /**
-        * Returns a list of the names of all available official plugins. Right 
now
-        * this list is hardcoded but in future we could retrieve this list 
from emu
-        * or from freenet itself.
-        * 
-        * @return A list of all available plugin names
-        */
-       private List/* <String> */findAvailablePlugins() {
-               List/* <String> */availablePlugins = new ArrayList/* <String> 
*/();
-               availablePlugins.add("Echo");
-               availablePlugins.add("Freemail");
-               availablePlugins.add("HelloWorld");
-               availablePlugins.add("HelloFCP");
-               availablePlugins.add("JSTUN");
-               availablePlugins.add("KeyExplorer");
-               availablePlugins.add("MDNSDiscovery");
-               availablePlugins.add("SNMP");
-               availablePlugins.add("TestGallery");
-               availablePlugins.add("ThawIndexBrowser");
-               availablePlugins.add("UPnP");
-               availablePlugins.add("XMLLibrarian");
-               availablePlugins.add("XMLSpider");
-               return availablePlugins;
-       }
-
-       /**
         * Shows a list of all currently loading plugins.
         * 
         * @param pluginManager
@@ -489,6 +482,22 @@
                addOtherForm.addChild("input", new String[] { "type", "name", 
"size" }, new String[] { "text", "plugin-url", "80" });
                addOtherForm.addChild("#", " ");
                addOtherForm.addChild("input", new String[] { "type", "name", 
"value" }, new String[] { "submit", "submit-other", l10n("Load") });
+               addOtherForm.addChild("br");
+               addOtherForm.addChild("input", new String[] { "type", "name", 
"checked" }, new String[] { "checkbox", "fileonly", "checked" });
+               addOtherForm.addChild("#", " " + l10n("fileonly"));
        }
+       
+       private void showFreenetPluginLoader(ToadletContext toadletContext, 
HTMLNode contentNode) {
+               /* box for freenet plugins. */
+               HTMLNode addFreenetPluginBox = contentNode.addChild("div", 
"class", "infobox infobox-normal");
+               addFreenetPluginBox.addChild("div", "class", "infobox-header", 
l10n("loadFreenetPlugin"));
+               HTMLNode addFreenetPluginContent = 
addFreenetPluginBox.addChild("div", "class", "infobox-content");
+               HTMLNode addFreenetForm = 
toadletContext.addFormChild(addFreenetPluginContent, ".", 
"addFreenetPluginForm");
+               addFreenetForm.addChild("div", l10n("loadFreenetPluginText"));
+               addFreenetForm.addChild("#", (l10n("loadFreenetURLLabel") + ": 
"));
+               addFreenetForm.addChild("input", new String[] { "type", "name", 
"size" }, new String[] { "text", "plugin-uri", "80" });
+               addFreenetForm.addChild("#", " ");
+               addFreenetForm.addChild("input", new String[] { "type", "name", 
"value" }, new String[] { "submit", "submit-freenet", l10n("Load") });
+       }

 }

Modified: branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java    
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java    
2008-08-07 18:30:55 UTC (rev 21657)
@@ -62,6 +62,7 @@
 import freenet.support.io.Closer;
 import freenet.support.io.FileBucket;
 import freenet.support.io.NativeThread;
+import java.util.StringTokenizer;

 public class QueueToadlet extends Toadlet implements RequestCompletionCallback 
{

@@ -206,6 +207,60 @@
                                }
                                writePermanentRedirect(ctx, "Done", "/queue/");
                                return;
+                       }else if(request.isPartSet("bulkDownloads")) {
+                               String bulkDownloadsAsString = 
request.getPartAsString("bulkDownloads", Integer.MAX_VALUE);
+                               String[] keys = 
bulkDownloadsAsString.split("\n");
+                               if(("".equals(bulkDownloadsAsString)) || 
(keys.length < 1)) {
+                                       writePermanentRedirect(ctx, "Done", 
"/queue/");
+                                       return;
+                               }
+                               LinkedList success = new LinkedList(), failure 
= new LinkedList();
+                               
+                               for(int i=0; i<keys.length; i++) {
+                                       String currentKey = keys[i];
+                                       try {
+                                               FreenetURI fetchURI = new 
FreenetURI(currentKey);
+                                               
fcp.makePersistentGlobalRequestBlocking(fetchURI, null, "forever", "disk");
+                                               success.add(currentKey);
+                                       } catch (Exception e) {
+                                               failure.add(currentKey);
+                                               Logger.error(this, "An error 
occured while attempting to download key("+i+") : "+currentKey+ " : 
"+e.getMessage());
+                                       }
+                               }
+
+                               boolean displayFailureBox = failure.size() > 0;
+                               boolean displaySuccessBox = success.size() > 0;
+                               
+                               HTMLNode pageNode = 
ctx.getPageMaker().getPageNode(L10n.getString("QueueToadlet.downloadFiles"), 
ctx);
+                               HTMLNode contentNode = 
ctx.getPageMaker().getContentNode(pageNode);
+                               HTMLNode alertNode = 
contentNode.addChild(ctx.getPageMaker().getInfobox((displayFailureBox ? 
"infobox-warning" : "infobox-info"), 
L10n.getString("QueueToadlet.downloadFiles")));
+                               HTMLNode alertContent = 
ctx.getPageMaker().getContentNode(alertNode);
+                               Iterator it;
+                               if(displaySuccessBox) {
+                                       HTMLNode successDiv = 
alertContent.addChild("ul");
+                                       successDiv.addChild("#", 
L10n.getString("QueueToadlet.enqueuedSuccessfully", "number", 
String.valueOf(success.size())));
+                                       it = success.iterator();
+                                       while(it.hasNext()) {
+                                               HTMLNode line = 
successDiv.addChild("li");
+                                               line.addChild("#", (String) 
it.next());
+                                       }
+                                       successDiv.addChild("br");
+                               }
+                               if(displayFailureBox) {
+                                       HTMLNode failureDiv = 
alertContent.addChild("ul");
+                                       if(displayFailureBox) {
+                                               failureDiv.addChild("#", 
L10n.getString("QueueToadlet.enqueuedFailure", "number", 
String.valueOf(failure.size())));
+                                               it = failure.iterator();
+                                               while(it.hasNext()) {
+                                                       HTMLNode line = 
failureDiv.addChild("li");
+                                                       line.addChild("#", 
(String) it.next());
+                                               }
+                                       }
+                                       failureDiv.addChild("br");
+                               }
+                               alertContent.addChild("a", "href", "/queue/", 
L10n.getString("Toadlet.returnToQueuepage"));
+                               writeHTMLReply(ctx, 200, "OK", 
pageNode.generate());
+                               return;
                        } else if (request.isPartSet("change_priority")) {
                                String identifier = 
request.getPartAsString("identifier", MAX_IDENTIFIER_LENGTH);
                                short newPriority = 
Short.parseShort(request.getPartAsString("priority", 32));
@@ -425,7 +480,7 @@
                                                String mimeType = 
result.getMimeType();
                                                String requestedMimeType = 
request.getParam("type", null);
                                                String forceString = 
request.getParam("force");
-                                               
FProxyToadlet.handleDownload(ctx, data, ctx.getBucketFactory(), mimeType, 
requestedMimeType, forceString, request.isParameterSet("forcedownload"), 
"/queue/", key, "", "/queue/", false, ctx);
+                                               
FProxyToadlet.handleDownload(ctx, data, ctx.getBucketFactory(), mimeType, 
requestedMimeType, forceString, request.isParameterSet("forcedownload"), 
"/queue/", key, "", "/queue/", false, ctx, core);
                                                if(result.freeWhenDone)
                                                        data.free();
                                                return;
@@ -530,6 +585,7 @@
                        HTMLNode infoboxContent = 
pageMaker.getContentNode(infobox);
                        infoboxContent.addChild("#", 
L10n.getString("QueueToadlet.noTaskOnGlobalQueue"));
                        contentNode.addChild(createInsertBox(pageMaker, ctx, 
core.isAdvancedModeEnabled()));
+                       contentNode.addChild(createBulkDownloadForm(ctx, 
pageMaker));
                        return pageNode;
                }

@@ -645,8 +701,9 @@
                /* add alert summary box */
                if(ctx.isAllowedFullAccess())
                        contentNode.addChild(core.alerts.createSummary());
+               final int mode = pageMaker.drawModeSelectionArray(core, 
request, contentNode);
                /* add file insert box */
-               contentNode.addChild(createInsertBox(pageMaker, ctx, 
core.isAdvancedModeEnabled()));
+               contentNode.addChild(createInsertBox(pageMaker, ctx, mode >= 
PageMaker.MODE_ADVANCED));

                /* navigation bar */
                HTMLNode navigationBar = pageMaker.getInfobox("navbar", 
L10n.getString("QueueToadlet.requestNavigation"));
@@ -707,7 +764,7 @@
                                L10n.getString("QueueToadlet.priority6")
                };

-               boolean advancedModeEnabled = core.isAdvancedModeEnabled();
+               boolean advancedModeEnabled = (mode >= PageMaker.MODE_ADVANCED);

                HTMLNode legendBox = 
contentNode.addChild(pageMaker.getInfobox("legend", 
L10n.getString("QueueToadlet.legend")));
                HTMLNode legendContent = pageMaker.getContentNode(legendBox);
@@ -832,6 +889,8 @@
                        }
                }

+               contentNode.addChild(createBulkDownloadForm(ctx, pageMaker));
+               
                return pageNode;
        }

@@ -1039,6 +1098,18 @@
                return insertBox;
        }

+       private HTMLNode createBulkDownloadForm(ToadletContext ctx, PageMaker 
pageMaker) {
+               HTMLNode downloadBox = 
pageMaker.getInfobox(L10n.getString("QueueToadlet.downloadFiles"));
+               HTMLNode downloadBoxContent = 
pageMaker.getContentNode(downloadBox);
+               HTMLNode downloadForm = ctx.addFormChild(downloadBoxContent, 
"/queue/", "queueDownloadForm");
+               downloadForm.addChild("#", 
L10n.getString("QueueToadlet.downloadFilesInstructions"));
+               downloadForm.addChild("br");
+               downloadForm.addChild("textarea", new String[] { "id", "name", 
"cols", "rows" }, new String[] { "bulkDownloads", "bulkDownloads", "120", "8" 
});
+               downloadForm.addChild("br");
+               downloadForm.addChild("input", new String[] { "type", "name", 
"value" }, new String[] { "submit", "insert", 
L10n.getString("QueueToadlet.download") });
+               return downloadBox;
+       }
+       
        private HTMLNode createRequestTable(PageMaker pageMaker, ToadletContext 
ctx, List requests, int[] columns, String[] priorityClasses, boolean 
advancedModeEnabled, boolean isUpload, ObjectContainer container) {
                HTMLNode table = new HTMLNode("table", "class", "requests");
                HTMLNode headerRow = table.addChild("tr", "class", 
"table-header");
@@ -1320,6 +1391,10 @@
                        FreenetURI uri = 
((ClientPut)req).getFinalURI(container);
                        if(req.isPersistentForever() && uri != null)
                                container.activate(uri, 5);
+                       if(uri == null) {
+                               Logger.error(this, "No URI for supposedly 
finished request "+req);
+                               return;
+                       }
                        long size = ((ClientPut)req).getDataSize();
                        if(uri == null) {
                                Logger.error(this, "uri is null for "+req+" for 
"+identifier);
@@ -1331,7 +1406,7 @@
                        L10n.addL10nSubstitution(text, 
"QueueToadlet.uploadSucceeded",
                                        new String[] { "link", "/link", 
"filename", "size" },
                                        new String[] { "<a 
href=\"/"+uri.toACIIString()+"\">", "</a>", name, SizeUtil.formatSize(size) } );
-                       UserAlert alert = 
+                       UserAlert alert =
                        new SimpleHTMLUserAlert(true, title, title, text, 
UserAlert.MINOR) {
                                public void onDismiss() {
                                        
synchronized(completedRequestIdentifiers) {

Modified: 
branches/db4o/freenet/src/freenet/clients/http/SimpleToadletServer.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/SimpleToadletServer.java     
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/clients/http/SimpleToadletServer.java     
2008-08-07 18:30:55 UTC (rev 21657)
@@ -465,10 +465,12 @@

        }

-       private StartupToadlet startupToadlet;
+       public StartupToadlet startupToadlet;

        public void removeStartupToadlet() {
                unregister(startupToadlet);
+               // Ready to be GCed
+               startupToadlet = null;
                // Not in the navbar.
        }

@@ -520,6 +522,10 @@
                }
        }

+       public StartupToadlet getStartupToadlet() {
+               return startupToadlet;
+       }
+       
        public Toadlet findToadlet(URI uri) throws PermanentRedirectException {
                Iterator i = toadlets.iterator();
                String path = uri.getPath();

Modified: branches/db4o/freenet/src/freenet/clients/http/StartupToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/StartupToadlet.java  
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/clients/http/StartupToadlet.java  
2008-08-07 18:30:55 UTC (rev 21657)
@@ -1,5 +1,6 @@
 package freenet.clients.http;

+import freenet.l10n.L10n;
 import java.io.IOException;
 import java.net.URI;

@@ -9,40 +10,53 @@
 /**
  * Toadlet for "Freenet is starting up" page.
  */
-class StartupToadlet extends Toadlet {
+public class StartupToadlet extends Toadlet {

-    private StaticToadlet staticToadlet;
-       
+       private StaticToadlet staticToadlet;
+       private volatile boolean isPRNGReady = false;
+
        public StartupToadlet(StaticToadlet staticToadlet) {
                super(null);
                this.staticToadlet = staticToadlet;
        }
-       
-    public void handleGet(URI uri, HTTPRequest req, ToadletContext ctx) throws 
ToadletContextClosedException, IOException, RedirectException {
-    // If we don't disconnect we will have pipelining issues
-    ctx.forceDisconnect();

-        String path = uri.getPath();
-        if (path.startsWith(StaticToadlet.ROOT_URL) && staticToadlet != null) {
-            staticToadlet.handleGet(uri, req, ctx);
-        } else {
-            String desc = "Freenet is starting up";
-            HTMLNode pageNode = ctx.getPageMaker().getPageNode(desc, false, 
ctx);
-            HTMLNode headNode = ctx.getPageMaker().getHeadNode(pageNode);
-            headNode.addChild("meta", new String[]{"http-equiv", "content"}, 
new String[]{"refresh", "20; url="});
-            HTMLNode contentNode = ctx.getPageMaker().getContentNode(pageNode);
-       
-       HTMLNode infobox = 
contentNode.addChild(ctx.getPageMaker().getInfobox("infobox-error", desc));
-       HTMLNode infoboxContent = ctx.getPageMaker().getContentNode(infobox);
-       infoboxContent.addChild("#", "Your freenet node is starting up, please 
hold on.");
-            
-            WelcomeToadlet.maybeDisplayWrapperLogfile(ctx, contentNode);
-            //TODO: send a Retry-After header ?
-            writeHTMLReply(ctx, 503, desc, pageNode.generate());
-        }
+       @Override
+       public void handleGet(URI uri, HTTPRequest req, ToadletContext ctx) 
throws ToadletContextClosedException, IOException, RedirectException {
+               // If we don't disconnect we will have pipelining issues
+               ctx.forceDisconnect();
+
+               String path = uri.getPath();
+               if(path.startsWith(StaticToadlet.ROOT_URL) && staticToadlet != 
null)
+                       staticToadlet.handleGet(uri, req, ctx);
+               else {
+                       String desc = L10n.getString("StartupToadlet.title");
+                       HTMLNode pageNode = 
ctx.getPageMaker().getPageNode(desc, false, ctx);
+                       HTMLNode headNode = 
ctx.getPageMaker().getHeadNode(pageNode);
+                       headNode.addChild("meta", new String[]{"http-equiv", 
"content"}, new String[]{"refresh", "20; url="});
+                       HTMLNode contentNode = 
ctx.getPageMaker().getContentNode(pageNode);
+
+                       if(!isPRNGReady) {
+                               HTMLNode prngInfobox = 
contentNode.addChild(ctx.getPageMaker().getInfobox("infobox-error", 
L10n.getString("StartupToadlet.entropyErrorTitle")));
+                               HTMLNode prngInfoboxContent = 
ctx.getPageMaker().getContentNode(prngInfobox);
+                               prngInfoboxContent.addChild("#", 
L10n.getString("StartupToadlet.entropyErrorContent"));
+                       }
+
+                       HTMLNode infobox = 
contentNode.addChild(ctx.getPageMaker().getInfobox("infobox-error", desc));
+                       HTMLNode infoboxContent = 
ctx.getPageMaker().getContentNode(infobox);
+                       infoboxContent.addChild("#", 
L10n.getString("StartupToadlet.isStartingUp"));
+
+                       WelcomeToadlet.maybeDisplayWrapperLogfile(ctx, 
contentNode);
+
+                       //TODO: send a Retry-After header ?
+                       writeHTMLReply(ctx, 503, desc, pageNode.generate());
+               }
+       }
+
+       public String supportedMethods() {
+               return "GET";
+       }
+
+       public void setIsPRNGReady() {
+               isPRNGReady = true;
+       }
 }
-    
-    public String supportedMethods() {
-        return "GET";
-    }
-}
\ No newline at end of file

Modified: branches/db4o/freenet/src/freenet/clients/http/StatisticsToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/StatisticsToadlet.java       
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/clients/http/StatisticsToadlet.java       
2008-08-07 18:30:55 UTC (rev 21657)
@@ -125,8 +125,6 @@
                        super.sendErrorPage(ctx, 403, 
L10n.getString("Toadlet.unauthorizedTitle"), 
L10n.getString("Toadlet.unauthorized"));
                        return;
                }
-
-               final boolean advancedModeEnabled = 
node.isAdvancedModeEnabled();
                final SubConfig nodeConfig = node.config.get("node");

                /* gather connection statistics */
@@ -165,10 +163,12 @@

                // FIXME! We need some nice images
                final long now = System.currentTimeMillis();
+               double myLocation = node.getLocation();
                final long nodeUptimeSeconds = (now - node.startupTime) / 1000;

                if(ctx.isAllowedFullAccess())
                        contentNode.addChild(core.alerts.createSummary());
+               final int mode = 
ctx.getPageMaker().drawModeSelectionArray(core, request, contentNode);

                double swaps = (double)node.getSwaps();
                double noSwaps = (double)node.getNoSwaps();
@@ -204,11 +204,11 @@
                        logsList.addChild("li").addChild("a", new String[]{ 
"href", "target"}, new String[]{ "/?latestlog", "_new"}, l10n("getLogs"));
                logsList.addChild("li").addChild("a", "href", 
TranslationToadlet.TOADLET_URL+"?getOverrideTranlationFile").addChild("#", 
L10n.getString("TranslationToadlet.downloadTranslationsFile"));

-               if(advancedModeEnabled) {
+               if(mode >= PageMaker.MODE_ADVANCED) {
                        // store size box
                        HTMLNode storeSizeInfobox = 
nextTableCell.addChild("div", "class", "infobox");

-                       drawStoreSizeBox(storeSizeInfobox, nodeUptimeSeconds);
+                       drawStoreSizeBox(storeSizeInfobox, myLocation, 
nodeUptimeSeconds);

                        if(numberOfConnected + numberOfRoutingBackedOff > 0) {
                                // Load balancing box
@@ -237,16 +237,16 @@
                        }
                }

-               if(advancedModeEnabled || numberOfConnected + 
numberOfRoutingBackedOff > 0) {                   
+               if(mode >= PageMaker.MODE_ADVANCED || numberOfConnected + 
numberOfRoutingBackedOff > 0) {                       

                        // Activity box
                        nextTableCell = overviewTableRow.addChild("td", 
"class", "last");
                        HTMLNode activityInfobox = 
nextTableCell.addChild("div", "class", "infobox");

-                       drawActivityBox(activityInfobox, advancedModeEnabled);
+                       drawActivityBox(activityInfobox, mode >= 
PageMaker.MODE_ADVANCED);

                        /* node status overview box */
-                       if(advancedModeEnabled) {
+                       if(mode >= PageMaker.MODE_ADVANCED) {
                                HTMLNode overviewInfobox = 
nextTableCell.addChild("div", "class", "infobox");
                                drawOverviewBox(overviewInfobox, 
nodeUptimeSeconds, now, swaps, noSwaps);
                        }
@@ -254,7 +254,7 @@
                        // Peer statistics box
                        HTMLNode peerStatsInfobox = 
nextTableCell.addChild("div", "class", "infobox");

-                       drawPeerStatsBox(peerStatsInfobox, advancedModeEnabled, 
numberOfConnected, numberOfRoutingBackedOff, 
+                       drawPeerStatsBox(peerStatsInfobox, mode >= 
PageMaker.MODE_ADVANCED, numberOfConnected, numberOfRoutingBackedOff, 
                                        numberOfTooNew, numberOfTooOld, 
numberOfDisconnected, numberOfNeverConnected, numberOfDisabled, 
                                        numberOfBursting, numberOfListening, 
numberOfListenOnly, numberOfSeedServers, numberOfSeedClients,
                                        numberOfRoutingDisabled, 
numberOfClockProblem, numberOfConnError, numberOfDisconnecting);
@@ -262,10 +262,10 @@
                        // Bandwidth box
                        HTMLNode bandwidthInfobox = 
nextTableCell.addChild("div", "class", "infobox");

-                       drawBandwidthBox(bandwidthInfobox, nodeUptimeSeconds, 
advancedModeEnabled);
+                       drawBandwidthBox(bandwidthInfobox, nodeUptimeSeconds, 
mode >= PageMaker.MODE_ADVANCED);
                }

-               if(advancedModeEnabled) {
+               if(mode >= PageMaker.MODE_ADVANCED) {

                        // Peer routing backoff reason box
                        HTMLNode backoffReasonInfobox = 
nextTableCell.addChild("div", "class", "infobox");
@@ -286,7 +286,7 @@

                        //Swap statistics box
                        HTMLNode locationSwapInfobox = 
nextTableCell.addChild("div", "class", "infobox");
-                       drawSwapStatsBox(locationSwapInfobox, 
nodeUptimeSeconds, swaps, noSwaps);
+                       drawSwapStatsBox(locationSwapInfobox, myLocation, 
nodeUptimeSeconds, swaps, noSwaps);

                        // unclaimedFIFOMessageCounts box
                        HTMLNode unclaimedFIFOMessageCountsInfobox = 
nextTableCell.addChild("div", "class", "infobox");
@@ -323,14 +323,54 @@
                        HTMLNode peerCircleInfobox = 
nextTableCell.addChild("div", "class", "infobox");
                        peerCircleInfobox.addChild("div", "class", 
"infobox-header", "Peer\u00a0Location\u00a0Distribution (w/pReject)");
                        HTMLNode peerCircleTable = 
peerCircleInfobox.addChild("div", "class", "infobox-content").addChild("table");
-                       addPeerCircle(peerCircleTable, peerNodeStatuses);
+                       addPeerCircle(peerCircleTable, peerNodeStatuses, 
myLocation);
                        nextTableCell = overviewTableRow.addChild("td");

                        // node distribution box
                        HTMLNode nodeCircleInfobox = 
nextTableCell.addChild("div", "class", "infobox");
                        nodeCircleInfobox.addChild("div", "class", 
"infobox-header", "Node\u00a0Location\u00a0Distribution (w/Swap\u00a0Age)");
                        HTMLNode nodeCircleTable = 
nodeCircleInfobox.addChild("div", "class", "infobox-content").addChild("table");
-                       addNodeCircle(nodeCircleTable);
+                       addNodeCircle(nodeCircleTable, myLocation);
+                       
+                       
+                       overviewTableRow = overviewTable.addChild("tr");
+                       nextTableCell = overviewTableRow.addChild("td", 
"class", "first");
+                       // specialisation box
+                       int[] incomingRequestCountArray = new int[1];
+                       int[] incomingRequestLocation = 
stats.getIncomingRequestLocation(incomingRequestCountArray);
+                       int incomingRequestsCount = 
incomingRequestCountArray[0];
+                       
+                       if(incomingRequestsCount > 0) {
+                               HTMLNode nodeSpecialisationInfobox = 
nextTableCell.addChild("div", "class", "infobox");
+                               nodeSpecialisationInfobox.addChild("div", 
"class", "infobox-header", "Incoming\u00a0Request\u00a0Distribution");
+                               HTMLNode nodeSpecialisationTable = 
nodeSpecialisationInfobox.addChild("div", "class", 
"infobox-content").addChild("table");
+                               addSpecialisation(nodeSpecialisationTable, 
myLocation, incomingRequestsCount, incomingRequestLocation);
+                       }
+                       
+                       nextTableCell = overviewTableRow.addChild("td");
+                       int[] outgoingLocalRequestCountArray = new int[1];
+                       int[] outgoingLocalRequestLocation = 
stats.getOutgoingLocalRequestLocation(outgoingLocalRequestCountArray);
+                       int outgoingLocalRequestsCount = 
outgoingLocalRequestCountArray[0];
+                       
+                       if(outgoingLocalRequestsCount > 0) {
+                               HTMLNode nodeSpecialisationInfobox = 
nextTableCell.addChild("div", "class", "infobox");
+                               nodeSpecialisationInfobox.addChild("div", 
"class", "infobox-header", 
"Outgoing\u00a0Local\u00a0Request\u00a0Distribution");
+                               HTMLNode nodeSpecialisationTable = 
nodeSpecialisationInfobox.addChild("div", "class", 
"infobox-content").addChild("table");
+                               addSpecialisation(nodeSpecialisationTable, 
myLocation, outgoingLocalRequestsCount, outgoingLocalRequestLocation);
+                       }
+                       
+                       overviewTableRow = overviewTable.addChild("tr");
+                       nextTableCell = overviewTableRow.addChild("td", 
"class", "first");
+                       int[] outgoingRequestCountArray = new int[1];
+                       int[] outgoingRequestLocation = 
stats.getOutgoingRequestLocation(outgoingRequestCountArray);
+                       int outgoingRequestsCount = 
outgoingRequestCountArray[0];
+                       
+                       if(outgoingRequestsCount > 0) {
+                               HTMLNode nodeSpecialisationInfobox = 
nextTableCell.addChild("div", "class", "infobox");
+                               nodeSpecialisationInfobox.addChild("div", 
"class", "infobox-header", "Outgoing\u00a0Request\u00a0Distribution");
+                               HTMLNode nodeSpecialisationTable = 
nodeSpecialisationInfobox.addChild("div", "class", 
"infobox-content").addChild("table");
+                               addSpecialisation(nodeSpecialisationTable, 
myLocation, outgoingRequestsCount, outgoingRequestLocation);
+                       }
                }

                this.writeHTMLReply(ctx, 200, "OK", pageNode.generate());
@@ -456,7 +496,7 @@
                }
        }

-       private void drawStoreSizeBox(HTMLNode storeSizeInfobox, long 
nodeUptimeSeconds) {
+       private void drawStoreSizeBox(HTMLNode storeSizeInfobox, double loc, 
long nodeUptimeSeconds) {

                storeSizeInfobox.addChild("div", "class", "infobox-header", 
"Datastore");
                HTMLNode storeSizeInfoboxContent = 
storeSizeInfobox.addChild("div", "class", "infobox-content");
@@ -559,16 +599,7 @@
                row.addChild("td", 
fix1p2.format(1.0*cacheWrites/nodeUptimeSeconds)+" /sec");

                // location-based stats
-               boolean hasLoc=true;
                double nodeLoc=0.0;
-               try {
-                       nodeLoc=node.getLocationManager().getLocation();
-               } catch (Error e) {
-                       //FIXME: PLEASE, how do we get the node location on the 
stats page?
-                       //Logger.error(this, "why?", e);
-                       e.printStackTrace();
-                       hasLoc=false;
-               }

                double 
avgCacheLocation=node.nodeStats.avgCacheLocation.currentValue();
                double 
avgStoreLocation=node.nodeStats.avgStoreLocation.currentValue();
@@ -594,28 +625,27 @@
                row.addChild("td", fix1p4.format(furthestStoreSuccess));
                row.addChild("td", fix1p4.format(furthestCacheSuccess));

-               if (hasLoc) {
-                       row=storeSizeTable.addChild("tr");
-                       row.addChild("td", "Avg. Distance");
-                       row.addChild("td", fix1p4.format(storeDist));
-                       row.addChild("td", fix1p4.format(cacheDist));
-                       
-                       long 
cacheLocationReports=node.nodeStats.avgCacheLocation.countReports();
-                       long 
storeLocationReports=node.nodeStats.avgStoreLocation.countReports();
-                       
-                       double storePercent=1.0*storeLocationReports/storeKeys;
-                       double cachePercent=1.0*cacheLocationReports/cachedKeys;
-                       
-                       //Cap the reported value at 100%, as the decaying 
average does not account beyond that anyway.
-                       if (storePercent>1.0) storePercent=1.0;
-                       if (cachePercent>1.0) cachePercent=1.0;
-                       
-                       row=storeSizeTable.addChild("tr");
-                       row.addChild("td", "Distance Stats");
-                       row.addChild("td", fix3p1pct.format(storePercent));
-                       row.addChild("td", fix3p1pct.format(cachePercent));
-               }
-               
+               row = storeSizeTable.addChild("tr");
+               row.addChild("td", "Avg. Distance");
+               row.addChild("td", fix1p4.format(storeDist));
+               row.addChild("td", fix1p4.format(cacheDist));
+
+               long cacheLocationReports = 
node.nodeStats.avgCacheLocation.countReports();
+               long storeLocationReports = 
node.nodeStats.avgStoreLocation.countReports();
+
+               double storePercent = 1.0 * storeLocationReports / storeKeys;
+               double cachePercent = 1.0 * cacheLocationReports / cachedKeys;
+
+               //Cap the reported value at 100%, as the decaying average does 
not account beyond that anyway.
+               if(storePercent > 1.0)
+                       storePercent = 1.0;
+               if(cachePercent > 1.0)
+                       cachePercent = 1.0;
+
+               row = storeSizeTable.addChild("tr");
+               row.addChild("td", "Distance Stats");
+               row.addChild("td", fix3p1pct.format(storePercent));
+               row.addChild("td", fix3p1pct.format(cachePercent));
        }

        private void drawUnclaimedFIFOMessageCountsBox(HTMLNode 
unclaimedFIFOMessageCountsInfobox) {
@@ -650,10 +680,9 @@

        }

-       private void drawSwapStatsBox(HTMLNode locationSwapInfobox, long 
nodeUptimeSeconds, double swaps, double noSwaps) {
+       private void drawSwapStatsBox(HTMLNode locationSwapInfobox, double 
location, long nodeUptimeSeconds, double swaps, double noSwaps) {

                locationSwapInfobox.addChild("div", "class", "infobox-header", 
"Location swaps");
-               double location = node.getLocation();
                int startedSwaps = node.getStartedSwaps();
                int swapsRejectedAlreadyLocked = 
node.getSwapsRejectedAlreadyLocked();
                int swapsRejectedNowhereToGo = 
node.getSwapsRejectedNowhereToGo();
@@ -793,7 +822,7 @@
                }
                if (numberOfDisconnecting > 0) {
                        HTMLNode peerStatsListenOnlyListItem = 
peerStatsList.addChild("li").addChild("span");
-                       peerStatsListenOnlyListItem.addChild("span", new 
String[] { "class", "title", "style" }, new String[] { "peer_disconnecting", 
l10n("disconnecting"), "border-bottom: 1px dotted; cursor: help;" }, 
l10nDark("disconnectingShort"));
+                       peerStatsListenOnlyListItem.addChild("span", new 
String[] { "class", "title", "style" }, new String[] { "peer_disconnecting", 
l10nDark("disconnecting"), "border-bottom: 1px dotted; cursor: help;" }, 
l10nDark("disconnectingShort"));
                        peerStatsListenOnlyListItem.addChild("span", ":\u00a0" 
+ numberOfDisconnecting);
                }
                if (numberOfSeedServers > 0) {
@@ -810,7 +839,7 @@
                }
                if (numberOfRoutingDisabled > 0) {
                        HTMLNode peerStatsRoutingDisabledListItem = 
peerStatsList.addChild("li").addChild("span");
-                       peerStatsRoutingDisabledListItem.addChild("span", new 
String[] { "class", "title", "style" }, new String[] { "peer_routing_disabled", 
l10n("routingDisabled"), "border-bottom: 1px dotted; cursor: help;" }, 
l10n("routingDisabledShort"));
+                       peerStatsRoutingDisabledListItem.addChild("span", new 
String[] { "class", "title", "style" }, new String[] { "peer_routing_disabled", 
l10nDark("routingDisabled"), "border-bottom: 1px dotted; cursor: help;" }, 
l10nDark("routingDisabledShort"));
                        peerStatsRoutingDisabledListItem.addChild("span", 
":\u00a0" + numberOfRoutingDisabled);
                }
        }
@@ -852,6 +881,8 @@

        static void drawBandwidth(HTMLNode activityList, Node node, long 
nodeUptimeSeconds, boolean isAdvancedModeEnabled) {
                long[] total = node.collector.getTotalIO();
+               if(total[0] == 0 || total[1] == 0)
+                       return;
                long total_output_rate = (total[0]) / nodeUptimeSeconds;
                long total_input_rate = (total[1]) / nodeUptimeSeconds;
                long totalPayload = node.getTotalPayloadSent();
@@ -1088,7 +1119,7 @@
        private final static long MAX_CIRCLE_AGE_THRESHOLD = 24l*60*60*1000;   
// 24 hours
        private final static int HISTOGRAM_LENGTH = 10;

-       private void addNodeCircle (HTMLNode circleTable) {
+       private void addNodeCircle (HTMLNode circleTable, double myLocation) {
                int[] histogram = new int[HISTOGRAM_LENGTH];
                for (int i = 0; i < HISTOGRAM_LENGTH; i++) {
                        histogram[i] = 0;
@@ -1133,7 +1164,7 @@
                        histogram[histogramIndex]++;
                        nodeCircleInfoboxContent.addChild("span", new String[] 
{ "style", "class" }, new String[] { 
generatePeerCircleStyleString(location.doubleValue(), false, strength), 
"connected" }, "x");
                }
-               nodeCircleInfoboxContent.addChild("span", new String[] { 
"style", "class" }, new String[] { 
generatePeerCircleStyleString(node.getLocation(), true, 1.0), "me" }, "x");
+               nodeCircleInfoboxContent.addChild("span", new String[] { 
"style", "class" }, new String[] { generatePeerCircleStyleString(myLocation, 
true, 1.0), "me" }, "x");
                //
                double histogramPercent;
                for (int i = 0; i < HISTOGRAM_LENGTH; i++) {
@@ -1145,8 +1176,24 @@
                        nodeHistogramGraphCell.addChild("div", new String[] { 
"class", "style" }, new String[] { "histogramConnected", "height: " + 
fix3pctUS.format(histogramPercent) + "; width: 100%;" }, "\u00a0");
                }
        }
+       
+       private void addSpecialisation(HTMLNode table, double peerLocation, int 
incomingRequestsCount, int[] incomingRequestLocation) {
+               HTMLNode nodeHistogramLegendTableRow = table.addChild("tr");
+               HTMLNode nodeHistogramGraphTableRow = table.addChild("tr");
+               int myIndex = (int)(peerLocation * 
incomingRequestLocation.length);
+               for (int i = 0; i<incomingRequestLocation.length; i++) {
+                       HTMLNode nodeHistogramLegendCell = 
nodeHistogramLegendTableRow.addChild("td");
+                       HTMLNode nodeHistogramGraphCell = 
nodeHistogramGraphTableRow.addChild("td", "style", "height: 100px;");
+                       HTMLNode nodeHistogramGraphCell2 = 
nodeHistogramLegendCell.addChild("div", "class", "histogramLabel");
+                       if(i == myIndex)
+                                nodeHistogramGraphCell2 = 
nodeHistogramGraphCell2.addChild("span", "class", "me");
+                       nodeHistogramGraphCell2.addChild("#", 
fix1p1.format(((double) i) / incomingRequestLocation.length ));
+                       nodeHistogramGraphCell.addChild("div", new String[] { 
"class", "style" }, new String[] { "histogramConnected", "height: " + 
fix3pctUS.format(((double)incomingRequestLocation[i]) / incomingRequestsCount) 
+ "; width: 100%;" }, "\u00a0");
+               }

-       private void addPeerCircle (HTMLNode circleTable, PeerNodeStatus[] 
peerNodeStatuses) {
+       }
+
+       private void addPeerCircle (HTMLNode circleTable, PeerNodeStatus[] 
peerNodeStatuses, double myLocation) {
                int[] histogramConnected = new int[HISTOGRAM_LENGTH];
                int[] histogramDisconnected = new int[HISTOGRAM_LENGTH];
                for (int i = 0; i < HISTOGRAM_LENGTH; i++) {
@@ -1168,8 +1215,7 @@
                peerCircleInfoboxContent.addChild("span", new String[] { 
"style", "class" }, new String[] { generatePeerCircleStyleString(0.625, false, 
1.0), "mark" }, "+");
                peerCircleInfoboxContent.addChild("span", new String[] { 
"style", "class" }, new String[] { generatePeerCircleStyleString(0.75, false, 
1.0),  "mark" }, "--");
                peerCircleInfoboxContent.addChild("span", new String[] { 
"style", "class" }, new String[] { "position: absolute; top: " + 
PEER_CIRCLE_RADIUS + "px; left: " + (PEER_CIRCLE_RADIUS + 
PEER_CIRCLE_ADDITIONAL_FREE_SPACE) + "px", "mark" }, "+");
-               //
-               double myLocation = node.getLocation();
+
                PeerNodeStatus peerNodeStatus;
                double peerLocation;
                double peerDistance;

Modified: branches/db4o/freenet/src/freenet/clients/http/WelcomeToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/WelcomeToadlet.java  
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/clients/http/WelcomeToadlet.java  
2008-08-07 18:30:55 UTC (rev 21657)
@@ -388,7 +388,12 @@
                     }, 1);
             return;
         } else if(request.isPartSet("dismiss-events")) {
-               String alertsToDump = request.getPartAsString("events", 4096);
+               if(noPassword) {
+                       redirectToRoot(ctx);
+                       return;
+               }
+
+               String alertsToDump = request.getPartAsString("events", 
Integer.MAX_VALUE);
                String[] alertAnchors = alertsToDump.split(",");
                HashSet toDump = new HashSet();
                for(int i=0;i<alertAnchors.length;i++) 
toDump.add(alertAnchors[i]);

Modified: branches/db4o/freenet/src/freenet/clients/http/bookmark/Bookmark.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/bookmark/Bookmark.java       
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/clients/http/bookmark/Bookmark.java       
2008-08-07 18:30:55 UTC (rev 21657)
@@ -1,36 +1,35 @@
 package freenet.clients.http.bookmark;

+import freenet.l10n.L10n;
 import freenet.support.SimpleFieldSet;

 public abstract class Bookmark {

-    protected String name;
+       protected String name;

-    public String getName() {
-        return name;
-    }
+       public String getName() {
+               return name;
+       }

-    protected void setName(String s) {
-        name = s;
-    }
+       protected void setName(String s) {
+               name = (s.length() > 0 ? s : L10n.getString("Bookmark.noName"));
+       }

-    public boolean equals(Object o) {
-        if (o == this)
-               return true;
-        if (o instanceof Bookmark) {
-            Bookmark b = (Bookmark) o;
-            if (!b.name.equals(name)) {
-                return false;
-            }
-            return true;
-        } else {
-            return false;
-        }
-    }
-    
-    public int hashCode() {
-       return name.hashCode();
-    }
-    
-    public abstract SimpleFieldSet getSimpleFieldSet();
+       public boolean equals(Object o) {
+               if(o == this)
+                       return true;
+               if(o instanceof Bookmark) {
+                       Bookmark b = (Bookmark) o;
+                       if(!b.name.equals(name))
+                               return false;
+                       return true;
+               } else
+                       return false;
+       }
+
+       public int hashCode() {
+               return name.hashCode();
+       }
+
+       public abstract SimpleFieldSet getSimpleFieldSet();
 }

Modified: 
branches/db4o/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java
        2008-08-07 16:48:54 UTC (rev 21656)
+++ 
branches/db4o/freenet/src/freenet/clients/http/filter/GenericReadFilterCallback.java
        2008-08-07 18:30:55 UTC (rev 21657)
@@ -11,8 +11,10 @@
 import java.util.HashSet;

 import freenet.clients.http.HTTPRequestImpl;
+import freenet.clients.http.StaticToadlet;
 import freenet.keys.FreenetURI;
 import freenet.l10n.L10n;
+import freenet.node.StaticSwapRequestInterval;
 import freenet.support.HTMLEncoder;
 import freenet.support.Logger;
 import freenet.support.URIPreEncoder;
@@ -75,6 +77,11 @@
        }

        public String processURI(String u, String overrideType, boolean 
noRelative, boolean inline) throws CommentException {
+               if(u.matches("^#[a-zA-Z0-9-_]+$")) {
+                       // Hack for anchors, see #710
+                       return u;
+               }
+               
                URI uri;
                URI resolved;
                boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
@@ -110,9 +117,9 @@
                                        url = url+"&hasAnActivelink=true";
                                }
                                return url;
-                       }else if(path.equals("") && 
uri.toString().matches("^#[a-zA-Z0-9-_]+$")){
-                               // Hack for anchors, see #710
-                               return uri.toString();
+                       } else if(path.startsWith(StaticToadlet.ROOT_URL)) {
+                               // @see bug #2297
+                               return path;
                        }
                }


Modified: branches/db4o/freenet/src/freenet/clients/http/filter/HTMLFilter.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/filter/HTMLFilter.java       
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/clients/http/filter/HTMLFilter.java       
2008-08-07 18:30:55 UTC (rev 21657)
@@ -1815,8 +1815,6 @@
                                        }
                                }
                        }
-                       if (hn.isEmpty())
-                               return null;
                        return hn;
                }
        }

Modified: 
branches/db4o/freenet/src/freenet/clients/http/staticfiles/defaultbookmarks.dat
===================================================================
--- 
branches/db4o/freenet/src/freenet/clients/http/staticfiles/defaultbookmarks.dat 
    2008-08-07 16:48:54 UTC (rev 21656)
+++ 
branches/db4o/freenet/src/freenet/clients/http/staticfiles/defaultbookmarks.dat 
    2008-08-07 18:30:55 UTC (rev 21657)
@@ -7,19 +7,19 @@
 BookmarkCategory0.Content.Bookmark0.Name=The Ultimate FreeNet Index
 BookmarkCategory0.Content.Bookmark0.Description=A new one-page index with a 
menu including categories
 BookmarkCategory0.Content.Bookmark0.hasAnActivelink=true
-BookmarkCategory0.Content.Bookmark0.URI=USK at 
0I8gctpUE32CM0iQhXaYpCMvtPPGfT4pjXm01oid5Zc,3dAcn4fX2LyxO6uCnWFTx-2HKZ89uruurcKwLSCxbZ4,AQACAAE/Ultimate-Freenet-Index/23/
+BookmarkCategory0.Content.Bookmark0.URI=USK at 
0I8gctpUE32CM0iQhXaYpCMvtPPGfT4pjXm01oid5Zc,3dAcn4fX2LyxO6uCnWFTx-2HKZ89uruurcKwLSCxbZ4,AQACAAE/Ultimate-Freenet-Index/25/
 BookmarkCategory0.Content.Bookmark3.Name=Index des sites Fran??ais
 BookmarkCategory0.Content.Bookmark3.Description=A small French index with 
descriptions
 BookmarkCategory0.Content.Bookmark3.hasAnActivelink=true
-BookmarkCategory0.Content.Bookmark3.URI=USK at 
RJnh1EnvOSPwOWVRS2nyhC4eIQkKoNE5hcTv7~yY-sM,pOloLxnKWM~AL24iDMHOAvTvCqMlB-p2BO9zK96TOZA,AQACAAE/index_fr/47/
+BookmarkCategory0.Content.Bookmark3.URI=USK at 
RJnh1EnvOSPwOWVRS2nyhC4eIQkKoNE5hcTv7~yY-sM,pOloLxnKWM~AL24iDMHOAvTvCqMlB-p2BO9zK96TOZA,AQACAAE/index_fr/54/
 BookmarkCategory0.Content.Bookmark2.Name=Freenet Activelink Index (SLOW: 
graphical index, preloads all the sites, so takes *ages* to load)
 BookmarkCategory0.Content.Bookmark2.hasAnActivelink=true
 BookmarkCategory0.Content.Bookmark2.Description=A graphical freenet index 
(this will take a long time to load as it preloads the sites)
-BookmarkCategory0.Content.Bookmark2.URI=USK at 
qd-hk0vHYg7YvK2BQsJMcUD5QSF0tDkgnnF6lnWUH0g,xTFOV9ddCQQk6vQ6G~jfL6IzRUgmfMcZJ6nuySu~NUc,AQACAAE/activelink-index/55/
+BookmarkCategory0.Content.Bookmark2.URI=USK at 
qd-hk0vHYg7YvK2BQsJMcUD5QSF0tDkgnnF6lnWUH0g,xTFOV9ddCQQk6vQ6G~jfL6IzRUgmfMcZJ6nuySu~NUc,AQACAAE/activelink-index/67/
 BookmarkCategory0.Content.Bookmark1.Name=Freenet Activelink Index Text Version 
(a quick-loading non-graphical index site, no porn)
 BookmarkCategory0.Content.Bookmark1.hasAnActivelink=true
 BookmarkCategory0.Content.Bookmark1.Description=Text version of the Activelink 
Index
-BookmarkCategory0.Content.Bookmark1.URI=USK at 
qd-hk0vHYg7YvK2BQsJMcUD5QSF0tDkgnnF6lnWUH0g,xTFOV9ddCQQk6vQ6G~jfL6IzRUgmfMcZJ6nuySu~NUc,AQACAAE/activelink-index-text/19/
+BookmarkCategory0.Content.Bookmark1.URI=USK at 
qd-hk0vHYg7YvK2BQsJMcUD5QSF0tDkgnnF6lnWUH0g,xTFOV9ddCQQk6vQ6G~jfL6IzRUgmfMcZJ6nuySu~NUc,AQACAAE/activelink-index-text/30/
 BookmarkCategory1.Name=Freenet devel's flogs
 BookmarkCategory1.Content.BookmarkCategory=0
 BookmarkCategory1.Content.Bookmark=5
@@ -34,7 +34,7 @@
 BookmarkCategory1.Content.Bookmark2.Name=Bombe
 BookmarkCategory1.Content.Bookmark2.Description=Bombe's flog
 BookmarkCategory1.Content.Bookmark2.hasAnActivelink=true
-BookmarkCategory1.Content.Bookmark2.URI=USK at 
e3myoFyp5avg6WYN16ImHri6J7Nj8980Fm~aQe4EX1U,QvbWT0ImE0TwLODTl7EoJx2NBnwDxTbLTE6zkB-eGPs,AQACAAE/bombe/35/
+BookmarkCategory1.Content.Bookmark2.URI=USK at 
e3myoFyp5avg6WYN16ImHri6J7Nj8980Fm~aQe4EX1U,QvbWT0ImE0TwLODTl7EoJx2NBnwDxTbLTE6zkB-eGPs,AQACAAE/bombe/41/
 BookmarkCategory1.Content.Bookmark1.Name=Nextgen$
 BookmarkCategory1.Content.Bookmark1.Description=NextGen$' flog
 BookmarkCategory1.Content.Bookmark1.hasAnActivelink=true
@@ -45,29 +45,25 @@
 BookmarkCategory1.Content.Bookmark0.URI=USK at 
yGvITGZzrY1vUZK-4AaYLgcjZ7ysRqNTMfdcO8gS-LY,-ab5bJVD3Lp-LXEQqBAhJpMKrKJ19RnNaZMIkusU79s,AQACAAE/toad/12/
 BookmarkCategory2.Name=Freenet related software and documentation
 BookmarkCategory2.Content.BookmarkCategory=0
-BookmarkCategory2.Content.Bookmark=6
-BookmarkCategory2.Content.Bookmark0.Name=Frost
-BookmarkCategory2.Content.Bookmark0.Description=The official freesite of 
Frost, a message board system for Freenet
+BookmarkCategory2.Content.Bookmark=5
+BookmarkCategory2.Content.Bookmark0.Name=Freenet Message System
+BookmarkCategory2.Content.Bookmark0.Description=The official freesite of FMS, 
a spam resistant message board system for Freenet
 BookmarkCategory2.Content.Bookmark0.hasAnActivelink=true
-BookmarkCategory2.Content.Bookmark0.URI=USK at 
QRZAI1nSm~dAY2hTdzVWXmEhkaI~dso0OadnppBR7kE,wq5rHGBI7kpChBe4yRmgBChIGDug7Xa5SG9vYGXdxR0,AQACAAE/frost/7/
-BookmarkCategory2.Content.Bookmark1.Name=Freenet Message System
-BookmarkCategory2.Content.Bookmark1.Description=The official freesite of FMS, 
a spam resistant message board system for Freenet
+BookmarkCategory2.Content.Bookmark0.URI=USK at 
0npnMrqZNKRCRoGojZV93UNHCMN-6UU3rRSAmP6jNLE,~BG-edFtdCC1cSH4O3BWdeIYa8Sw5DfyrSV-TKdO5ec,AQACAAE/fms/62/
+BookmarkCategory2.Content.Bookmark1.Name=Freemail
+BookmarkCategory2.Content.Bookmark1.Description=The official site for Freemail 
- email over Freenet
 BookmarkCategory2.Content.Bookmark1.hasAnActivelink=true
-BookmarkCategory2.Content.Bookmark1.URI=USK at 
0npnMrqZNKRCRoGojZV93UNHCMN-6UU3rRSAmP6jNLE,~BG-edFtdCC1cSH4O3BWdeIYa8Sw5DfyrSV-TKdO5ec,AQACAAE/fms/51/
-BookmarkCategory2.Content.Bookmark2.Name=Freemail
-BookmarkCategory2.Content.Bookmark2.Description=The official site for Freemail 
- email over Freenet
+BookmarkCategory2.Content.Bookmark1.URI=USK at 
xOg49GNltumTJJzj0fVzuGDpo4hJUsy2UsGQkjE7NY4,EtUH5b9gGpp8JiY-Bm-Y9kHX1q-yDjD-9oRzXn21O9k,AQACAAE/freemail/4/
+BookmarkCategory2.Content.Bookmark2.Name=Publish!
+BookmarkCategory2.Content.Bookmark2.Description=Simple guide to publishing web 
sites to Freenet
 BookmarkCategory2.Content.Bookmark2.hasAnActivelink=true
-BookmarkCategory2.Content.Bookmark2.URI=USK at 
xOg49GNltumTJJzj0fVzuGDpo4hJUsy2UsGQkjE7NY4,EtUH5b9gGpp8JiY-Bm-Y9kHX1q-yDjD-9oRzXn21O9k,AQACAAE/freemail/4/
-BookmarkCategory2.Content.Bookmark3.Name=Publish!
-BookmarkCategory2.Content.Bookmark3.Description=Simple guide to publishing web 
sites to Freenet
+BookmarkCategory2.Content.Bookmark2.URI=USK at 
940RYvj1-aowEHGsb5HeMTigq8gnV14pbKNsIvUO~-0,FdTbR3gIz21QNfDtnK~MiWgAf2kfwHe-cpyJXuLHdOE,AQACAAE/publish/1/
+BookmarkCategory2.Content.Bookmark3.URI=USK at 
8r-uSRcJPkAr-3v3YJR16OCx~lyV2XOKsiG4MOQQBMM,P42IgNemestUdaI7T6z3Og6P-Hi7g9U~e37R3kWGVj8,AQACAAE/freesite-HOWTO/4/
+BookmarkCategory2.Content.Bookmark3.Name=Freesite HOWTO
+BookmarkCategory2.Content.Bookmark3.Description=A more detailed explanation of 
publishing freesites
 BookmarkCategory2.Content.Bookmark3.hasAnActivelink=true
-BookmarkCategory2.Content.Bookmark3.URI=USK at 
940RYvj1-aowEHGsb5HeMTigq8gnV14pbKNsIvUO~-0,FdTbR3gIz21QNfDtnK~MiWgAf2kfwHe-cpyJXuLHdOE,AQACAAE/publish/1/
-BookmarkCategory2.Content.Bookmark4.URI=USK at 
8r-uSRcJPkAr-3v3YJR16OCx~lyV2XOKsiG4MOQQBMM,P42IgNemestUdaI7T6z3Og6P-Hi7g9U~e37R3kWGVj8,AQACAAE/freesite-HOWTO/4/
-BookmarkCategory2.Content.Bookmark4.Name=Freesite HOWTO
-BookmarkCategory2.Content.Bookmark4.Description=A more detailed explanation of 
publishing freesites
+BookmarkCategory2.Content.Bookmark4.URI=USK at 
ugb~uuscsidMI-Ze8laZe~o3BUIb3S50i25RIwDH99M,9T20t3xoG-dQfMO94LGOl9AxRTkaz~TykFY-voqaTQI,AQACAAE/FAFS/4/
 BookmarkCategory2.Content.Bookmark4.hasAnActivelink=true
-BookmarkCategory2.Content.Bookmark5.URI=USK at 
F-BKUq9vNTrvp7D90r5edQ4MfZCrx3pP7TofdDlCRoU,YFUeosm79Z3KZxC62qQCteCCUI3D-LYyRk6P9auVpPA,AQACAAE/freenetapps/15/
-BookmarkCategory2.Content.Bookmark5.hasAnActivelink=true
-BookmarkCategory2.Content.Bookmark5.Name=The Freenet Applications Freesite
-BookmarkCategory2.Content.Bookmark5.Description=Various links to Freenet 
applications, and instructions for using them
+BookmarkCategory2.Content.Bookmark4.Name=The Freenet Applications Freesite
+BookmarkCategory2.Content.Bookmark4.Description=Various links to Freenet 
applications, and instructions for using them
 End

Copied: branches/db4o/freenet/src/freenet/clients/http/staticfiles/startssl.pem 
(from rev 21652, 
trunk/freenet/src/freenet/clients/http/staticfiles/startssl.pem)
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/staticfiles/startssl.pem     
                        (rev 0)
+++ branches/db4o/freenet/src/freenet/clients/http/staticfiles/startssl.pem     
2008-08-07 18:30:55 UTC (rev 21657)
@@ -0,0 +1,44 @@
+-----BEGIN CERTIFICATE-----
+MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW
+MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
+Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9
+MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
+U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
+cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
+pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
+OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
+Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
+Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
+HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
+Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
+Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
+26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
+AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
+FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j
+ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js
+LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM
+BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0
+Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy
+dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh
+cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh
+YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg
+dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp
+bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ
+YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT
+TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ
+9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8
+jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW
+FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz
+ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1
+ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L
+EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu
+L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
+yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC
+O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V
+um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh
+NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=
+-----END CERTIFICATE-----

Modified: branches/db4o/freenet/src/freenet/config/FilePersistentConfig.java
===================================================================
--- branches/db4o/freenet/src/freenet/config/FilePersistentConfig.java  
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/config/FilePersistentConfig.java  
2008-08-07 18:30:55 UTC (rev 21657)
@@ -111,11 +111,9 @@
        }

        public void store() {
-               synchronized(this) {
-                       if(!finishedInit) {
-                               Logger.minor(this, "Initialization not 
finished, refusing to write config", new Exception("error"));
-                               return;
-                       }
+               if(!finishedInit) {
+                       Logger.minor(this, "Initialization not finished, 
refusing to write config", new Exception("error"));
+                       return;
                }
                try {
                        synchronized(storeSync) {
@@ -130,7 +128,10 @@
        }

        /** Don't call without taking storeSync first */
-       protected void innerStore() throws IOException {
+       protected final void innerStore() throws IOException {
+               if(!finishedInit)
+                       throw new IllegalStateException("SHOULD NOT HAPPEN!!");
+               
                SimpleFieldSet fs = exportFieldSet();
                if(Logger.shouldLog(Logger.MINOR, this))
                        Logger.minor(this, "fs = " + fs);

Modified: 
branches/db4o/freenet/src/freenet/config/FreenetFilePersistentConfig.java
===================================================================
--- branches/db4o/freenet/src/freenet/config/FreenetFilePersistentConfig.java   
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/config/FreenetFilePersistentConfig.java   
2008-08-07 18:30:55 UTC (rev 21657)
@@ -8,8 +8,8 @@
 import freenet.support.SimpleFieldSet;

 public class FreenetFilePersistentConfig extends FilePersistentConfig {
-       private boolean isWritingConfig = false;
-       private boolean hasNodeStarted = false;
+       private volatile boolean isWritingConfig = false;
+       private volatile boolean hasNodeStarted = false;
        private Ticker ticker;
        public final Runnable thread = new Runnable() {
                public void run() {

Modified: branches/db4o/freenet/src/freenet/config/PersistentConfig.java
===================================================================
--- branches/db4o/freenet/src/freenet/config/PersistentConfig.java      
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/config/PersistentConfig.java      
2008-08-07 18:30:55 UTC (rev 21657)
@@ -11,7 +11,7 @@
 public class PersistentConfig extends Config {

        protected SimpleFieldSet origConfigFileContents;
-       protected boolean finishedInit;
+       protected volatile boolean finishedInit;

        public PersistentConfig(SimpleFieldSet initialContents) {
                this.origConfigFileContents = initialContents;

Modified: branches/db4o/freenet/src/freenet/config/StringOption.java
===================================================================
--- branches/db4o/freenet/src/freenet/config/StringOption.java  2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/config/StringOption.java  2008-08-07 
18:30:55 UTC (rev 21657)
@@ -42,7 +42,7 @@

        public boolean isDefault() {
                getValue();
-               return currentValue.equals(defaultValue);
+               return (currentValue == null ? false : 
currentValue.equals(defaultValue));
        }

        public void setDefault() {

Modified: branches/db4o/freenet/src/freenet/crypt/Global.java
===================================================================
--- branches/db4o/freenet/src/freenet/crypt/Global.java 2008-08-07 16:48:54 UTC 
(rev 21656)
+++ branches/db4o/freenet/src/freenet/crypt/Global.java 2008-08-07 18:30:55 UTC 
(rev 21657)
@@ -20,44 +20,41 @@
         * COUNTER: 1653
         * Primality of q, 2q+1, and p is assured 2^200:1.
         */
-       public static final DSAGroup DSAgroupBigA = 
+       public static final DSAGroup DSAgroupBigA =
                new DSAGroup(
-                       new NativeBigInteger( /* p */
-                               
"008608ac4f55361337f2a3e38ab1864ff3c98d66411d8d2afc9c526320c541f65078e86bc78494a5d73e4a9a67583f941f2993ed6c97dbc795dd88f0915c9cfbffc7e5373cde13e3c7ca9073b9106eb31bf82272ed0057f984a870a19f8a83bfa707d16440c382e62d3890473ea79e9d50c4ac6b1f1d30b10c32a02f685833c6278fc29eb3439c5333885614a115219b3808c92a37a0f365cd5e61b5861761dad9eff0ce23250f558848f8db932b87a3bd8d7a2f7cf99c75822bdc2fb7c1a1d78d0bcf81488ae0de5269ff853ab8b8f1f2bf3e6c0564573f612808f68dbfef49d5c9b4a705794cf7a424cd4eb1e0260552e67bfc1fa37b4a1f78b757ef185e86e9",
 16),
-                       new NativeBigInteger( /* q */
-                               
"00b143368abcd51f58d6440d5417399339a4d15bef096a2c5d8e6df44f52d6d379", 16),
-                       new NativeBigInteger( /* g */
-                               
"51a45ab670c1c9fd10bd395a6805d33339f5675e4b0d35defc9fa03aa5c2bf4ce9cfcdc256781291bfff6d546e67d47ae4e160f804ca72ec3c5492709f5f80f69e6346dd8d3e3d8433b6eeef63bce7f98574185c6aff161c9b536d76f873137365a4246cf414bfe8049ee11e31373cd0a6558e2950ef095320ce86218f992551cc292224114f3b60146d22dd51f8125c9da0c028126ffa85efd4f4bfea2c104453329cc1268a97e9a835c14e4a9a43c6a1886580e35ad8f1de230e1af32208ef9337f1924702a4514e95dc16f30f0c11e714a112ee84a9d8d6c9bc9e74e336560bb5cd4e91eabf6dad26bf0ca04807f8c31a2fc18ea7d45baab7cc997b53c356",
 16));
-       
-       static final int GROUP_INDEX_BIG_A = 1;
-       
-    public static final DHGroup 
-    /* -- Diffie-Hellman Group A ----------------------------
-     * For use in internode symmetric-cipher key exchange
-     * 
-     * Diffie-Hellman KE modulus (|p|=1024, g=2)
-     * 
-     * Taken from the IPsec standard
-     */
-       DHgroupA = new DHGroup(
-         new NativeBigInteger(
-           "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1"+
-          "29024E088A67CC74020BBEA63B139B22514A08798E3404DD"+
-          "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245"+
-          "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED"+
-          "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381"+
-          "FFFFFFFFFFFFFFFF", 16),
-        Util.TWO);
+               new NativeBigInteger( /* p */
+               
"008608ac4f55361337f2a3e38ab1864ff3c98d66411d8d2afc9c526320c541f65078e86bc78494a5d73e4a9a67583f941f2993ed6c97dbc795dd88f0915c9cfbffc7e5373cde13e3c7ca9073b9106eb31bf82272ed0057f984a870a19f8a83bfa707d16440c382e62d3890473ea79e9d50c4ac6b1f1d30b10c32a02f685833c6278fc29eb3439c5333885614a115219b3808c92a37a0f365cd5e61b5861761dad9eff0ce23250f558848f8db932b87a3bd8d7a2f7cf99c75822bdc2fb7c1a1d78d0bcf81488ae0de5269ff853ab8b8f1f2bf3e6c0564573f612808f68dbfef49d5c9b4a705794cf7a424cd4eb1e0260552e67bfc1fa37b4a1f78b757ef185e86e9",
 16),
+               new NativeBigInteger( /* q */
+               
"00b143368abcd51f58d6440d5417399339a4d15bef096a2c5d8e6df44f52d6d379", 16),
+               new NativeBigInteger( /* g */
+               
"51a45ab670c1c9fd10bd395a6805d33339f5675e4b0d35defc9fa03aa5c2bf4ce9cfcdc256781291bfff6d546e67d47ae4e160f804ca72ec3c5492709f5f80f69e6346dd8d3e3d8433b6eeef63bce7f98574185c6aff161c9b536d76f873137365a4246cf414bfe8049ee11e31373cd0a6558e2950ef095320ce86218f992551cc292224114f3b60146d22dd51f8125c9da0c028126ffa85efd4f4bfea2c104453329cc1268a97e9a835c14e4a9a43c6a1886580e35ad8f1de230e1af32208ef9337f1924702a4514e95dc16f30f0c11e714a112ee84a9d8d6c9bc9e74e336560bb5cd4e91eabf6dad26bf0ca04807f8c31a2fc18ea7d45baab7cc997b53c356",
 16));
+       public static final int GROUP_INDEX_BIG_A = 1;
+       public static final DHGroup /* -- Diffie-Hellman Group A 
----------------------------
+                * For use in internode symmetric-cipher key exchange
+                * 
+                * Diffie-Hellman KE modulus (|p|=1024, g=2)
+                * 
+                * Taken from the IPsec standard
+                */ DHgroupA = new DHGroup(
+               new NativeBigInteger(
+               "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" +
+               "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" +
+               "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" +
+               "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" +
+               "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381" +
+               "FFFFFFFFFFFFFFFF", 16),
+               Util.TWO);

-    public static void main(String[] args) {
-       System.err.println(DSAgroupBigA.toString() + '\t' + 
-                       DSAgroupBigA.fingerprintToString());
-       System.err.println(DHgroupA.toString() + '\t' + 
-                       DHgroupA.fingerprintToString());
-    }
+       public static void main(String[] args) {
+               System.err.println(DSAgroupBigA.toString() + '\t' +
+                       DSAgroupBigA.fingerprintToString());
+               System.err.println(DHgroupA.toString() + '\t' +
+                       DHgroupA.fingerprintToString());
+       }

        public static DSAGroup getGroup(int groupIndex) {
-               if(groupIndex == GROUP_INDEX_BIG_A) return DSAgroupBigA;
+               if(groupIndex == GROUP_INDEX_BIG_A)
+                       return DSAgroupBigA;
                return null;
        }
 }

Modified: branches/db4o/freenet/src/freenet/crypt/Yarrow.java
===================================================================
--- branches/db4o/freenet/src/freenet/crypt/Yarrow.java 2008-08-07 16:48:54 UTC 
(rev 21656)
+++ branches/db4o/freenet/src/freenet/crypt/Yarrow.java 2008-08-07 18:30:55 UTC 
(rev 21657)
@@ -50,6 +50,7 @@
  * @author Scott G. Miller <scgmille at indiana.edu>
  */
 public class Yarrow extends RandomSource {
+
        private static final long serialVersionUID = -1;
        /**
         * Security parameters
@@ -57,36 +58,35 @@
        private static final boolean DEBUG = false;
        private static final int Pg = 10;
        private final SecureRandom sr;
-
        public final File seedfile; //A file to which seed data should be 
dumped periodically

        public Yarrow() {
-               this("prng.seed", "SHA1", "Rijndael",true);
+               this("prng.seed", "SHA1", "Rijndael", true);
        }

-       public Yarrow(String seed, String digest, String cipher,boolean 
updateSeed) {
-               this(new File(seed), digest, cipher,updateSeed);
+       public Yarrow(String seed, String digest, String cipher, boolean 
updateSeed) {
+               this(new File(seed), digest, cipher, updateSeed);
        }

-       public Yarrow(File seed, String digest, String cipher,boolean 
updateSeed) {
-           SecureRandom s;
-           try {
-            s = SecureRandom.getInstance("SHA1PRNG");
-        } catch (NoSuchAlgorithmException e) {
-            s = null;
-        }
-        sr = s;
-        try {
-            accumulator_init(digest);
-            reseed_init(digest);
-            generator_init(cipher);
-        } catch (NoSuchAlgorithmException e) {
-            Logger.error(this, "Could not init pools trying to 
getInstance("+digest+"): "+e, e);
-            throw new RuntimeException("Cannot initialize Yarrow!: "+e, e);
-        }
+       public Yarrow(File seed, String digest, String cipher, boolean 
updateSeed) {
+               SecureRandom s;
+               try {
+                       s = SecureRandom.getInstance("SHA1PRNG");
+               } catch(NoSuchAlgorithmException e) {
+                       s = null;
+               }
+               sr = s;
+               try {
+                       accumulator_init(digest);
+                       reseed_init(digest);
+                       generator_init(cipher);
+               } catch(NoSuchAlgorithmException e) {
+                       Logger.error(this, "Could not init pools trying to 
getInstance(" + digest + "): " + e, e);
+                       throw new RuntimeException("Cannot initialize Yarrow!: 
" + e, e);
+               }
                entropy_init(seed);
-               seedFromExternalStuff(false);
-               if (updateSeed && !(seed.toString()).equals("/dev/urandom")) 
//Dont try to update the seedfile if we know that it wont be possible anyways 
+               seedFromExternalStuff(true);
+               if(updateSeed && !(seed.toString()).equals("/dev/urandom")) 
//Dont try to update the seedfile if we know that it wont be possible anyways 
                        seedfile = seed;
                else
                        seedfile = null;
@@ -100,85 +100,82 @@

        public void seedFromExternalStuff(boolean canBlock) {
                byte[] buf = new byte[32];
-           if(File.separatorChar == '/') {
-               DataInputStream dis = null;
-               FileInputStream fis = null;
-               File hwrng = new File("/dev/hwrng");
-               if(hwrng.exists() && hwrng.canRead()) {
-                       try {
-                           fis = new FileInputStream(hwrng);
-                           dis = new DataInputStream(fis);
-                           dis.readFully(buf);
-                           consumeBytes(buf);
-                           dis.readFully(buf);
-                           consumeBytes(buf);
-                           dis.close();
-                       } catch (Throwable t) {
-                           Logger.normal(this, "Can't read /dev/hwrng even 
though exists and is readable: "+t, t);
-                       } finally {
-                           Closer.close(dis);
-                           Closer.close(fis);
-                       }
-               }
+               if(File.separatorChar == '/') {
+                       DataInputStream dis = null;
+                       FileInputStream fis = null;
+                       File hwrng = new File("/dev/hwrng");
+                       if(hwrng.exists() && hwrng.canRead())
+                               try {
+                                       fis = new FileInputStream(hwrng);
+                                       dis = new DataInputStream(fis);
+                                       dis.readFully(buf);
+                                       consumeBytes(buf);
+                                       dis.readFully(buf);
+                                       consumeBytes(buf);
+                                       dis.close();
+                               } catch(Throwable t) {
+                                       Logger.normal(this, "Can't read 
/dev/hwrng even though exists and is readable: " + t, t);
+                               } finally {
+                                       Closer.close(dis);
+                                       Closer.close(fis);
+                               }

-               boolean isSystemEntropyAvailable = true;
-               // Read some bits from /dev/urandom
-               try {
-                   fis = new FileInputStream("/dev/urandom");
-                   dis = new DataInputStream(fis);
-                   dis.readFully(buf);
-                   consumeBytes(buf);
-                   dis.readFully(buf);
-                   consumeBytes(buf);
-               } catch (Throwable t) {
-                   Logger.normal(this, "Can't read /dev/urandom: "+t, t);
-                   // We can't read it; let's skip /dev/random and seed from 
SecureRandom.generateSeed()
-                   canBlock = true;
-                   isSystemEntropyAvailable = false;
-               } finally {
-                   Closer.close(dis);
-                   Closer.close(fis);
-               }
-               if(canBlock && isSystemEntropyAvailable) {
-                   // Read some bits from /dev/random
-                   try {
-                       fis = new FileInputStream("/dev/random");
-                       dis = new DataInputStream(fis);
-                       dis.readFully(buf);
-                       consumeBytes(buf);
-                       dis.readFully(buf);
-                       consumeBytes(buf);
-                   } catch (Throwable t) {
-                       Logger.normal(this, "Can't read /dev/random: "+t, t);
-                   } finally {
-                           Closer.close(dis);
-                           Closer.close(fis);
-                   }
-               }
-               fis = null;
-           } else {
-               // Force generateSeed(), since we can't read random data from 
anywhere else.
-               // Anyway, Windows's CAPI won't block.
-               canBlock = true;
-           }
-           if(canBlock) {
-                   // SecureRandom hopefully acts as a proxy for CAPI on 
Windows
-                   buf = sr.generateSeed(32);
-                   consumeBytes(buf);
-                   buf = sr.generateSeed(32);
-                   consumeBytes(buf);
-           }
-           // A few more bits
-           consumeString(Long.toHexString(Runtime.getRuntime().freeMemory()));
-           consumeString(Long.toHexString(Runtime.getRuntime().totalMemory()));
+                       boolean isSystemEntropyAvailable = true;
+                       // Read some bits from /dev/urandom
+                       try {
+                               fis = new FileInputStream("/dev/urandom");
+                               dis = new DataInputStream(fis);
+                               dis.readFully(buf);
+                               consumeBytes(buf);
+                               dis.readFully(buf);
+                               consumeBytes(buf);
+                       } catch(Throwable t) {
+                               Logger.normal(this, "Can't read /dev/urandom: " 
+ t, t);
+                               // We can't read it; let's skip /dev/random and 
seed from SecureRandom.generateSeed()
+                               canBlock = true;
+                               isSystemEntropyAvailable = false;
+                       } finally {
+                               Closer.close(dis);
+                               Closer.close(fis);
+                       }
+                       if(canBlock && isSystemEntropyAvailable)
+                               // Read some bits from /dev/random
+                               try {
+                                       fis = new 
FileInputStream("/dev/random");
+                                       dis = new DataInputStream(fis);
+                                       dis.readFully(buf);
+                                       consumeBytes(buf);
+                                       dis.readFully(buf);
+                                       consumeBytes(buf);
+                               } catch(Throwable t) {
+                                       Logger.normal(this, "Can't read 
/dev/random: " + t, t);
+                               } finally {
+                                       Closer.close(dis);
+                                       Closer.close(fis);
+                               }
+                       fis = null;
+               } else
+                       // Force generateSeed(), since we can't read random 
data from anywhere else.
+                       // Anyway, Windows's CAPI won't block.
+                       canBlock = true;
+               if(canBlock) {
+                       // SecureRandom hopefully acts as a proxy for CAPI on 
Windows
+                       buf = sr.generateSeed(32);
+                       consumeBytes(buf);
+                       buf = sr.generateSeed(32);
+                       consumeBytes(buf);
+               }
+               // A few more bits
+               
consumeString(Long.toHexString(Runtime.getRuntime().freeMemory()));
+               
consumeString(Long.toHexString(Runtime.getRuntime().totalMemory()));
        }
-       
-    private void entropy_init(File seed) {
+
+       private void entropy_init(File seed) {
                Properties sys = System.getProperties();
                EntropySource startupEntropy = new EntropySource();

                // Consume the system properties list
-               for (Enumeration enu = sys.propertyNames(); 
enu.hasMoreElements();) {
+               for(Enumeration enu = sys.propertyNames(); 
enu.hasMoreElements();) {
                        String key = (String) enu.nextElement();
                        consumeString(key);
                        consumeString(sys.getProperty(key));
@@ -187,8 +184,8 @@
                // Consume the local IP address
                try {
                        consumeString(InetAddress.getLocalHost().toString());
-               } catch (Exception e) {
-                   // Ignore
+               } catch(Exception e) {
+                       // Ignore
                }

                readStartupEntropy(startupEntropy);
@@ -227,32 +224,29 @@
                        dis.close();
                } catch(IOException e) {
                        Logger.error(this, "IOE trying to read the seedfile 
from disk : " + e.getMessage());
-               }
-               finally {
+               } finally {
                        Closer.close(dis);
                        Closer.close(bis);
                        Closer.close(fis);
                }
                fast_pool_reseed();
        }
+       private long timeLastWroteSeed = -1;

-       private long timeLastWroteSeed = -1;
-       
        public void write_seed(File filename) {
                write_seed(filename, false);
        }
-       
+
        public void write_seed(File filename, boolean force) {
-               if(!force) {
+               if(!force)
                        synchronized(this) {
                                long now = System.currentTimeMillis();
-                               if(now - timeLastWroteSeed <= 60*60*1000 /* 
once per hour */) {
+                               if(now - timeLastWroteSeed <= 60 * 60 * 1000 /* 
once per hour */)
                                        return;
-                               } else
+                               else
                                        timeLastWroteSeed = now;
                        }
-               }
-               
+
                FileOutputStream fos = null;
                BufferedOutputStream bos = null;
                DataOutputStream dos = null;
@@ -263,25 +257,23 @@

                        for(int i = 0; i < 32; i++)
                                dos.writeLong(nextLong());
-                       
+
                        dos.flush();
                        dos.close();
                } catch(IOException e) {
                        Logger.error(this, "IOE while saving the seed file! : " 
+ e.getMessage());
-               }
-               finally {
+               } finally {
                        Closer.close(dos);
                        Closer.close(bos);
                        Closer.close(fos);
                }
        }
-
        /**
         * 5.1 Generation Mechanism
         */
        private BlockCipher cipher_ctx;
-       private byte[] output_buffer, counter, allZeroString, tmp;
-       private int output_count, fetch_counter;
+       private byte[] output_buffer,  counter,  allZeroString,  tmp;
+       private int output_count,  fetch_counter;

        private void generator_init(String cipher) {
                cipher_ctx = Util.getCipherByName(cipher);
@@ -294,8 +286,8 @@
        }

        private final void counterInc() {
-               for (int i = counter.length - 1; i >= 0; i--)
-                       if (++counter[i] != 0)
+               for(int i = counter.length - 1; i >= 0; i--)
+                       if(++counter[i] != 0)
                                break;
        }

@@ -305,7 +297,7 @@
                output_buffer = new byte[counter.length];
                cipher_ctx.encipher(counter, output_buffer);

-               if (output_count++ > Pg) {
+               if(output_count++ > Pg) {
                        output_count = 0;
                        nextBytes(tmp);
                        rekey(tmp);
@@ -323,7 +315,7 @@
        // an offset to the bytes
        private synchronized int getBytes(int count) {

-               if (fetch_counter + count > output_buffer.length) {
+               if(fetch_counter + count > output_buffer.length) {
                        fetch_counter = 0;
                        generateOutput();
                        return getBytes(count);
@@ -333,45 +325,72 @@
                fetch_counter += count;
                return rv;
        }
+       static final int bitTable[][] = {{0, 0x0}, {
+                       1, 0x1
+               }, {
+                       1, 0x3
+               }, {
+                       1, 0x7
+               }, {
+                       1, 0xf
+               }, {
+                       1, 0x1f
+               }, {
+                       1, 0x3f
+               }, {
+                       1, 0x7f
+               }, {
+                       1, 0xff
+               }, {
+                       2, 0x1ff
+               }, {
+                       2, 0x3ff
+               }, {
+                       2, 0x7ff
+               }, {
+                       2, 0xfff
+               }, {
+                       2, 0x1fff
+               }, {
+                       2, 0x3fff
+               }, {
+                       2, 0x7fff
+               }, {
+                       2, 0xffff
+               }, {
+                       3, 0x1ffff
+               }, {
+                       3, 0x3ffff
+               }, {
+                       3, 0x7ffff
+               }, {
+                       3, 0xfffff
+               }, {
+                       3, 0x1fffff
+               }, {
+                       3, 0x3fffff
+               }, {
+                       3, 0x7fffff
+               }, {
+                       3, 0xffffff
+               }, {
+                       4, 0x1ffffff
+               }, {
+                       4, 0x3ffffff
+               }, {
+                       4, 0x7ffffff
+               }, {
+                       4, 0xfffffff
+               }, {
+                       4, 0x1fffffff
+               }, {
+                       4, 0x3fffffff
+               }, {
+                       4, 0x7fffffff
+               }, {
+                       4, 0xffffffff
+               }};

-       static final int bitTable[][] = { { 0, 0x0 }, {
-                       1, 0x1 }, {
-                       1, 0x3 }, {
-                       1, 0x7 }, {
-                       1, 0xf }, {
-                       1, 0x1f }, {
-                       1, 0x3f }, {
-                       1, 0x7f }, {
-                       1, 0xff }, {
-
-                       2, 0x1ff }, {
-                       2, 0x3ff }, {
-                       2, 0x7ff }, {
-                       2, 0xfff }, {
-                       2, 0x1fff }, {
-                       2, 0x3fff }, {
-                       2, 0x7fff }, {
-                       2, 0xffff }, {
-
-                       3, 0x1ffff }, {
-                       3, 0x3ffff }, {
-                       3, 0x7ffff }, {
-                       3, 0xfffff }, {
-                       3, 0x1fffff }, {
-                       3, 0x3fffff }, {
-                       3, 0x7fffff }, {
-                       3, 0xffffff }, {
-
-                       4, 0x1ffffff }, {
-                       4, 0x3ffffff }, {
-                       4, 0x7ffffff }, {
-                       4, 0xfffffff }, {
-                       4, 0x1fffffff }, {
-                       4, 0x3fffffff }, {
-                       4, 0x7fffffff }, {
-                       4, 0xffffffff }
-       };
-
        // This may *look* more complicated than in is, but in fact it is
        // loop unrolled, cache and operation optimized.
        // So don't try to simplify it... Thanks. :)
@@ -382,52 +401,48 @@

                int val = output_buffer[offset];

-               if (parameters[0] == 4)
-                       val += (output_buffer[offset + 1] << 24)
-                               + (output_buffer[offset + 2] << 16)
-                               + (output_buffer[offset + 3] << 8);
-               else if (parameters[0] == 3)
-                       val += (output_buffer[offset + 1] << 16)
-                               + (output_buffer[offset + 2] << 8);
-               else if (parameters[0] == 2)
+               if(parameters[0] == 4)
+                       val += (output_buffer[offset + 1] << 24) + 
(output_buffer[offset + 2] << 16) + (output_buffer[offset + 3] << 8);
+               else if(parameters[0] == 3)
+                       val += (output_buffer[offset + 1] << 16) + 
(output_buffer[offset + 2] << 8);
+               else if(parameters[0] == 2)
                        val += output_buffer[offset + 2] << 8;

                return val & parameters[1];
        }
-
        /**
         * 5.2 Entropy Accumulator
         */
-       private MessageDigest fast_pool, slow_pool;
-       private int fast_entropy, slow_entropy;
+       private MessageDigest fast_pool,  slow_pool;
+       private int fast_entropy,  slow_entropy;
        private boolean fast_select;
        private Hashtable entropySeen;

        private void accumulator_init(String digest) throws 
NoSuchAlgorithmException {
-        fast_pool = MessageDigest.getInstance(digest);
-               slow_pool = MessageDigest.getInstance(digest);
+               fast_pool = MessageDigest.getInstance(digest);
+               slow_pool = MessageDigest.getInstance(digest);
                entropySeen = new Hashtable();
        }

        public int acceptEntropy(EntropySource source, long data, int 
entropyGuess) {
                return acceptEntropy(source, data, entropyGuess, 1.0);
        }
-       
-    public int acceptEntropyBytes(EntropySource source, byte[] buf, int 
offset, 
-            int length, double bias) {
-        int totalRealEntropy = 0;
-        for(int i=0;i<length;i+=8) {
-            long thingy = 0;
-            int bytes = 0;
-            for(int j=0;j<Math.min(length,i+8);j++) {
-                thingy = (thingy << 8) + buf[j];
-                bytes++;
-            }
-            totalRealEntropy += acceptEntropy(source, thingy, bytes*8, bias);
-        }
-        return totalRealEntropy;
-    }
-    
+
+       public int acceptEntropyBytes(EntropySource source, byte[] buf, int 
offset,
+               int length, double bias) {
+               int totalRealEntropy = 0;
+               for(int i = 0; i < length; i += 8) {
+                       long thingy = 0;
+                       int bytes = 0;
+                       for(int j = 0; j < Math.min(length, i + 8); j++) {
+                               thingy = (thingy << 8) + buf[j];
+                               bytes++;
+                       }
+                       totalRealEntropy += acceptEntropy(source, thingy, bytes 
* 8, bias);
+               }
+               return totalRealEntropy;
+       }
+
        public int acceptEntropy(
                EntropySource source,
                long data,
@@ -437,15 +452,15 @@
                        data,
                        source,
                        (int) (bias * Math.min(
-                               32,
-                               Math.min(estimateEntropy(source, data), 
entropyGuess))));
+                       32,
+                       Math.min(estimateEntropy(source, data), 
entropyGuess))));
        }

        private int accept_entropy(long data, EntropySource source, int 
actualEntropy) {

                boolean performedPoolReseed = false;

-               synchronized (this) {
+               synchronized(this) {
                        fast_select = !fast_select;
                        MessageDigest pool = (fast_select ? fast_pool : 
slow_pool);
                        pool.update((byte) data);
@@ -457,33 +472,33 @@
                        pool.update((byte) (data >> 48));
                        pool.update((byte) (data >> 56));

-                       if (fast_select) {
+                       if(fast_select) {
                                fast_entropy += actualEntropy;
-                               if (fast_entropy > FAST_THRESHOLD) {
+                               if(fast_entropy > FAST_THRESHOLD) {
                                        fast_pool_reseed();
                                        performedPoolReseed = true;
                                }
                        } else {
                                slow_entropy += actualEntropy;

-                               if (source != null) {
+                               if(source != null) {
                                        Integer contributedEntropy = (Integer) 
entropySeen.get(source);
-                                       if (contributedEntropy == null)
+                                       if(contributedEntropy == null)
                                                contributedEntropy = new 
Integer(actualEntropy);
                                        else
                                                contributedEntropy = new 
Integer(actualEntropy + contributedEntropy.intValue());
                                        entropySeen.put(source, 
contributedEntropy);

-                                       if (slow_entropy >= (SLOW_THRESHOLD * 
2)) {
+                                       if(slow_entropy >= (SLOW_THRESHOLD * 
2)) {
                                                int kc = 0;
-                                               for (Enumeration enu = 
entropySeen.keys(); enu.hasMoreElements();) {
+                                               for(Enumeration enu = 
entropySeen.keys(); enu.hasMoreElements();) {
                                                        Object key = 
enu.nextElement();
                                                        Integer v = (Integer) 
entropySeen.get(key);
-                                                       if (DEBUG)
+                                                       if(DEBUG)
                                                                
Logger.normal(this, "Key: <" + key + "> " + v);
-                                                       if (v.intValue() > 
SLOW_THRESHOLD) {
+                                                       if(v.intValue() > 
SLOW_THRESHOLD) {
                                                                kc++;
-                                                               if (kc >= 
SLOW_K) {
+                                                               if(kc >= 
SLOW_K) {
                                                                        
slow_pool_reseed();
                                                                        
performedPoolReseed = true;
                                                                        break;
@@ -493,18 +508,20 @@
                                        }
                                }
                        }
-                       if (DEBUG)
+                       if(DEBUG)
                                //          Core.logger.log(this,"Fast pool: 
"+fast_entropy+"\tSlow pool:
                                // "+slow_entropy, Logger.NORMAL);
                                System.err.println("Fast pool: " + fast_entropy 
+ "\tSlow pool: " + slow_entropy);
                }
-               if (performedPoolReseed && (seedfile != null)) {
+               if(performedPoolReseed && (seedfile != null)) {
                        //Dont do this while synchronized on 'this' since
                        //opening a file seems to be suprisingly slow on windows
                        boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
-                       if(logMINOR) Logger.minor(this, "Writing seedfile");
-                       write_seed(seedfile); 
-                       if(logMINOR) Logger.minor(this, "Written seedfile");
+                       if(logMINOR)
+                               Logger.minor(this, "Writing seedfile");
+                       write_seed(seedfile);
+                       if(logMINOR)
+                               Logger.minor(this, "Written seedfile");
                }

                return actualEntropy;
@@ -518,15 +535,15 @@
                int delta3 = delta2 - source.lastDelta2;
                source.lastDelta2 = delta2;

-               if (delta < 0)
+               if(delta < 0)
                        delta = -delta;
-               if (delta2 < 0)
+               if(delta2 < 0)
                        delta2 = -delta2;
-               if (delta3 < 0)
+               if(delta3 < 0)
                        delta3 = -delta3;
-               if (delta > delta2)
+               if(delta > delta2)
                        delta = delta2;
-               if (delta > delta3)
+               if(delta > delta3)
                        delta = delta3;

                /*
@@ -555,9 +572,9 @@
        }

        public int acceptTimerEntropy(EntropySource timer) {
-           return acceptTimerEntropy(timer, 1.0);
+               return acceptTimerEntropy(timer, 1.0);
        }
-       
+
        public int acceptTimerEntropy(EntropySource timer, double bias) {
                long now = System.currentTimeMillis();
                return acceptEntropy(timer, now - timer.lastVal, 32, bias);
@@ -570,7 +587,6 @@
         */
        public void waitForEntropy(int bits) {
        }
-
        /**
         * 5.3 Reseed mechanism
         */
@@ -586,7 +602,7 @@
                byte[] v0 = fast_pool.digest();
                byte[] vi = v0;

-               for (byte i = 0; i < Pt; i++) {
+               for(byte i = 0; i < Pt; i++) {
                        reseed_ctx.update(vi, 0, vi.length);
                        reseed_ctx.update(v0, 0, v0.length);
                        reseed_ctx.update(i);
@@ -600,7 +616,7 @@
                fast_entropy = 0;
                long endTime = System.currentTimeMillis();
                if(endTime - startTime > 5000)
-                       Logger.normal(this, "Fast pool reseed took 
"+(endTime-startTime)+"ms");
+                       Logger.normal(this, "Fast pool reseed took " + (endTime 
- startTime) + "ms");
        }

        private void slow_pool_reseed() {
@@ -611,16 +627,13 @@
                slow_entropy = 0;

                Integer ZERO = new Integer(0);
-               for (Enumeration enu = entropySeen.keys(); 
enu.hasMoreElements();)
+               for(Enumeration enu = entropySeen.keys(); 
enu.hasMoreElements();)
                        entropySeen.put(enu.nextElement(), ZERO);
        }
-
        /**
         * 5.4 Reseed Control parameters
         */
-       private static final int FAST_THRESHOLD = 100,
-               SLOW_THRESHOLD = 160,
-               SLOW_K = 2;
+       private static final int FAST_THRESHOLD = 100,  SLOW_THRESHOLD = 160,  
SLOW_K = 2;

        /**
         * If the RandomSource has any resources it wants to close, it can do so
@@ -633,58 +646,53 @@
         * Test routine
         */
        public static void main(String[] args) throws Exception {
-               Yarrow r = new Yarrow(new File("/dev/urandom"), "SHA1", 
"Rijndael",true);
+               Yarrow r = new Yarrow(new File("/dev/urandom"), "SHA1", 
"Rijndael", true);

                byte[] b = new byte[1024];

-               if ((args.length == 0) || args[0].equalsIgnoreCase("latency")) {
-                       if (args.length == 2)
+               if((args.length == 0) || args[0].equalsIgnoreCase("latency")) {
+                       if(args.length == 2)
                                b = new byte[Integer.parseInt(args[1])];
                        long start = System.currentTimeMillis();
-                       for (int i = 0; i < 100; i++)
+                       for(int i = 0; i < 100; i++)
                                r.nextBytes(b);
                        System.out.println(
-                               (double) (System.currentTimeMillis() - start)
-                                       / (100 * b.length)
-                                       * 1024
-                                       + " ms/k");
+                               (double) (System.currentTimeMillis() - start) / 
(100 * b.length) * 1024 + " ms/k");
                        start = System.currentTimeMillis();
-                       for (int i = 0; i < 1000; i++)
+                       for(int i = 0; i < 1000; i++)
                                r.nextInt();
                        System.out.println(
-                               (double) (System.currentTimeMillis() - start) / 
1000
-                                       + " ms/int");
+                               (double) (System.currentTimeMillis() - start) / 
1000 + " ms/int");
                        start = System.currentTimeMillis();
-                       for (int i = 0; i < 1000; i++)
+                       for(int i = 0; i < 1000; i++)
                                r.nextLong();
                        System.out.println(
-                               (double) (System.currentTimeMillis() - start) / 
1000
-                                       + " ms/long");
-               } else if (args[0].equalsIgnoreCase("randomness")) {
+                               (double) (System.currentTimeMillis() - start) / 
1000 + " ms/long");
+               } else if(args[0].equalsIgnoreCase("randomness")) {
                        int kb = Integer.parseInt(args[1]);
-                       for (int i = 0; i < kb; i++) {
+                       for(int i = 0; i < kb; i++) {
                                r.nextBytes(b);
                                System.out.write(b);
                        }
-               } else if (args[0].equalsIgnoreCase("gathering")) {
+               } else if(args[0].equalsIgnoreCase("gathering")) {
                        System.gc();
                        EntropySource t = new EntropySource();
                        long start = System.currentTimeMillis();
-                       for (int i = 0; i < 100000; i++)
+                       for(int i = 0; i < 100000; i++)
                                r.acceptEntropy(t, System.currentTimeMillis(), 
32);
                        System.err.println(
                                (double) (System.currentTimeMillis() - start) / 
100000);
                        System.gc();
                        start = System.currentTimeMillis();
-                       for (int i = 0; i < 100000; i++)
+                       for(int i = 0; i < 100000; i++)
                                r.acceptTimerEntropy(t);
                        System.err.println(
                                (double) (System.currentTimeMillis() - start) / 
100000);
-               } else if (args[0].equalsIgnoreCase("volume")) {
+               } else if(args[0].equalsIgnoreCase("volume")) {
                        b = new byte[1020];
                        long duration =
                                System.currentTimeMillis() + 
Integer.parseInt(args[1]);
-                       while (System.currentTimeMillis() < duration) {
+                       while(System.currentTimeMillis() < duration) {
                                r.nextBytes(b);
                                System.out.write(b);
                        }
@@ -697,71 +705,68 @@
 //                             r.nextBytes(buffer);
 //                             System.out.write(buffer);
 //                     }
-               } else if (args[0].equalsIgnoreCase("bitstream")) {
-                       while (true) {
+               } else if(args[0].equalsIgnoreCase("bitstream"))
+                       while(true) {
                                int v = r.nextInt();
-                               for (int i = 0; i < 32; i++) {
-                                       if (((v >> i) & 1) == 1)
+                               for(int i = 0; i < 32; i++) {
+                                       if(((v >> i) & 1) == 1)
                                                System.out.print('1');
                                        else
                                                System.out.print('0');
                                }
                        }
-               } else if (args[0].equalsIgnoreCase("sample")) {
-                       if ((args.length == 1) || args[1].equals("general")) {
+               else if(args[0].equalsIgnoreCase("sample"))
+                       if((args.length == 1) || args[1].equals("general")) {
                                System.out.println("nextInt(): ");
-                               for (int i = 0; i < 3; i++)
+                               for(int i = 0; i < 3; i++)
                                        System.out.println(r.nextInt());
                                System.out.println("nextLong(): ");
-                               for (int i = 0; i < 3; i++)
+                               for(int i = 0; i < 3; i++)
                                        System.out.println(r.nextLong());
                                System.out.println("nextFloat(): ");
-                               for (int i = 0; i < 3; i++)
+                               for(int i = 0; i < 3; i++)
                                        System.out.println(r.nextFloat());
                                System.out.println("nextDouble(): ");
-                               for (int i = 0; i < 3; i++)
+                               for(int i = 0; i < 3; i++)
                                        System.out.println(r.nextDouble());
                                System.out.println("nextFullFloat(): ");
-                               for (int i = 0; i < 3; i++)
+                               for(int i = 0; i < 3; i++)
                                        System.out.println(r.nextFullFloat());
                                System.out.println("nextFullDouble(): ");
-                               for (int i = 0; i < 3; i++)
+                               for(int i = 0; i < 3; i++)
                                        System.out.println(r.nextFullDouble());
-                       } else if (args[1].equals("normalized")) {
-                               for (int i = 0; i < 20; i++)
+                       } else if(args[1].equals("normalized"))
+                               for(int i = 0; i < 20; i++)
                                        System.out.println(r.nextDouble());
-                       }
-               }
        }

        private void consumeString(String str) {
                byte[] b;
                try {
                        b = str.getBytes("UTF-8");
-               } catch (UnsupportedEncodingException e) {
+               } catch(UnsupportedEncodingException e) {
                        throw new Error("Impossible: JVM doesn't support UTF-8: 
" + e, e);
                }
                consumeBytes(b);
        }

        private void consumeBytes(byte[] bytes) {
-               if (fast_select) {
+               if(fast_select)
                        fast_pool.update(bytes, 0, bytes.length);
-               } else {
+               else
                        slow_pool.update(bytes, 0, bytes.length);
-               }
                fast_select = !fast_select;
        }

-    public String getCheckpointName() {
-        return "Yarrow random number generator checkpoint";
-    }
+       public String getCheckpointName() {
+               return "Yarrow random number generator checkpoint";
+       }

-    public long nextCheckpoint() {
-        return System.currentTimeMillis() + 60*60*1000;
-    }
+       public long nextCheckpoint() {
+               return System.currentTimeMillis() + 60 * 60 * 1000;
+       }

-    public void checkpoint() {
-        seedFromExternalStuff(true);
-    }
+       public void checkpoint() {
+               seedFromExternalStuff(true);
+       }
 }

Modified: branches/db4o/freenet/src/freenet/io/comm/DMT.java
===================================================================
--- branches/db4o/freenet/src/freenet/io/comm/DMT.java  2008-08-07 16:48:54 UTC 
(rev 21656)
+++ branches/db4o/freenet/src/freenet/io/comm/DMT.java  2008-08-07 18:30:55 UTC 
(rev 21657)
@@ -30,7 +30,6 @@
 import freenet.support.Fields;
 import freenet.support.ShortBuffer;

-
 /**
  * @author ian
  *
@@ -987,27 +986,7 @@
                msg.set(PING_SEQNO, seqNo);
                return msg;
        }
-
-       public static final MessageType FNPLinkPing = new 
MessageType("FNPLinkPing", PRIORITY_HIGH) {{
-               addField(PING_SEQNO, Long.class);
-       }};

-       public static final Message createFNPLinkPing(long seqNo) {
-               Message msg = new Message(FNPLinkPing);
-               msg.set(PING_SEQNO, seqNo);
-               return msg;
-       }
-       
-       public static final MessageType FNPLinkPong = new 
MessageType("FNPLinkPong", PRIORITY_HIGH) {{
-               addField(PING_SEQNO, Long.class);
-       }};
-       
-       public static final Message createFNPLinkPong(long seqNo) {
-               Message msg = new Message(FNPLinkPong);
-               msg.set(PING_SEQNO, seqNo);
-               return msg;
-       }
-       
        public static final MessageType FNPPong = new MessageType("FNPPong", 
PRIORITY_HIGH) {{
                addField(PING_SEQNO, Integer.class);
        }};
@@ -1228,15 +1207,31 @@
                return msg;
        }

+       @Deprecated
        public static final MessageType FNPLocChangeNotification = new 
MessageType("FNPLocationChangeNotification", PRIORITY_LOW) {{
                addField(LOCATION, Double.class);
        }};

+       @Deprecated
        public static final Message createFNPLocChangeNotification(double 
newLoc) {
                Message msg = new Message(FNPLocChangeNotification);
                msg.set(LOCATION, newLoc);
                return msg;
        }
+               
+       public static final MessageType FNPLocChangeNotificationNew = new 
MessageType("FNPLocationChangeNotification2", PRIORITY_LOW) {{
+               addField(LOCATION, Double.class);
+               addField(PEER_LOCATIONS, ShortBuffer.class);
+       }};
+       
+       public static final Message createFNPLocChangeNotificationNew(double 
myLocation, double[] locations) {
+               Message msg = new Message(FNPLocChangeNotificationNew);
+               ShortBuffer dst = new 
ShortBuffer(Fields.doublesToBytes(locations));
+               msg.set(LOCATION, myLocation);
+               msg.set(PEER_LOCATIONS, dst);
+               
+               return msg;
+       }

        public static final MessageType FNPRoutedPing = new 
MessageType("FNPRoutedPing", PRIORITY_LOW) {{
                addRoutedToNodeMessageFields();
@@ -1571,7 +1566,7 @@

                return msg;
        }
-
+       
        public static void init() { }

 }

Modified: branches/db4o/freenet/src/freenet/io/comm/Peer.java
===================================================================
--- branches/db4o/freenet/src/freenet/io/comm/Peer.java 2008-08-07 16:48:54 UTC 
(rev 21656)
+++ branches/db4o/freenet/src/freenet/io/comm/Peer.java 2008-08-07 18:30:55 UTC 
(rev 21657)
@@ -20,12 +20,12 @@
 package freenet.io.comm;

 import java.io.DataInput;
-import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.net.InetAddress;
 import java.net.UnknownHostException;

+import freenet.io.WritableToDataOutputStream;
 import freenet.support.transport.ip.HostnameSyntaxException;
 import freenet.support.transport.ip.IPUtil;

@@ -35,7 +35,7 @@
  * To change the template for this generated type comment go to Window - 
Preferences - Java - Code Generation - Code and
  * Comments
  */
-public class Peer {
+public class Peer implements WritableToDataOutputStream {

     public static class LocalAddressException extends Exception {
        private static final long serialVersionUID = -1;

Modified: branches/db4o/freenet/src/freenet/io/comm/UdpSocketHandler.java
===================================================================
--- branches/db4o/freenet/src/freenet/io/comm/UdpSocketHandler.java     
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/io/comm/UdpSocketHandler.java     
2008-08-07 18:30:55 UTC (rev 21657)
@@ -195,9 +195,7 @@
                } else if(logDEBUG) Logger.minor(this, "No packet received");
        }

-    // FIXME necessary to deal with bugs around build 1000; arguably necessary 
to deal with large node names in connection setup
-    // Revert to 1500?
-    private static final int MAX_RECEIVE_SIZE = 2048;
+    private static final int MAX_RECEIVE_SIZE = 1500;

     private boolean getPacket(DatagramPacket packet) {
                try {

Modified: branches/db4o/freenet/src/freenet/io/xfer/PacketThrottle.java
===================================================================
--- branches/db4o/freenet/src/freenet/io/xfer/PacketThrottle.java       
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/io/xfer/PacketThrottle.java       
2008-08-07 18:30:55 UTC (rev 21657)
@@ -35,7 +35,7 @@
        protected static final double PACKET_TRANSMIT_INCREMENT = (4 * (1 - 
(PACKET_DROP_DECREASE_MULTIPLE * PACKET_DROP_DECREASE_MULTIPLE))) / 3;
        protected static final double SLOW_START_DIVISOR = 3.0;
        protected static final long MAX_DELAY = 1000;
-       protected static final long MIN_DELAY = 25;
+       protected static final long MIN_DELAY = 1;
        public static final String VERSION = "$Id: PacketThrottle.java,v 1.3 
2005/08/25 17:28:19 amphibian Exp $";
        public static final long DEFAULT_DELAY = 200;
        private final Peer _peer;
@@ -139,7 +139,7 @@

        /**
         * returns the number of bytes-per-second in the transmition link (?).
-        * FIXME: Will not return more than 40K/s due to MIN_DELAY in 
getDelay().
+        * FIXME: Will not return more than 1M/s due to MIN_DELAY in getDelay().
         */
        public synchronized double getBandwidth() {
                //PACKET_SIZE=1024 [bytes?]

Modified: branches/db4o/freenet/src/freenet/l10n/L10n.java
===================================================================
--- branches/db4o/freenet/src/freenet/l10n/L10n.java    2008-08-07 16:48:54 UTC 
(rev 21656)
+++ branches/db4o/freenet/src/freenet/l10n/L10n.java    2008-08-07 18:30:55 UTC 
(rev 21657)
@@ -24,9 +24,6 @@
 *
 * TODO: Maybe base64 the override file ?
 *
-* comment(mario): for www interface we might detect locale from http requests?
-* for other access (telnet) using system locale would probably be good, but
-* it would be nice to have a command to switch locale on the fly.
 */
 public class L10n {
        public static final String CLASS_NAME = "L10n";
@@ -35,8 +32,22 @@
        public static final String OVERRIDE_SUFFIX = ".override" + SUFFIX;

        public static final String FALLBACK_DEFAULT = "en";
-       public static final String[] AVAILABLE_LANGUAGES = { "en", "es", "da", 
"de", "fi", "fr", "it", "no", "pl", "se",
-               "zh-cn", "zh-tw", "unlisted" };
+       /** @see http://www.omniglot.com/language/names.htm */
+       public static final String[][] AVAILABLE_LANGUAGES = {
+               new String[] { "en", "English", "eng" },
+               new String[] { "es", "Espa??ol", "spa" },
+               new String[] { "da", "Dansk", "dan" },
+               new String[] { "de", "Deutsch", "deu" },
+               new String[] { "fi", "Suomi", "fin" },
+               new String[] { "fr", "Fran??ais", "fra" },
+               new String[] { "it", "Italiano", "ita" },
+               new String[] { "no", "Norsk", "nor" },
+               new String[] { "pl", "Polski", "pol" },
+               new String[] { "se", "Svenska", "svk" },
+               new String[] { "zh-cn", "??????(??????)", "chn" },
+               new String[] { "zh-tw", "??????(??????)", "zh-tw" },
+               new String[] { "unlisted", "unlisted", "unlisted"},
+       };
        private final String selectedLanguage;

        private static SimpleFieldSet currentTranslation = null;
@@ -47,8 +58,8 @@
        private static final Object sync = new Object();

        L10n(String selected) {
-               selectedLanguage = selected;
-               File tmpFile = new File(L10n.PREFIX + selected + 
L10n.OVERRIDE_SUFFIX);
+               selectedLanguage = mapLanguageNameToShortCode(selected);
+               File tmpFile = new File(L10n.PREFIX + selectedLanguage + 
L10n.OVERRIDE_SUFFIX);

                try {
                        if(tmpFile.exists() && tmpFile.canRead() && 
tmpFile.length() > 0) {
@@ -83,26 +94,15 @@
        * @throws MissingResourceException
        */
        public static void setLanguage(String selectedLanguage) throws 
MissingResourceException {
+               selectedLanguage = mapLanguageNameToLongName(selectedLanguage);
                synchronized (sync) {
-                       for(int i=0; i<AVAILABLE_LANGUAGES.length; i++){
-                               
if(selectedLanguage.equalsIgnoreCase(AVAILABLE_LANGUAGES[i])){          
-                                       selectedLanguage = 
AVAILABLE_LANGUAGES[i];
-                                       Logger.normal(CLASS_NAME, "Changing the 
current language to : " + selectedLanguage);
-
-                                       currentClass = new 
L10n(selectedLanguage);      
-
-                                       if(currentTranslation == null) {
-                                               currentClass = new 
L10n(FALLBACK_DEFAULT);      
-                                               throw new 
MissingResourceException("Unable to load the translation file for 
"+selectedLanguage, "l10n", selectedLanguage);
-                                       }
-
-                                       return;
-                               }
+                       Logger.normal(CLASS_NAME, "Changing the current 
language to : " + selectedLanguage);
+                       currentClass = new L10n(selectedLanguage);
+                       if(currentClass == null) {
+                               currentClass = new L10n(FALLBACK_DEFAULT);
+                               Logger.error(CLASS_NAME, "The requested 
translation is not available!" + selectedLanguage);
+                               throw new MissingResourceException("The 
requested translation (" + selectedLanguage + ") hasn't been found!", 
CLASS_NAME, selectedLanguage);
                        }
-
-                       currentClass = new L10n(FALLBACK_DEFAULT);
-                       Logger.error(CLASS_NAME, "The requested translation is 
not available!" + selectedLanguage);
-                       throw new MissingResourceException("The requested 
translation ("+selectedLanguage+") hasn't been found!", CLASS_NAME, 
selectedLanguage);
                }
        }

@@ -116,7 +116,7 @@

                        // If there is no need to keep it in the override, 
remove it...
                        // unless the original/default is the same as the 
translation
-                       if(("".equals(value) || 
L10n.getString(key).equals(value)) && 
!L10n.getDefaultString(key).equals(value)) {
+                       if (("".equals(value)) || 
(value.equals(currentTranslation.get(key)))) {
                                translationOverride.removeValue(key);
                        } else {
                                value = value.replaceAll("(\r|\n|\t)+", "");
@@ -313,8 +313,10 @@
        */
        public static String getSelectedLanguage() {
                synchronized (sync) {
-                       if(currentClass == null) return null;
-                       return currentClass.selectedLanguage;   
+                       if((currentClass == null) || 
(currentClass.selectedLanguage == null))
+                               return FALLBACK_DEFAULT;
+                       else
+                               return currentClass.selectedLanguage;   
                }
        }

@@ -325,6 +327,12 @@
        * @return the Properties object or null if not found
        */
        public static SimpleFieldSet loadTranslation(String name) {
+               String shortCountryCode = mapLanguageNameToShortCode(name);
+               if(shortCountryCode == null) { 
+                       Logger.error("L10n", "Can't map "+name+" to a country 
code!");
+                       return null;
+               } else
+                       name = shortCountryCode;
                name = PREFIX.replace ('.', 
'/').concat(PREFIX.concat(name.concat(SUFFIX)));

                SimpleFieldSet result = null;
@@ -345,7 +353,43 @@

                return result;
        }
+       
+       /**
+        * Map a full string language name to the corresponding country short 
code
+        * 
+        * @param The name to look for
+        * @return The two letters short code OR null if not found
+        */
+       public static String mapLanguageNameToShortCode(String name) {
+               for(int i=0; i<AVAILABLE_LANGUAGES.length; i++) {
+                       String currentShortCode = AVAILABLE_LANGUAGES[i][0];
+                       String currentLongName = AVAILABLE_LANGUAGES[i][1];
+                       String currentCountryCodeName = 
AVAILABLE_LANGUAGES[i][2];
+                       
+                       if(currentShortCode.equalsIgnoreCase(name) || 
currentLongName.equalsIgnoreCase(name) || 
currentCountryCodeName.equalsIgnoreCase(name))
+                               return currentShortCode;
+               }
+               return null;
+       }

+       /**
+        * Map a language identifier to its corresponding long name
+        * 
+        * @param The name to look for
+        * @return The full text language name OR null if not found
+        */
+       public static String mapLanguageNameToLongName(String name) {
+               for(int i=0; i<AVAILABLE_LANGUAGES.length; i++) {
+                       String currentShortCode = AVAILABLE_LANGUAGES[i][0];
+                       String currentLongName = AVAILABLE_LANGUAGES[i][1];
+                       String currentCountryCodeName = 
AVAILABLE_LANGUAGES[i][2];
+                       
+                       if(currentShortCode.equalsIgnoreCase(name) || 
currentLongName.equalsIgnoreCase(name) || 
currentCountryCodeName.equalsIgnoreCase(name))
+                               return currentLongName;
+               }
+               return null;
+       }
+
        public static boolean isOverridden(String key) {
                synchronized(sync) {
                        if(translationOverride == null) return false;

Modified: branches/db4o/freenet/src/freenet/l10n/freenet.l10n.de.properties
===================================================================
--- branches/db4o/freenet/src/freenet/l10n/freenet.l10n.de.properties   
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/l10n/freenet.l10n.de.properties   
2008-08-07 18:30:55 UTC (rev 21657)
@@ -8,6 +8,7 @@
 Announcer.announceDisabledTooOldTitle=Ank??ndigungen deaktiviert (zu alt)
 Announcer.announceLoading=Freenet l??dt gerade die 
Seednodes(Saat-Knoten)-Datei herunter, sodass es versuchen kann sich im Rest 
des Netzwerks bekannt zu machen. Die Bekanntgabe kann ein paar Minuten dauern.
 Announcer.coolingOff=In den n??chsten ${time} Sekunden wartet der Knoten auf 
die Knoten, bei denen er sich gerade gemeldet hat um sich zu verbinden. Wenn 
dies nicht gen??gend Knoten hervorbringt, wird er es mit einem anderen Knoten 
versuchen.
+Bookmark.noName=unbenannt
 BookmarkEditorToadlet.addBookmark=Lesezeichen hinzuf??gen
 BookmarkEditorToadlet.addCategory=Kategorie hinzuf??gen
 BookmarkEditorToadlet.addDefaultBookmarks=Die Standard-Lesezeichen erneut 
hinzuf??gen
@@ -85,16 +86,12 @@
 ConfigToadlet.fproxy=FProxy
 ConfigToadlet.fullTitle=Freenet-Knoten-Konfiguration von ${name}
 ConfigToadlet.logger=Logger
-ConfigToadlet.modeAdvanced=Erweiterte Einstellungen
-ConfigToadlet.modeAdvancedTooltip=Optionen, die nur erfahrene Freenet-Benutzer 
und -Entwickler benutzen m??ssen
-ConfigToadlet.modeSimple=Einfache Einstellungen
-ConfigToadlet.modeSimpleTooltip=Optionen, die alle Benutzer kennen sollten
 ConfigToadlet.node=Knoten
 ConfigToadlet.pluginmanager=Plugin-Manager
 ConfigToadlet.pluginmanager2=Plugin-Manager 2
 ConfigToadlet.possibilitiesTitle=Fortsetzen
 ConfigToadlet.reset=Zur??cksetzen
-ConfigToadlet.returnToNodeConfig=Zur Knoten-Konfiguration zur??ckkehren
+ConfigToadlet.returnToNodeConfig=Zur??ck zur Knoten-Konfiguration
 ConfigToadlet.shortTitle=Konfiguration
 ConfigToadlet.ssl=SSL (ben??tigt Neustart)
 ConfigToadlet.title=Freenet-Knoten-Konfiguration
@@ -439,7 +436,7 @@
 FirstTimeWizardToadlet.noNetworkIF=Keine zus??tzliche Netzwerk-Schnittstelle 
gefunden
 FirstTimeWizardToadlet.noNetworkIFLong=Freenet hat keine zus??tzliche 
Netzwerk-Schnittstelle gefunden. Es wird annehmen, dass Sie sich von Ihrem 
Computer (und nur von Ihrem Computer) mit ihm verbinden.
 FirstTimeWizardToadlet.opennetNo=Ja, ich habe mindestens 5 Freunde, die 
bereits Freenet benutzen und werde Ihre Kontaktdaten auf der Freunde-Seite 
eintragen.
-FirstTimeWizardToadlet.opennetWarning=Wenn Freenet dort wo Sie leben illegal 
ist oder wenn Sie es benutzen um Inhalte abzurufen, die Sie in Schwierigkeiten 
bringen k??nnten, kann es sein, dass dem Knoten zu sagen, dass er sich mit 
automatisch mit Fremden verbinden soll, gef??hrlich ist, da es das Leben eines 
Angreifers deutlich erleichtert. Freenet ist immernoch Alpha-Software und wir 
geben keine Garantie f??r die Sicherheit.
+FirstTimeWizardToadlet.opennetWarning=Wenn Freenet dort wo Sie leben illegal 
ist oder wenn Sie es benutzen um Inhalte abzurufen, die Sie in Schwierigkeiten 
bringen k??nnten, kann es sein, dass dem Knoten zu sagen, dass er sich 
automatisch mit Fremden verbinden soll, gef??hrlich ist, da es das Leben eines 
Angreifers deutlich erleichtert. Freenet ist immer noch experimentell und wir 
geben keine Garantie f??r die Sicherheit.
 FirstTimeWizardToadlet.opennetYes=Nein, ich m??chte, dass der Knoten 
automatisch Fremde findet mit denen er sich verbinden kann.
 FirstTimeWizardToadlet.skipWizard=Ich bin kein Neuling, bitte ??berspringe den 
Assistenten!
 FirstTimeWizardToadlet.step1Title=Freenet-Einrichtungs-Assistent! - Freunde 
und Fremde
@@ -665,6 +662,9 @@
 Node.inBWLimit=Limit f??r hereinkommende Bandbreite (Bytes pro Sekunde)
 Node.inBWLimitLong=Limit f??r die hereinkommende Bandbreite (Bytes/Sek); der 
Knoten wird versuchen dieses nicht zu ??berschreiten; -1 = 4x das gesetzte 
Limit f??r die ausgehende Bandbreite
 Node.invalidStoreSize=Die Speicher-Gr????e muss mindestens 32MB betragen
+Node.java14ShortText=Java 1.4 wird in naher Zukunft nicht mehr unterst??tzt 
werden, bitte aktualisieren Sie auf mindestens 1.5.
+Node.java14Text=Sie f??hren Freenet auf Java 1.4 aus. Bitte aktualisieren Sie 
auf mindestens Java 1.5. Die automatische Aktualisierung wurde vor??bergehend 
deaktiviert, da zuk??nftige Versionen m??glicherweise ??berhaupt nicht starten.
+Node.java14Title=Java 1.4 wird nicht l??nger unterst??tzt
 Node.l10nLanguage=Die Sprache die der Knoten benutzt um Nachrichten anzuzeigen
 Node.l10nLanguageLong=Diese Einstellung ??ndert die Sprache in der Nachrichten 
angezeigt werden. Beachten Sie, dass manche Zeichenfolgen erst beim n??chsten 
Start des Knotens ??bersetzt werden.
 Node.maxHTL=Maximale HTL
@@ -693,6 +693,10 @@
 Node.passOpennetPeersThroughDarknetLong=Wenn aktiviert, werden 
Opennet-Knotenreferenzen (NIEMALS unsere eigene Darknet-Knotenreferenz) ??ber 
unsere Darknet-Partner weitergeleitet. Sodass ein Knoten (dieser Knoten oder 
seine Partner) Opennet-Partner von seinen Darknet-Partnern bekommen kann. Dies 
ist n??tzlich, da es uns erlaubt einen Bootstrap (Erlangung neuer Quellen ohne 
vorher welche zu haben) nach neuen Opennet-Partnern durchzuf??hren nachdem wir 
unsere Partner, zum Beispiel durch Ausfallzeiten, verloren haben. Jedoch kann 
es eine Traffic(Verkehrs)-Analyse etwas erleichtern, deshalb sollten Sie es 
ausschalten wenn Sie paranoid sind.
 Node.port=FNP-Port Nummer (UDP)
 Node.portLong=UDP-Port f??r Knoten-zu-Knoten Kommunikationen 
(Freenet-Knoten-Protokoll)
+Node.publishOurPeersLocation=Sollen wir die Position unserer Partner an unsere 
Partner weitergeben?
+Node.publishOurPeersLocationLong=Sollen wir die Position unserer Partner an 
unsere Partner weitergeben? Dies zu tun, hilft dem Routing gibt aber 
Informationen an potenzielle Angreifer preis.
+Node.routeAccordingToOurPeersLocation=Sollen wir die Positionen der Partner 
unserer Partner zu Routing-Zwecken ber??cksichtigen?
+Node.routeAccordingToOurPeersLocationLong=Sollen wir die Positionen der 
Partner unserer Partner zu Routing-Zwecken ber??cksichtigen? Dies zu tun 
verbessert das Routing, k??nnte aber einem potenziellen Angreifer helfen.
 Node.storeDirectory=Speicher-Verzeichnis
 Node.storeDirectoryLong=Name des Verzeichnisses in welchem die 
Speicher-Dateien platziert werden
 Node.storeMaxMemTooHigh=Mehr als 80% Ihres RAMs (Hauptspeichers) an BDB 
(Datenbank) abzugeben ist wahrscheinlich nicht das was Sie tun wollen!
@@ -785,6 +789,10 @@
 OpennetUserAlert.warningTitle=Warnung: Unsicherer Modus aktiviert: Ihr Knoten 
wird sich mit Fremden verbinden
 PNGFilter.invalidHeader=Die Datei, die Sie versucht haben abzurufen, ist keine 
PNG-Datei. Sie enth??lt keinen g??ltigen PNG-Header (Dateikopf). Es k??nnte 
sich um ein anderes Dateiformat handeln und Ihr Browser k??nnte etwas 
gef??hrliches damit tun, deshalb wurde sie blockiert.
 PNGFilter.invalidHeaderTitle=Keine PNG-Datei - ung??ltiger Header
+PageMaker.modeAdvanced=Erweiterte Oberfl??che
+PageMaker.modeAdvancedTooltip=Eine erweiterte Oberfl??che, die nur erfahrene 
Freenet-Benutzer und Entwickler werden benutzen m??ssen
+PageMaker.modeSimple=Einfache Oberfl??che
+PageMaker.modeSimpleTooltip=Eine einfache Oberfl??che, die alle Benutzer 
bedienen k??nnen
 PeerManagerUserAlert.clockProblem=${count} Ihrer Knoten sind nicht in der Lage 
sich zu verbinden, weil ihre System-Zeit sich um mehr als 24 Stunden von Ihrer 
unterscheidet. Bitte ??berpr??fen Sie, ob Ihr Computer die korrekte Zeit hat. 
Eine inkorrekte Zeit wird das Fehlschlagen von vielen Knoten- und 
Client-Mechanismen verursachen.
 PeerManagerUserAlert.clockProblemTitle=Zeit-Problem
 PeerManagerUserAlert.connError=${count} Ihrer Partner k??nnen sich aus einer 
unbekannten Ursache nicht verbinden, m??glicherweise aufgrund eines 
fehlerhaften Knotens oder einer besch??digten Knoten-Referenz.
@@ -857,7 +865,7 @@
 PproxyToadlet.loadOfficialPlugin=Ein offizielles Plugin hinzuf??gen
 PproxyToadlet.loadOfficialPluginLabel=Offizielles Plugin laden
 PproxyToadlet.loadOfficialPluginText=Diese Plugins liegen auf den Servern des 
Freenet-Projekts. Wir glauben, dass diese Plugins keine pers??nlichen 
Informationen ungefragt herausgeben, auch wenn wir es nicht garantieren.
-PproxyToadlet.loadOfficialPluginWarning=WARNUNG: Das Laden eines offiziellen 
Plugins beinhaltet das Herunterladen des Plugins aus dem Internet (nicht aus 
dem Freenet). Ein Angreifer k??nnte das Herunterladen bemerken und vielleicht 
manipulieren. Laden Sie hier keine Plugins herunter wenn dies ein Problem 
darstellt.
+PproxyToadlet.loadOfficialPluginWarning=WARNUNG: Das Laden eines offiziellen 
Plugins beinhaltet das Herunterladen des Plugins aus dem Internet (nicht aus 
dem Freenet). Laden Sie hier keine Plugins herunter wenn dies ein Problem 
darstellt.
 PproxyToadlet.loadOtherPlugin=Ein inoffizielles Plugin hinzuf??gen
 PproxyToadlet.loadOtherPluginText=Hier k??nnen Sie die URL eines Plugins 
eingeben, das geladen werden soll. Andere Plugins als die oben aufgelisteten, 
werden von uns noch nicht einmal im Entferntesten unterst??tzt oder darauf 
gepr??ft, ob sie pers??nliche Informationen herausgeben. Wenn Sie also hier ein 
inoffizielles Plugin laden, sind Sie auf sich allein gestellt.
 PproxyToadlet.loadOtherURLLabel=Plugin-URL
@@ -880,7 +888,7 @@
 PproxyToadlet.reloadPluginTitle=Plugin neu laden
 PproxyToadlet.reloadPurgeWarning=Das Plugin vor dem neu laden aus dem Cache 
(Zwischenspeicher) l??schen. Wenn das Plugin aus dem Internet geladen wurde, 
wird es nochmals heruntergeladen!
 PproxyToadlet.reloadWarning=Warnung: Einige Plugins haben Probleme mit dem 
erneuten Laden!
-PproxyToadlet.returnToPluginPage=Zur Plugin-Seite zur??ckkehren
+PproxyToadlet.returnToPluginPage=Zur??ck zur Plugin-Seite
 PproxyToadlet.startedAtTitle=Gestartet am
 PproxyToadlet.startingPluginName=Plugin-Name
 PproxyToadlet.startingPluginStatus=Aktueller Status
@@ -907,8 +915,12 @@
 QueueToadlet.completedU=Vollst??ndige Uploads (${size})
 QueueToadlet.completedUDirectory=Vollst??ndige Verzeichnis-Uploads (${size})
 QueueToadlet.download=Download
+QueueToadlet.downloadFiles=Massen-Downloads
+QueueToadlet.downloadFilesInstructions=Sie k??nnen in das Textfeld unten eine 
Liste mit herunterzuladenden Schl??sseln einf??gen (ein Schl??ssel pro Zeile)
 QueueToadlet.downloadSucceeded=Die Datei ${origlink}${filename}${/origlink} 
wurde erfolgreich heruntergeladen. ${link}Klicken Sie hier${/link} um die Datei 
zu ??ffnen (${size}).
 QueueToadlet.downloadSucceededTitle=Erfolgreich heruntergeladen: ${filename}
+QueueToadlet.enqueuedFailure=Die folgenden ${number} Schl??ssel konnten nicht 
zur Warteschlange hinzugef??gt werden:
+QueueToadlet.enqueuedSuccessfully=Die folgenden ${number} Schl??ssel wurden 
erfolgreich in die Warteschlange eingereiht:
 QueueToadlet.errorAccessDenied=Fehler: Zugriff verweigert!
 QueueToadlet.errorAccessDeniedFile=Die aktuelle Konfiguration des Knotens 
untersagt Ihnen das Hochladen der Datei "${file}".
 QueueToadlet.errorDToDisk=Kann nicht auf den Datentr??ger herunterladen
@@ -1041,6 +1053,10 @@
 SimpleToadletServer.portLong=Der TCP-Port auf dem FProxy Nachrichten empfangen 
soll
 SimpleToadletServer.ssl=SSL aktivieren?
 SimpleToadletServer.sslLong=SSL auf FProxy aktivieren?
+StartupToadlet.entropyErrorContent=Auf Ihrem System steht nicht genug Entropie 
zur Verf??gung... Freenet wird erst starten, wenn es genug gesammelt hat.
+StartupToadlet.entropyErrorTitle=Es ist nicht genug Entropie verf??gbar!
+StartupToadlet.isStartingUp=Ihr Knoten startet gerade, bitte warten Sie.
+StartupToadlet.title=Freenet startet gerade
 StaticToadlet.pathInvalidChars=Der angegebene URI enth??lt nicht erlaubte 
Zeichen.
 StaticToadlet.pathNotFound=Der Pfad, den Sie angegeben haben, existiert nicht.
 StaticToadlet.pathNotFoundTitle=Pfad nicht gefunden
@@ -1124,8 +1140,9 @@
 Toadlet.notSupportedWithClass=Ihr Browser hat eine Anfrage gesendet, die 
Freenet (${class}) nicht verstehen konnte.
 Toadlet.ok=OK
 Toadlet.permRedirectWithReason=Permanente Weiter-/Umleitung: ${reason}
-Toadlet.returnToNodeHomepage=Zur Knoten-Startseite zur??ckkehren
-Toadlet.returnToPrevPage=Zur vorherigen Seite zur??ckkehren
+Toadlet.returnToNodeHomepage=Zur??ck zur Knoten-Startseite
+Toadlet.returnToPrevPage=Zur??ck zur vorherigen Seite
+Toadlet.returnToQueuepage=Zur??ck zur Warteschlange
 Toadlet.tempRedirectWithReason=Tempor??re Weiter-/Umleitung: ${reason}
 Toadlet.unauthorized=Der Zugriff aus diese Seite ist Ihnen nicht gestattet.
 Toadlet.unauthorizedTitle=Nicht erlaubt

Modified: branches/db4o/freenet/src/freenet/l10n/freenet.l10n.en.properties
===================================================================
--- branches/db4o/freenet/src/freenet/l10n/freenet.l10n.en.properties   
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/l10n/freenet.l10n.en.properties   
2008-08-07 18:30:55 UTC (rev 21657)
@@ -9,6 +9,7 @@
 Announcer.announceDisabledTooOldShort=The node has tried to connect to the 
network but your copy of Freenet is too old. You should upgrade.
 Announcer.announceAlertShort=The node is trying to connect to the network, it 
will be slow for a while.
 Announcer.coolingOff=For the next ${time} seconds, the node is waiting for the 
nodes that it just announced to to connect, if there are not enough nodes it 
will try a different node.
+Bookmark.noName=no name
 BookmarkEditorToadlet.addBookmark=Add Bookmark
 BookmarkEditorToadlet.addCategory=Add Category
 BookmarkEditorToadlet.addNewBookmark=Add a new bookmark
@@ -86,10 +87,10 @@
 ConfigToadlet.fproxy=fproxy
 ConfigToadlet.fullTitle=Freenet Node Configuration of ${name}
 ConfigToadlet.logger=logger
-ConfigToadlet.modeSimple=Simple config options
-ConfigToadlet.modeSimpleTooltip=Config options that all users should know about
-ConfigToadlet.modeAdvanced=Advanced config options
-ConfigToadlet.modeAdvancedTooltip=Config options that only experienced freenet 
users and developers will need to use
+PageMaker.modeSimple=Simple interface
+PageMaker.modeSimpleTooltip=A simple interface all users can use
+PageMaker.modeAdvanced=Advanced interface
+PageMaker.modeAdvancedTooltip=An advanced interface that only experienced 
freenet users and developers will need to use
 ConfigToadlet.node=node
 ConfigToadlet.node.load=node.load
 ConfigToadlet.node.opennet=node.opennet
@@ -329,6 +330,7 @@
 FProxyToadlet.notEnoughMetaStrings=Not enough meta-strings
 FProxyToadlet.notFoundTitle=Not Found
 FProxyToadlet.openAsText=${link}Click here${/link} to open the file as plain 
text (this should not be dangerous but it may be garbled).
+FProxyToadlet.openAsThawIndex=${link}Click here${/link} to open the file with 
thaw index browser (read warning above!).
 FProxyToadlet.openForce=${link}Click here${/link} to open the file as ${mime} 
(read warning above!).
 FProxyToadlet.openForceDisk=${link}Click here${/link} to force your browser to 
download the file to disk.
 FProxyToadlet.openPossRSSForceDisk=${link}Click here${/link} to try to force 
your browser to download the file to disk (this ${bold}this may also be 
dangerous${/bold} if you run Firefox 2.0.0, 2.0.1 should fix this).
@@ -662,6 +664,9 @@
 Node.inBWLimit=Input bandwidth limit (bytes per second)
 Node.inBWLimitLong=Input bandwidth limit (bytes/sec); the node will try not to 
exceed this; -1 = 4x set outputBandwidthLimit
 Node.invalidStoreSize=Store size must be at least 32MB
+Node.java14Title=Java 1.4 no longer supported
+Node.java14Text=You are running Freenet on a 1.4 version of Java. Please 
upgrade to at least java 1.5. Auto-update has been temporarily disabled as 
future builds may not load at all.
+Node.java14ShortText=Java 1.4 will not be supported for much longer, please 
upgrade to 1.5.
 Node.l10nLanguage=The language the node will use to display messages
 Node.l10nLanguageLong=This setting will change the language used to display 
messages. Keep in mind that some strings won't be translated until next node 
startup though.
 Node.maxHTL=Maximum HTL
@@ -690,6 +695,10 @@
 Node.passOpennetPeersThroughDarknetLong=If true, opennet noderefs (NEVER our 
own darknet noderef) will be relayed through our darknet peers. So a node (this 
node, or its peers) can get opennet peers from its darknet peers. This is 
useful because it allows us to bootstrap new opennet peers after having lost 
our peers due to downtime, for example. However, it may make traffic analysis 
slightly easier, so turn it off if you are paranoid.
 Node.port=FNP port number (UDP)
 Node.portLong=UDP port for node-to-node communications (Freenet Node Protocol)
+Node.publishOurPeersLocation=Shall we send our peers' locations to our peers?
+Node.publishOurPeersLocationLong=Shall we send our peers' locations to our 
peers? Doing so helps routing but gives some information away to a potential 
attacker.
+Node.routeAccordingToOurPeersLocation=Shall we use the locations of the peers 
of our peers into account for routing purposes?
+Node.routeAccordingToOurPeersLocationLong=Shall we use the locations of the 
peers of our peers into account for routing purposes? Doing so helps routing 
but might help a potential attacker.
 Node.storeDirectory=Store directory
 Node.storeDirectoryLong=Name of directory to put store files in
 Node.storeMaxMemTooHigh=Giving more than 80% of your ram to BDB is probably 
not what you want to do!
@@ -704,6 +713,8 @@
 Node.tooSmallMTU=Too small MTU
 Node.tooSmallMTULong=Your connection's MTU appears to be ${mtu} bytes. Freenet 
will not function well with an MTU of less than ${minMTU} bytes: connections 
will be unreliable and possibly slow. Please fix the problem if possible.
 Node.tooSmallMTUShort=Connection problems: Your connection's MTU is too short 
for Freenet to work well. Expect problems.
+Node.withAnnouncement=Allow the node to bootstrap itself using seednodes?
+Node.withAnnouncementLong=Allow the node to bootstrap itself using seednodes? 
While this has to be the default behaviour, it's insecure by design.
 NodeClientCore.couldNotFindOrCreateDir=Could not find or create directory
 NodeClientCore.downloadAllowedDirs=Directories downloading is allowed to
 NodeClientCore.downloadAllowedDirsLong=Semicolon separated list of directories 
to which downloads are allowed. "downloads" means downloadsDir, empty means no 
downloads to disk allowed, "all" means downloads allowed from anywhere. 
WARNING! If this is set to "all" any user can download any file to anywhere on 
your computer!
@@ -817,6 +828,10 @@
 PeersSayKeyBlownAlert.failedTransferSayBlownLabel=These nodes told us that the 
key has been blown, but then failed to transfer the revocation certificate:
 PeersSayKeyBlownAlert.titleWithCount=Auto-update key blown according to 
${count} peer(s)!
 PeersSayKeyBlownAlert.short=Some of your peers say the auto-update key is 
blown!
+PluginConfig.configFile=Plugins configuration file
+PluginConfig.configFileLong=Path/Filename for the file which stores the plugin 
configuration
+PluginConfig.installDir=Plugins installation directory
+PluginConfig.installDirLong=Directory where to install the plugins 
 PluginManager.cannotSetOnceLoaded=Cannot set the plugins list once loaded
 PluginManager.loadedOnStartup=Plugins to load on startup
 PluginManager.loadedOnStartupLong=Classpath, name and location for plugins to 
load when node starts up
@@ -849,11 +864,15 @@
 PproxyToadlet.classNameTitle=Class Name
 PproxyToadlet.downloadNotAllowedFromRemoteServer=Download of plugins is only 
allowed from our server.
 PproxyToadlet.Error=Error
+PproxyToadlet.fileonly=local files only
 PproxyToadlet.internalIDTitle=Internal ID
 PproxyToadlet.Load=Load
+PproxyToadlet.loadFreenetPlugin=Add an Unofficial Plugin from Freenet
+PproxyToadlet.loadFreenetPluginText=Here you can enter the Freenet URI of a 
plugin you want to load. These plugins are not even remotely supported or 
checked for privacy leaks by us, so if you load a remote plugin here, you are 
basically on your own.
+PproxyToadlet.loadFreenetURLLabel=Plugin Key
 PproxyToadlet.loadOfficialPlugin=Add an Official Plugin
 PproxyToadlet.loadOfficialPluginText=These plugins are hosted on servers of 
The Freenet Project. We believe that these plugins are free of privacy leaks 
though we will not guarantee it.
-PproxyToadlet.loadOfficialPluginWarning=WARNING: Loading an official plugin 
involves downloading it from the internet (not from Freenet). An attacker could 
see the download, and maybe interfere with it. Do not load plugins here if that 
is a problem.
+PproxyToadlet.loadOfficialPluginWarning=WARNING: Loading an official plugin 
involves downloading it from the internet (not from Freenet). Do not load 
plugins here if that is a problem.
 PproxyToadlet.loadOfficialPluginLabel=Load Official Plugin
 PproxyToadlet.loadOtherPlugin=Add an Unofficial Plugin
 PproxyToadlet.loadOtherPluginText=Here you can enter the URL of a plugin you 
want to load. Other plugins than the ones listed above are not even remotely 
supported or checked for privacy leaks by us, so if you load a remote plugin 
here, you are basically on your own.
@@ -903,8 +922,12 @@
 QueueToadlet.completedU=Completed uploads (${size})
 QueueToadlet.completedUDirectory=Completed directory uploads (${size})
 QueueToadlet.download=Download
+QueueToadlet.downloadFiles=Bulk downloads
+QueueToadlet.downloadFilesInstructions=You can paste a list of keys to 
download in the box below (one per line)
 QueueToadlet.downloadSucceededTitle=Download succeeded: ${filename}
 QueueToadlet.downloadSucceeded=The file ${origlink}${filename}${/origlink} has 
been downloaded successfully. ${link}Click here${/link} to open the file 
(${size}).
+QueueToadlet.enqueuedSuccessfully=The following ${number} keys have been 
enqueued sucessfully:
+QueueToadlet.enqueuedFailure=The following ${number} keys couldn't have been 
enqueued:
 QueueToadlet.errorAccessDenied=Error: Access Denied!
 QueueToadlet.errorAccessDeniedFile=The current configuration of the node 
prohibits you from uploading the file "${file}".
 QueueToadlet.errorDToDisk=Cannot download to disk
@@ -1039,6 +1062,10 @@
 SSL.keyPassLong=Password of private key access
 SSL.version=Version of SSL
 SSL.versionLong=Version of SSL, SSLv3 or TLSv1 (default SSLv3)
+StartupToadlet.entropyErrorTitle=Not enough entropy is available!
+StartupToadlet.entropyErrorContent=There isn't enough entropy available on 
your system... Freenet won't start until it can gather enough.
+StartupToadlet.isStartingUp=Your freenet node is starting up, please hold on.
+StartupToadlet.title=Freenet is starting up
 StaticToadlet.pathInvalidChars=The given URI contains disallowed characters.
 StaticToadlet.pathNotFound=The path you specified doesn't exist.
 StaticToadlet.pathNotFoundTitle=Path Not Found
@@ -1128,6 +1155,7 @@
 Toadlet.ok=Ok
 Toadlet.permRedirectWithReason=Permanent redirect: ${reason}
 Toadlet.returnToNodeHomepage=Return to node homepage
+Toadlet.returnToQueuepage=Return to queue page
 Toadlet.returnToPrevPage=Return to the previous page
 Toadlet.tempRedirectWithReason=Temporary redirect: ${reason}
 Toadlet.unauthorizedTitle=Unauthorized

Modified: branches/db4o/freenet/src/freenet/l10n/freenet.l10n.es.properties
===================================================================
--- branches/db4o/freenet/src/freenet/l10n/freenet.l10n.es.properties   
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/l10n/freenet.l10n.es.properties   
2008-08-07 18:30:55 UTC (rev 21657)
@@ -1,5 +1,7 @@
+Bookmark.noName=sin nombre
 BookmarkEditorToadlet.addBookmark=A??adir marcador
 BookmarkEditorToadlet.addCategory=A??adir categor??a
+BookmarkEditorToadlet.addDefaultBookmarks=Agregar nuevamente los marcadores 
por defecto
 BookmarkEditorToadlet.addNewBookmark=A??adir un nuevo marcador
 BookmarkEditorToadlet.addNewCategory=A??adir una nueva categor??a
 BookmarkEditorToadlet.addedNewBookmark=Se ha a??adido satisfactoriamente el 
nuevo marcador.
@@ -17,10 +19,12 @@
 BookmarkEditorToadlet.deleteCategoryConfirm=??Est?? seguro de borrar 
${bookmark} y todos sus descendientes?
 BookmarkEditorToadlet.deleteSucceeded=Se ha borrado el marcador.
 BookmarkEditorToadlet.deleteSucceededTitle=Borrado exitoso
+BookmarkEditorToadlet.descLabel=Descripcion del marcador:
 BookmarkEditorToadlet.edit=Editar
 BookmarkEditorToadlet.editBookmarkTitle=Modificar marcador
 BookmarkEditorToadlet.editCategoryTitle=Editar categor??a
 BookmarkEditorToadlet.error=Error
+BookmarkEditorToadlet.hasAnActivelinkLabel=Tiene el freesite un activelink?
 BookmarkEditorToadlet.invalidKey=La clave de Freenet no es v??lida.
 BookmarkEditorToadlet.invalidKeyTitle=Clave inv??lida
 BookmarkEditorToadlet.invalidKeyWithReason=Clave inv??lida para Freenet.
@@ -36,6 +40,7 @@
 BookmarkEditorToadlet.title=Editor de marcadores
 BookmarkEditorToadlet.urlDecodeError=Error de decodificaci??n de URL
 BookmarkItem.bookmarkUpdated=El sitio de marcadores de nombre ${name} ha 
publicado la edici??n ${edition}.
+BookmarkItem.bookmarkUpdatedShort=Marcador actualizado: ${name}
 BookmarkItem.bookmarkUpdatedTitle=Marcador actualizado: ${name}
 BookmarkItem.bookmarkUpdatedWithLink=El sitio de marcadores de nombre 
${link}${name}${/link} ha publicado la edici??n ${edition}.
 BookmarkItem.deleteBookmarkUpdateNotification=Borrar notificaci??n
@@ -53,6 +58,9 @@
 CSSTokenizerFilter.invalidURLContents=Contenidos inv??lidos de url()
 CSSTokenizerFilter.supplementalCharsNotSupported=NO SE SOPORTAN LOS CARACTERES 
UCS-4 POR ENCIMA DE 0xFFFF
 CSSTokenizerFilter.unknownAtIdentifierLabel=Desconocido: @identifier:
+ClockProblemDetectedUserAlert.shortText=El reloj de tu computadora no esta 
bien, Freenet tiene problemas para conectarse de esta forma.
+ClockProblemDetectedUserAlert.text=Freenet detecto que la fecha y hora del 
reloj de tu computadora son incorrectos. Corrije el reloj y reinicia el nodo.
+ClockProblemDetectedUserAlert.title=El reloj de tu computadora esta fuera de 
hora
 ConfigToadlet.appliedFailureExceptions=Se han aplicado los cambios de 
configuraci??n, con las siguientes excepciones:
 ConfigToadlet.appliedFailureTitle=No se ha aplicado la configuraci??n
 ConfigToadlet.appliedSuccess=Los cambios en la configuraci??n se han aplicado 
con ??xito.
@@ -66,9 +74,30 @@
 ConfigToadlet.reset=Reiniciar
 ConfigToadlet.returnToNodeConfig=Regresar a la configuraci??n del nodo
 ConfigToadlet.shortTitle=Configuraci??n
+ConfigToadlet.ssl=SSL (requiere reiniciar)
 ConfigToadlet.title=Configuraci??n del nodo de Freenet
 ConfigurablePersister.doesNotExistCannotCreate=El documento no existe y no se 
ha podido crearlo
 ConfigurablePersister.existsCannotReadWrite=El documento existe y no se puede 
leer/escribir
+ConnectionsToadlet.nodeStatus.BUSY=OCUPADO
+ConnectionsToadlet.nodeStatus.CLOCK PROBLEM=PROBLEMA DE RELOJ
+ConnectionsToadlet.nodeStatus.CONNECTED=CONECTADO
+ConnectionsToadlet.nodeStatus.CONNECTION ERROR=ERROR DE CONECCI??N
+ConnectionsToadlet.nodeStatus.DISABLED=DESACTIVADO
+ConnectionsToadlet.nodeStatus.DISCONNECTED=DESCONECTADO
+ConnectionsToadlet.nodeStatus.DISCONNECTING=DESCONECTANDO
+ConnectionsToadlet.nodeStatus.LISTENING=ESCUCHANDO
+ConnectionsToadlet.nodeStatus.NEVER CONNECTED=NUNCA CONECTADO
+ConnectionsToadlet.nodeStatus.TOO NEW=MUY NUEVO
+ConnectionsToadlet.nodeStatus.TOO OLD=MUY VIEJO
+ConnectionsToadlet.nodeStatus.UNKNOWN STATUS=ESTADO DESCONOCIDO
+ConnectivityToadlet.addressTitle=Direcci??n
+ConnectivityToadlet.connectivity=Conectividad a Internet
+ConnectivityToadlet.connectivityTitle=Conectividad
+ConnectivityToadlet.localRemoteTitle=Local/Remoto
+ConnectivityToadlet.noreply=SIN RESPUESTA
+ConnectivityToadlet.remote=REMOTO
+ConnectivityToadlet.summaryTitle=Conectividad
+ConnectivityToadlet.title=Conectividad a internet de ${nodeName}
 ContentDataFilter.unknownCharset=La p??gina que se va a mostrar tiene un juego 
de caracteres desconocido. Esto significa que no se ha podido filtrar la 
p??gina, lo cual puede comprometer su anonimato.
 ContentDataFilter.unknownCharsetTitle=??Juego de caracteres desconocido!
 ContentDataFilter.warningUnknownCharsetTitle=Atenci??n: juego de caracteres 
desconocido (${charset})
@@ -171,8 +200,10 @@
 DarknetConnectionsToadlet.urlReference=Introduzca aqu?? la URL de la 
referencia:
 DarknetConnectionsToadlet.versionTitle=Versi??n
 ExtOldAgeUserAlert.extTooOld=El archivo freenet-ext.jar parece anticuado: se 
recomienda encarecidamente actualizarlo desde 
http://downloads.freenetproject.org/alpha/freenet-ext.jar.
+ExtOldAgeUserAlert.extTooOldShort=El archivo freenet-ext.jar esta 
desactualizado, actualizar!
 ExtOldAgeUserAlert.extTooOldTitle=Freenet-ext demasiado antiguo
 FProxyToadlet.abortToHomepage=Abortar y volver a la p??gina principal de FProxy
+FProxyToadlet.alertsTitle=Alertas
 FProxyToadlet.backToFProxy=${link}Pulse aqu??${/link} para ir a la p??gina 
principal de FProxy
 FProxyToadlet.backToReferrer=${link}Pulse aqu??${/link} para volver a la 
p??gina previa.
 FProxyToadlet.cantBindPort=??No se puede asociar fproxy a ese puerto!
@@ -256,6 +287,8 @@
 FcpServer.isEnabledLong=Est?? activado el servidor FCP?
 FcpServer.portNumber=Puerto FCP
 FcpServer.portNumberLong=Puerto empleado por el servidor FCP
+FcpServer.ssl=Activar SSL?
+FcpServer.sslLong=Activar SSL en el servicio de FCP
 FetchException.longError.1=Demasiados niveles de recursi??n en los documentos
 FetchException.longError.10=El documento no est?? en el contenedor
 FetchException.longError.11=Demasiadas partes en la ruta - ??no es un 
manifiesto? Reintente eliminando una parte
@@ -320,17 +353,22 @@
 FileOffer.askUserTitle=Transferencia directa de archivos
 FileOffer.commentLabel=Comentario:
 FileOffer.failedReceiveHeader=La transferencia del documento ${filename} desde 
${node} ha fallado.
+FileOffer.failedReceiveShort=Fallo en la transferencia del archivo ${filename} 
desde ${node}.
 FileOffer.failedReceiveTitle=Fallo durante la recepci??n del documento
 FileOffer.fileLabel=Archivo:
 FileOffer.mimeLabel=Tipo MIME:
 FileOffer.offeredFileHeader=El nodo ${name} ha ofrecido un documento:
+FileOffer.offeredFileShort=Tu amigo ${node} te ofrece el archivo ${filename}.
 FileOffer.rejectTransferButton=Rechazar transferencia
 FileOffer.senderLabel=Remitente:
 FileOffer.sizeLabel=Tama??o:
 FileOffer.succeededReceiveHeader=La transferencia del document ${filename} 
desde ${node} se ha completado con ??xito.
+FileOffer.succeededReceiveShort=Archivo ${filename} recibido con exito desde 
${node}.
 FileOffer.succeededReceiveTitle=Documento recibido con ??xito
 FirstTimeWizardToadlet.bandwidthLimit=L??mites de ancho de banda
 FirstTimeWizardToadlet.bandwidthLimitLong=Por favor, seleccione su tipo de 
conexi??n y velocidad de acceso en el men?? desplegable a continuaci??n.
+FirstTimeWizardToadlet.bwlimitHigherSpeed=maxima velocidad
+FirstTimeWizardToadlet.bwlimitLowerSpeed=m??nima velocidad
 FirstTimeWizardToadlet.chooseNodeName=??Hace falta un nombre para el nodo!
 FirstTimeWizardToadlet.chooseNodeNameLong=Por favor, proporcione un nombre 
para el nodo en el campo siguiente (se recomienda un apodo con, si quiere, una 
direcci??n de correo). Esto es para que sus amigos (contactos de confianza, 
a??adidos manualmente) puedan identificarle con facilidad. Esto no se muestra a 
los desconocidos (nodos no de confianza a??adidos autom??ticamente). Sepa que 
cualquier contacto, amigo o desconocido, puede identificar trivialmente su 
direcci??n IP, aunque no pueden saber con facilidad qu?? peticiones est?? usted 
haciendo.
 FirstTimeWizardToadlet.congratz=??Bienvenido a bordo!
@@ -338,9 +376,11 @@
 FirstTimeWizardToadlet.connectToStrangers=??Conectarse a desconocidos?
 FirstTimeWizardToadlet.connectToStrangersLong=Si permite a Freenet conectarse 
con desconocidos, Freenet ser?? menos seguro para usted. Cualquiera podr?? 
averiguar que usted usa Freenet, y entes enemigos podr??n conectarse a este 
nodo. Si no lo permite, tendr?? que conectarse manualmente con al menos tres 
Amigos (personas de su confianza) que ya est??n usando Freenet.
 FirstTimeWizardToadlet.continue=Continuar
+FirstTimeWizardToadlet.continueEnd=Clickea aqui para comenzar a usar Freenet!
 FirstTimeWizardToadlet.datastoreSize=Tama??o del almac??n de datos
 FirstTimeWizardToadlet.datastoreSizeLong=Por favor, seleccione el tama??o del 
almac??n de datos. Este almac??n act??a como una cach??; al guardar datos de la 
red favorece que las transferencias sean m??s r??pidas al solicitarse 
documentos populares. Cuanto m??s espacio pueda dedicar, m??s se beneficiar?? 
la comunidad y m??s r??pido funcionar?? este nodo.
 FirstTimeWizardToadlet.enableOpennet=??Conectarse autom??ticamente a nodos 
desconocidos no de confianza?
+FirstTimeWizardToadlet.fivePercentDisk=(= 5% del espacio libre en disco)
 FirstTimeWizardToadlet.homepageTitle=??Asistente para la primera vez en 
Freenet!
 FirstTimeWizardToadlet.iDoTrust=??Conf??a en las conexiones desde ${interface} 
(${ip}) ?
 FirstTimeWizardToadlet.isNetworkTrusted=??Es de confianza la red local?
@@ -354,6 +394,7 @@
 FirstTimeWizardToadlet.step4Title=??Asistente para la primera vez en Freenet! 
- Tama??o del almac??n de datos
 FirstTimeWizardToadlet.step5Title=??Asistente para la primera vez en Freenet! 
- Configuraci??n de red
 FirstTimeWizardToadlet.step7Title=??Asistente para la primera vez en Freenet! 
- Enhorabuena, el nodo est?? configurado
+FirstTimeWizardToadlet.warningTitle=Cuidado!
 FirstTimeWizardToadlet.welcomeInfoboxContent1=Bienvenido al asistente para la 
primera ejecuci??n de Freenet. Esta herramienta le ayudar?? a poner a punto el 
nodo r??pida y f??cilmente. Por favor,
 FirstTimeWizardToadlet.welcomeInfoboxTitle=??Bienvenido al asistente para la 
primera vez en Freenet!
 GIFFilter.invalidHeader=El documento no comienza con una cabecera GIF v??lida.
@@ -376,26 +417,31 @@
 HTMLFilter.tooManyNestedStyleOrScriptTags=Demasiadas etiquetas anidadas 
'style' o 'script' - procesado ambiguo o inv??lido
 HTMLFilter.tooManyNestedStyleOrScriptTagsLong=Demasiados </style> anidados - 
procesado ambiguo o inv??lido, no se puede filtrar con fiabilidad as?? que se 
eliminar??n las etiquetas m??s interiores - puede aparecer basura en el 
navegador
 HTMLFilter.unknownTag=etiqueta desconocida ${tag}
+IPDetectorPluginManager.connectionProblems=Problemas de conecci??n:
 IPDetectorPluginManager.direct=Parece estar conectado directamente a internet. 
Enhorabuena, deber??a poder conectar con cualquier otro nodo de Freenet.
 IPDetectorPluginManager.directTitle=Se ha detectado que la conexi??n a 
internet es directa
 IPDetectorPluginManager.fullCone=Su conexi??n parece estar tras un enrutador 
de tipo "full cone NAT". Enhorabuena, el nodo deber??a ser capaz de conectarse 
a cualquier otro nodo de Freenet.
 IPDetectorPluginManager.fullConeTitle=Se ha detectado una conexi??n de tipo 
'Full cone NAT'
 IPDetectorPluginManager.noConnectivity=Su conexi??n a internet parece no 
soportar UDP. A no ser que esta detecci??n sea err??nea, es improbable que 
Freenet pueda funcionar en esta m??quina por el momento.
 IPDetectorPluginManager.noConnectivityTitle=No hay conectividad UDP
+IPDetectorPluginManager.noConnectivityshort=Problemas graves de conecci??n: no 
hay conectividad UDP, Freenet will no va a funcionar!
 IPDetectorPluginManager.portRestricted=Su conexi??n a internet parece estar 
tras un enrutador NAT con restricciones de puertos. Podr?? conectar con la 
mayor??a de usuarios, pero no con aquellos tras NATs sim??tricos.
 IPDetectorPluginManager.portRestrictedTitle=Se ha detectado un NAT de tipo 
'restricted cone'
 IPDetectorPluginManager.restricted=Su conexi??n parece estar tras un enrutador 
de tipo "restricted cone NAT". Deber??a ser capaz de conectarse a la mayor??a 
de usuarios.
 IPDetectorPluginManager.restrictedTitle=Se ha detectado una conexi??n de tipo 
'Restricted cone NAT'
+IPDetectorPluginManager.seriousConnectionProblems=Problemas serios de 
conecci??n:
 IPDetectorPluginManager.suggestForwardPort=Puede querer redirigir manualmente 
el puerto (UDP n?? ${port}). (Vea 
http://wiki.freenetproject.org/FirewallAndRouterIssues ).
 IPDetectorPluginManager.suggestForwardPortWithLink=Puede querer 
${link}redirigir los puertos${/link} (UDP n?? ${port}) manualmente (o podr??a 
haberlo hecho ya, Freenet no puede detectarlo con facilidad).
 IPDetectorPluginManager.suggestForwardTwoPorts=Puede desear redirigir 
manualmente los puertos (UDP n?? ${port1} y ${port2}). (Vea 
http://wiki.freenetproject.org/FirewallAndRouterIssues ).
 IPDetectorPluginManager.symmetric=Su conexi??n parece estar tras un NAT o 
cortafuegos sim??trico. Probablemente s??lo podr?? conectarse a usuarios 
directamente conectados a internet o que se hallen tras "restricted cone" NATs.
 IPDetectorPluginManager.symmetricTitle=Se ha detectado un cortafuegos 
sim??trico
 IPUndetectedUserAlert.detecting=Freenet est?? intentando detectar su 
direcci??n IP externa. Si tarda m??s de unos minutos, entonces algo no ha 
funcionado correctamente...
+IPUndetectedUserAlert.detectingShort=Freenet esta intentando detectar tu 
direccion IP externa
 IPUndetectedUserAlert.detectingWithConfigLink=Freenet est?? intentando 
detectar su direcci??n IP externa. Si esto tarda m??s de unos minutos, entonces 
algo no ha funcionado y usted puede user la opci??n 'sugerencia de IP 
transitoria' ${link}configuration parameter${/link}. Adem??s, ser??a 
conveniente redirigir el puerto UDP ${port} en el router a su direcci??n local 
para facilitar la conexi??n del nodo.
 IPUndetectedUserAlert.suggestForwardPort=Ser??a tambi??n una buena idea 
redirigir el puerto ${port} (UDP) en el router para facilitar la conexi??n del 
nodo
 IPUndetectedUserAlert.suggestForwardTwoPorts=Ser??a tambi??n una buena idea 
redirigir los puertos ${port1} y ${port2} (UDP) en el router para facilitar la 
conexi??n del nodo.
 IPUndetectedUserAlert.unknownAddress=Freenet no ha podido detectar su 
direcci??n IP externa (o la del cortafuegos o NAT). A??n as??, usted puede 
intercambiar referencias con otras personas, aunque ??stas s??lo funcionaran si 
ellos no est??n tras un cortafuegos o NAT. Tan pronto como consiga una 
conexi??n de este modo, Freenet podr?? determinar su IP externa. Si usted la 
conoce, puede indicarla en la opci??n 'sugerencia de IP transitoria' 
${link}configuration parameter${/link}. Adem??s, ser??a conveniente redirigir 
el puerto UDP ${port} en su enrutador a su direcci??n local para facilitar la 
conexi??n del nodo.
+IPUndetectedUserAlert.unknownAddressShort=Freenet no pudo detectar tu 
direccion IP externa, puede que existan problemas de conectividad.
 IPUndetectedUserAlert.unknownAddressTitle=Direcci??n externa desconocida
 IPUndetectedUserAlert.unknownAddressWithConfigLink=Freenet no ha podido 
averiguar su direcci??n IP externa (o la del cortafuegos o NAT). A??n as??, 
usted puede intercambiar referencias con otras personas, pero s??lo 
funcionar??n si ellas no est??n tras un NAT o cortafuegos. En cuanto conecte 
con otro nodo de este modo, Freenet podr?? determinar la direcci??n IP externa. 
Usted puede especificarla, si la conoce, en la opci??n 'Direcci??n IP 
transitoria' ${link}configuration parameter${/link}. Adem??s, ser??a una buena 
idea redirigir el puerto ${port} de su router para tr??fico UDP hacia su 
direcci??n local para facilitar la conexi??n del nodo.
 InsertException.longError.1=El llamador ha proporcionado un URI que no podemos 
usar"
@@ -490,6 +536,7 @@
 N2NTMToadlet.tooLongTitle=Demasiado largo
 N2NTMUserAlert.delete=Borrar
 N2NTMUserAlert.header=De: ${from} (escrito el ${composed} | enviado el ${sent} 
| recibido el ${received})
+N2NTMUserAlert.headerShort=Mensaje de ${from}
 N2NTMUserAlert.reply=Responder
 N2NTMUserAlert.title=Mensaje entre nodos ${number} desde ${peername} (${peer})
 Node.alwaysAllowLocalAddresses=??Permitir siempre conectar a nodos a trav??s 
de direcciones locales?
@@ -511,6 +558,8 @@
 Node.disablePHTLSLong=Desactivar HTL probabil??stico (no toque esto si no sabe 
lo que significa)
 Node.dropPacketEvery=Frecuencia de descarte de paquetes para pruebas
 Node.dropPacketEveryLong=Frecuencia de descarte de paquetes. Opci??n de prueba 
que los desarrolladores emplean para simular p??rdidas de paquetes. Cero 
significa nunca descartar artificialmente un paquete. ??No toque esto!
+Node.enableARKs=Activar ARKs? (NO DESACTIVAR!)
+Node.enableARKsLong=Activar ARKs? (NO DESACTIVAR!).
 Node.errorApplyingConfig=Error al aplicar la nueva configuraci??n : ${error}
 Node.extraPeerDir=Carpeta para datos extra de los contactos
 Node.extraPeerDirLong=Nombre de la carpeta en la que guardar datos adicionales 
de los nodos conectados
@@ -523,11 +572,16 @@
 Node.l10nLanguageLong=Este ajuste cambia el idioma empleado para mostrar los 
mensajes. Sepa que algunos textos no aparecer??n traducidos hasta el siguiente 
arranque del nodo.
 Node.maxHTL=HTL m??ximo
 Node.maxHTLLong=HTL m??ximo (??PARA USO DE DESARROLLADORES ??NICAMENTE!)
+Node.maxOpennetPeers=Numero maximo de conecciones por Opennet
+Node.maxOpennetPeersMustBeTwentyOrLess=Debe ser veinte o menos
 Node.mustBePositive=El valor de configuraci??n debe ser positivo
 Node.nodeDir=Carpeta del nodo
 Node.nodeDirLong=Ruta de la carpeta en que guardar documentos relacionados con 
el nodo (p.e. la lista de contactos)
 Node.nodeName=Apodo para este nodo de Freenet
 Node.nodeNameLong=Apodo para el nodo. Esto ser?? visible s??lo para sus amigos.
+Node.notUsingSunVMTitle=No se esta usando JVM de Sun
+Node.notUsingWrapperShort=Freenet esta corriendo sin el wrapper y no esta 
recomendado.
+Node.notUsingWrapperTitle=No se esta usando el wrapper!
 Node.oneConnectionPerIP=??Limitar a una conexi??n por direcci??n?
 Node.oneConnectionPerIPLong=No permitir m??s de una conexi??n por direcci??n. 
Esto hace ligeramente m??s dif??cil  para un atacante el conectarse varias 
veces simult??neas usando distintas identidades, ya sea para controlar el 
enrutado o simplificar la recolecci??n de direcciones. Tambi??n previene el 
conectarse a un mismo nodo a trav??s de darknet y opennet.
 Node.opennetEnabled=??Activar modo promiscuo (conectar autom??ticamente a 
nodos desconocidos)?
@@ -545,6 +599,7 @@
 Node.storeSizeLong=Tama??o del almac??n de datos en bytes
 Node.swapRInterval=Intervalo de env??o de peticiones de intercambio de 
ubicaci??n (ms)
 Node.swapRIntervalLong=Intervalo entre intentos de env??o de peticiones de 
intercambio de ubicaci??n, en milisegundos. ??No lo toque!
+Node.tooSmallMTU=MTU muy peque??o
 NodeClientCore.allowInsecureCHK=??Permitir CHKs inseguras?
 NodeClientCore.allowInsecureCHKLong=Todas las CHKs anteriores a la versi??n 
1010 eran inseguras (cifrado parcial). ??Permitirlas?
 NodeClientCore.allowInsecureSSK=??Permitir SSKs inseguras?
@@ -566,6 +621,7 @@
 NodeClientCore.movingTempDirOnTheFlyNotSupported=Actualmente no se puede 
cambiar la carpeta temporal con el nodo en marcha
 NodeClientCore.persistentTempDir=Carpeta de datos temporales persistentes
 NodeClientCore.persistentTempDirLong=Nombre de la carpeta en que almacenar 
datos temporales persistentes
+NodeClientCore.startingUpTitle=Freenet esta iniciando
 NodeClientCore.tempDir=Carpeta de datos temporales
 NodeClientCore.tempDirLong=Nombre de la carpeta en que guardar datos temporales
 NodeClientCore.uploadAllowedDirs=El env??o de carpetas se permite desde
@@ -607,6 +663,7 @@
 NodeUpdateManager.revocationURILong=URI de la clave de revocaci??n. Si se 
encuentra, el nodo mostrar?? su contenido y desactivar?? el auto-actualizador.
 NodeUpdateManager.updateCatastropheTitle=??Fallo catastr??fico de 
actualizaci??n!
 NodeUpdateManager.updateFailed=Actualizaci??n fallida: ${reason}
+NodeUpdateManager.updateFailedShort=Fallo en la actualizaci??n: ${reason}
 NodeUpdateManager.updateFailedTitle=??Actualizaci??n fallida!
 NodeUpdateManager.updateURI=??D??nde debe el nodo buscar actualizaciones?
 NodeUpdateManager.updateURILong=??D??nde debe buscar el nodo las 
actualizaciones?
@@ -618,6 +675,10 @@
 OpennetUserAlert.warningTitle=Cuidado: Modo promiscuo activado: El nodo se 
conectar?? a Desconocidos
 PNGFilter.invalidHeader=La imagen que ha intentado descargar no es un PNG. No 
tiene una cabecera PNG v??lida. Podr??a ser otro tipo de documento, y su 
navegador podr??a intentar hacer algo peligroso con el, as?? que ha sido 
bloqueado.
 PNGFilter.invalidHeaderTitle=No es un PNG - cabecera inv??lida
+PageMaker.modeAdvanced=Interface avanzada
+PageMaker.modeAdvancedTooltip=Una interface avanzada que solo usuarios 
experimentados y desarrolladores necesitan usar
+PageMaker.modeSimple=Interface simple
+PageMaker.modeSimpleTooltip=Una interface simple que todos los usuarios pueden 
usar
 PeerManagerUserAlert.clockProblem=${count} de las conexiones no pueden 
establecerse porque el reloj del sistema remoto est?? desajustado m??s de 24 
horas respecto al reloj local. Por favor, compruebe si el computador local 
tiene la hora correcta. Un reloj mal ajustado puede causar fallos tanto en el 
nodo como en las aplicaciones cliente.
 PeerManagerUserAlert.clockProblemTitle=Problemas con el reloj
 PeerManagerUserAlert.connError=${count} de sus contactos no pueden conectarse 
por razones desconocidas, posiblemente a causa de c??digo err??neo en el nodo o 
una referencia incorrecta.
@@ -655,6 +716,8 @@
 PluginManager.loadedOnStartupLong=Classpath, nombre y ubicaci??n para los 
complementos a cargar cuando el nodo arranca
 PluginManager.loadedPlugins=Complementos a cargar al arrancar
 PluginManager.loadedPluginsLong=Una lista de complementos que se cargan cuando 
el nodo arranca
+PluginManager.pluginLoadingFailedShort=No se puedo cargar el complemento 
${name}!
+PluginManager.pluginLoadingFailedTitle=No se puedo cargar el complemento!
 PluginManager.pluginReqNewerJVM=El complemento ${name} parece requerir una JVM 
m??s reciente. Por favor, instale al menos la versi??n 1.5 de Sun Java, o 
elimine el complemento.
 PluginManager.pluginReqNewerJVMTitle=El complemento ${name} requiere una JVM 
m??s reciente
 PluginToadlet.addPluginTitle=A??adir un complemento
@@ -674,10 +737,18 @@
 PluginToadlet.unsupportedMethod=M??todo no soportado.
 PluginToadlet.unsupportedMethodTitle=M??todo no soportado
 PluginToadlet.visit=Visite
+PproxyToadlet.Load=Cargar
+PproxyToadlet.changeReloadOnStartup=Cambiar
 PproxyToadlet.classNameTitle=Nombre de clase
 PproxyToadlet.internalIDTitle=ID interno
+PproxyToadlet.loadOfficialPlugin=Agregar complemento oficial
+PproxyToadlet.loadOfficialPluginLabel=Cargar complemento oficial
+PproxyToadlet.loadOtherPlugin=Agregar complemento no oficial
+PproxyToadlet.loadOtherURLLabel=URL del complemento
 PproxyToadlet.loadPluginLabel=Cargar complemento:
 PproxyToadlet.noPlugins=No hay complementos funcionando
+PproxyToadlet.noVersion=No Disponible
+PproxyToadlet.pluginDirectoryNotCreated=El directorio para el complemento no 
puede ser creado
 PproxyToadlet.pluginNotFoundReload=El complemento dado no ha podido ser 
localizado para reiniciarlo.
 PproxyToadlet.pluginNotFoundReloadTitle=Complemento no encontrado (recargando)
 PproxyToadlet.pluginStopping=Complemento deteni??ndose
@@ -686,11 +757,23 @@
 PproxyToadlet.plugins=Complementos
 PproxyToadlet.pluginsWithNodeName=Complementos de ${name}
 PproxyToadlet.reload=Recargar
+PproxyToadlet.reloadOnStartupShort=Recargar al iniciar
+PproxyToadlet.reloadPluginTitle=Recargar Complemento
 PproxyToadlet.returnToPluginPage=Volver a la p??gina de complementos
 PproxyToadlet.startedAtTitle=Arrancado el
+PproxyToadlet.startingPluginName=Nombre del complemento
+PproxyToadlet.startingPluginStatus=Estado actual
+PproxyToadlet.startingPluginTime=Tiempo empleado
+PproxyToadlet.startingPluginsTitle=Comenzando complementos
+PproxyToadlet.unauthorized=No estas autorizado a ver esta p??gina.
+PproxyToadlet.unauthorizedTitle=Acceso no autorizado
 PproxyToadlet.unload=Descargar
 PproxyToadlet.unloadPluginTitle=??Desinstalar plugin?
 PproxyToadlet.unloadPluginWithName=??Est?? seguro de que quiere desinstalar 
${name}?
+PproxyToadlet.unloadPurge=Eliminar complemento del cache
+PproxyToadlet.versionTitle=Versi??n
+PproxyToadlet.startingPluginStatus.downloading=creando copia local
+PproxyToadlet.startingPluginStatus.starting=arrancando
 QueueToadlet.DUinProgress=Inserciones de carpetas en curso
 QueueToadlet.DinProgress=Descargas en curso
 QueueToadlet.UinProgress=Inserciones en curso
@@ -703,6 +786,7 @@
 QueueToadlet.completedU=Completadas: Inserciones (${size})
 QueueToadlet.completedUDirectory=Completado: Env??o de carpetas (${size})
 QueueToadlet.download=Descarga
+QueueToadlet.downloadSucceededTitle=Descarga completada: ${filename}
 QueueToadlet.errorAccessDenied=Error: ??Acceso denegado!
 QueueToadlet.errorAccessDeniedFile=La configuraci??n actual del nodo proh??be 
la inserci??n del documento "${file}".
 QueueToadlet.errorDToDisk=No se puede descargar a disco
@@ -734,6 +818,9 @@
 QueueToadlet.identifier=Identificador
 QueueToadlet.insertAs=Insertar como:
 QueueToadlet.insertFile=Insertar documento
+QueueToadlet.insertFileBrowseLabel=Explorar archivos del disco
+QueueToadlet.insertFileCompressLabel=Comprimir
+QueueToadlet.insertFileInsertFileLabel=Insertar archivo
 QueueToadlet.key=Clave
 QueueToadlet.legend=Leyenda
 QueueToadlet.mimeType=Tipo MIME
@@ -775,6 +862,9 @@
 RequestStarterGroup.schedulerLong=Ajuste para la pol??tica de prioridades que 
usa el planificador.
 RevocationKeyFoundUserAlert.text=El nodo ha encontrado la clave de anulaci??n 
del auto-actualizador. ??Esto significa, con toda probabilidad, que el sistema 
de auto-actualizaci??n se ha visto COMPROMETIDO! En consecuencia, ha sido 
desactivado para evitar la instalaci??n de "cosas malas". Se le sugiere 
encarecidamente que compruebe la web del proyecto Freenet en busca de 
noticias/actualizaciones. Tenga cuidado as??mismo de que la web no haya sido 
tambi??n suplantada. El mensaje de revocaci??n recuperado es: ${message}.
 RevocationKeyFoundUserAlert.title=??La clave privada del proyecto se ha visto 
comprometida!
+SSL.enable=Activar soporte para SSL?
+SSL.enableLong=Activar soporte para SSL?
+SSL.version=Versi??n de SSL
 ShortOption.parseError=No se ha podido interpretar como un vector de cadenas: 
${error}
 SimpleToadletServer.advancedMode=??Activar modo avanzado?
 SimpleToadletServer.advancedModeLong=Mostrar o no informaci??n destinada a 
usuarios avanzados/desarrolladores. Este ajuste deber??a mantenerse desactivado 
(false) como norma general.
@@ -803,6 +893,11 @@
 SimpleToadletServer.panicButtonLong=Si debe mostrarse o no el bot??n de 
p??nico en la p??gina de /cola/
 SimpleToadletServer.port=N?? de puerto de FProxy
 SimpleToadletServer.portLong=N?? de puerto de FProxy
+SimpleToadletServer.ssl=Activar SSL?
+SimpleToadletServer.sslLong=Activar SSL en FProxy
+StartupToadlet.entropyErrorTitle=No hay suficiente entropia disponible!
+StartupToadlet.isStartingUp=Freenet esta iniciando, espere por favor
+StartupToadlet.title=Freenet esta iniciando
 StaticToadlet.pathInvalidChars=La URI dada contiene caracteres prohibidos
 StaticToadlet.pathNotFound=La ruta dada no existe
 StaticToadlet.pathNotFoundTitle=No se ha encontrado la ruta de disco
@@ -811,20 +906,25 @@
 StatisticsToadlet.allocMemory=Memoria Java asignada: ${memory}
 StatisticsToadlet.bandwidthTitle=Ancho de banda
 StatisticsToadlet.cpus=CPUs disponibles: ${count}
+StatisticsToadlet.fullTitle=Estad??sticas para ${name}
 StatisticsToadlet.getLogs=Ver ??ltimo registro de eventos
 StatisticsToadlet.inputRate=Tasa de entrada: ${rate}/s (de ${max})
+StatisticsToadlet.javaVersion=Versi??n de Java: ${version}
 StatisticsToadlet.jeDumpButton=Generar un volcado de JE
 StatisticsToadlet.jvmInfoTitle=Informaci??n de JVM
 StatisticsToadlet.jvmVendor=Proveedor de JVM: ${vendor}
 StatisticsToadlet.jvmVersion=Versi??n de Java (JVM): ${version}
 StatisticsToadlet.maxMemory=Memoria Java m??xima: ${memory}
 StatisticsToadlet.noRequests=El nodo no est?? procesando ninguna petici??n en 
este momento.
+StatisticsToadlet.nodeToNodeBytes=Mensajes nodo a nodo: ${total}
 StatisticsToadlet.osArch=Arquitectura del S.O: ${arch}
 StatisticsToadlet.osName=Nombre del S.O: ${name}
 StatisticsToadlet.osVersion=Versi??n del S.O: ${version}
 StatisticsToadlet.outputRate=Tasa de salida: ${rate}/s (de ${max})
 StatisticsToadlet.payloadOutput=Env??o ??til: ${total} (${rate}/s)(${percent}%)
 StatisticsToadlet.peerStatsTitle=Estad??sticas de contactos
+StatisticsToadlet.priority=Prioridad
+StatisticsToadlet.running=Corriendo
 StatisticsToadlet.threadDumpButton=Generar un volcado de subprocesos
 StatisticsToadlet.threads=Subprocesos en ejecuci??n: ${running}/${max}
 StatisticsToadlet.totalInput=Recibido total: ${total} (${rate}/s)
@@ -832,6 +932,7 @@
 StatisticsToadlet.transferringRequests=Transferencias: ${senders} enviando, 
${receivers} recibiendo
 StatisticsToadlet.usedMemory=Memoria usada por Java: ${memory}
 StatisticsToadlet.versionTitle=Informaci??n de la versi??n del nodo
+StatisticsToadlet.waiting=Esperando
 SymlinkerToadlet.symlinks=Enlaces simb??licon en ToadletServer
 SymlinkerToadlet.symlinksLong=Una lista de "alias#target"'s que forma una 
colecci??n de enlaces simb??licos
 TestnetHandler.cannotEnableDisableOnTheFly=Activar/desactivar el modo Testnet 
mientras el nodo est?? en marcha es imposible; rein??cielo para obtener nuevas 
conexiones
@@ -847,6 +948,7 @@
 TextModeClientInterfaceServer.enableInputOutputLong=Activar cliente de texto 
para consola? ('Enabled' proporciona un servidor estilo telnet, accesible 
mediante socket).
 TextModeClientInterfaceServer.enabled=Activar TMCI (Cliente de modo texto / 
Text Mode Client Interface)
 TextModeClientInterfaceServer.enabledLong=Determina si se activar?? el TMCI
+TextModeClientInterfaceServer.ssl=Activar SSL?
 TextModeClientInterfaceServer.telnetPortNumber=Puerto para Telnet
 TextModeClientInterfaceServer.telnetPortNumberLong=N??mero de puerto para 
Telnet
 TimeSkewDetectedUserAlert.text=El nodo ha detectado un salto en el reloj. Esto 
es MUY perjudicial. El nodo no funcionar?? correctamente hasta que se corrija. 
Son causas habituales ajustes incorrectos del modo de ahorro de energ??a, 
clientes de sincronizaci??n temporal por  red (NTP) o hardware defectuoso.
@@ -866,6 +968,7 @@
 Toadlet.returnToPrevPage=Regresar a la p??gina anterior
 Toadlet.tempRedirectWithReason=Redirecci??n temporal: ${reason}
 Toadlet.unauthorized=No se le permite acceder a esta p??gina.
+Toadlet.unauthorizedTitle=No autorizado
 Toadlet.yes=S??
 ToadletContextImpl.cannotParseContentLength=Error procesando Content-length: 
${error}
 ToadletContextImpl.headersLineTooLong=L??nea demasiado larga procesando 
cabeceras
@@ -913,6 +1016,9 @@
 UpdatedVersionAvailableUserAlert.fetchingNewNode=El nodo est?? descargando una 
actualizaci??n de Freenet (versi??n ${nodeVersion}).
 UpdatedVersionAvailableUserAlert.finalCheck=El nodo est?? ejecutando una 
verificaci??n final acerca de la seguridad de la actualizaci??n (${count} de 
${max}, tiempo m??ximo restante ${time}).
 UpdatedVersionAvailableUserAlert.notLatest=Parece que el nodo no est?? 
actualizado a la ??ltima versi??n.
+UpdatedVersionAvailableUserAlert.shortArmed=El nodo esta bajando una nueva 
version y se reiniciara cuando termine.
+UpdatedVersionAvailableUserAlert.shortNotReadyNotArmed=El nodo esta bajando 
una nueva version de freenet pero necesita permiso para poder usarla.
+UpdatedVersionAvailableUserAlert.shortReadyNotArmed=Tu nodo bajo una nueva 
version de freenet pero necesita tu permiso para usarla.
 UpdatedVersionAvailableUserAlert.title=Hay disponible una nueva versi??n 
estable de Freenet
 UpdatedVersionAvailableUserAlert.updateASAPButton=Actualizar en cuanto sea 
posible
 UpdatedVersionAvailableUserAlert.updateASAPQuestion=??Desea que el nodo se 
reinicie en cuanto se haya descargado la actualizaci??n?
@@ -927,7 +1033,9 @@
 UserAlertManager.minorCountLabel=Menor:
 UserAlertManager.totalLabel=Total:
 UserAlertManager.warningCountLabel=Avisos:
+UserAlertsToadlet.titleWithName=Alertas para ${name}
 WelcomeToadlet.activityTitle=Actividad actual
+WelcomeToadlet.alertsSummary=Resumen de alertas
 WelcomeToadlet.arkFetchCount=Descargadores ARK: ${total}
 WelcomeToadlet.confirmAddBookmarkSubTitle=Confirme la adici??n del marcador
 WelcomeToadlet.confirmAddBookmarkTitle=A??adir un marcador
@@ -995,4 +1103,5 @@
 WelcomeToadlet.version=Freenet ${fullVersion} Compilaci??n #${build} r${rev}
 WelcomeToadlet.versionHeader=Informaci??n de versi??n & control del nodo
 WelcomeToadlet.writtenDatabaseStats=Las estad??sticas de ejecuci??n de la base 
de datos se han volcado al registro del lanzador (wrapper).
+WrapperConfig.wrapper.java.maxmemory.short=Memoria maxima (en megabytes)
 End

Modified: branches/db4o/freenet/src/freenet/l10n/freenet.l10n.fr.properties
===================================================================
--- branches/db4o/freenet/src/freenet/l10n/freenet.l10n.fr.properties   
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/l10n/freenet.l10n.fr.properties   
2008-08-07 18:30:55 UTC (rev 21657)
@@ -8,6 +8,7 @@
 Announcer.announceDisabledTooOldTitle=Annonces d??sactiv??es (noeud trop 
ancien)
 Announcer.announceLoading=Freenet t??l??charge la liste des seednodes afin de 
pouvoir annoncer sa pr??sence sur le r??seau. Cela va prendre quelques minutes.
 Announcer.coolingOff=Pendant les ${time} prochaines secondes, le noeud va 
attendre que les noeuds auxquels il s'est annonc?? se connectent. S'il n'y en a 
pas assez, il essaiera ?? nouveau.
+Bookmark.noName=Pas de nom
 BookmarkEditorToadlet.addBookmark=Ajouter un marque-page
 BookmarkEditorToadlet.addCategory=Ajouter une cat??gorie
 BookmarkEditorToadlet.addDefaultBookmarks=Rajouter les marque-pages par d??faut
@@ -443,7 +444,7 @@
 FirstTimeWizardToadlet.noNetworkIF=Pas d'autre carte r??seau trouv??e
 FirstTimeWizardToadlet.noNetworkIFLong=Freenet n'a pas trouv?? d'autre carte 
r??seau. Il consid??rera que vous vous y connectez seulement depuis votre 
ordinateur.
 FirstTimeWizardToadlet.opennetNo=Oui, j'ai au moins 5 amis qui utilisent 
Freenet et je vais les ajouter manuellement sur la page Amis.
-FirstTimeWizardToadlet.opennetWarning=Freenet est peut-??tre ill??gal dans 
votre pays, car il permet une libert?? d'expression sans restrictions. Si c'est 
le cas, et que vous utilisez la connexion automatique ?? des inconnus, votre 
gouvernement pourra savoir facilement que vous utilisez Freenet; vous ne 
devriez donc pas activer ce mode et ne devriez vous connecter qu'?? des gens 
que vous connaissez (et en qui vous avez confiance). Freenet est toujours en 
version b??ta, nous ne garantissons pas qu'il est exempt de bugs, et par 
cons??quent, ne pouvons garantir votre anonymat/s??curit??. Il faut faire 
particuli??rement attention aux gens avec qui vous vous connectez: ce sont eux 
qui sont eux qui occupent la meilleure place pour espionner vos requ??tes.
+FirstTimeWizardToadlet.opennetWarning=Freenet est peut-??tre ill??gal dans 
votre pays, car il permet une libert?? d'expression sans restrictions. Si c'est 
le cas, et que vous utilisez la connexion automatique ?? des inconnus, votre 
gouvernement pourra savoir facilement que vous utilisez Freenet; vous ne 
devriez donc pas activer ce mode et ne devriez vous connecter qu'?? des gens 
que vous connaissez (et en qui vous avez confiance). Freenet est toujours 
exp??rimental, nous ne garantissons pas qu'il est exempt de bugs, et par 
cons??quent, ne pouvons garantir votre anonymat/s??curit??. Il faut faire 
particuli??rement attention aux gens avec qui vous vous connectez: ils occupent 
la meilleure place pour espionner vos requ??tes.
 FirstTimeWizardToadlet.opennetYes=Non, je veux que le n??ud trouve 
automatiquement des gens ?? qui se connecter.
 FirstTimeWizardToadlet.skipWizard=Je ne suis pas un d??butant, passer 
l'assistant !
 FirstTimeWizardToadlet.step1Title=Assistant de d??marrage Freenet ! - Amis et 
Inconnus
@@ -669,6 +670,9 @@
 Node.inBWLimit=Limite de t??l??chargement (octet/seconde)
 Node.inBWLimitLong=Limite de t??l??chargement (octets/seconde); le noeud 
essaiera de ne pas la d??passer ; -1 correspond ?? 4x la limite d'upload
 Node.invalidStoreSize=Le store doit faire au moins 32Mo
+Node.java14ShortText=Java 1.4 ne sera pas support?? tr??s longtemps, veuillez 
passer en version 1.5.
+Node.java14Text=Vous utilisez Freenet avec Java 1.4. Veuillez passer en 
version 1.5 au moins. Les mises ?? jour automatiques ont ??t?? d??sactiv??es 
car les prochaines versions risquent de ne pas fonctionner du tout.
+Node.java14Title=Java 1.4 n'est plus support??
 Node.l10nLanguage=Langue utilis??e pour afficher les messages
 Node.l10nLanguageLong=Le param??tre change la langue d'affichage des messages. 
Certaines cha??nes ne seront traduites qu'au prochain red??marrage.
 Node.maxHTL=HTL maximum
@@ -697,6 +701,10 @@
 Node.passOpennetPeersThroughDarknetLong=Si activ??, les r??f??rences opennet 
(JAMAIS votre r??f??rence darknet) seront relay??es ?? travers nos Amis 
(connexions darknet). Cela permet ?? un noeud (le votre ou celui de vos Amis) 
d'obtenir des connexions opennet ?? partir de ses connexions darknet. C'est 
utile car cela nous permet de retrouver de nouvelles connexions opennet quand 
on les a toutes perdues suite ?? un arr??t prolong?? du noeud. Cependant, cela 
rend l'analyse de traffic l??g??rement plus facile ; d??sactivez-le si vous 
??tes parano.
 Node.port=Num??ro de port FNP (UDP)
 Node.portLong=Port UDP des communications inter-noeuds (Freenet Node Protocol)
+Node.publishOurPeersLocation=Devons nous envoyer la position de nos Amis ?? 
nos Amis ?
+Node.publishOurPeersLocationLong=Devons-nous envoyer la position de nos Amis 
?? nos Amis ? Cela aide le routage mais donne des informations ?? un attaquant 
potentiel.
+Node.routeAccordingToOurPeersLocation=Devons nous utiliser la position des 
Amis de nos Amis pour le routage ?
+Node.routeAccordingToOurPeersLocationLong=Devons nous utiliser la position des 
Amis de nos Amis pour le routage ? Cela aide le routage mais pourrait aider un 
attaquant potentiel.
 Node.storeDirectory=Dossier du store
 Node.storeDirectoryLong=Dossier o?? placer le store
 Node.storeMaxMemTooHigh=Vous ne voulez s??rement pas donner plus de 80% de 
votre m??moire ?? BDB !
@@ -789,6 +797,10 @@
 OpennetUserAlert.warningTitle=Attention : Mode peu s??curis?? : Votre n??ud va 
se connecter ?? des inconnus
 PNGFilter.invalidHeader=Ce fichier n'est pas une image PNG. Il ne contient pas 
d'en-t??te PNG valide. Il peut s'agir de n'importe quoi et votre navigateur 
risque de faire quelque chose de dangereux avec. Nous l'avons donc bloqu??.
 PNGFilter.invalidHeaderTitle=Ceci n'est pas une image PNG - en-t??te invalide
+PageMaker.modeAdvanced=Interface avanc??e
+PageMaker.modeAdvancedTooltip=Une interface avanc??e dont seuls les 
utilisateurs exp??riment??s de Freenet et les d??veloppeurs ont besoin
+PageMaker.modeSimple=Interface simple
+PageMaker.modeSimpleTooltip=Une interface simple que tous les utilisateurs 
peuvent utiliser
 PeerManagerUserAlert.clockProblem=${count} noeuds ne peuvent pas se connecter 
?? vous car leur horloge et la votre sont d??call??es de plus de 24 heures. 
Veuillez vous assurer que votre ordinateur est ?? l'heure. Une heure erron??e 
g??ne le fonctionnement du noeud et des clients.
 PeerManagerUserAlert.clockProblemTitle=Probl??me d'horloge
 PeerManagerUserAlert.connError=${count} noeud ne peuvent pas se connecter pour 
une raison inconnue, peut-??tre parce que votre noeud est bugg?? ou votre 
r??f??rence corrompue.
@@ -912,8 +924,12 @@
 QueueToadlet.completedUDirectory=Insertions de dossiers termin??es (${size})
 QueueToadlet.delete=Supprimer
 QueueToadlet.download=T??l??chargement
+QueueToadlet.downloadFiles=T??l??chargement group??s
+QueueToadlet.downloadFilesInstructions=Vous pouvez coller une liste de cl??s 
?? t??l??charger dans la boite ci-dessous (une par ligne)
 QueueToadlet.downloadSucceeded=Le fichier ${origlink}${filename}${/origlink} a 
??t?? t??l??charg?? avec succ??s. ${link}Cliquez ici${/link} pour ouvrir ce 
fichier (${size}).
 QueueToadlet.downloadSucceededTitle=T??l??chargement r??ussi : ${filename}
+QueueToadlet.enqueuedFailure=Les ${number} cl??s suivantes n'ont pas pu ??tre 
mises en file :
+QueueToadlet.enqueuedSuccessfully=Les ${number} cl??s suivantes ont ??t?? 
mises en file :
 QueueToadlet.errorAccessDenied=Erreur : Acc??s refus?? !
 QueueToadlet.errorAccessDeniedFile=La configuration du noeud vous interdit 
d'ins??rer le fichier "${file}".
 QueueToadlet.errorDToDisk=Le t??l??chargement sur le disque a ??chou??
@@ -1047,6 +1063,10 @@
 SimpleToadletServer.portLong=Port TCP ??cout?? par FProxy
 SimpleToadletServer.ssl=Activer SSL ?
 SimpleToadletServer.sslLong=Activer SSL pour FProxy
+StartupToadlet.entropyErrorContent=Il n'y a pas assez d'entropy sur votre 
syst??me... Freenet ne d??marrera pas avant d'en avoir suffisament.
+StartupToadlet.entropyErrorTitle=Pas assez d'entropie disponible !
+StartupToadlet.isStartingUp=D??arrage de Freenet en cours, veuillez patienter.
+StartupToadlet.title=D??marrage de Freenet
 StaticToadlet.pathInvalidChars=Cette URI contient des caract??res interdits.
 StaticToadlet.pathNotFound=Le chemin sp??cifi?? n'existe pas.
 StaticToadlet.pathNotFoundTitle=Chemin introuvable.
@@ -1135,6 +1155,7 @@
 Toadlet.permRedirectWithReason=Redirection permanente : ${reason}
 Toadlet.returnToNodeHomepage=Revenir ?? la page d'accueil
 Toadlet.returnToPrevPage=Retour ?? la page pr??c??dente
+Toadlet.returnToQueuepage=Retour ?? la file d'attente
 Toadlet.tempRedirectWithReason=Redirection temporaire : ${reason}
 Toadlet.unauthorized=Vous n'??tes pas autoris?? ?? acc??der ?? cette page.
 Toadlet.unauthorizedTitle=Acc??s refus??
@@ -1201,7 +1222,7 @@
 UserAlertManager.alertsTitle=Alertes
 UserAlertManager.clickForMore=Cliquez sur un lien pour plus de d??tails, ou 
pour ne plus le voir.
 UserAlertManager.criticalErrorCountLabel=Erreurs critiques :
-UserAlertManager.dumpEventsButton=Enlever le avertissements triviaux
+UserAlertManager.dumpEventsButton=Enlever les avertissements triviaux
 UserAlertManager.errorCountLabel=Erreurs :
 UserAlertManager.minorCountLabel=Mineur :
 UserAlertManager.totalLabel=Total :

Modified: branches/db4o/freenet/src/freenet/l10n/freenet.l10n.it.properties
===================================================================
--- branches/db4o/freenet/src/freenet/l10n/freenet.l10n.it.properties   
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/l10n/freenet.l10n.it.properties   
2008-08-07 18:30:55 UTC (rev 21657)
@@ -1,13 +1,14 @@
 Announcer.announceAlertIntro=Il nodo sta cercando di connettersi con i 
seednode ed annunciare s?? stesso all' OpenNet (network di Sconosciuti). 
Possono essere necessari alcuni minuti per completare l'operazione.
 Announcer.announceAlertNoSeednodes=Non e' stato trovato il file seednodes.fref 
e quindi il nodo non pu?? connettersi automaticamente ad Opennet. Aggiungere 
alcuni nodi manualmente o scaricare il file seednodes da 
http://downloads.freenetproject.org/alpha/opennet/ .
 Announcer.announceAlertShort=Il nodo sta cercando di connettersi alla rete, 
nel frattempo sar?? pi?? lento.
-Announcer.announceAlertTitle=Announce Nodo
+Announcer.announceAlertTitle=Annuncio Nodo in corso
 Announcer.announceDetails=Il nodo ha recentemente inoltrato 
${recentSentAnnouncements} annunci, ${runningAnnouncements} dei quali ancora in 
corso, ed aggiunto ${addedNodes} nodi (${refusedNodes} nodi hanno rifiutato la 
connessione). In questo momento il nodo ?? connesso a ${connectedSeednodes} 
seednode e sta cercando di connettersi ad altri ${disconnectedSeednodes}.
-Announcer.announceDisabledTooOld=Il nodo ?? oodo obsoleto ed inadatto alla 
connessione con la rete Freenet attuale. L'annuncio ?? stato diabilitato in 
quanto comunque inutile. Si prega di aggiornare il nodo appena possibile 
(auto-aggiornamento potrebbe essere in attesa di input o disabilitato)
+Announcer.announceDisabledTooOld=Il software utilizzato dal nodo ?? obsoleto 
ed inadatto alla connessione con la version corrente della rete Freenet. 
L'annuncio ?? stato diabilitato in quanto comunque inutile. Si prega di 
aggiornare il nodo appena possibile (auto-aggiornamento potrebbe essere in 
attesa di input o disabilitato)
 Announcer.announceDisabledTooOldShort=Il nodo non riesce a connettersi alla 
rete perch?? la versione di Freenet utilizzata ?? obsoleta. Si prega di 
eseguire l'aggiornamento.
 Announcer.announceDisabledTooOldTitle=Annuncio disabilitato (obsoleto)
-Announcer.announceLoading=Il nodo sta caricando il file seednodes in modo da 
poter provare ad annunciare al resto della rete. Announcement pu?? richiedere 
alcuni minuti.
+Announcer.announceLoading=Il nodo sta caricando il file seednodes per 
annunciarsi al resto della rete. Il completamento dell' operazione potrebbe 
richiedere diversi minuti.
 Announcer.coolingOff=per i prossimi ${time} secondi, il nodo aspetter?? che i 
nodi che ha annunciato si connettano; se non ci saranno abbastanza nodi 
prover?? con un altro nodo.
+Bookmark.noName=nessun nome
 BookmarkEditorToadlet.addBookmark=Aggiungi Segnalibro
 BookmarkEditorToadlet.addCategory=Aggiungi Categoria
 BookmarkEditorToadlet.addDefaultBookmarks=Ri-aggiungi segnalibri originali
@@ -60,7 +61,7 @@
 BookmarkManager.malformedBookmark=Segnalibro malformato
 BooleanOption.parseError=Booleano non riconosciuto: ${val} - prova "vero o 
falso"
 BuildOldAgeUserAlert.tooOld=Il software di questo nodo ?? antecedente alla 
pi?? vecchia versione (Build #${lastgood}) utilizzabile dai peer aggiornati ai 
quali si cerca di connettersi.  E' necessario aggiornare il nodo al pi?? presto 
possibile; non sar?? possibile connettersi ai peer etichettati "TROPPO RECENTE" 
finch?? il nodo non sar?? stato aggiornato (il nodo va tenuto aggiornato o si 
rischia di essere esclusi dalla rete Freenet)
-BuildOldAgeUserAlert.tooOldShort=Il nodo sta utilizzando una versione obsoleta 
di Freenet, che rende imossibile collegarsi alla rete. Si prega di eseguire 
l'aggiornamento al pi?? presto possibile.
+BuildOldAgeUserAlert.tooOldShort=Il nodo sta utilizzando una versione  di 
Freenet obsoleta al punto da rendere impossibile il collegamento alla rete. Si 
prega di eseguire l'aggiornamento al pi?? presto possibile.
 BuildOldAgeUserAlert.tooOldTitle=Versione obsoleta
 CSSTokenizerFilter.deletedDisallowedString=Stringa non permessa eliminata
 CSSTokenizerFilter.deletedUnmatchedChar=Ignorato char non corrispondente:
@@ -84,13 +85,9 @@
 ConfigToadlet.false=falso
 ConfigToadlet.fcp=fcp
 ConfigToadlet.fproxy=fproxy
-ConfigToadlet.fullTitle=Configurazione del Nodo Freenet di ${name}
+ConfigToadlet.fullTitle=Configurazione del nodo Freenet: ${name}
 ConfigToadlet.homepage=Homepage del Nodo
 ConfigToadlet.logger=log
-ConfigToadlet.modeAdvanced=Opzionni di configurazione avanzate
-ConfigToadlet.modeAdvancedTooltip=Opzioni di configurazione che dovrebbero 
usare solo gli utenti avanzati di Freenet e gli sviluppatori.
-ConfigToadlet.modeSimple=Opzioni di configurazione Semplici
-ConfigToadlet.modeSimpleTooltip=Opzioni di configurazione che tutti gli utenti 
dovrebbero conoscere.
 ConfigToadlet.node=nodo
 ConfigToadlet.pluginmanager=pluginmanager
 ConfigToadlet.pluginmanager2=pluginmanager2
@@ -99,7 +96,7 @@
 ConfigToadlet.returnToNodeConfig=Torna alla configurazione del nodo
 ConfigToadlet.returnToNodeHomepage=Torna alla homepage del nodo
 ConfigToadlet.shortTitle=Configurazione
-ConfigToadlet.ssl=SSL (il cambiamento non influisce sui server attivi, il 
riavviamento ?? necessario)
+ConfigToadlet.ssl=SSL (necessario riavvio)
 ConfigToadlet.title=Configurazione del Nodo Freenet
 ConfigToadlet.toadletsymlinker=toadletsymlinker
 ConfigToadlet.true=vero
@@ -125,7 +122,7 @@
 ConnectionsToadlet.nodeStatus.LISTEN ONLY=SOLO ASCOLTO
 ConnectionsToadlet.nodeStatus.LISTENING=IN ASCOLTO
 ConnectionsToadlet.nodeStatus.NEVER CONNECTED=MAI CONNESSO
-ConnectionsToadlet.nodeStatus.ROUTING DISABLED=NON STA INSTRADANDO TRAFFICO
+ConnectionsToadlet.nodeStatus.ROUTING DISABLED=NON INSTRADA TRAFFICO
 ConnectionsToadlet.nodeStatus.TOO NEW=TROPPO RECENTE
 ConnectionsToadlet.nodeStatus.TOO OLD=OBSOLETO
 ConnectionsToadlet.nodeStatus.UNKNOWN STATUS=STATUS NON DETERMINATO
@@ -143,7 +140,7 @@
 ConnectivityToadlet.sentReceivedTitle=Pacchetti ricevuti/trasmessi
 ConnectivityToadlet.summaryTitle=Connettivit??
 ConnectivityToadlet.title=Connettivit?? internet di ${nodeName}
-ContentDataFilter.unknownCharset=La pagina che sta per essere visualizzata 
utilizza un formato di caratteri (chaset) di tipo sconosciuto. Questo rende 
impossibile filtrare la pagina, il che potrebbe a sua volta compromettere 
l'anonimato dell'utente.
+ContentDataFilter.unknownCharset=La pagina che sta per essere visualizzata 
utilizza un formato di caratteri (charset) di tipo sconosciuto. Ci?? rende 
impossibile filtrare la pagina, il che potrebbe a sua volta compromettere 
l'anonimato dell'utente.
 ContentDataFilter.unknownCharsetTitle=Charset sconosciuto!
 ContentDataFilter.warningUnknownCharsetTitle=Attenzione: charset sconosciuto 
(${charset})
 ContentFilter.applicationPdfReadAdvice=Documento Adobe(R) PDF - MOLTO 
PERICOLOSO!
@@ -167,7 +164,7 @@
 DarknetConnectionsToadlet.activityTitle=Attivit?? Corrente
 DarknetConnectionsToadlet.add=Aggiungi
 DarknetConnectionsToadlet.addPeerTitle=Aggiungi un peer
-DarknetConnectionsToadlet.alreadyInReferences=Questa referenza ?? gi?? in 
lista.
+DarknetConnectionsToadlet.alreadyInReferences=La referenza data ?? gi?? 
presente in lista.
 DarknetConnectionsToadlet.backedOff=Connesso ma respinto: Il nodo ?? connesso 
a questi peer ma la la connessione viene rifiutata e quindi i peer in questione 
non vengono al momento utilizzati per l'instradamento delle richieste
 DarknetConnectionsToadlet.backedOffShort=Respinti
 DarknetConnectionsToadlet.bursting=Non connesso e bursting: per un breve 
periodo, il nodo sta tentando di connettersi a questi peer perch?? l'utenete ha 
impostato burstOnly su di essi
@@ -176,11 +173,11 @@
 DarknetConnectionsToadlet.busyShort=Occupati
 DarknetConnectionsToadlet.cancel=Cancella
 DarknetConnectionsToadlet.cantFetchNoderefURL=Non ?? stato possibile 
richiamare la referenza di un nodo da ${url}. Riprovare.
-DarknetConnectionsToadlet.cantParseTryAgain=Non ?? stato possibile 
interpretare it testo come refernza di un nodo: (${error}).
+DarknetConnectionsToadlet.cantParseTryAgain=Non ?? stato possibile 
interpretare it testo dato come refernza di un nodo: (${error}).
 DarknetConnectionsToadlet.cantParseWrongEnding=Non ?? stato possibile 
interpretare le referenza: L'ultimo rigo dovrebbe contenere solo la parola End, 
esso contiene invece: ${end}
-DarknetConnectionsToadlet.clockProblem=L'orologio di sitema e l'orologio del 
nodo differiscono di oltre 24 ore. La connessione ?? stata disabilitata perch?? 
questo pu?? causare problemi con l'aggiornamento e con i client.
+DarknetConnectionsToadlet.clockProblem=L'orologio di sitema e l'orologio del 
nodo differiscono di oltre 24 ore.  Ci?? potrebbe causare problemi con 
l'aggiornamento e con i client. La connessione ?? stata pertanto disabilitata,
 DarknetConnectionsToadlet.clockProblemShort=Problema di sincronizzazione 
orologio
-DarknetConnectionsToadlet.confirmRemoveNode=Conferma rimozione di 
"+peerNodes[i].getName()+" ? Rimuovere un nodo che ?? stato disconnesso per 
meno di una settimana non ?? consigliabile; si consiglia attendere ancora un 
po', considerando che potrebbe trattarsi di un problema temporaneo, e che ci 
sono utenti che non hanno la possibilit?? lasciar girare il proprio nodo giorno 
e notte.
+DarknetConnectionsToadlet.confirmRemoveNode=Conferma rimozione di "${name}" ? 
Rimuovere un nodo che ?? stato disconnesso per meno di una settimana non ?? 
consigliabile. L'azione pi?? appropriata sarebbe di attendere ancora un po', 
considerando che potrebbe trattarsi di un problema temporaneo, e che ci sono 
utenti che non hanno la possibilit?? lasciar girare il proprio nodo giorno e 
notte.
 DarknetConnectionsToadlet.confirmRemoveNodeTitle=Conferma
 DarknetConnectionsToadlet.confirmRemoveNodeWarningTitle=Rimozione Nodo
 DarknetConnectionsToadlet.connError=Connessione fallita (il nodo ha un 'bug'?)
@@ -190,12 +187,12 @@
 DarknetConnectionsToadlet.darknetFnpPort=Darknet FNP: ${port}/UDP (usata per 
connessioni a peer affidabili. Forwardare se possibile)
 DarknetConnectionsToadlet.disabled=Non connesso e disabilitato: L'utente ha 
configurato il nodo in maniera da non connettersi a questo peer.
 DarknetConnectionsToadlet.disabledShort=Disabilitato
-DarknetConnectionsToadlet.disconnecting=Disconnessione in corso (si sta 
procedendo alla rimozione del nodo; ?? necessario informare il nodo in 
questione e questo richiede un po' di tempo)
+DarknetConnectionsToadlet.disconnecting=Disconnessione in corso (si sta 
procedendo alla rimozione del nodo; ?? necessario informare il nodo in 
questione e ci?? potrebbe richiedere un po' di tempo)
 DarknetConnectionsToadlet.disconnectingShort=Disconnessione in corso
 DarknetConnectionsToadlet.enterDescription=Inserisci descrizione:
 DarknetConnectionsToadlet.failedToAddNodeInternalError=Impossibile 
interpretare il testo dato comereferenza di un nodo Freenet. Si prega di 
riportare agli sviluppatori quanto segue:
-DarknetConnectionsToadlet.failedToAddNodeInternalErrorTitle=Tentativo di 
aggiungere nodo fallito: Errore interno.
-DarknetConnectionsToadlet.failedToAddNodeTitle=Non ?? Stato Possibile 
Aggiungere il Nodo
+DarknetConnectionsToadlet.failedToAddNodeInternalErrorTitle=Aggiunta nuovo 
nodo fallita: Errore interno.
+DarknetConnectionsToadlet.failedToAddNodeTitle=Aggiunta Nodo Fallita
 DarknetConnectionsToadlet.fcpDisabled=FCP non ?? abilitato (per applicazioni 
client di Freenet come Frost e Thaw)
 DarknetConnectionsToadlet.fcpPort=FCP: ${port}/tcp (per le applicazioni client 
di Freenet, per esempio Frost e Thaw)
 DarknetConnectionsToadlet.fileReference=Seleziona il file contenente la 
referenza:
@@ -208,7 +205,7 @@
 DarknetConnectionsToadlet.idleTime=Tempo trascorso da quando il nodo ?? 
connesso o da quando lo ?? stato per l'ultima volta
 DarknetConnectionsToadlet.idleTimeTitle=Connesso / Inattivo
 DarknetConnectionsToadlet.invalidSignature=Non ?? stato possibile verificare 
le firma elettronica della refernza (${error}).
-DarknetConnectionsToadlet.ipAddress=L'indirizzo network del nodo nel formato 
IP:porta
+DarknetConnectionsToadlet.ipAddress=Indirizzo del nodo in formato IP:porta
 DarknetConnectionsToadlet.ipAddressTitle=Indirizzo
 DarknetConnectionsToadlet.listenOnly=Non connesso e solo ascolto: il nodo non 
cercher?? di connettersi a questo peer perch?? l'utente l'ha impostato su solo 
ascolto (listenOnly)
 DarknetConnectionsToadlet.listenOnlyShort=Solo ascolto
@@ -223,7 +220,7 @@
 DarknetConnectionsToadlet.noPeersFirstHalf=Freenet non pu?? funzionare perch?? 
non sono stati ancora aggiunti dei peer ai quali connettersi.
 DarknetConnectionsToadlet.noPeersSecondHalf=Leggi l'infobox in alto per vedere 
come si fa.
 DarknetConnectionsToadlet.noPeersWithHomepageLink=Freenet non pu?? funzionare 
perch?? non sono ancora stati aggiunti dei peer ai quali collegarsi. Alla 
pagina ${link}node homepage${/link}, in alto, si pu?? leggere come fare.
-DarknetConnectionsToadlet.noRefOrURL=Non ?? stato possibile rilevare una 
referenza nodo o una URL: riprovare.
+DarknetConnectionsToadlet.noRefOrURL=Non ?? stato possibile rilevare una 
referenza nodo o una URL. Si prega di riprovare.
 DarknetConnectionsToadlet.noRequests=Al momento, il nodo non sta elaborando 
alcuna richiesta.
 DarknetConnectionsToadlet.nodeHomepage=homepage del nodo
 DarknetConnectionsToadlet.nodePortsTitle=Porte utilizzate dal Nodo
@@ -231,13 +228,13 @@
 DarknetConnectionsToadlet.notConnectedShort=Disconnessi
 DarknetConnectionsToadlet.opennetFnpPort=Opennet FNP: ${port}/UDP (usata per 
connessioni a peer non affidabili, cio?? Sconosciuti. Forwardare se possibile)
 DarknetConnectionsToadlet.pasteReference=Incolla la referenza qui (il nodo 
elliminer?? automaticamente le parti aggiunte da chat clients, p.es. <toad_>) :
-DarknetConnectionsToadlet.privateNote=Nota privata relativa a questo nodo:
+DarknetConnectionsToadlet.privateNote=Un commento privato relativo a questo 
nodo:
 DarknetConnectionsToadlet.privateNoteTitle=Nota Privata
-DarknetConnectionsToadlet.referenceCopyWarning=La referenza del nodo va 
copiata ${bold}COSI' COME E'${/bold}. Qualsiasi modificazione la render?? 
${bold}inutilizzabile${/bold}..
-DarknetConnectionsToadlet.remove=Elimina!
-DarknetConnectionsToadlet.removePeers=Elimina i peer selezionati
+DarknetConnectionsToadlet.referenceCopyWarning=La referenza del nodo va 
copiata ${bold}SENZA VARIAZIONI${/bold}. Qualsiasi modificazione la render?? 
${bold}inutilizzabile${/bold}..
+DarknetConnectionsToadlet.remove=Elimina
+DarknetConnectionsToadlet.removePeers=Elimina peer selezionati
 DarknetConnectionsToadlet.routingDisabled=Non sta instradando traffico: (la 
connessione tra nodo locale e remoto ?? attiva ma uno dei due rifiuta di 
instradare traffico)
-DarknetConnectionsToadlet.routingDisabledShort=Non sta instradando traffico
+DarknetConnectionsToadlet.routingDisabledShort=Non instrada traffico
 DarknetConnectionsToadlet.seedClients=Nodi per i quali il nodo locale sta 
facendo da seednode.
 DarknetConnectionsToadlet.seedClientsShort=Seeding per
 DarknetConnectionsToadlet.seedServers=Nodi attualmente usati come seednode.
@@ -248,7 +245,7 @@
 DarknetConnectionsToadlet.separator=-- -- --
 DarknetConnectionsToadlet.statusTitle=Status
 DarknetConnectionsToadlet.tmciDisabled=TMCI non ?? abilitato (semplice 
interfaccia a comandi testuali simile a telnet)
-DarknetConnectionsToadlet.tmciPort=TMCI: ${port}/tcp (una semplice interfaccia 
a comandi testuali simile a telnet)
+DarknetConnectionsToadlet.tmciPort=TMCI: ${port}/tcp (semplice interfaccia a 
comandi testuali simile a telnet)
 DarknetConnectionsToadlet.tooNew=Connesso ma troppo recente: La versione 
obbligatoria minima di questo peer e' maggiore della versione che stiamo 
utilizzando.
 DarknetConnectionsToadlet.tooNewShort=Troppo recente
 DarknetConnectionsToadlet.tooOld=Connesso ma obsoleto: Questo peer sta usando 
una versione obsoleta di Freenet. Esso non sar?? utilizzato per l'instradamento 
delle richieste.
@@ -257,17 +254,17 @@
 DarknetConnectionsToadlet.triedToAddSelf=Non ?? possibile aggiungere il 
proprio stesso nodo ad una lista di peer remoti.
 DarknetConnectionsToadlet.unauthorized=L'accesso a questa pagina ?? 
interedetto.
 DarknetConnectionsToadlet.unknownAddress=(indirizzo sconosciuto)
-DarknetConnectionsToadlet.updateChangedPrivnotes=Aggiorna i commenti
+DarknetConnectionsToadlet.updateChangedPrivnotes=Aggiorna commenti
 DarknetConnectionsToadlet.urlReference=Inserire qui la URL della referenza:
 DarknetConnectionsToadlet.versionTitle=Versione
-ExtOldAgeUserAlert.extTooOld=Il file freenet-ext.jar sembra essere corrotto o 
obsoleto: Per l'aggiornamento usare 
http://downloads.freenetproject.org/alpha/freenet-ext.jar.
+ExtOldAgeUserAlert.extTooOld=Il file freenet-ext.jar sembra essere corrotto od 
obsoleto: Per l'aggiornamento usare 
http://downloads.freenetproject.org/alpha/freenet-ext.jar
 ExtOldAgeUserAlert.extTooOldShort=Il file freenet-ext.jar ?? obsoleto. Si 
prega di aggiornarlo.
-ExtOldAgeUserAlert.extTooOldTitle=Freenet-ext troppo vecchio
+ExtOldAgeUserAlert.extTooOldTitle=Freenet-ext obsoleto
 FProxyToadlet.abortToHomepage=Interrompi e ritorna alla homepage di FProxy
-FProxyToadlet.alerts=Messaggi di stato dettagliati
+FProxyToadlet.alerts=Messaggi dettagliati sullo stato del nodo
 FProxyToadlet.alertsTitle=Avvertenze
 FProxyToadlet.backToFProxy=${link}Clicca qui${/link} per andare alla homepage 
di FProxy
-FProxyToadlet.backToReferrer=${link}Clicka qui${/link} per tornare alla pagina 
referente.
+FProxyToadlet.backToReferrer=${link}Clicca qui${/link} per tornare alla pagina 
referente.
 FProxyToadlet.cantBindPort=Non ?? possibile abbinare FProxy a quella porta!
 FProxyToadlet.config=configura il nodo
 FProxyToadlet.configTitle=Configurazione
@@ -301,10 +298,11 @@
 FProxyToadlet.notEnoughMetaStrings=Non ci sono abbastanza meta-strings
 FProxyToadlet.notFoundTitle=Non Trovato
 FProxyToadlet.openAsText=${link}Clicca qui${/link} per aprire il file come 
testo 'liscio' (plain text) . Questo non dovrebbe essere pericoloso ma la 
visualizzazione pu?? risultare disturbata.
-FProxyToadlet.openForce=${link}Clicka qui${/link} per aprire il file come 
${mime} (leggi l'avvertenza sopra!).
-FProxyToadlet.openForceDisk=${link}Clicka qui${/link} per forzare il browser a 
scaricare il file su disco.
+FProxyToadlet.openAsThawIndex=${link}Clicca qui${/link} per aprire un file con 
il browser di indici Thaw. (leggere l'avvertenza!)
+FProxyToadlet.openForce=${link}Clicca qui${/link} per aprire il file come 
${mime} (leggi l'avvertenza sopra!).
+FProxyToadlet.openForceDisk=${link}Clicca qui${/link} per scaricare il file su 
disco.
 FProxyToadlet.openPossRSSAsForceDisk=${link}Clicka qui${/link} per scaricare 
il file su disco (${bold}possibile pericolo${/bold} se si sta usando Firefox 
2.0.0.0; il problema dovrebbe essere stato risolto in 2.0.0.1
-FProxyToadlet.openPossRSSAsPlainText=${link}Clicka qui${/link} per aprire il 
file come testo 'liscio' (plain text) (ci?? ${bold}pu?? rappresentare un 
pericolo${/bold} se si sta usando IE7 o FF2).
+FProxyToadlet.openPossRSSAsPlainText=${link}Clicca qui${/link} per aprire il 
file come testo 'liscio' (plain text) (ci?? ${bold}pu?? rappresentare un 
pericolo${/bold} se si sta usando IE7 o FF2).
 FProxyToadlet.openPossRSSForceDisk=${link}Clicca qui${/link} per cercare di 
costringere il browser a scaricare il file su disco (${bold}Pu?? essere 
pericoloso se si sta usando Firefox 2.0.0${/bold} ; il problema dovrebbe essere 
risolto in 2.0.1).
 FProxyToadlet.openRSSAsRSS=${link}Clicca qui${/link} per aprire il file come 
RSS (ci?? ${bold}rappresenta un pericolo${/bold} se l'autore del sito ?? mal 
intenzionato, perch?? il filtraggio di RSS in Freenet non ?? ancora stato 
implementato).
 FProxyToadlet.openRSSForce=${link}Clicca qui${/link} per aprire il file come 
${mime} (ci?? ${bold}pu?? costituire un pericolo${/bold} se si usa IE7 o FF2).
@@ -374,13 +372,13 @@
 FetchException.longError.21=Troppo grande
 FetchException.longError.22=Volume dei metadati troppo grande
 FetchException.longError.23=Troppi blocchi per segmento
-FetchException.longError.24=Sono necessarie pi?? metastrings (componenti di 
percorso) nella URI
+FetchException.longError.24=Sono necessarie pi?? metastringhe (componenti di 
percorso) nella URI
 FetchException.longError.25=Annullato
 FetchException.longError.26=Archivio riavviato
 FetchException.longError.27=Redirezione permanente: usare la nuova URI
-FetchException.longError.28=Non sono stati trovati dati sufficienti; alcuni 
dati sono stati richiamati ma il redirect potrebbe puntare su localit?? non 
valide
-FetchException.longError.29=MIME Type sbagliato: la chiave non era nella lista 
dei MIME type permessi fornita dal client.
-FetchException.longError.3=Il nodo non sa cosa fare dei metadati
+FetchException.longError.28=Non ?? stato possibile raccogliere dati in 
quantit?? sufficiente; dati parziali sono stati richiamati ma il redirect 
potrebbe puntare su localit?? non valide
+FetchException.longError.29=MIME Type non valido: chiave non presente in lista 
di MIME type permessi fornita dal client.
+FetchException.longError.3=Metadati non utilizzabili
 FetchException.longError.30=La richiesta ?? stata terminata da un nodo perch?? 
esso aveva da poco ricevuto un'altra richiesta per la stessa chiave e quella 
richiesta non era andata a buon fine.
 FetchException.longError.4=Non ?? stato possibile interpretare i metadati.
 FetchException.longError.5=Fallimento durante l'estrazione di file da un 
archivio
@@ -402,9 +400,9 @@
 FetchException.shortError.2=Splitfile metadati sconosciuto
 FetchException.shortError.20=URI non valida
 FetchException.shortError.21=Troppo grande
-FetchException.shortError.22=Volume di metadati troppo grande
+FetchException.shortError.22=Volume metadati eccessivo
 FetchException.shortError.23=Troppi blocchi per segmento
-FetchException.shortError.24=Non abbastanza meta-strings
+FetchException.shortError.24=Quantit?? meta-strings insufficiente
 FetchException.shortError.25=Annullato da caller
 FetchException.shortError.26=Archivio riavviato
 FetchException.shortError.27=Nuova URI
@@ -434,7 +432,7 @@
 FileOffer.succeededReceiveHeader=Il trasferimento del file ${filename} da 
${node} ?? stato completato.
 FileOffer.succeededReceiveShort=${filename} ?? stato ricevuto da ${node}.
 FileOffer.succeededReceiveTitle=Trasferimento file completato
-FirstTimeWizardToadlet.bandwidthLimit=Limitazioni dell'ampiezza di banda
+FirstTimeWizardToadlet.bandwidthLimit=Limitazione banda
 FirstTimeWizardToadlet.bandwidthLimitLong=Scegliere il tipo di connessione e 
la velocit?? dal drop-down menu.
 FirstTimeWizardToadlet.bwlimitHigherSpeed=Velocit?? maggiore
 FirstTimeWizardToadlet.bwlimitLowerSpeed=Velocit?? minore
@@ -444,7 +442,7 @@
 FirstTimeWizardToadlet.congratz=Benvenuto a bordo!
 FirstTimeWizardToadlet.congratzLong=Congratulazioni, la configurazione di base 
del nodo Freenet ?? completa. E' possibile cambiare e modificare ognuno dei 
parametri appena impostati usando la pagina "configurazione" che ?? 
raggiungibile attraverso il menu sulla sinistra dell'interfaccia. Vi auguriamo 
una piacevole esperienza con Freenet.
 FirstTimeWizardToadlet.connectToStrangers=Connetti a sconosciuti?
-FirstTimeWizardToadlet.connectToStrangersLong=Permettendo connessioni con 
sconosciuti, questo nodo Freenet sar?? meno sicuro; chiunque port?? determinare 
che un nodo sta girando sul tuo computer e qualsiasi malintenzionato portebbe 
connettersi ad esso. per non permettere che Freenet si connetta a chiunque, 
bisogner?? contattare almeno altre tre persone conosciute e fidate che gi?? 
stiano usando Freenet e conettersi a loro manualmente.
+FirstTimeWizardToadlet.connectToStrangersLong=In un mondo ideale, ogni utente 
Freenet si connetterebbe esclusivamente con nodi gestiti da persone fid??te. 
Qesto ?? di gran lunga il sistema pi?? sicuro, che rende molto difficile per un 
osservatore esterno determinare se un nodo stia o meno girando sul computer 
osservato. D'altra parte, non avendo a disposizione almeno cinque amici, 
parenti o conoscenti fid??ti che gi?? usano Freenet, ai quali connettersi, come 
soluzione alternativa ?? possibile lasciare che il nodo si connetta 
automaticamente a nodi gestiti da sconosciuti. Questa opzione pu?? essere 
disattivata in qualsiasi momento.
 FirstTimeWizardToadlet.continue=Continua
 FirstTimeWizardToadlet.continueEnd=Clicca qui per cominciare ad usare Freenet!
 FirstTimeWizardToadlet.datastoreSize=Dimensioni magazzino dati (datastore)
@@ -455,12 +453,12 @@
 FirstTimeWizardToadlet.iDoTrust=Possiamo fidarci degli utenti connessi a 
${interface} (${ip}) ?
 FirstTimeWizardToadlet.isNetworkTrusted=La rete locale ?? affidabile?
 FirstTimeWizardToadlet.isNetworkTrustedLong=La rete locale ?? affidabile? 
Rispondendo di si a questa domanda, tutti i servizii forniti dal nodo Freenet 
saranno pienamente accessibili da chiunque sul network suddetto. E' possibile 
configurare un accesso pi?? selettivo attraverso la pagina "configurazione" 
dopo aver completato questo wizard.
-FirstTimeWizardToadlet.memoryLimit=Uso di memoria
+FirstTimeWizardToadlet.memoryLimit=Utilizzo memoria
 FirstTimeWizardToadlet.memoryLimitLong=Specifica il valore massimo della 
memoria utilizzabile da Freenet. Il nodo ha bisogno di pi?? memoria se ci sono 
molti file in coda per il download/upload. Si raccomanda di non impostare 
questa opzione per un valore inferiore a 128MB tranne nel caso in cui la 
memoria totale a disposizione sia veramente poca. Se il computer ha 1GB di 
memoria RAM o pi??, si consiglia di usare almeno 256MB. Il cambiamento avr?? 
effetto dopo aver riavviato Freenet.
 FirstTimeWizardToadlet.noNetworkIF=Non ?? stata trovata nessuna interfaccia di 
rete addizionale
 FirstTimeWizardToadlet.noNetworkIFLong=Freenet non ha trovato altre interfacce 
di rete, quindi dar?? per scontato che l'utente si connetter?? dal computer 
locale e solo da quello.
 FirstTimeWizardToadlet.opennetNo=Si, ho almeno 5 amici che usano Freenet e 
aggiunger?? i loro dati alla pagina degli Amici.
-FirstTimeWizardToadlet.opennetWarning=Freenet potrebbe essere illegale in 
alcuni paesi perch?? rende possibile comunicazione anonima e non censurabile 
garantendo la libert?? di espressione. In tal  caso ?? bene NON connettersi 
degli sconosiuti in quanto ci?? faciliterebbe la scoperta dell'esistenza del 
nodo; connettersi invece ad amici (possibilmente fid??ti). Freenet ?? ancora in 
corso di sviluppo e gli autori non possono garantire la sicurezza degli utenti! 
In particolare, i peer a cui ci si connette ${bold}potrebbero${/bold} essere 
capaci di spiare le nostre richieste
+FirstTimeWizardToadlet.opennetWarning=In Paesi dove networking anonimo ?? 
illegale e/o se usa Freenet per accedere a materiale che potrebbe mettere nei 
guai chi ne fosse trovato in possesso, un serio pericolo pu?? risultare dal 
configurare il nodo in modo da connettersi automaticamente a nodi gestiti da 
sconosciuti, facilitando il il compito ad un avversario determinato. Freenet ?? 
ancora in fase sperimentale, gli autori non sono in grado di garatire sicurezza 
assoluta.
 FirstTimeWizardToadlet.opennetYes=No, voglio che il nodo trovi automaticamente 
degli sconosciuti ai quali connettersi.
 FirstTimeWizardToadlet.selectLanguage=Lingua
 FirstTimeWizardToadlet.selectLanguageLong=Selezionare una lingua dalla lista 
qui sotto:
@@ -479,7 +477,7 @@
 FirstTimeWizardToadlet.memory.128M=128Mb - Il minimo indispensabile
 FirstTimeWizardToadlet.memory.192M=192Mb - Default ragionevole.
 FirstTimeWizardToadlet.memory.256M=256Mb - Per computer con almeno 1GB di RAM
-FirstTimeWizardToadlet.memory.512M=512Mb - per computer con moltissima memoria 
RAM
+FirstTimeWizardToadlet.memory.512M=512Mb - per computer con molta memoria RAM
 FirstTimeWizardToadlet.memory.64M=64MB - Usare solo in caso di estrema 
necessit??
 FproxyToadlet.dangerousRSSTitle=Contenuto potenzialmente pericoloso (RSS)
 GIFFilter.invalidHeader=Il file non contiene un header GIF valido.
@@ -490,11 +488,11 @@
 GenericReadFilterCallback.couldNotParseAbsoluteFreenetURI=Non ?? stato 
possibile interpretare come URI Freenet assoluta.
 GenericReadFilterCallback.couldNotParseFormURIWithError=Il filtro non ?? 
riuscito ad interpretare ${error} dalla URI.
 GenericReadFilterCallback.couldNotParseRelativeFreenetURI=Non ?? stato 
possibile interpretare come Freenet URI relativa.
-GenericReadFilterCallback.couldNotParseURIWithError=Il filtro non ?? riuscito 
a interpretare la URI: ${error}
-GenericReadFilterCallback.invalidFormURI=Forma URI non valida perch?? punta ad 
una risorsa esterna (non Freenet)
+GenericReadFilterCallback.couldNotParseURIWithError=Il filtro ha fallito 
nell'analisi della URI: ${error}
+GenericReadFilterCallback.invalidFormURI=URI form non valida: punta a risorsa 
esterna
 GenericReadFilterCallback.invalidFormURIAttemptToEscape=Tentativo di evasione 
dalla struttura delle directory
 GenericReadFilterCallback.malformedAbsoluteURL=URL malformata (assoluto): 
${error}
-GenericReadFilterCallback.malformedRelativeURL=URL malformata (relativo): 
${error}
+GenericReadFilterCallback.malformedRelativeURL=URL malformata (relativa): 
${error}
 GenericReadFilterCallback.protocolNotEscaped=Non ?? un protocollo fuggitivo: 
${protocol}
 HTMLFilter.couldNotParseStyle=Non ?? stato possibile abbinare lo stile 
dell'input
 HTMLFilter.deletedUnknownStyle=stile sconosciuto eliminato
@@ -506,8 +504,8 @@
 IPDetectorPluginManager.direct=Il computer sembra essere direttamente connesso 
a Internet, dovrebbe essere quindi possibile connettersi con qualunque nodo 
Freenet.
 IPDetectorPluginManager.directTitle=Rilevata connessione diretta a Internet
 IPDetectorPluginManager.forwardPort=Il tuo nodo sembra essere dietro qualche 
tipo di NAT (vedi la pagina connettivit?? per dettagli). Se possibile, dovresti 
forwardare le porte UDP (not TCP) ${port} per migliorare la connettivit??. E' 
possibile comunque che tu abbia gi?? provveduto; Serve del tempo a Freenet per 
rilevare il port forward. Leggi ${link}qui${/link} per ulteriori informazioni.
-IPDetectorPluginManager.forwardPortMaybeForwarded=Sembra che il nodo si trovi 
dietro una NAt di qualche tipo (vedi pagina connettivit?? per i dettaglil). Se 
possibile, bigognerebbe configurare il forward per la porta ${port} UDP (non 
TCP) allo scopo di migliorare la connettivit??. E' possibile comunque che ci?? 
sia gi?? stato fatto: occorre un po' di tempo perch?? Freenet rilevi il port 
forward. Clicca ${link}qui${/link} per maggiori informazioni.
-IPDetectorPluginManager.forwardPortNotForwarded=Sembra che il nodo si trovi 
dietro una NAt di qualche tipo (vedi pagina connettivit?? per i dettaglil). Se 
possibile, bigognerebbe configurare il forward per la porta ${port} UDP (non 
TCP) allo scopo di migliorare la connettivit??. Sembra che ci?? non sia stato 
fatto, anche occorre un po' di tempo perch?? Freenet rilevi il port forward. 
Clicca ${link}qui${/link} per maggiori informazioni
+IPDetectorPluginManager.forwardPortMaybeForwarded=Sembra che il nodo si trovi 
dietro una NAT di qualche tipo (vedi pagina connettivit?? per i dettaglil). Se 
possibile, bigognerebbe configurare il forward per la porta ${port} UDP (non 
TCP) allo scopo di migliorare la connettivit??. E' possibile comunque che ci?? 
sia gi?? stato fatto: occorre un po' di tempo perch?? Freenet rilevi il port 
forward. Clicca ${link}qui${/link} per maggiori informazioni.
+IPDetectorPluginManager.forwardPortNotForwarded=Sembra che il nodo si trovi 
dietro una NAT di qualche tipo (vedi pagina connettivit?? per i dettaglil). Se 
possibile, bigognerebbe configurare il forward per la porta ${port} UDP (non 
TCP) allo scopo di migliorare la connettivit??. Sembra che ci?? non sia stato 
fatto, anche occorre un po' di tempo perch?? Freenet rilevi il port forward. 
Clicca ${link}qui${/link} per maggiori informazioni
 IPDetectorPluginManager.forwardPortShort=Per favore, forwardare la porta UDP 
${port}.
 IPDetectorPluginManager.forwardPortShortMaybeForwarded=Si prega di configurare 
il forward della porta ${port} UDP (questo potrebbe essere gi?? stato fatto, ma 
non ancora rilevato)
 IPDetectorPluginManager.forwardPortShortNotForwarded=Si prega di configurare 
il forward per la porta ${port} UDP .
@@ -515,10 +513,10 @@
 IPDetectorPluginManager.forwardTwoPortsMaybeForwarded=Sembra che il nodo si 
trovi dietro una NAt di qualche tipo (vedi pagina connettivit?? per i 
dettaglil). Se possibile, bigognerebbe configurare il forward per la porta 
${port} UDP (non TCP) allo scopo di migliorare la connettivit??. E' possibile 
comunque che ci?? sia gi?? stato fatto: occorre un po' di tempo perch?? Freenet 
rilevi il port forward. Clicca ${link}qui${/link} per maggiori informazioni
 IPDetectorPluginManager.forwardTwoPortsNotForwarded=Pare che il nodo sia 
dietro una  NAT (controllare la pagina connettivit?? per i dettagli). PSe 
possibile si dovrebbe configurare il forward per le porte ${port1} e ${port2} 
UDP (non TCP), allo scopo di migliorare la connettivit??. Sembra che il forward 
delle porte non sia attivo, anche se Freenet non pu?? determinarlo per certo. 
Controllare ${link}qui${/link} per ulteriori informazioni.
 IPDetectorPluginManager.forwardTwoPortsShort=Per favore, forwardare le porte 
UDP ${port1} e ${port2}.
-IPDetectorPluginManager.forwardTwoPortsShortMaybeForwarded=Configurare il 
forward  perle porte ${port1} e ${port2} UDP (potrebbe essere gi?? stato fatto).
+IPDetectorPluginManager.forwardTwoPortsShortMaybeForwarded=Configurare il 
forward  per porte ${port1} e ${port2} UDP (potrebbe essere gi?? stato fatto).
 IPDetectorPluginManager.forwardTwoPortsShortNotForwarded=Si prega di 
configurare il forward per le porte ${port1} e ${port2} UDP.
-IPDetectorPluginManager.fullCone=La connessione a Internet sembra avvenire 
attraverso un "cono completo" NAT. Il nodo Dovrebbe potersi connettere a 
qualunque altro nodo Freenet.
-IPDetectorPluginManager.fullConeTitle=Rilevato full cone NAT
+IPDetectorPluginManager.fullCone=La connessione a Internet sembra avvenire 
attraverso una "full cone" NAT. Il nodo dovrebbe riuscire connettersi con 
qualunque altro nodo Freenet.
+IPDetectorPluginManager.fullConeTitle=Rilevata full cone NAT
 IPDetectorPluginManager.maybeAlreadyForwarded=Potrebbe essere gi?? stato fatto 
(?? difficile per Freenet determinarlo).
 IPDetectorPluginManager.noConnectivity=La connessione a Internet non sembra 
essere provvista di supporto UDP. A meno che non si tratti di un rilevamento 
erroneo, non ?? probabile che Freenet possa funzionare al momento.
 IPDetectorPluginManager.noConnectivityTitle=Mancanza di connettivit?? UDP
@@ -526,10 +524,10 @@
 
IPDetectorPluginManager.portForwardHelpURL=http://wiki.freenetproject.org/FirewallAndRouterIssues
 IPDetectorPluginManager.portRestricted=La connessione a Internet sembra 
avvenire attraverso una NAT a porte ristrette (router). Il nodo potr?? 
connettersi a quasi tutti gli altri nodi ma non a quelli dietro NAT simmetrica.
 IPDetectorPluginManager.portRestrictedTitle=Port restricted cone NAT rilevata
-IPDetectorPluginManager.restricted=La connessione a Internet sembra avvenire 
attraverso un "restricted cone" NAT (router). Dovrebbe essere comunque 
possibile connettersi alla maggior parte dei nodi Freenet.
-IPDetectorPluginManager.restrictedTitle=E' stato rilevato un restricted cone 
NAT
+IPDetectorPluginManager.restricted=La connessione a Internet sembra avvenire 
attraverso una "restricted cone" NAT (router). Dovrebbe essere comunque 
possibile connettersi alla maggior parte dei nodi Freenet.
+IPDetectorPluginManager.restrictedTitle=E' stata rilevata una restricted cone 
NAT
 IPDetectorPluginManager.seriousConnectionProblems=Gravi problemi di 
connessione:
-IPDetectorPluginManager.suggestForwardPort=Potrebbe essere necessario 
configurare il 'port forwarding'  per la porta (Porta UDP numero ${port}) 
manualmente. Vedi: http://wiki.freenetproject.org/FirewallAndRouterIssues 
(disponibile solo in inglese, per ora).
+IPDetectorPluginManager.suggestForwardPort=Potrebbe essere necessario 
configurare  manualmente il 'port forwarding'  per la porta UDP numero ${port}. 
Vedi: http://wiki.freenetproject.org/FirewallAndRouterIssues (disponibile solo 
in inglese, per ora).
 IPDetectorPluginManager.suggestForwardPortWithLink=Potrebbe essere necessario 
${link}configurare il port forwarding${/link} (porta UDP numero ${port}) 
manualmente (oppure ci?? ?? gi?? stato fatto: Freenet pu?? avere delle 
difficolt?? in questo tipo di rilevazione).
 IPDetectorPluginManager.suggestForwardTwoPorts=Sarebbe opportuno configurare 
manualmente il port forward sul router per le porte ${port1} e ${port2} (UDP). 
vedi http://wiki.freenetproject.org/FirewallAndRouterIssues (disponibile solo 
in inglese, per ora).
 IPDetectorPluginManager.suggestForwardTwoPortsWithLink=Potrebbe essere 
necessario configurare manualmente ${link}il forward delle porte${/link} Per 
porte nummero ${port1} e ${port2}, UDP. (questo messaggio pu?? in alcuni casi 
continuare ad apparire per un po' di tempo dopo aver configurato il forward)
@@ -548,13 +546,13 @@
 InsertException.longError.1=Caller ha fornito una URI che non ?? possibile 
utilizzare"
 InsertException.longError.10=Annullato dall'utente
 InsertException.longError.11=Meta string (probabilmente '/') usata nella URI
-InsertException.longError.12=Binary blob format error
+InsertException.longError.12=Errore di formattazione nel blob binario
 InsertException.longError.2=Errore bucket interno: potrebbe trattarsi di 
mancanza di spazio sufficiente su disco rigido o di mancanza di autorizzazione.
 InsertException.longError.3=Errore interno
 InsertException.longError.4=Un nodo 'a valle' (downstream) ?? andato in time 
out o ?? stato gravemente sovraccaricato
 InsertException.longError.5=Non ?? stato possibile propagare questa inserzione 
su un numero sufficiente di nodi (questo e' normale su network di piccole 
dimensioni: si pu?? provare a richiamare il file comunque)
 InsertException.longError.6=Errori fatali in un'inserzione di splitfiles
-InsertException.longError.7=Non ?? stato possibile inserire gli splitfile: 
numero di tentativi esaurito (errori nonfatali)
+InsertException.longError.7=Non ?? stato possibile inserire splitfile: numero 
di tentativi esaurito (errori nonfatali)
 InsertException.longError.8=Non ?? stato possibile far partire l'inserzione 
dal nodo locale.
 InsertException.longError.9=L' inserzione ?? in conflitto con dati 
pre-esistenti e differenti alla stessa chiave
 InsertException.shortError.1=URI non valida
@@ -579,7 +577,7 @@
 JPEGFilter.tooShortTitle=Troppo corto
 KnownUnsafeContentTypeException.dangerousInlines=Contenuto di questo tipo pu?? 
includere immagini o video che vengono caricati direttamente da internet, 
esponendo l'indirizzo IP dell'utente e quindi compromettendone gravemente 
l'anonimato.
 KnownUnsafeContentTypeException.dangerousInlinesLabel=Collegamenti esterni 
pericolosi:
-KnownUnsafeContentTypeException.dangerousLinks=Contenuto di questo tipo pu?? 
includere dei link a pagine pubblicate al di fuori di Freenet. Clickando su 
tali link (e possono essere camuffati) si espone il proprio indirizzo IP, 
compromettendo l'anonimato.
+KnownUnsafeContentTypeException.dangerousLinks=Contenuto di questo tipo pu?? 
includere dei link a pagine pubblicate al di fuori di Freenet. Cliccando su 
tali link (e possono essere camuffati) si espone il proprio indirizzo IP, 
compromettendo l'anonimato.
 KnownUnsafeContentTypeException.dangerousLinksLabel=Link pericolosi:
 KnownUnsafeContentTypeException.dangerousMetadata=Contenuto di questo tipo 
pu?? includere metadati, i quali possono essere visualizzati da alcuni browser 
o con l'aiuto di altri programmi: i metadati possono contenere link o immagini 
caricate direttamente da internet, che possono compromettere l'anonimato.
 KnownUnsafeContentTypeException.dangerousMetadataLabel=Metadati pericolosi:
@@ -587,7 +585,7 @@
 KnownUnsafeContentTypeException.dangerousScriptsLabel=Scripting pericoloso:
 KnownUnsafeContentTypeException.knownUnsafe=Questo e' un MIME type 
potenzialmente pericoloso. Se il nodo lo lascia passare, il browser potrebbe 
fare qualcosa capace di compromettere l'anonimato dell'utente, esponendone 
l'indirizzo IP in relazione a questa pagina. In particolare:
 KnownUnsafeContentTypeException.noFilter=Non ?? disponibile alcun filtro per 
questo tipo di dati; ?? necessario quindi prendere tutte le possibili 
precauzioni.
-KnownUnsafeContentTypeException.title=Tipo conosciuto per essere pericoloso: 
${type}
+KnownUnsafeContentTypeException.title=Conosciuto come pericoloso: Tipo ${type}
 LocalFileInsertToadlet.checkPathExist=Accerta l'esistenza del percorso 
specificato.
 LocalFileInsertToadlet.checkPathIsDir=Controlla che il percorso specificato 
sia una directory
 LocalFileInsertToadlet.checkPathReadable=Controlla che il percorso specificato 
sia leggibile dall'utente che sta utilizzando il nodo.
@@ -608,8 +606,8 @@
 LogConfigHandler.maxCachedBytesLong=Numero massimo di bytes nella RAM cache
 LogConfigHandler.maxCachedLines=Numero massimo di righe nella RAM cache
 LogConfigHandler.maxCachedLinesLong=Numero massimo di righe nella RAM cache
-LogConfigHandler.maxZippedLogsSize=Spazio massimo utilizzabile da vecchi log 
file su disco rigido.
-LogConfigHandler.maxZippedLogsSizeLong=Spazio massimo utilizzabile da vecchi 
log
+LogConfigHandler.maxZippedLogsSize=Spazio massimo per vecchi log
+LogConfigHandler.maxZippedLogsSizeLong=Spazio massimo su disco utilizzabile da 
vecchi log.
 LogConfigHandler.minLoggingPriority=Priorit?? minima dei messaggi da iscrivere 
nei log.
 LogConfigHandler.minLoggingPriorityLong=Minima priorit?? dei messaggi che 
vengono iscritti nel log file. Le opzioni sono: minor, normal, error, 
nell'ordine dalla meno alla pi?? verbosa.
 LogConfigHandler.rotationInterval=Intervallo di rotazione dei log
@@ -617,8 +615,8 @@
 LoggerHook.unrecognizedPriority=Nome di priorit?? non riconosciuto: ${name}.
 LongOption.parseError=Il valore specificato non pu?? essere interpretato come 
64-bit integer : ${val}
 MeaningfulNodeNameUserAlert.noNodeNick=Non ?? stato possibile trovare il 
nickname da utilizzare. Usare qui un indirizzo e-mail o un nickname IRC ?? 
generalmente una buona idea in quanto consente ai peer di identificare il nodo. 
(nota che soltanto i peer darknet elencati alla pagina Amici potranno vedere il 
nome del nodo, che resta invece invisibile ai peer Opennet)
-MeaningfulNodeNameUserAlert.noNodeNickShort=Non ?? stato impostato il nome del 
nodo.
-MeaningfulNodeNameUserAlert.noNodeNickTitle=Non ?? stato impostato il nome del 
nodo.
+MeaningfulNodeNameUserAlert.noNodeNickShort=Nome nodo non definito.
+MeaningfulNodeNameUserAlert.noNodeNickTitle=Nome nodo non definito.
 N2NTMToadlet.composingMessageLabel=Messaggio N2NTM  da inviare ai seguenti 
nodi:
 N2NTMToadlet.delayed=Il nodo interressato sta temporaneamente respingendo 
richieste; il messaggio potrebbe giungere in lieve ritardo.
 N2NTMToadlet.delayedTitle=Differito
@@ -631,13 +629,13 @@
 N2NTMToadlet.peerNotFoundTitle=Peer non trovato
 N2NTMToadlet.peerNotFoundWithHash=Non ?? stato possibile trovare il peer con 
hash code \u201c${hash}\u201d
 N2NTMToadlet.processingSend=Invio messaggio in corso
-N2NTMToadlet.queued=Il peer interessato non ?? connesso in questo momento. Il 
messaggio ?? stato messo in coda e verr?? spedito il pi?? presto possibile
+N2NTMToadlet.queued=In attesa: Il peer interessato non ?? connesso in questo 
momento. Il messaggio ?? stato posto in attesa e verr?? spedito al pi?? presto 
possibile
 N2NTMToadlet.queuedTitle=Aggiunto alla Coda
 N2NTMToadlet.returnToFriends=Torna alla lista degli Amici
 N2NTMToadlet.returnToNodeHomepage=Torna alla homepage del nodo
 N2NTMToadlet.sendMessage=Invia Messaggio di Testo da Nodo a Nodo (N2NTM)
 N2NTMToadlet.sendMessageShort=Invia Messaggio
-N2NTMToadlet.sendStatus=Status N2NTM in uscita
+N2NTMToadlet.sendStatus=Stato N2NTM in uscita
 N2NTMToadlet.sent=Messaggio inviato al peer
 N2NTMToadlet.sentTitle=Inviato
 N2NTMToadlet.tooLong=I messaggi N2NTM possono contenere fino a un massimo di 
1024 caratteri
@@ -648,23 +646,23 @@
 N2NTMUserAlert.headerShort=Messaggio da ${from}
 N2NTMUserAlert.reply=Rispondi
 N2NTMUserAlert.title=Messaggio di testo da nodo a nodo (N2NTM) ${number} da: 
${peername} (${peer})
-Node.acceptSeedConnections=Se impostato su vero, il nodo accetter?? 
connessioni dai nodi che intendono usare la nuova modalit?? insicura e li 
aiuter?? a connettersi alla rete Freenet. Questo permette la connessione a 
qualsiasi nodo in possesso della referenza, ma limitata all'announcement: le 
richieste possono essere fatte solo ai nodi ottenuti tramite l'announcement 
(cio' potrebbe includere questo nodo, se non ha gi?? molti Sconosiuti)
-Node.acceptSeedConnectionsShort=Essere un seednode?
-Node.alwaysAllowLocalAddresses=Sempre permettere la connessione a nodi via 
indirizzi locali?
+Node.acceptSeedConnections=Selezionando "vero" il nodo accetter?? connessioni 
da nodi che intendono usare la modalit?? insicura (opennet) e li aiuter?? a 
connettersi alla rete Freenet. Ci?? rende possibile la connessione a qualsiasi 
nodo in possesso della referenza ma limitata dall'annuncio: le richieste di 
connessione sono indirizzate solo ai nodi aggiunti tramite annuncio. Il nodo 
locale potrebbe essere incluso a meno che non abbia gi?? molti peer opennet 
(visibili alla pagina "Sconosciuti")
+Node.acceptSeedConnectionsShort=Abilita seednode
+Node.alwaysAllowLocalAddresses=Permettere sempre la connessione a nodi via 
indirizzi locali?
 Node.alwaysAllowLocalAddressesLong=Se impostato su "vero" il nodo cercher?? di 
connettersi ad altri nodi usando il loro indirizzo locale (localhost, LAN) 
oltre al loro indirizzo IP pubblico. Se questa opzione non e' impostata, si 
pu?? comunque abilitarla separatamente per singoli peer darknet (ma non per i 
peer opennet). Impostare questa opzione se ci si vuole connettere ad altri nodi 
sulla stessa rete locale (LAN) o che girano sullo stesso computer, e non far 
caso alle referenze "bogus" ("scr??use") che possono far mandare al nodo 
pacchetti UDP alle macchine sulla rete locale.
 Node.assumeNATed=Presumere che la porta non sia forwardata.
 Node.assumeNATedLong=Dare per scontato che la porta sia dietro NAT e non 
forwardata? In questo caso il nodo mander?? handshake ogni 10-30 secondi.
 Node.bandwidthLimitMustBePositiveOrMinusOne=Il valore dell'ampiezza di banda 
deve essere positivo o -1
-Node.bindTo=Indirizzo IP collegato
-Node.bindToLong=Indirizzo IP collegato
-Node.buggyJVM=La JVM attualmente in uso (${version}) ?? una versione 
notoriamente afflitta da 'bug'. Pu?? produrre OutOfMemoryError anche con molta 
memoria ancora a disposizione. Si raccomanda di aggiornare il software Java, 
usando come minimo Sun Java 1.4.2_13, 1.5.0_10 o 1.6 (quest'ultima ?? la 
versione raccomandata). Vedi 
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4855795
+Node.bindTo=Indirizzo IP
+Node.bindToLong=Indirizzo IP
+Node.buggyJVM=La JVM attualmente in uso (${version}) ?? una versione 
notoriamente afflitta da 'bug' che pu?? produrre OutOfMemoryError anche con 
molta memoria ancora a disposizione. Si raccomanda di aggiornare Java. La 
versione consigliata ?? Sun Java 1.6, ma ?? possibile usare anche 1.4.2 o 1.5.
 Node.buggyJVMShort=Freenet sta attualmente utilizzando Java versione 
${version}, che ?? notoriamente afflitta da p'bug' pericolosi. Si prega di 
aggiornare Java al pi?? presto possibile.
 Node.buggyJVMTitle=Avvertennza JVM soggetta a 'bug'
 Node.buggyJVMWithLink=La JVM in uso (${version}) ?? notoriamente 
${link}difettosa${/link}. Pu?? produrre errori tipo OutOfMemoryError anche con 
molta memoria ancora disponibile. Sarebbe auspicabile aggiornare almeno a Sun 
Java 1.4.2_13, 1.5.0_10 o 1.6 (quest'ultima ?? la versione consigliata).
 Node.bwlimitMustBePositive=Il limite dell'ampiezza di banda deve essere 
positivo
-Node.databaseMemory=Memoria massima utilizzabile dal magazzino dati
+Node.databaseMemory=Memoria massima utilizzabile dal datastore
 Node.databaseMemoryLong=Uso massimo della memoria del database contenente 
indici del magazzino dati (datastore). 0 significa nessun limite (non supera 
comunque il 30% circa della memoria massima)
-Node.deadlockTitle=Deadlocking probabilmente dovuto ad una combinazione 
JVM/kernel particolarmente 'buggy'
+Node.deadlockTitle=Deadlocking probabilmente dovuto ad una combinazione di JVM 
e kernel che da luogo a "bug".
 Node.deadlockWarning=ATTENZIONE: E' stato rilevato l'uso di Sun JVM con NPTL. 
Ci?? pu?? produrre il "congelamento" del nodo a causa della JVM che perde un 
lock. Per ovviare a tale inconveniente ?? necessatio disabilitare NPTL 
impostando la variabile ambientale LD_ASSUME_KERNEL=2.4.1. Le versioni pi?? 
recenti di Freenet installer dovrebbero gi?? esserne provviste; reinstallare, o 
modificare il file run.sh 
(https://emu.freenetproject.org/svn/trunk/apps/installer/installclasspath/run.sh).
 Su alcuni sistemi pu?? essere necessario installare le pthreads libraries 
perch?? questo funzioni. Nota che il nodo cercherebbe di riavviarsi 
automaticamente se un tale deadlock occorresse, ma questa funzione non ?? 
ancora pienamente affidabile, e richiede tempo.
 Node.disableHangCheckers=Disabilita tutti gli hang checker
 Node.disableHangCheckersLong=Disabilita tutte le funzioni hang 
checkers/watchdog. Impostare per fare il profiling di Fred.
@@ -677,7 +675,7 @@
 Node.enablePacketCoalescing=Abilita coalescenza pacchetti?
 Node.enablePacketCoalescingLong=Ablilita coalescenza pacchetti? La coalescenza 
dei pacchetti aumenta l'efficienza della banda, ruduce l'uso di CPU e aumenta 
leggermente la resistenza all'analisi di traffico, al costo di una leggera 
latenza dei messaggi. Si consiglia di non disabilitare questa opzione.
 Node.enablePerNodeFailureTables=Abilita tabelle operazioni fallite per nodi?
-Node.enablePerNodeFailureTablesLong=Abilita reinstradamento automatico intorno 
ai nodi che hanno fallito una richiesta entro gli ultimi 10 minuti?
+Node.enablePerNodeFailureTablesLong=Abilita il reinstradamento automatico 
intorno a nodi che abbiano fallito richieste negli gli ultimi 10 minuti
 Node.enableSwapQueueing=Abilita messa in coda di richieste di scambio? (NON 
DISABILITARE!)
 Node.enableSwapQueueingLong=Abilita lista d'attesa per richieste di swap? (NON 
DISABILITARE!)
 Node.enableSwapping=Abilita scambio di locazione (NON DISABILITARE)
@@ -691,19 +689,22 @@
 Node.forceBigShrinkLong=Determina se eseguire immediatamente le riduzioni di 
dimensione in misura superiore al 10% del magazzino (store), piuttosto che 
aspettare il prossimo riavvio del nodo. Le riduzioni on-line non preservano i 
dati utilizzati per ultimi quindi l'uso di questa opzione non ?? raccomandato; 
da usarsi solo nel caso in cui sia desiderabile un risultato immediato.
 Node.inBWLimit=Limite ampiezza di banda in entrata (bytes per secondo)
 Node.inBWLimitLong=Limite dell'ampiezza di banda in entrata (bytes/sec); il 
nodo cerca di non eccedere tale limite; -1 siglifica quattro volte il limite 
impostato per l'ampiezza di banda in uscita (outputBandwidthLimit)
-Node.invalidStoreSize=Il magazzino dati non pu?? essere di dimensioni 
inferiori a 32MB
+Node.invalidStoreSize=Il datastore (magazzino dati) deve essere di dimensioni 
uguali o superiori a 32MB
+Node.java14ShortText=Tra breve non sara pi?? possibile operare un nodo Freenet 
su Java 1.4. Si prega di aggiornare a 1.5 o 1.6
+Node.java14Text=Freenet sta girando su una versione 1.4 di Java. Si prega di 
aggiornare almeno a Java 1.5. Gli aggiornamenti automatici di Freenet sono 
stati temporaneamente disabilitati in quanto versioni future potrebbero non non 
girare del tutto.
+Node.java14Title=Freenet non ?? pi?? compatibile con Java 1.4
 Node.l10nLanguage=Lingua dell' interfaccia grafica
-Node.l10nLanguageLong=Cambia la lingua in cui messaggi sono visualizzati. 
Alcune frasi e messaggi saranno visibili in versione tradotta dopo il prossimo 
riavvio del nodo.
+Node.l10nLanguageLong=Cambia la lingua in cui messaggi sono visualizzati. 
Alcune frasi e messaggi saranno visibili in versione tradotta solo dopo il 
prossimo riavvio del nodo.
 Node.maxHTL=HTL massimo
 Node.maxHTLLong=HTL massimo (PER USO ESCLUSIVO DEGLI SVILUPPATORI!)
 Node.maxOpennetPeers=Numero massimo di peer Opennet
-Node.maxOpennetPeersLong=Numero massimo di peer Opennet (deve essere compreso 
tra zero e 20 incluso)
-Node.maxOpennetPeersMustBeTwentyOrLess=Deve essere venti o minore
-Node.mustBePositive=Il valore di config deve essere positivo
+Node.maxOpennetPeersLong=Numero massimo di peer Opennet (il  valore 
specificato minore o uguale a venti; le connessioni darknet verranno sottratte 
dal limite totale)
+Node.maxOpennetPeersMustBeTwentyOrLess=Il valore deve essere uguale o 
inferiore a 20
+Node.mustBePositive=Il valore deve essere positivo!
 Node.nodeDir=Directory del nodo
 Node.nodeDirLong=Directory contenente file relativi al nodo, per esempio la 
lista dei peer
-Node.nodeName=Nickname di questo nodo Freenet
-Node.nodeNameLong=Nickname del nodo. Visibile solo agli Amici
+Node.nodeName=Nome del nodo
+Node.nodeNameLong=Nome del nodo. E' visibile solo agli Amici (darknet peer), 
mentre gli Sconosciuti (opennet peer) non potranno vederlo.
 Node.notUsingSunVM=E' stata rilevata una JVM ${vendor} ${version} che potrebbe 
influire sul corretto funzionamento del nodo. Se possibile, installare Sun java 
disponibile presso http://www.java.com/getjava
 Node.notUsingSunVMShort=Freenet sta attualmente utilizzando JVM (Java Virtual 
Machine) diversa da Sun, che ?? quella raccomandata. Si prega di scaricare ed 
installare la versione corrente di Sun Java JRE (Java Runtime Environment)
 Node.notUsingSunVMTitle=Il nodo non sta usando una JVM della Sun
@@ -711,29 +712,35 @@
 Node.notUsingWrapperShort=Freenet sta girando senza wrapper. Questo non ?? 
raccomandato.
 Node.notUsingWrapperTitle=Il nodo non sta usando il wrapper!
 Node.oneConnectionPerIP=Limita ad una connessione per indirizzo?
-Node.oneConnectionPerIPLong=Non permettere pi?? di una connessione per 
indirizzo? Questo render?? leggermente pi?? difficile eseguire un attacco 
connettendosi al nodo pi?? volte con diverse identit?? in modo da dominare il 
routing (instradamento) di questo nodo e rendere pi?? facile raccogliere dati 
con lo "harvesting" (lett: "il raccolto", in agricoltura). Abilitare questa 
opzione rende anche impossibile che un peer sia connesso al nodo sia su darknet 
che su opennet.
-Node.opennetEnabled=Abilita Modalit?? Insicura (connette automaticamente a 
nodi non gestiti da utenti conosciuti ed affidabili)
-Node.opennetEnabledLong=Abilita Modalit?? Insicura? (detta anche Opennet) 
Abilitando questa opzione il nodo scambier?? automaticamente referenze on altri 
nodi. Ma questo significa anche che il fatto che su questo computer gira un 
nodo Freenet non sar?? pi?? un segreto e molti attacchi saranno pi?? facili da 
eseguire. Conoscendo abbastanza gente che usa Freenet, si consiglia di 
continuare a connettersi soltanto ad utenti conosciuti ed addifabili (Amici)
+Node.oneConnectionPerIPLong=Non permettere pi?? di una connessione per 
indirizzo? Ci?? rende leggermente pi?? difficile un attacco eseguito 
connettendosi al nodo pi?? volte con diverse identit?? in modo da dominarne il 
routing (instradamento) e rendere pi?? facile raccogliere dati con lo 
"harvesting" (lett: "il raccolto", in agricoltura). Questa opzione impedisce 
che un peer sia connesso al nodo sia su darknet che su opennet.
+Node.opennetEnabled=Abilita Modalit?? Insicura (connette automaticamente a 
nodi gestiti da Sconosciuti)
+Node.opennetEnabledLong=Abilita Modalit?? Insicura? (detta anche Opennet) 
Abilitando questa opzione il nodo scambier?? automaticamente referenze on altri 
nodi. Ci?? rende facilmente osservabile dall'esterno il fatto che su questo 
computer sta girando un nodo Freenet, facilitando attacchi di diversi tipi. 
Avendone la possibilit??, l'opzione migiore ?? quella di connettersi soltanto 
ad utenti conosciuti ed addifabili (Darknet peer, vedi pagina Amici)
 Node.outBWLimit=Limite dell'ampiezza di banda in uscita (bytes per secondo)
 Node.outBWLimitLong=Limite "duro" dell' ampiezza di banda in uscita 
(bytes/sec); di solito il nodo non eccede questo limite
-Node.passOpennetPeersThroughDarknet=Trasmettere referenze opennet attraverso 
peer darknet?
+Node.passOpennetPeersThroughDarknet=Trasmetti referenze opennet attraverso 
darknet peer
 Node.passOpennetPeersThroughDarknetLong=Se impostata su "vero" referenze 
opennet verranno trasmesse attraverso peer darknet (ma MAI la referenza del 
nodo locale). In questo modo un nodo (nodo locale, o i suoi peer) pu?? ottenere 
peer opennet dai suoi peer darknet. Questo ?? utile perch?? permette di 
riconnettersi in caso di perdita dei peer, per esempio dopo una lunga 
disconnessione, ma rende l'analisi del traffico leggermente pi?? facile, quindi 
chi ?? paranoico dovrebbe disabilitare questa opzione.
 Node.port=Numero della porta FNP (UDP)
 Node.portLong=Porta UDP per le comunicazioni da nodo a nodo (Freenet Node 
Protocol)
+Node.publishOurPeersLocation=Trasmettere ai peer la locazione dei nostri peer?
+Node.publishOurPeersLocationLong=Trasmettere ai peer la locazione dei nostri 
peer? Ci?? facilita il routing ma fornisce informazioni ad un potenziale 
avversario.
+Node.routeAccordingToOurPeersLocation=Tenere conto nel routing della locazione 
dei peer dei nostri peer?
+Node.routeAccordingToOurPeersLocationLong=Usare per il routing la locazione 
dei peer dei nostri peer? Ci?? facilita il routing ma potrebbe essere utile ad 
un potenziale avversario.
 Node.storeDirectory=Directory magazzino dati (store)
 Node.storeDirectoryLong=Directory contenente gli store file
-Node.storeMaxMemTooHigh=Dare a BDB pi?? dell' 80% della memoria RAM 
disponibile non e' una buona idea!
+Node.storeMaxMemTooHigh=Impostare un valore superiore ad 80% della memoria RAM 
da destinare a BDB ?? generalmente una pessima idea.
 Node.storeSize=Dimensioni in bytes del magazzino dati (store)
 Node.storeSizeLong=Dimensioni del magazzino (store) in bytes
 Node.storeType=Tipo di magazzino dati (store). NON TOCCARE!!
-Node.storeTypeLong=Tipo di datastore. Attualmente pu?? essere un indice bdb 
(usa un BerkeleyDBFreenetStore per l'indice, e mette i dati in dei file su 
disco), o ram (indice e dati in RAM). Uso di ram riservato a persone 
competenti, e solo se c'e' abbastanza memoria per metterci tutti i dati (NOTA: 
in questo caso i dati NON verranno salvati all'arresto del nodo)
+Node.storeTypeLong=Tipo di datastore. Attualmente pu?? essere un indice bdb 
(usa un BerkeleyDBFreenetStore per l'indice, e mette i dati in dei file su 
disco), o ram (indice e dati in RAM). L'uso di ram ?? riservato a persone 
competenti, e solo se c'e' memoria sufficiente a disposizione per tutti i dati 
(NOTA: in questo caso i dati NON verranno salvati all'arresto del nodo)
 Node.swapRInterval=Intervallo tra le richieste di scambio (swap) in 
millisecondi
 Node.swapRIntervalLong=Intervallo tra richieste di scambio (swap) in 
millisecondi. Non toccare!
-Node.throttleLocalTraffic=Throttle traffico locale?
-Node.throttleLocalTrafficLong=Abilita throttle traffico locale? Abilitando 
questa opzione anche LAN e traffico localhost saranno soggetti alla limitazione 
di banda.
+Node.throttleLocalTraffic=Limitazione di banda su traffico locale
+Node.throttleLocalTrafficLong=Abilita limitazione di banda su traffico locale? 
Abilitando questa opzione,  la limitazione di banda avr?? effetto anche sulla 
rete locale (LAN) e su localhost.
 Node.tooSmallMTU=MTU insufficiente
 Node.tooSmallMTULong=L' MTU della connessione sembra essere ${mtu} bytes. 
Freenet non pu?? funzionare bene con un MTU minore di ${minMTU} bytes: le 
connessioni saranno inaffidabili e forse rallentate. Se possibile, si dovrebbe 
provvedere a risolvere il problema.
 Node.tooSmallMTUShort=Problema di connessione: MTU di connessione troppo basso 
per consentire a Freenet di funzionare correttamente. Potranno verificarsi dei 
problemi.
+Node.withAnnouncement=Permettere l'inserimento nella rete usando seednodes?
+Node.withAnnouncementLong=Permettere che il nodo si auto-inserisca nella rete 
Freenet usando seednodes? Questa opzione ?? abilitata di default per motivi 
tecnici ma ?? intrinsecamente insicura
 NodeClientCore.couldNotFindOrCreateDir=Non ?? stato possibile trovare o creare 
la directory
 NodeClientCore.downloadAllowedDirs=Directory dove il download ?? consentito
 NodeClientCore.downloadAllowedDirsLong=Si pu?? usare una lista di directory 
dove dove il download e' permesso, separate da 'punto e virgola' (;). 
"downloads" significa downloadsDir, vuoto (nessuna directory specificata) 
significa che il download su disco non e' permesso, "all" significa download 
permessi in tutte le directory AVVERTENZA; Se impostato su "all" ("tutte"), 
ogni utente potr?? scaricare files  in qualsiasi directory.
@@ -750,17 +757,17 @@
 NodeClientCore.persistentTempDir=Directory dei file temporanei persistenti
 NodeClientCore.persistentTempDirLong=Nome della directory dei file temporanei 
persistenti
 NodeClientCore.startingUp=Si prega di concedere a Freenet alcuni minuti per 
completare il processo di avviamento. Nel frattempo alcune funzioni non saranno 
disponibili e il nodo potr?? risultare pi?? lento del normale.
-NodeClientCore.startingUpShort=Freenet si sta avviando, qualcosa potrebbe 
ancora non funzionare e il nodo potrebbe essere lento.
+NodeClientCore.startingUpShort=L'avviamento di Freenet ?? ancora in corso: 
alcune funzioni potrebbero non essere ancora disponibili e il nodo potrebbe 
operare ad una velocit?? inferiore al normale.
 NodeClientCore.startingUpTitle=Avviamento di Freenet in corso
 NodeClientCore.tempDir=Directory file temporanei
 NodeClientCore.tempDirLong=Nome della directory dei file temporanei
 NodeClientCore.uploadAllowedDirs=Directory dalle quali l'upload e' consentito
 NodeClientCore.uploadAllowedDirsLong=Si pu?? usare una lista di directory dove 
l'upload e' consentito, separate da 'punto e virgola' (;). Vuoto (nessuna 
directory specificata) significa che l'upload non e' permesso, "all" significa 
upload permesso da tutte le directory AVVERTENZA; Se impostato su "all" 
("tutte"), ogni utente potr?? inserire qualunque file da qualsiasi directory.
 NodeIPDectector.inclLocalAddress=Includi indirizzi locali nella referenza del 
nodo
-NodeIPDectector.inclLocalAddressLong=Specifica se includere l'indirizzo locale 
(LAN e localhost) nella referenza del nodo. Questo non ?? utile a meno che 
entrambi i lati abbiano impostato allowLocalAddresses=true per le rispettive 
referenze (per impostare questa opzione, abilitare la modalit?? avanzata e 
usare la pagina Amici).
-NodeIPDectector.ipOverride=Imposta manualmente indirizzo IP
+NodeIPDectector.inclLocalAddressLong=Specifica se includere l'indirizzo locale 
(LAN e localhost) nella referenza del nodo. Ci?? non ?? necessario a meno che 
entrambi i nodi che si vogliono collegare abbiano impostato 
allowLocalAddresses=true per le rispettive referenze (per impostare questa 
opzione, abilitare la modalit?? avanzata e usare le opzioni disponibili alla 
pagina Amici).
+NodeIPDectector.ipOverride=Impostazione manuale indirizzo IP
 NodeIPDectector.ipOverrideLong=Impostazione manuale dell'indirizzo IP (di 
solito non ?? necessario) - Utilizzare questa opzione se si ha un indirizzo IP 
statico o un domain name  (es. dyndns), e ci si trova dietro un firewall.
-NodeIPDectector.tempAddressHint=Suggerimento temporaneo dell'indirizzo IP
+NodeIPDectector.tempAddressHint=Suggerimento temporaneo indirizzo IP
 NodeIPDectector.tempAddressHintLong=Suggerisce temporaneamente l'indirizzo IP; 
viene eliminato dopo l'uso
 NodeIPDetector.maybeSymmetric=Sembra che il nodo sia dietro una NAT 
simmetrica. Potrebbe trattarsi di problemi di connessione: se ci si trova 
dietro una NAT simmetrica ci si potr?? probabilmente connettere soltanto con i 
nodi che sono raggiungibili da interenet.
 NodeIPDetector.maybeSymmetricShort=Problema di connessione: il nodo potrebbe 
trovarsi dietro una NAT simmetrica.
@@ -771,17 +778,17 @@
 NodeStat.freeHeapBytesThreshold=Soglia free heap bytes
 NodeStat.freeHeapBytesThresholdLong=Il nodo respinge richieste per mantenere 
la quota di free heap bytes impostata
 NodeStat.freeHeapPercentThreshold=Soglia percentuale free heap
-NodeStat.freeHeapPercentThresholdLong=Respingendo nuove richieste, il nodo 
mantiene al di sopra della soglia la  percentuale di max heap bytes ammessa
-NodeStat.ignoreLocalVsRemoteBandwidthLiability=Gestire richieste locali allo 
stesso modo di quelle remote, per limitazioni della disponibilit?? di banda?
-NodeStat.ignoreLocalVsRemoteBandwidthLiabilityLong=Abilitare questa opzione 
per ridurre notevolmente la banda utilizzata ed aumentare leggermente la 
sicurezza contro i tentativi di attacchi di timing. Nella gran parte dei casi, 
non devi preoccuparti di essi, in quanto sono pi?? probabili i "correlation 
attacks" (attacchi di correlazione).
-NodeStat.memCheck=Abilita la Verifica di Memoria
+NodeStat.freeHeapPercentThresholdLong=Respingendo nuove richieste, il nodo 
mantiene la  percentuale di di free heap (in rapporto a max heap bytes ammessi) 
 al di sopra della soglia
+NodeStat.ignoreLocalVsRemoteBandwidthLiability=Gestisi richieste locali allo 
come quelle remote per limitazioni della disponibilit?? di banda
+NodeStat.ignoreLocalVsRemoteBandwidthLiabilityLong=Abilitando questa opzione 
si riduce notevolmente la banda utilizzata e si aumenta leggermente la 
sicurezza nei confronti di attacchi di timing. Generalmente non c'?? di che 
preoccuparsi per questo tipo di attacchi in quanto gli attacchi di correlazione 
sono pi?? facili da eseguire.
+NodeStat.memCheck=Abilita Verifica di Memoria
 NodeStat.memCheckLong=Abilita verifica della memoria (scrive un messaggio nel 
log file. La verifica della memoria deve essere abilitata perche' 
aggressiveGCModificator abbia effetto)
 NodeStat.statsPersister=File contenente le statistiche del nodo
 NodeStat.statsPersisterLong=File contenente statistiche: NON si tratta delle 
statistiche del client. Queste statistiche servono al nodo per decidere se 
accettare o rifiutare nuove richieste. Non eliminare!
 NodeStat.threadLimit=Limite thread
 NodeStat.threadLimitLong=Il nodo respinge richieste per limitare l'uso di 
thread al valore specificato.
 NodeStats.mustBePercentValueNotFull=Questo valore deve essere espresso in 
precentuale, compresa tra 0 e 99.
-NodeStats.valueTooLow=Questo valore ?? troppo basso per quella impostazione: 
?? necessario aumentarlo.
+NodeStats.valueTooLow=Valore troppo basso per questa impostazione: ?? 
necessario aumentarlo.
 NodeUpdateManager.enabled=Verifica disponibilit?? e scarica nuove versioni
 NodeUpdateManager.enabledLong=Verifica e scarica automaticamente nuove 
versioni di Freenet. Se impostatos su 'vero', le nuove versioni verranno 
scaricate ma non necessariamente installate. L'impostazione torna sempre su 
'falso' se il nodo non gira all'interno del wrapper.
 NodeUpdateManager.extURI=Dove cercare versioni aggiornate di freenet-ext.jar?
@@ -800,11 +807,11 @@
 NodeUpdateManager.updateFailedTitle=Aggiornamento Fallito!
 NodeUpdateManager.updateURI=Dove cercare aggiornamenti?
 NodeUpdateManager.updateURILong=Dove cercare aggiornamenti?
-NotEnoughNiceLevelsUserAlert.content=Il nodo ha rilevato di stare operando ad 
un alto livello di nice. In mancanza di un numero sufficiente di livelli di 
nice, il nodo non potr?? operare a pieno regime. Si prega di ridurre il livello 
di nice. (cercare PRIORITY nel file run.sh e ridurne il valore). Attualmente il 
nodo ha ${available} livelli a disposizione mentre avrebbe bisogno di 
${required} livelli.
-NotEnoughNiceLevelsUserAlert.short=Non ci sono abbastanza "Nice levels" 
disponibili. si prega assegnare a Freenet per  un "Nice Level" inferiore.
-NotEnoughNiceLevelsUserAlert.title=Numero di livelli Nice insufficiente!
-OpennetConnectionsToadlet.fullTitle=${counts} Sconosciuti (Peers non 
affidabili) di ${name}
-OpennetConnectionsToadlet.peersListTitle=I Miei Peer Opennet (nodi non 
affidabili aggiunti dal nodo)
+NotEnoughNiceLevelsUserAlert.content=Il nodo ha rilevato di stare operando ad 
un Nice level alto. In mancanza di un numero sufficiente di livelli di nice, il 
nodo non potr?? operare a pieno regime. Si prega di ridurre il livello di nice. 
(cercare PRIORITY nel file run.sh e ridurne il valore). Attualmente il nodo ha 
${available} livelli a disposizione mentre avrebbe bisogno di ${required} 
livelli.
+NotEnoughNiceLevelsUserAlert.short=Non ci sono abbastanza Nice level 
disponibili. si prega di assegnare a Freenet un Nice level inferiore.
+NotEnoughNiceLevelsUserAlert.title=Numero di Nice level insufficiente!
+OpennetConnectionsToadlet.fullTitle=${counts} Sconosciuti (Peer non fid??ti) 
del nodo: ${name}
+OpennetConnectionsToadlet.peersListTitle=Peer Opennet (peer non fid??ti 
aggiunti automaticamente dal nodo)
 OpennetConnectionsToadlet.successTime=L'ultima volta che si ?? riusciti a 
richiamare una CHK dal nodo.
 OpennetConnectionsToadlet.successTimeTitle=Ultimo successo
 OpennetUserAlert.warning=Il nodo sta funzionando in modo "promiscuo". Ci?? 
significa che il nodo si connetter?? con nodi operati da sconosiuti, e quindi 
chiunque potr?? facilmente determinare che l'utente Tal dei Tali sta usando 
Freenet. Molti attacchi vengono facilitati da questa modalit??, bloccare il 
nodo (per esempio con un firewall nazionale) diventa molto pi?? facile, ed 
intoltre l'utente non ha controllo su chi si connette al suo nodo. Si 
raccomanda vivamente di procurarsi qualche connessione ad Amici (nodi operati 
da persone conosciute); il modo promiscuo va considerato una misura temporanea 
da utilizzarsi temporaneamente, in attesa di connessioni ad amici. 
Connettendosi esclusivamente a nodi gestiti da persone conosciute, pur non 
essendo impossibli degli attacchi da parte loro, risulter?? comunque meno 
probabile l'esposizione ad agenzie governative (tipo servizi segreti o che so 
io) o altri "cattivi". Nota che aggiungere un peer alla sezione Amici non 
cambia molto la situazione, a meno che tale nodo non sia gestito da qualcuno di 
consciuto e di cui ci si fida (per ragioni sia di routing [instradamento] che 
di sicurezza)!
@@ -812,6 +819,10 @@
 OpennetUserAlert.warningTitle=Avvertenza: Modo Promiscuo Attivato: Il nodo si 
connetter?? a degli sconosciuti
 PNGFilter.invalidHeader=Il file che si sta cercando di richiamare non e' un 
PNG: esso non include un header PNG valido. Potrebbe trattarsi di un file in 
altro formato e il browser potrebbe fare qualcosa di pericoloso a causa della 
confusione creata dalla mancata corrispondenza; il file ?? stato pertanto 
bloccato.
 PNGFilter.invalidHeaderTitle=Header PNG non valido
+PageMaker.modeAdvanced=Interfaccia avanzata
+PageMaker.modeAdvancedTooltip=Un'interfaccia pi?? complessa, utile soltanto 
agli utenti esperti
+PageMaker.modeSimple=Interfaccia semplice
+PageMaker.modeSimpleTooltip=Un'interfaccia semplice che pu?? essere usata da 
ogni utente
 PeerManagerUserAlert.clockProblem=${count} peer non riescono a connettersi 
perch?? il loro orologio di sistema differisce di oltre 24 ore da quello 
locale. Si prega di verificare che l'orologio di sistema del computer sia 
regolato sull'ora esatta. Regolazioni inaccurate dell'orologio causano molti 
problemi nel funzionamento dei meccanismi tra nodo e client.
 PeerManagerUserAlert.clockProblemTitle=Problema di sincronizzazione.
 PeerManagerUserAlert.connError=${count} peer non riescono a connettersi per 
motivi sconosciuti, forse per causa di 'bug' nel nodo o di una referenza di un 
nodo che e' corrotta.
@@ -847,14 +858,18 @@
 PeersSayKeyBlownAlert.intro=Uno o pi?? peers ci comunicano che la chiave di 
revoca per l'aggiornamento automatico ?? saltata. Questo significa che qualcuno 
potrebbe essere venuto a conoscenza della chiave privata del sistema di 
autoaggiornamento, cosa che potrebbe far eseguire al nodo il codice che 
l'attaccante volesse fargli eseguire (se l'aggiornamento venisse eseguito): per 
prevenire tale eventualit??, il sistema di autoaggiornamento ?? stato 
disabilitato. E' anche possibile che dei peers stiano deliberatamente mentendo 
a proposito della chiave di revoca.
 PeersSayKeyBlownAlert.short=Alcuni peer avvertono che la chiave di auto 
aggiornamento ?? saltata!
 PeersSayKeyBlownAlert.titleWithCount=La chiave di Auto-aggiornamento ?? 
saltata! L' evento ?? stato confermato da ${count} peer!
+PluginConfig.configFile=File di configurazione dei plugin
+PluginConfig.configFileLong=Percorso/Nome del file che contiene la 
configurazione del plugin
+PluginConfig.installDir=Directory di installazione dei plugin
+PluginConfig.installDirLong=Directory dove installare i plugin
 PluginManager.cannotSetOnceLoaded=Una volta caricata, non ?? pi?? possibile 
impostare la lista dei plugin
 PluginManager.loadedOnStartup=Plugin da caricare all'avvio
 PluginManager.loadedOnStartupLong=Classpath, nome e locazione dei plugin da 
caricare all'avvio
 PluginManager.loadedPlugins=Plugin da caricare all'avvio
-PluginManager.loadedPluginsLong=Lista dei plugin da avviare all'avvio del nodo
+PluginManager.loadedPluginsLong=Lista dei plugin da caricare all'avvio del nodo
 PluginManager.pluginLoadingFailed=Non ?? stato possibile caricare il plugin 
specificato ${name}.
 PluginManager.pluginLoadingFailedShort=Impossibile caricare il plugin ${name}!
-PluginManager.pluginLoadingFailedTitle=Non ?? stato possibile caricare il 
plugin!
+PluginManager.pluginLoadingFailedTitle=Non ?? stato possibile caricare il 
plugin
 PluginManager.pluginLoadingFailedWithMessage=Non ?? stato possibile caricare 
il plugin specificato ${name}: ${message}
 PluginManager.pluginReqNewerJVM=Per usare il plugin ${name} ?? necessario 
installare una JVM pi?? recente di quella attualmente in uso. Installare Sun 
Java 1.5 o superiore, o rimuovere il plugin.
 PluginManager.pluginReqNewerJVMTitle=Il plugin ${name} richiede l'uso di una 
JVM pi?? aggiornata
@@ -864,11 +879,11 @@
 PluginToadlet.failedToLoadPluginTitle=Caricamento plugin fallito
 PluginToadlet.internalNameTitle=Nome Interno
 PluginToadlet.loadPluginCommand=Carica Plugin
-PluginToadlet.noWebInterface=Il plugin non ha interfaccia web quindi non c'?? 
nulla da mostrare
-PluginToadlet.noWebInterfaceTitle=Il plugin non ?? provvisto di interfaccia web
+PluginToadlet.noWebInterface=Questo plugin non ha interfaccia web e pertanto 
non c'?? nulla da mostrare
+PluginToadlet.noWebInterfaceTitle=Plugin non provvisto di interfaccia web
 PluginToadlet.pluginList=Lista plugin
-PluginToadlet.pluginListTitle=Lista dei Plugin
-PluginToadlet.pluginNameTitle=Nome del Plugin
+PluginToadlet.pluginListTitle=Lista Plugin
+PluginToadlet.pluginNameTitle=Nome Plugin
 PluginToadlet.pluginNotFound=Non ?? stato possibile trovare il plugin richiesto
 PluginToadlet.pluginNotFoundTitle=Plugin non trovato
 PluginToadlet.returnToPluginsWithLinks=${link}return${/link} alla lista di 
plugins.
@@ -881,13 +896,17 @@
 PproxyToadlet.changeReloadOnStartup=Cambia
 PproxyToadlet.classNameTitle=Class Name
 PproxyToadlet.downloadNotAllowedFromRemoteServer=Donload dei plugins ?? 
ammesso solo dal server di Freenet.
+PproxyToadlet.fileonly=accetta solo file locali
 PproxyToadlet.internalIDTitle=ID interna
+PproxyToadlet.loadFreenetPlugin=Carica un Plugin non ufficiale da freenet
+PproxyToadlet.loadFreenetPluginText=Inserire la URI del plugin che si vuole 
caricare. I plugin disponibili si Freenet non godono di alcun supporto 
ufficiale e non vengono controllati dagli sviluppatori di Freenet. Non ?? 
quindi possibile quindi garantire la privacy e la sicurezza di chi decidesse di 
utilizzarli.
+PproxyToadlet.loadFreenetURLLabel=Chiave del plugin
 PproxyToadlet.loadOfficialPlugin=Aggiungi un Plugin Ufficiale
 PproxyToadlet.loadOfficialPluginLabel=Carica Plugin Ufficiale
-PproxyToadlet.loadOfficialPluginText=Questi plugin sono immagazinati nei 
server del Progetto Freenet. L'opinione degli sviluppatori ?? che i plugins 
ufficiali siano esenti da difetti che possano compromettere la privacy ma non 
?? possibile garantire al 100% che ci?? corrisponda a realt??.
-PproxyToadlet.loadOfficialPluginWarning=AVVERTENZA: Caricando un plugin 
ufficiale lo si scarica da internet (non da Freenet). Un avversario potrebbe 
vedere il download e forse interferire con esso. Se ci?? pu?? effettivamente 
rappresentare un un problema, si consiglia di non caricare plugins.
+PproxyToadlet.loadOfficialPluginText=Plugin ufficialy disponibili per download 
dai server del Progetto Freenet. I programmatori di Freenet hanno esaminato i 
plugin ufficiali e trovato che essi appaiono esenti da difetti che possano 
compromettere la privacy; non ?? tuttavia possibile garantire con il 100% di 
sicurezza che ci?? corrisponda a realt??.
+PproxyToadlet.loadOfficialPluginWarning=AVVERTENZA: Caricando un plugin 
ufficiale lo si scarica da internet (non da Freenet). Se ci?? pu?? 
effettivamente rappresentare un un problema, si consiglia di non caricare 
plugins.
 PproxyToadlet.loadOtherPlugin=Aggiungi Plugin Non Ufficiale
-PproxyToadlet.loadOtherPluginText=Inserire qui la URL del plugin che si vuole 
caricare. Plugin diversi da quelli ufficiali di Freenet NON RICEVONO ALCUNA 
ASSISTENZA O VERIFICA per difetti di privacy da parte sviluppatori di Freenet!
+PproxyToadlet.loadOtherPluginText=Inserire qui la URL del plugin che si vuole 
caricare. ATTENZIONE! I Plugin non ufficiali non ricevono alcuna assistenza e 
non vengono controllati dai programmatory di Freenet, pertanto chi volesse 
utilizzarli lo far?? A PROPRIO RISCHIO.
 PproxyToadlet.loadOtherURLLabel=URL del plugin
 PproxyToadlet.loadPluginLabel=Carica Plugin:
 PproxyToadlet.noPlugins=Nessun plugin caricato
@@ -927,7 +946,7 @@
 QueueToadlet.DinProgress=Download in corso
 QueueToadlet.UinProgress=Upload in corso
 QueueToadlet.change=Modifica
-QueueToadlet.completedDU=Upload directory completati
+QueueToadlet.completedDU=Upload di directory completati
 QueueToadlet.completedDinDownloadDirectory=Download completati (directory dei 
download) (${size})
 QueueToadlet.completedDinTempDirectory=Download Completati (directory 
temporanea) (${size})
 QueueToadlet.completedDtoDisk=Download completati
@@ -936,9 +955,13 @@
 QueueToadlet.completedUDirectory=Directory Upload Completati:(${size})
 QueueToadlet.delete=Elimina
 QueueToadlet.download=Scarica
+QueueToadlet.downloadFiles=Download multipli
+QueueToadlet.downloadFilesInstructions=E' possibile incollare una serie di 
chiavi da scaricare nello spazio sottostante (una per rigo)
 QueueToadlet.downloadSucceeded=Il file ${origlink}${filename}${/origlink} ?? 
stato scaricato. ${link}Click qui${/link} per aprile il file (${size}).
-QueueToadlet.downloadSucceededTitle=Download effettuato: ${filename}
+QueueToadlet.downloadSucceededTitle=Download completato: ${filename}
 QueueToadlet.emergency=urgenza estrema
+QueueToadlet.enqueuedFailure=Non ?? stato possibile agguingere alla coda le 
${number} chiavi qui elencate:
+QueueToadlet.enqueuedSuccessfully=Le ${number} chiavi elencate di seguito sono 
state aggiunte alla coda con successo:
 QueueToadlet.errorAccessDenied=Errore: Accesso Negato
 QueueToadlet.errorAccessDeniedFile=L'attuale configurazione del nodo non 
consente l'upload del file "${file}".
 QueueToadlet.errorDToDisk=Non ?? stato possibile scaricare su disco
@@ -955,10 +978,10 @@
 QueueToadlet.errorNoKey=Non ?? stata specificata alcuna chiave per il download
 QueueToadlet.errorNoKeyToD=Non ?? stata specificata una chiave per il download
 QueueToadlet.failedD=Download falliti
-QueueToadlet.failedDU=Upload directory falliti
+QueueToadlet.failedDU=Upload di directory falliti
 QueueToadlet.failedToRemove=Non ?? stato possibile rimuovere ${id}: ${message}
-QueueToadlet.failedToRemoveId=Non ?? stato possibile rimuovere: ${id}
-QueueToadlet.failedToRemoveRequest=Non ?? stato possibile rimuovere la 
richiesta
+QueueToadlet.failedToRemoveId=Non ?? stato possibile eliminare: ${id}
+QueueToadlet.failedToRemoveRequest=Non ?? stato possibile eliminare la 
richiesta
 QueueToadlet.failedToRestart=Non ?? stato possibile riavviare: ${id}
 QueueToadlet.failedToRestartRequest=Non e' stato possibile riavviare la 
richiesta
 QueueToadlet.failedU=Upload falliti
@@ -975,9 +998,9 @@
 QueueToadlet.insertFileCompressLabel=Comprimi
 QueueToadlet.insertFileInsertFileLabel=Inserisci File
 QueueToadlet.insertFileLabel=File
-QueueToadlet.insertFileResetForm=Modulo Reset
+QueueToadlet.insertFileResetForm=Annulla
 QueueToadlet.key=Chiave
-QueueToadlet.legend=Legenda
+QueueToadlet.legend=Significato dei colori: Priorit??...
 QueueToadlet.low=bassa
 QueueToadlet.medium=media
 QueueToadlet.mimeType=MIME type
@@ -986,7 +1009,7 @@
 QueueToadlet.notLoadedYet=Il nodo sta ancora caricando la lista delle 
richieste persistenti. Si prega di pazientare.
 QueueToadlet.notLoadedYetTitle=La Coda non ?? stata ancora caricata.
 QueueToadlet.panicButton=Bottone Emergenza
-QueueToadlet.panicButtonConfirmation=Elimina tutto senza chiedere conferma!
+QueueToadlet.panicButtonConfirmation=Elimina tutte le richieste senza chiedere 
conferma
 QueueToadlet.persistence=Persistenza
 QueueToadlet.persistenceForever=illimitata
 QueueToadlet.persistenceNone=nessuna
@@ -1007,16 +1030,16 @@
 QueueToadlet.remove=Elimina
 QueueToadlet.requestNavigation=Esplora Richieste
 QueueToadlet.restart=Riavvia
-QueueToadlet.siteUploadSucceeded=I file ${filename} (${files} del tuo 
freesite, ${size} total size) sono stati correttamente caricati su Freenet. 
${link}Click qui${/link} per aprire l'homepage del freesite.
-QueueToadlet.siteUploadSucceededTitle=Inserimento del Freesite avvenuto: 
${filename}
+QueueToadlet.siteUploadSucceeded=E' stato completato l'upload del freesite 
${filename} (${files} files, dimensioni totali ${size}). ${link}Clicca 
qui${/link} per aprire la homepage del sito.
+QueueToadlet.siteUploadSucceededTitle=Inserimento freesite completato: 
${filename}
 QueueToadlet.size=Dimensioni
 QueueToadlet.starting=AVVIAMENTO IN CORSO
-QueueToadlet.title=Coda globale di ${nodeName}
+QueueToadlet.title=Coda globale del nodo: ${nodeName}
 QueueToadlet.totalSize=Dimensioni Totali
 QueueToadlet.unknown=Non Disp.
-QueueToadlet.uploadProgressbarNotAccurate=Il valore di questo indicatore 
progresso pu?? essere falsato quando l'upload codifica ulteriori blocchi.
+QueueToadlet.uploadProgressbarNotAccurate=Il valore di questo indicatore di 
progresso pu?? essere falsato quando l'upload codifica ulteriori blocchi.
 QueueToadlet.uploadSucceeded=Il file ${filename} (size ${size}) ?? stato 
correttamente caricato su Freenet. ${link}Click qui${/link} per aprire il file.
-QueueToadlet.uploadSucceededTitle=upload avvenuto: ${filename}
+QueueToadlet.uploadSucceededTitle=Inserzione completata: ${filename}
 QueueToadlet.veryhigh=molto alta
 QueueToadlet.verylow=bassissima
 QueueToadlet.warningUnsafeContent=Contenuto Potenzialmente Pericoloso
@@ -1061,7 +1084,7 @@
 SimpleToadletServer.cssOverrideLong=Questa impostazione permette di utilizzare 
un CSS personalizzato invece di quello normalmente usato. AVVERTENZA: i CSS 
possono essere pericolosi, e *non* vengono filtrati: utilizzare a proprio 
rischio. Per includerli nella distribuzione principale e-mail devl at 
freenetroject.org
 SimpleToadletServer.cssOverrideNotInUploads=Non ?? possibile usare questa 
impostazione: "${filename} non ?? una directory dalla quale sono permessi gli 
upload.
 SimpleToadletServer.doRobots=Usare robots.txt per escludere i robot?
-SimpleToadletServer.doRobotsLong=Pubblica /robots.txt che dice a persone, 
Google, spiders, wget, ecc. di lasciarci in pace.
+SimpleToadletServer.doRobotsLong=Pubblica un file /robots.txt allo scopo di 
tenere lontano Google, spiders, Wget, etc.
 SimpleToadletServer.enableInlinePrefetch=Abilita pre-ricezione (prefetching) 
di immagini inlinea (inline)?
 SimpleToadletServer.enableInlinePrefetchLong=Questo potrebbe essere utile se 
il browser utilizza un numero ridotto di connessioni per comunicare con il 
nodo. D'altra parte potrebbe non esserlo.
 SimpleToadletServer.enableJS=Permetti a FProxy di usare Javascript
@@ -1077,6 +1100,10 @@
 SimpleToadletServer.portLong=Numero della porta FProxy
 SimpleToadletServer.ssl=Abilitare ssl?
 SimpleToadletServer.sslLong=Abilitare ssl?
+StartupToadlet.entropyErrorContent=Non c'?? abbastanza entropia disponibile 
nel sistema... Freenet non si avvier?? finch?? non ne avr?? racimolata 
abbastanza.
+StartupToadlet.entropyErrorTitle=Entropia insufficiente!
+StartupToadlet.isStartingUp=Avviamento del nodo Freenet in corso, si prega di 
attendere.
+StartupToadlet.title=Avvio di Freenet in corso
 StaticToadlet.pathInvalidChars=La URI specificata contiene caratteri non 
permessi.
 StaticToadlet.pathNotFound=Il percorso specificato non esiste.
 StaticToadlet.pathNotFoundTitle=Percorso non trovato
@@ -1088,15 +1115,15 @@
 StatisticsToadlet.announceBytes=Output annuncio: ${total}
 StatisticsToadlet.authBytes=Configura connessione: ${total} output
 StatisticsToadlet.bandwidthTitle=Ampiezza di banda
-StatisticsToadlet.cpus=CPU disponibili: ${count}
+StatisticsToadlet.cpus=Numero CPU: ${count}
 StatisticsToadlet.debuggingBytes=Debugging bytes: ${netColoring} colorazione 
rete, ${ping} ping, ${probe} richieste probe, ${routed} messaggi di testo 
instradati.
-StatisticsToadlet.fullTitle=Statistiche per ${name}
-StatisticsToadlet.getLogs=Ultimo logfile del nodo
+StatisticsToadlet.fullTitle=Statistiche del nodo: ${name}
+StatisticsToadlet.getLogs=Scarica l'ultimo logfile del nodo
 StatisticsToadlet.inputRate=Input: ${rate}/second (of ${max}/second)
-StatisticsToadlet.insertOutput=Output inserzione (carico utile escluso): CHK 
${chk} SSK ${ssk}.
+StatisticsToadlet.insertOutput=Output inserzioni (carico utile escluso): CHK 
${chk} SSK ${ssk}.
 StatisticsToadlet.javaVersion=Versione Java: ${version}
 StatisticsToadlet.jeDumpButton=Genera JE Dump
-StatisticsToadlet.jvmInfoTitle=Info JVM
+StatisticsToadlet.jvmInfoTitle=JVM
 StatisticsToadlet.jvmVendor=JVM fornita da: ${vendor}
 StatisticsToadlet.jvmVersion=Versione JVM: ${version}
 StatisticsToadlet.maxMemory=Max Memoria Java: ${memory}
@@ -1111,15 +1138,15 @@
 StatisticsToadlet.payloadOutput=Output Carico Utile: ${total} (${rate}/second) 
(${percent}%)
 StatisticsToadlet.peerStatsTitle=Statistiche peer
 StatisticsToadlet.priority=Priorit??
-StatisticsToadlet.requestOutput=Output richiesta (escluso carico utile): CHK 
${chk} SSK ${ssk}.
+StatisticsToadlet.requestOutput=Output richieste (carico utile escluso): CHK 
${chk} SSK ${ssk}.
 StatisticsToadlet.resendBytes=Bytes rispediti: ${total}
-StatisticsToadlet.routingDisabled=Indirizzamento traffico sospeso (il nodo ?? 
attualmente connesso ma una delle due parti non accetta l'indirizzamento di 
traffico)
+StatisticsToadlet.routingDisabled=Indirizzamento traffico sospeso (il nodo ?? 
attualmente connesso ma una delle due parti non accetta indirizzamento di 
traffico)
 StatisticsToadlet.routingDisabledShort=Indirizzamento Traffico Sospeso
 StatisticsToadlet.running=In funzione
 StatisticsToadlet.statisticGatheringTitle=Raccolta Statistiche
 StatisticsToadlet.swapOutput=Output Scambio: ${total}.
 StatisticsToadlet.threadDumpButton=Genera Thread Dump
-StatisticsToadlet.threads=Threads in esecuzione: ${running}/${max}
+StatisticsToadlet.threads=Threads correnti: ${running}/${max}
 StatisticsToadlet.threadsByPriority=Thread in ordine di prorit??
 StatisticsToadlet.totalInput=Input Totale: ${total} (${rate}/second)
 StatisticsToadlet.totalOutput=Output Totale: ${total} (${rate}/second)
@@ -1128,7 +1155,7 @@
 StatisticsToadlet.unaccountedBytes=Altro output: ${total} (${percent}%)
 StatisticsToadlet.uomBytes=Output Aggiornamento: ${total}
 StatisticsToadlet.usedMemory=Memoria Java in uso: ${memory}
-StatisticsToadlet.versionTitle=Info Versione Nodo
+StatisticsToadlet.versionTitle=Versione Nodo
 StatisticsToadlet.waiting=In attesa
 SymlinkerToadlet.symlinks=Link simbolici in ToadletServer
 SymlinkerToadlet.symlinksLong=Lista di "alias#target" che va a formare un 
gruppo di link simbolici
@@ -1148,12 +1175,12 @@
 TextModeClientInterfaceServer.ssl=Abilitare ssl?
 TextModeClientInterfaceServer.sslLong=Abilitare ssl?
 TextModeClientInterfaceServer.telnetPortNumber=Porta telnet
-TextModeClientInterfaceServer.telnetPortNumberLong=Numero della porta telnet
+TextModeClientInterfaceServer.telnetPortNumberLong=Porta TCP utlizzata dal 
server TMCI
 TimeSkewDetectedUserAlert.shortText=Il nodo ha rilevato una discrepanza 
temporale. Freenet potrebbe bloccarsi in strani modi!
 TimeSkewDetectedUserAlert.text=Una discrepanza temporale ?? stata rilevata dal 
nodo. Questo ?? un inconveniente grave; il nodo non potr?? funzionare 
correttamente finch?? non vi si sar?? ovviato. Tra le cause pi?? comuni, la 
modalit?? powersafe mal configurata, cattiva sincronizzazione tra i client in 
rete, problemi di hardware.
 TimeSkewDetectedUserAlert.title=Discrepanza temporale rilevata!
 Toadlet.cancel=Cancella
-Toadlet.clickHere=Clicka qui
+Toadlet.clickHere=Clicca qui
 Toadlet.homepage=Homepage
 Toadlet.internalErrorPleaseReport=Errore interno:  riportarlo se possibile
 Toadlet.internalErrorTitle=Errore Interno
@@ -1166,6 +1193,7 @@
 Toadlet.returnToHomepage=Torna alla homepage del nodo
 Toadlet.returnToNodeHomepage=Torna alla homepage del nodo
 Toadlet.returnToPrevPage=Torna alla pagina precedente
+Toadlet.returnToQueuepage=Torna alla pagina della coda
 Toadlet.tempRedirectWithReason=Redirect temporaneo: ${reason}
 Toadlet.unauthorized=L'accesso a questa pagina ?? interdetto.
 Toadlet.unauthorizedTitle=Non Autorizzato
@@ -1178,20 +1206,20 @@
 ToadletContextImpl.noSuchToadlet=Nessuna Toadlet con quel nome
 ToadletContextImpl.parseErrorWithError=Errore nell' interpretazione ${error}
 ToadletContextImpl.uriParseErrorTitle=Errore Nell' Interpretazione della URI
-TranslationToadlet.bracketRemoveOverride=(Elimina questa chiave di traduzione)
-TranslationToadlet.bracketTranslateIt=(traducilo nella tua lingua)
-TranslationToadlet.bracketUpdateTranslation=(aggiorna la traduzione)
-TranslationToadlet.confirmRemoveOverride=Conferma: eliminare la chiave di 
traduzione : (${key} - ${value}) ?
-TranslationToadlet.contributingToLabelWithLang=Stai attualmente contribuendo 
alla traduzione ${lang}:
-TranslationToadlet.currentTranslationLabel=Traduzione attuale
-TranslationToadlet.downloadTranslationsFile=Scarica il file di traduzione
-TranslationToadlet.hideAlreadyTranslated=Nascondi le stringhe gi?? tradotte
+TranslationToadlet.bracketRemoveOverride=(Elimina chiave di traduzione)
+TranslationToadlet.bracketTranslateIt=(traduci nella tua lingua)
+TranslationToadlet.bracketUpdateTranslation=(aggiorna traduzione)
+TranslationToadlet.confirmRemoveOverride=Conferma: elimina chiave di 
traduzione : (${key} - ${value}) ?
+TranslationToadlet.contributingToLabelWithLang=Stai contribuendo alla 
traduzione: ${lang}:
+TranslationToadlet.currentTranslationLabel=Traduzione corrente
+TranslationToadlet.downloadTranslationsFile=Scarica il file della traduzione
+TranslationToadlet.hideAlreadyTranslated=Nascondi stringhe tradotte
 TranslationToadlet.noCustomTranslations=Nessuna traduzione personalizzata 
disponibile.
 TranslationToadlet.originalVersionLabel=Originale (versione inglese)
 TranslationToadlet.reEdit=Ri-modifica la traduzione
-TranslationToadlet.remove=Rimuovi
+TranslationToadlet.remove=Elimina
 TranslationToadlet.removeOverrideTitle=Elimina una chiave di traduzione
-TranslationToadlet.removeOverrideWarningTitle=Si sta per eliminare una chiave 
di traduzione!
+TranslationToadlet.removeOverrideWarningTitle=Attenzione: la chiave di 
traduzione verr?? eliminata!
 TranslationToadlet.returnToTranslations=Torna alla pagina della traduzione
 TranslationToadlet.showEverything=Mostra tutto, incluse stringhe gi?? tradotte
 TranslationToadlet.translationKeyLabel=Chiave di traduzione
@@ -1226,20 +1254,20 @@
 UpdatedVersionAvailableUserAlert.updateNowButton=Aggiorna Adesso!
 UserAlert.apply=Conferma
 UserAlert.hide=Nascondi
-UserAlert.reset=Reset
-UserAlertManager.alertsOnAlertsPage=| Controllali nella ${link}pagina delle 
avvertenze${/link}.
+UserAlert.reset=Cancella
+UserAlertManager.alertsOnAlertsPage=|  Vedi dettagli alla ${link}pagina delle 
avvertenze${/link}.
 UserAlertManager.alertsOnHomepage=| Sono visibili alla ${link}Homepage di 
Freenet${/link}.
 UserAlertManager.alertsTitle=Notificazioni particolari
 UserAlertManager.clickForMore=Click su un oggetto per maggiori informazioni o 
per sbarazzarsene.
 UserAlertManager.criticalErrorCountLabel=Errori Critici:
-UserAlertManager.dumpEventsButton=Rimuovi notifiche superflue
+UserAlertManager.dumpEventsButton=Elimina notifiche di routine
 UserAlertManager.errorCountLabel=Errori:
 UserAlertManager.minorCountLabel=Minori:
 UserAlertManager.totalLabel=Totale:
 UserAlertManager.warningCountLabel=Avvertenze:
 UserAlertsToadlet.titleWithName=Avvertenze per ${name}
 WelcomeToadlet.activityTitle=Attivit?? in corso
-WelcomeToadlet.alertsSummary=Stato delle avvertenze
+WelcomeToadlet.alertsSummary=Sommario avvertenze
 WelcomeToadlet.arkFetchCount=ARK Fetchers: ${total}
 WelcomeToadlet.confirmAddBookmarkSubTitle=Conferma Aggiunta Sgnalibro
 WelcomeToadlet.confirmAddBookmarkTitle=Aggiungi ai Segnalibri
@@ -1261,7 +1289,7 @@
 WelcomeToadlet.fromHeader=Da
 WelcomeToadlet.goToExternalLink=Vai al link specificato
 WelcomeToadlet.homepageFullTitleWithName=Homepage FProxy di ${name}
-WelcomeToadlet.ieWarning=E' stato rilevato l'uso di Microsoft Internet 
Explorer; ci?? potrebbe costituire un pericolo per l'anonimato in quanto esso 
potrebbe risultare compromesso da alcuni siti interni a Freenet.
+WelcomeToadlet.ieWarning=E' stato rilevato l'uso di Microsoft Internet 
Explorer. Ci?? potrebbe costituire un pericolo per l'anonimato dell'utente.
 WelcomeToadlet.ieWarningTitle=Rischio Sicurezza!
 WelcomeToadlet.insertCount=Inserzioni: ${total}
 WelcomeToadlet.insertFailedTitle=Inserzione fallita
@@ -1280,7 +1308,7 @@
 WelcomeToadlet.restart=Riavvia
 WelcomeToadlet.restartConfirm=Conferma: Riavvia nodo Freenet?
 WelcomeToadlet.restartConfirmTitle=Riavvia Nodo
-WelcomeToadlet.restartNode=Riavvia il nodo
+WelcomeToadlet.restartNode=Riavvia nodo
 WelcomeToadlet.restarting=Si prega di attendere durante il riavvio del nodo. 
Questa schermata  si aggiorner?? automaticamente, fino a mostrare la pagina 
iniziale fi Freenet. Grazie di aver scelto Freenet.
 WelcomeToadlet.restartingTitle=Riavvio del nodo Freenet in corso.
 WelcomeToadlet.shutdown=Arresta
@@ -1294,7 +1322,7 @@
 WelcomeToadlet.targetBoardHeader=Target Board
 WelcomeToadlet.testnetWarning=gira in modalit?? testnet. DISTRUGGE l'anonimato!
 WelcomeToadlet.testnetWarningTitle=Modalit?? Testnet
-WelcomeToadlet.thanks=Grazie per aver scelto Freenet.
+WelcomeToadlet.thanks=Grazie di aver scelto Freenet.
 WelcomeToadlet.threadDumpNotUsingWrapper=Non ?? possibile generare un thread 
dump se il nodo non sta girando nel wrapper
 WelcomeToadlet.threadDumpSubTitle=Generazione di Thread Dump
 WelcomeToadlet.threadDumpTitle=Genera Thread Dump
@@ -1308,7 +1336,7 @@
 WelcomeToadlet.version=Freenet ${fullVersion} Build ${build} r${rev}
 WelcomeToadlet.versionHeader=Informazioni sulla Versione e Controllo del Nodo
 WelcomeToadlet.writtenDatabaseStats=Le statistiche di runtime del database 
sono state scritte nel file di log del wrapper
-WrapperConfig.wrapper.java.maxmemory.long=Memoria massima utilizzabile da 
Freenet. La memoria di cui Freenet a bisogno varia in funzione delle 
diomensioni del datastore. I cambiamenti saranno effettivi dopo il riavvio del 
nodo.
+WrapperConfig.wrapper.java.maxmemory.long=Limita la quantit?? massima di 
memoria utilizzabile da Freenet. Freenet ha bisogno di molta pi?? memoria se si 
hanno molti e/o grossi file in coda di dowload/upload,  ed in misura minore se 
il nodo ?? dotato di un datastore di dimensioni abbondanti.  I cambiamenti 
saranno effettivi dopo il riavvio del nodo.
 WrapperConfig.wrapper.java.maxmemory.short=Memoria massima (in megabytes)
 testing.test=test${test1}test${test2}test
 ???BookmarkEditorToadlet.pasteOrCancel=Click su un'icona incolla o cancella.

Modified: branches/db4o/freenet/src/freenet/l10n/freenet.l10n.zh-cn.properties
===================================================================
--- branches/db4o/freenet/src/freenet/l10n/freenet.l10n.zh-cn.properties        
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/l10n/freenet.l10n.zh-cn.properties        
2008-08-07 18:30:55 UTC (rev 21657)
@@ -1,8 +1,21 @@
+Persistence=forever. 
??????????????????????????????????????????????????????????????????; 
?????????????????????????????????, 
?????????????????????????????????????????????.
+Announcer.announceAlertIntro=Freenet ????????????????????? - 
?????????????????????????????????. ????????????????????????, 
????????????????????????. ????????????????????? Freenet 
????????????????????????, ????????????????????????, ??????????????? 24 
??????????????????.
+Announcer.announceAlertNoSeednodes=????????? seednodes.fref ??????, 
????????????????????????????????????????????????(opennet)???. 
???????????????????????????, ????????? 
http://downloads.freenetproject.org/alpha/opennet/ ?????????????????????.
+Announcer.announceAlertShort=?????????????????????????????????, 
????????????????????????.
+Announcer.announceAlertTitle=???????????????
+Announcer.announceDetails=????????????????????? ${recentSentAnnouncements} 
???????????????, ????????? ${runningAnnouncements} ??????????????????, 
??????????????? ${addedNodes} ?????????(????????? ${refusedNodes} 
??????????????????). ????????????????????? ${connectedSeednodes} 
?????????????????????, ???????????????????????? ${disconnectedSeednodes} 
???????????????.
+Announcer.announceDisabledTooOld=???????????????????????????, 
???????????????????????? Freenet ????????????. ???????????????????????????, 
????????????????????????????????????. 
?????????????????????????????????(????????????????????????????????????????????????,
 ?????????????????????).
+Announcer.announceDisabledTooOldShort=??????????????????????????????, 
???????????? Freenet ???????????????. ???????????????????????????.
+Announcer.announceDisabledTooOldTitle=?????????????????????(????????????)
+Announcer.announceLoading=Freenet ???????????????????????????, 
???????????????????????????????????????. 
??????????????????????????????????????????.
+Announcer.coolingOff=??????????????? ${time} ?????????, 
??????????????????????????????????????????????????????????????????, 
???????????????????????????????????????, ??????????????????????????????.
+Bookmark.noName=??????
 BookmarkEditorToadlet.addBookmark=????????????
 BookmarkEditorToadlet.addCategory=????????????
+BookmarkEditorToadlet.addDefaultBookmarks=??????????????????????????????.
 BookmarkEditorToadlet.addNewBookmark=??????????????????
 BookmarkEditorToadlet.addNewCategory=???????????????
-BookmarkEditorToadlet.addedNewBookmark=??????????????????????????????.
+BookmarkEditorToadlet.addedNewBookmark=??????????????????????????????.
 BookmarkEditorToadlet.addedNewBookmarkTitle=?????????????????????
 BookmarkEditorToadlet.bookmarkDoesNotExist="${bookmark}"?????????????????????.
 BookmarkEditorToadlet.cancelCut=????????????
@@ -18,106 +31,222 @@
 
BookmarkEditorToadlet.deleteCategoryConfirm=??????????????????${bookmark}??????????????????????????????????????????????
 BookmarkEditorToadlet.deleteSucceeded=??????????????????????????????.
 BookmarkEditorToadlet.deleteSucceededTitle=????????????
+BookmarkEditorToadlet.descLabel=????????????:
 BookmarkEditorToadlet.edit=??????
 BookmarkEditorToadlet.editBookmarkTitle=????????????
 BookmarkEditorToadlet.editCategoryTitle=????????????
 BookmarkEditorToadlet.error=??????
+BookmarkEditorToadlet.hasAnActivelinkLabel=?????? freesite 
?????????????????????????
+BookmarkEditorToadlet.invalidKey=?????????Freenet??????.
 BookmarkEditorToadlet.invalidKeyTitle=????????????
-BookmarkEditorToadlet.invalidKeyWithReason=?????????Freenet??????.
+BookmarkEditorToadlet.invalidKeyWithReason=????????? Freenet ??????.
 BookmarkEditorToadlet.keyLabel=??????:
 BookmarkEditorToadlet.moveDown=??????
 BookmarkEditorToadlet.moveUp=??????
 BookmarkEditorToadlet.myBookmarksTitle=????????????
 BookmarkEditorToadlet.nameLabel=??????:
 BookmarkEditorToadlet.paste=??????
-BookmarkEditorToadlet.pasteOrCancel=???????????????????????????????????????,??????????????????.
+BookmarkEditorToadlet.pasteOrCancel=?????????????????????????????????, 
??????????????????.
 BookmarkEditorToadlet.pasteTitle=??????/??????
 BookmarkEditorToadlet.save=??????
 BookmarkEditorToadlet.title=???????????????
+BookmarkEditorToadlet.urlDecodeError=URL????????????
+BookmarkItem.bookmarkUpdated=???????????????????????? ${name} 
?????????????????? ${edition} ???.
+BookmarkItem.bookmarkUpdatedShort=?????????????????? freesite ????????????: 
${name}
+BookmarkItem.bookmarkUpdatedTitle=??????????????????: ${name}
+BookmarkItem.bookmarkUpdatedWithLink=???????????????????????? 
${link}${name}${/link} ?????????????????? ${edition} ???.
+BookmarkItem.deleteBookmarkUpdateNotification=????????????
+BookmarkItem.unnamedBookmark=???????????????
 BookmarkManager.list=????????????
+BookmarkManager.listLong=?????????????????? freesite ??????
+BookmarkManager.malformedBookmark=?????????????????????
 BooleanOption.parseError=????????????????????????: ${val} - ????????? true ??? 
false
-BuildOldAgeUserAlert.tooOld=???????????????????????????????????????????????????????????????????????????????????????????????????(Build
 #${lastgood}). ???????????????????????????, 
??????????????????????????????"??????"?????????????????????. 
(????????????????????????, Freenet ??????????????????????????????????????????)
-BuildOldAgeUserAlert.tooOldShort=????????????????????? Freenet 
??????????????????, ?????????????????????????????????????????????! 
???????????????!
-BuildOldAgeUserAlert.tooOldTitle=???????????????
+BuildOldAgeUserAlert.tooOld=????????????????????????????????????????????????????????????????????????????????????????????????(Build
 #${lastgood}). ???????????????????????????, 
??????????????????????????????"??????"?????????????????????. 
(????????????????????????, Freenet 
?????????????????????????????????????????????)
+BuildOldAgeUserAlert.tooOldShort=??????????????? Freenet 
????????????????????????, ?????????????????????????????????????????????! 
???????????????!
+BuildOldAgeUserAlert.tooOldTitle=????????????
+CSSTokenizerFilter.deletedDisallowedString=???????????????????????????
+CSSTokenizerFilter.deletedUnmatchedChar=????????????????????????:
+CSSTokenizerFilter.deletedUnofficialIdent=????????????????????????
+CSSTokenizerFilter.deletedUnofficialIdentWithURL=???????????????????????? url 
?????????
+CSSTokenizerFilter.invalidURLContents=url() ?????????????????????
+CSSTokenizerFilter.supplementalCharsNotSupported=????????????????????? 0xFFFF 
??? UCS-4 ??????!
+CSSTokenizerFilter.unknownAtIdentifierLabel=????????? @ ?????????:
+ClockProblemDetectedUserAlert.shortText=?????????????????????????????????, 
Freenet ??????????????????.
+ClockProblemDetectedUserAlert.text=Freenet 
??????????????????????????????(???????????????)????????????. 
??????????????????????????????????????????, Freenet ??????????????????.
+ClockProblemDetectedUserAlert.title=?????????????????????.
+ConfigToadlet.appliedFailureExceptions=???????????????????????????, 
???????????????????????????:
+ConfigToadlet.appliedFailureTitle=??????????????????
+ConfigToadlet.appliedSuccess=??????????????????????????????.
 ConfigToadlet.appliedTitle=?????????????????????
 ConfigToadlet.apply=??????
+ConfigToadlet.configNavTitle=????????????
+ConfigToadlet.console=????????????
+ConfigToadlet.contributeTranslation=????????????????????????
+ConfigToadlet.defaultIs=?????????: '${default}'.
+ConfigToadlet.false=???
+ConfigToadlet.fcp=????????????
+ConfigToadlet.fproxy=????????????
 ConfigToadlet.fullTitle=${name} ??? Freenet ????????????
+ConfigToadlet.logger=?????????
+ConfigToadlet.modeAdvanced=??????????????????
+ConfigToadlet.modeSimple=??????????????????
+ConfigToadlet.node=??????
+ConfigToadlet.pluginmanager=???????????????
+ConfigToadlet.pluginmanager2=???????????????2
+ConfigToadlet.possibilitiesTitle=??????
 ConfigToadlet.reset=??????
+ConfigToadlet.returnToNodeConfig=??????????????????
 ConfigToadlet.shortTitle=??????
+ConfigToadlet.ssl=SSL (????????????)
+ConfigToadlet.title=Freenet ????????????
+ConfigToadlet.toadletsymlinker=toadlet???????????????
+ConfigToadlet.true=???
+ConfigToadlet.wrapper=????????????
+ConfigToadlet.wrapperSettingsTitle=??????????????????
+ConfigToadlet.node.load=??????.??????
+ConfigToadlet.node.opennet=??????.????????????
+ConfigToadlet.node.scheduler=??????.?????????
+ConfigToadlet.node.testnet=??????.????????????
+ConfigToadlet.node.updater=??????.????????????
 
ConfigurablePersister.doesNotExistCannotCreate=???????????????????????????????????????.
 
ConfigurablePersister.existsCannotReadWrite=??????????????????????????????????????????
 ConnectionsToadlet.nodeStatus.BACKED OFF=?????????
+ConnectionsToadlet.nodeStatus.BURSTING=?????????
+ConnectionsToadlet.nodeStatus.BUSY=?????????
+ConnectionsToadlet.nodeStatus.CLOCK PROBLEM=????????????
 ConnectionsToadlet.nodeStatus.CONNECTED=?????????
 ConnectionsToadlet.nodeStatus.CONNECTION ERROR=????????????
+ConnectionsToadlet.nodeStatus.DISABLED=?????????
 ConnectionsToadlet.nodeStatus.DISCONNECTED=?????????
+ConnectionsToadlet.nodeStatus.DISCONNECTING=?????????
+ConnectionsToadlet.nodeStatus.LISTEN ONLY=?????????
+ConnectionsToadlet.nodeStatus.LISTENING=?????????
+ConnectionsToadlet.nodeStatus.NEVER CONNECTED=????????????
+ConnectionsToadlet.nodeStatus.ROUTING DISABLED=???????????????
 ConnectionsToadlet.nodeStatus.TOO NEW=??????
 ConnectionsToadlet.nodeStatus.TOO OLD=??????
 ConnectionsToadlet.nodeStatus.UNKNOWN STATUS=????????????
+ConnectivityToadlet.addressTitle=??????
+ConnectivityToadlet.byIPTitle=${ip} ?????????????????????????????? - ${status} 
(????????????????????? ${tunnelLength})
+ConnectivityToadlet.byPortTitle=${port} ?????????????????????????????? - 
${status} (????????????????????? ${tunnelLength})
+ConnectivityToadlet.connectivity=???????????????
 ConnectivityToadlet.connectivityTitle=??????
+ConnectivityToadlet.firstReceiveLeadTime=???????????????????????????
+ConnectivityToadlet.firstSendLeadTime=???????????????????????????
+ConnectivityToadlet.local=??????
+ConnectivityToadlet.localRemoteTitle=??????/??????
+ConnectivityToadlet.noreply=????????????
+ConnectivityToadlet.remote=??????
+ConnectivityToadlet.sentReceivedTitle=??????/???????????????
 ConnectivityToadlet.summaryTitle=??????
-ContentDataFilter.unknownCharset=???????????????????????????????????????????????????.
 ????????????????????????????????????????????????, 
????????????????????????????????????.
+ConnectivityToadlet.title=${nodeName} ??????????????????
+ContentDataFilter.unknownCharset=???????????????????????????????????????????????????.
 ????????????????????????????????????????????????, 
????????????????????????????????????.
 ContentDataFilter.unknownCharsetTitle=???????????????!
 ContentDataFilter.warningUnknownCharsetTitle=??????: ?????????????????? 
(${charset})
+ContentFilter.applicationPdfReadAdvice=Adobe(R) PDF ?????? - ????????????!
+ContentFilter.applicationPdfWriteAdvice=Adobe(R) PDF ?????? - ????????????!
+ContentFilter.imageGifReadAdvice=GIF ?????? - ???????????????
+ContentFilter.imageGifWriteAdvice=GIF ?????? - ???????????????, 
????????????????????????????????????
+ContentFilter.imageIcoReadAdvice=???????????? - ???????????????
+ContentFilter.imageIcoWriteAdvice=???????????? - 
???????????????(?????????????????????????????????????????????????)
+ContentFilter.imageJpegReadAdvice=JPEG ?????? - ???????????????
+ContentFilter.imageJpegWriteAdvice=JPEG ?????? - ???????????????, 
?????????????????? EXIF ??????
+ContentFilter.imagePngReadAdvice=PNG ?????? - ???????????????
+ContentFilter.imagePngWriteAdvice=PNG ?????? - ???????????????, 
????????????????????????????????????????????????
+ContentFilter.textCssReadAdvice=CSS (cascading style sheet, 
??????????????????, ??????????????? HTML) - 
????????????????????????????????????, ??????????????????????????????, 
???????????????
+ContentFilter.textCssWriteAdvice=CSS (cascading style sheet, 
??????????????????, ??????????????? HTML) - ????????????????????????(metadata), 
???????????????
+ContentFilter.textHtmlReadAdvice=HTML - ??????????????????????????????
+ContentFilter.textHtmlWriteAdvice=HTML - 
????????????????????????????????????????????????(metadata); 
?????????????????????
+ContentFilter.textPlainReadAdvice=????????? - 
?????????????????????????????????(????????? IE, Internet 
Explorer)??????????????????
+ContentFilter.textPlainWriteAdvice=????????? - 
????????????????????????????????????, ???????????????
 DarknetConnectionsToadlet.activityInserts=??????: 
??????${totalSenders}????????????, ${CHKhandlers}???CHK?????????, 
${SSKhandlers}???SSK?????????
 DarknetConnectionsToadlet.activityRequests=??????: 
??????${totalSenders}????????????, ${CHKhandlers}???CHK?????????, 
${SSKhandlers}???SSK?????????
 DarknetConnectionsToadlet.activityTitle=????????????
 DarknetConnectionsToadlet.add=??????
 DarknetConnectionsToadlet.addPeerTitle=??????????????????
-DarknetConnectionsToadlet.backedOff=?????????????????????:????????????????????????????????????,?????????????????????????????????.
+DarknetConnectionsToadlet.alreadyInReferences=???????????????????????????.
+DarknetConnectionsToadlet.backedOff=?????????????????????: 
????????????????????????????????????, ?????????????????????????????????.
 DarknetConnectionsToadlet.backedOffShort=?????????
-DarknetConnectionsToadlet.busy=??????:????????????????????????,??????????????????????????????????????????????????????,??????????????????????????????????????????.
+DarknetConnectionsToadlet.bursting=?????????????????????: 
????????????????????????, ????????????????????????????????????, 
?????????????????????????????????????????????.
+DarknetConnectionsToadlet.burstingShort=?????????
+DarknetConnectionsToadlet.busy=??????: ????????????????????????, 
??????????????????????????????????????????????????????, 
???????????????????????????????????????.
 DarknetConnectionsToadlet.busyShort=??????
 DarknetConnectionsToadlet.cancel=??????
 DarknetConnectionsToadlet.cantFetchNoderefURL=????????? ${url} 
??????????????????.???????????????.
 
DarknetConnectionsToadlet.cantParseTryAgain=????????????????????????????????????:(${error}).???????????????.
 
DarknetConnectionsToadlet.cantParseWrongEnding=???????????????????????????:?????????????????????????????????End??????,?????????????????????????????????:${end}
+DarknetConnectionsToadlet.clockProblem=??????????????????????????????????????? 
24 ??????. ??????????????????????????????, 
????????????????????????????????????????????????????????????.
+DarknetConnectionsToadlet.clockProblemShort=????????????
+DarknetConnectionsToadlet.confirmRemoveNode=???????????????????????? "${name}" 
???? ?????????????????????????????????, ???????????????????????????, 
??????????????????????????????????????????????????????, 
???????????????????????????.
 DarknetConnectionsToadlet.confirmRemoveNodeTitle=?????????
 DarknetConnectionsToadlet.confirmRemoveNodeWarningTitle=????????????
+DarknetConnectionsToadlet.connError=????????????(????????????????)
+DarknetConnectionsToadlet.connErrorShort=????????????
 DarknetConnectionsToadlet.connected=?????????:??????????????????????????????
 DarknetConnectionsToadlet.connectedShort=?????????
-DarknetConnectionsToadlet.disabled=?????????????????????:????????????????????????????????????????????????.
-DarknetConnectionsToadlet.disabledShort=?????????
+DarknetConnectionsToadlet.darknetFnpPort=????????????(Darknet) FNP: 
${port}/UDP (???????????????????????????, ?????????"??????", ????????????; 
?????????????????????????????????????????????)
+DarknetConnectionsToadlet.disabled=?????????????????????: 
?????????????????????????????????????????????????????????.
+DarknetConnectionsToadlet.disabledShort=?????????
+DarknetConnectionsToadlet.disconnecting=????????? (?????????????????????, 
?????????????????????????????????, ????????????????????????)
+DarknetConnectionsToadlet.disconnectingShort=?????????
 DarknetConnectionsToadlet.enterDescription=???????????????:
+DarknetConnectionsToadlet.failedToAddNodeInternalError=??????????????????????????????????????????.
 ????????????????????????????????????:
 
DarknetConnectionsToadlet.failedToAddNodeInternalErrorTitle=??????????????????:????????????
 DarknetConnectionsToadlet.failedToAddNodeTitle=??????????????????
-DarknetConnectionsToadlet.fcpPort=FCP: ${port}/tcp 
(???Frost,Thaw???Freenet?????????????????????)
-DarknetConnectionsToadlet.fileReference=??????????????????????????????????????????:
+DarknetConnectionsToadlet.fcpDisabled=FCP ???????????? (??? Freenet 
???????????????, ?????? Frost ??? Thaw ??????)
+DarknetConnectionsToadlet.fcpPort=FCP: ${port}/TCP (??? Frost, Thaw ??? 
Freenet ?????????????????????)
+DarknetConnectionsToadlet.fileReference=?????????????????????????????????????????????:
 DarknetConnectionsToadlet.fnpPort=FNP: ${port}/udp 
(?????????????????????;??????????????????????????????????????????)
 DarknetConnectionsToadlet.forceRemove=????????????
 
DarknetConnectionsToadlet.fproxyDisabled=FProxy?????????????????????)???????????????
-DarknetConnectionsToadlet.fproxyPort=FProxy: ${port}/tcp (???web????????????)
+DarknetConnectionsToadlet.fproxyPort=FProxy: ${port}/TCP (??????????????????)
 DarknetConnectionsToadlet.fullTitle=${name}???${counts}?????????
 DarknetConnectionsToadlet.go=??????
 
DarknetConnectionsToadlet.idleTime=??????????????????????????????????????????????????????
 DarknetConnectionsToadlet.idleTimeTitle=?????????????????????
 
DarknetConnectionsToadlet.invalidSignature=??????????????????????????????????????????(${error}).
+DarknetConnectionsToadlet.ipAddress=??????????????????, ??? 
<??????>:<????????????> ??????
 DarknetConnectionsToadlet.ipAddressTitle=??????
+DarknetConnectionsToadlet.listenOnly=?????????????????????: 
???????????????????????????????????????, 
?????????????????????????????????????????????.
+DarknetConnectionsToadlet.listenOnlyShort=????????????
+DarknetConnectionsToadlet.listening=?????????????????????: 
???????????????????????????????????????, 
?????????????????????????????????????????????.
 DarknetConnectionsToadlet.listeningShort=?????????
 DarknetConnectionsToadlet.myFriends=????????????
 
DarknetConnectionsToadlet.myReferenceHeader=${linkref}??????????????????${/linkref}
 (${linktext}????????????${/linktext})
-DarknetConnectionsToadlet.nameClickToMessage=????????????.????????????????????????????????????????????????????????????
+DarknetConnectionsToadlet.nameClickToMessage=????????????. 
????????????????????????????????????????????????????????????
 DarknetConnectionsToadlet.nameTitle=??????
-DarknetConnectionsToadlet.neverConnected=????????????:????????????????????????????????????????????????.
+DarknetConnectionsToadlet.neverConnected=????????????: 
?????????????????????????????????????????????.
 DarknetConnectionsToadlet.neverConnectedShort=????????????
 
DarknetConnectionsToadlet.noPeersFirstHalf=Freenet???????????????????????????????????????,?????????????????????.??????
 
DarknetConnectionsToadlet.noPeersSecondHalf=??????,?????????????????????????????????????????????.
+DarknetConnectionsToadlet.noPeersWithHomepageLink=Freenet 
?????????????????????????????????????????????????????????. 
??????${link}????????????${/link}??????????????????????????????, 
???????????????????????????.
 
DarknetConnectionsToadlet.noRefOrURL=?????????????????????????????????????????????URL.
 ???????????????.
-DarknetConnectionsToadlet.nodePortsTitle=????????????????????????
-DarknetConnectionsToadlet.notConnected=?????????:???????????????,??????????????????????????????????????????????????????.
+DarknetConnectionsToadlet.nodePortsTitle=???????????????????????????
+DarknetConnectionsToadlet.notConnected=?????????: ???????????????, 
??????????????????????????????????????????
 DarknetConnectionsToadlet.notConnectedShort=?????????
-DarknetConnectionsToadlet.pasteReference=?????????????????????????????????:
-DarknetConnectionsToadlet.privateNote=??????????????????????????????
+DarknetConnectionsToadlet.opennetFnpPort=????????????(Opennet) FNP: 
${port}/UDP (??????????????????????????????, ?????????"?????????", 
????????????; ??????????????????????????????????????????)
+DarknetConnectionsToadlet.pasteReference=?????????????????????????????????:
+DarknetConnectionsToadlet.privateNote=?????????????????????????????????
 DarknetConnectionsToadlet.privateNoteTitle=????????????
 
DarknetConnectionsToadlet.referenceCopyWarning=?????????????????????${bold}????????????${/bold}??????.??????????????????${bold}????????????${/bold}.
 DarknetConnectionsToadlet.remove=?????????!
 DarknetConnectionsToadlet.removePeers=?????????????????????
+DarknetConnectionsToadlet.routingDisabled=?????????????????? 
(???????????????????????????????????????, 
??????????????????????????????????????????)
+DarknetConnectionsToadlet.routingDisabledShort=??????????????????
+DarknetConnectionsToadlet.seedClients=?????????????????????????????????????????????.
+DarknetConnectionsToadlet.seedClientsShort=????????????
+DarknetConnectionsToadlet.seedServers=????????????????????????????????????.
 DarknetConnectionsToadlet.seedServersShort=??????
 DarknetConnectionsToadlet.selectAction=-- ???????????? --
-DarknetConnectionsToadlet.sendMessageTitle=???????????????????????????
-DarknetConnectionsToadlet.sendMessageToPeers=?????????????????????????????????????????????
+DarknetConnectionsToadlet.sendMessageTitle=???????????????????????????
+DarknetConnectionsToadlet.sendMessageToPeers=?????????????????????????????????????????????
+DarknetConnectionsToadlet.separator=??? ??? ???
 DarknetConnectionsToadlet.statusTitle=??????
-DarknetConnectionsToadlet.tmciPort=TMCI: ${port}/tcp 
(??????telnet????????????????????????)
+DarknetConnectionsToadlet.tmciDisabled=TMCI ???????????? (?????? telnet 
????????????????????????)
+DarknetConnectionsToadlet.tmciPort=TMCI: ${port}/TCP (?????? telnet 
????????????????????????)
+DarknetConnectionsToadlet.tooNew=?????????????????????: 
????????????????????????????????????????????????????????????.
 DarknetConnectionsToadlet.tooNewShort=??????
+DarknetConnectionsToadlet.tooOld=?????????????????????: 
????????????????????????????????????????????????????????????. 
???????????????????????????????????????.
 DarknetConnectionsToadlet.tooOldShort=??????
 DarknetConnectionsToadlet.transferringRequests=????????????: 
${senders}????????????, ${receivers}????????????
 
DarknetConnectionsToadlet.triedToAddSelf=????????????????????????????????????????????????.
@@ -125,132 +254,746 @@
 DarknetConnectionsToadlet.updateChangedPrivnotes=??????????????????????????????
 DarknetConnectionsToadlet.urlReference=????????????????????????URL:
 DarknetConnectionsToadlet.versionTitle=??????
+ExtOldAgeUserAlert.extTooOld=?????? freenet-ext.jar 
???????????????????????????, 
?????????????????????????????????????????????????????????: 
http://downloads.freenetproject.org/alpha/freenet-ext.jar.
+ExtOldAgeUserAlert.extTooOldShort=?????? freenet-ext.jar ???????????????. 
???????????????.
+ExtOldAgeUserAlert.extTooOldTitle=Freenet-ext ??????
+FProxyToadlet.abortToHomepage=?????????????????? FProxy ??????
+FProxyToadlet.alerts=?????????????????????
 FProxyToadlet.alertsTitle=??????
+FProxyToadlet.backToFProxy=${link}?????????${/link}?????? FProxy ??????.
+FProxyToadlet.backToReferrer=${link}?????????${/link}??????????????????.
+FProxyToadlet.cantBindPort=Fproxy ????????????????????????????????????!
 FProxyToadlet.config=??????/??????????????????
 FProxyToadlet.configTitle=??????
 FProxyToadlet.dangerousContentTitle=????????????????????????
+FProxyToadlet.dangerousRSS=Freenet 
????????????????????????????????????????????? RSS ??????. Freenet 
?????????????????? RSS ??????, ?????? RSS 
???????????????????????????(???????????????????????????, 
??????????????????????????????????????????????????????, 
????????????????????????). Firefox 2.0 ??? Internet Explorer 7.0 
???????????????????????? RSS ????????????, ????????????????????????????????? 
"${type}".
+FProxyToadlet.dangerousRSSSubtitle=RSS ??????????????????????????????
 FProxyToadlet.dangerousRSSTitle=???????????????????????? (RSS)
+FProxyToadlet.downloadInBackgroundToDisk=???????????????????????????????????????????????????
+FProxyToadlet.errorIsFatal=?????????????????????. 
???????????????????????????????????????.
+FProxyToadlet.errorWithReason=??????: ${error}
+FProxyToadlet.expectedKeyButGot=???????????? Freenet ??????, 
??????????????????:
+FProxyToadlet.expectedMimeType=?????? MIME ??????: ${mime}
+FProxyToadlet.explanationTitle=??????
+FProxyToadlet.fetchLargeFileAnywayAndDisplay=???????????????, 
?????????????????????????????????????????????
+FProxyToadlet.fileInformationTitle=????????????
+FProxyToadlet.filenameLabel=??????:
 FProxyToadlet.friends=??????????????????
 FProxyToadlet.friendsTitle=??????
 FProxyToadlet.goBack=???????????????
+FProxyToadlet.goBackToPrev=???????????????
 FProxyToadlet.homepage=??????
+FProxyToadlet.invalidKeyTitle=??????????????????
+FProxyToadlet.invalidKeyWithReason=??????????????????: ${reason}
+FProxyToadlet.largeFile=??????
+FProxyToadlet.largeFileExplanationAndOptions=????????? Freenet 
?????????????????????. 
????????????????????????????????????????????????????????????, ?????? Freenet 
???????????????????????????????????????. ?????????????????????:
+FProxyToadlet.mayChange=(?????????)
 FProxyToadlet.mimeType=MIME ?????????${mime}
-FProxyToadlet.openForce=???${link}??????${/link}??????????????? ${mime} 
????????????????????????????????????????????????
-FProxyToadlet.opennetTitle=??????
+FProxyToadlet.notEnoughMetaStrings=?????????????????????
+FProxyToadlet.notFoundTitle=?????????
+FProxyToadlet.openAsText=${link}?????????${/link}?????????????????????????????????
 (?????????????????????, ??????????????????????????????).
+FProxyToadlet.openAsThawIndex=${link}?????????${/link}?????? thaw 
???????????????????????????(????????????????????????!).
+FProxyToadlet.openForce=${link}?????????${/link}??????????????? ${mime} 
????????????????????????????????????????????????.
+FProxyToadlet.openForceDisk=${link}?????????${/link}????????????????????????????????????????????????.
+FProxyToadlet.openPossRSSAsPlainText=${link}?????????${/link}?????????????????????????????????(???
 IE7 ?????? FF2 ???${bold}??????????????????s${/bold}).
+FProxyToadlet.openPossRSSForceDisk=${link}?????????${/link}????????????????????????????????????????????????(???????????????
 Firefox 2.0.0, ${bold}??????????????????????????????${/bold}, 2.0.1 
?????????????????????????????????).
+FProxyToadlet.openRSSAsRSS=${link}?????????${/link}?????? RSS 
?????????????????? 
(???????????????????????????????????????${bold}????????????${/bold}, Freenet 
???????????????????????? RSS ????????????).
+FProxyToadlet.openRSSForce=${link}????????????${/link}?????? ${mime} 
??????????????????(??? IE7 ?????? FF2 ???${bold}??????????????????${/bold}).
+FProxyToadlet.opennet=????????????????????????
+FProxyToadlet.opennetTitle=?????????
+FProxyToadlet.options=???????????????:
+FProxyToadlet.pathNotFound=?????????????????????.
 FProxyToadlet.pathNotFoundTitle=?????????????????????
+FProxyToadlet.plugins=?????????????????????
 FProxyToadlet.pluginsTitle=??????
 FProxyToadlet.queue=????????????????????????
 FProxyToadlet.queueTitle=??????
+FProxyToadlet.retryNow=????????????
+FProxyToadlet.sizeLabel=??????:
 FProxyToadlet.sizeUnknown=??????????????????
+FProxyToadlet.stats=??????????????????
 FProxyToadlet.statsTitle=??????
 FProxyToadlet.translationTitle=??????
+FProxyToadlet.unableToRetrieve=Freenet ????????????????????????.
 FProxyToadlet.unknownMIMEType=MIME ??????????????????
 FProxyToadlet.welcome=??????
 FProxyToadlet.welcomeTitle=??????
 FcpServer.allowedHosts=??????????????????(????????????????????????)
 FcpServer.allowedHostsFullAccess=?????????????????????????????????
+FcpServer.allowedHostsFullAccessLong=?????????????????????????????????????????????.
 ??????????????????????????????????????????????????????, ??????????????????. 
??????, ???????????????????????????????????????????????????!
 
FcpServer.allowedHostsLong=??????????????????????????????IP??????????????????????????????????????????????????????????????????IP???????????????CIDR?????????IP????????????(???
 192.168.0.0/24)???
+FcpServer.assumeDownloadDDAIsAllowed=????????????????????? DDA?
+FcpServer.assumeDownloadDDAIsAllowedLong=?????????????????????????????????????????????(DDA)?
 ?????????, ?????????????????? DDA ????????????????????? TestDDARequest ??????.
+FcpServer.assumeUploadDDAIsAllowed=????????????????????? DDA?
+FcpServer.assumeUploadDDAIsAllowedLong=?????????????????????????????????????????????(DDA)?
 ?????????, ?????????????????? DDA ????????????????????? TestDDARequest ??????.
+FcpServer.bindTo=??????????????????
+FcpServer.bindToLong=FCP ???????????????????????????????????????.
+FcpServer.cannotStartOrStopOnTheFly=????????????????????????????????? FCP 
?????????
+FcpServer.couldNotChangeBindTo=???????????? FCP ?????????????????????: 
${error}.
+FcpServer.downloadsFileCanCreateCannotReadOrWrite=?????????????????????????????????
+FcpServer.downloadsFileDoesNotExistCannotCreate=?????????????????????????????????
+FcpServer.downloadsFileExistsCannotReadOrWrite=?????????????????????????????????
+FcpServer.downloadsFileIsDirectory=???????????????????????????????????????: 
??????????????????
+FcpServer.downloadsFileParentDoesNotExist=?????????????????????
+FcpServer.downloadsFileUnreadable=?????????????????????????????????
+FcpServer.enablePersistentDownload=??????????????????????
+FcpServer.enablePersistentDownloadLong=??????????????? FCP ???????????? 
+FcpServer.filenameToStorePData=??????????????????????????????
+FcpServer.filenameToStorePDataLong=???????????????????????????????????????
+FcpServer.intervalBetweenWrites=?????????????????????????????????????????????
+FcpServer.intervalBetweenWritesLong=?????????????????????????????????????????????.
 FcpServer.isEnabled=??????FCP?????????
+FcpServer.isEnabledLong=???????????? Freenet ???????????????(FCP)?????????
 FcpServer.portNumber=FCP???
+FcpServer.portNumberLong=FCP ???????????????????????? TCP ????????????
+FcpServer.ssl=?????? SSL?
+FcpServer.sslLong=????????? FCP ?????????????????? SSL
+FetchException.longError.1=?????????????????????????????????
+FetchException.longError.10=????????????????????????
+FetchException.longError.11=????????????????????? - ?????????????????????? 
?????????????????????
+FetchException.longError.12=?????????????????????, 
????????????????????????????????????????
+FetchException.longError.13=???????????????
+FetchException.longError.14=??????????????? - 
???????????????????????????????????????????????????
+FetchException.longError.15=????????????????????????????????????
+FetchException.longError.16=?????????????????? - ???????????????????
+FetchException.longError.17=????????????, ??????????????????
+FetchException.longError.18=??????????????????, ??????????????????????????????
+FetchException.longError.19=???????????????
+FetchException.longError.2=?????????????????????????????????
+FetchException.longError.20=URI ????????????
+FetchException.longError.21=????????????
+FetchException.longError.22=??????????????????
+FetchException.longError.23=??????????????????????????????
+FetchException.longError.24=?????? URI 
??????????????????????????????(????????????)
+FetchException.longError.25=?????????
+FetchException.longError.26=??????????????????
+FetchException.longError.27=???????????????: ???????????? URI
+FetchException.longError.28=????????????????????????; 
??????????????????????????????, ?????????????????????????????????
+FetchException.longError.29=????????? MIME ??????: 
??????????????????????????????????????????????????????
+FetchException.longError.3=????????????????????????????????????
+FetchException.longError.30=??????????????????????????????, 
??????????????????????????????????????????????????????, ?????????????????????.
+FetchException.longError.4=????????????????????????
+FetchException.longError.5=?????????????????????????????????
+FetchException.longError.6=?????????????????????
+FetchException.longError.7=??????????????????????????????????????????
+FetchException.longError.8=?????????????????????????????????????????????????????????
+FetchException.longError.9=??????(??????)????????????
+FetchException.shortError.1=?????????????????????
+FetchException.shortError.10=??????????????????
+FetchException.shortError.11=?????????????????????
+FetchException.shortError.12=???????????????
+FetchException.shortError.13=???????????????
+FetchException.shortError.14=???????????????
+FetchException.shortError.15=???????????????
+FetchException.shortError.16=??????????????????
+FetchException.shortError.17=????????????
+FetchException.shortError.18=????????????
+FetchException.shortError.19=???????????????
+FetchException.shortError.2=?????????????????????????????????
+FetchException.shortError.20=URI ????????????
+FetchException.shortError.21=????????????
+FetchException.shortError.22=??????????????????
+FetchException.shortError.23=??????????????????????????????
+FetchException.shortError.24=?????????????????????
+FetchException.shortError.25=??????????????????
+FetchException.shortError.26=??????????????????
+FetchException.shortError.27=?????? URI
+FetchException.shortError.28=?????????????????????
+FetchException.shortError.29=????????? MIME ??????
+FetchException.shortError.3=?????????????????????
+FetchException.shortError.30=???????????????(??????????????????)
+FetchException.shortError.4=????????????????????????
+FetchException.shortError.5=???????????????
+FetchException.shortError.6=??????????????????
+FetchException.shortError.7=??????????????????????????????
+FetchException.shortError.8=???????????????????????????
+FetchException.shortError.9=???????????????
+FileOffer.acceptTransferButton=????????????
+FileOffer.askUserTitle=??????????????????
+FileOffer.commentLabel=??????:
+FileOffer.failedReceiveHeader=??? ${node} ???????????? ${filename} ??????.
+FileOffer.failedReceiveShort=??? ${node} ???????????? ${filename} ??????.
+FileOffer.failedReceiveTitle=??????????????????
+FileOffer.fileLabel=??????:
+FileOffer.mimeLabel=MIME ??????:
+FileOffer.offeredFileHeader=?????? ${name} ???????????????:
+FileOffer.offeredFileShort=???????????? ${node} ??????????????? ${filename}.
+FileOffer.rejectTransferButton=????????????
+FileOffer.senderLabel=?????????:
+FileOffer.sizeLabel=??????:
+FileOffer.succeededReceiveHeader=??? ${node} ???????????? ${filename} ??????.
+FileOffer.succeededReceiveShort=??? ${node} ?????? ${filename} ?????????.
+FileOffer.succeededReceiveTitle=??????????????????
 FirstTimeWizardToadlet.bandwidthLimit=????????????
 
FirstTimeWizardToadlet.bandwidthLimitLong=???????????????????????????????????????????????????????????????
 FirstTimeWizardToadlet.bwlimitHigherSpeed=?????????
 FirstTimeWizardToadlet.bwlimitLowerSpeed=?????????
 FirstTimeWizardToadlet.chooseNodeName=????????????????????????
+FirstTimeWizardToadlet.chooseNodeNameLong=???????????????????????????????????????(?????????????????????,
 ????????????????????????????????????). 
???????????????????????????(?????????????????????????????????????????????)?????????????????????????????????.
 ?????????(?????????????????????????????????????????????)?????????????????????. 
?????????, 
?????????????????????????????????????????????????????????????????????????????????,
 ????????????????????????????????????, 
??????????????????????????????????????????????????????.
 FirstTimeWizardToadlet.clickContinue=??????????????????
 FirstTimeWizardToadlet.congratz=????????????????????????
+FirstTimeWizardToadlet.congratzLong=??????, ????????????????????????????????? 
Freenet ?????????. 
????????????"??????"?????????????????????????????????????????????, 
????????????????????????????????????????????????. ?????????, Freenet 
???????????????????????????, ?????????????????????. 
?????????????????????????????????????????? Freenet. ?????????????????? Freenet 
??????????????????.
 FirstTimeWizardToadlet.connectToStrangers=?????????????????????
-FirstTimeWizardToadlet.connectToStrangersLong=????????????????????? Freenet 
????????????????????????????????????????????????????????????????????????????????????????????????????????????
 
Freenet????????????????????????????????????????????????????????????Freenet??????????????????????????????????????????????????????????????????????????????????????????
+FirstTimeWizardToadlet.connectToStrangersLong=????????????????????? Freenet 
????????????????????????????????????????????????????????????????????????????????????????????????????????????
 Freenet????????????????????????????????????????????? Freenet 
????????????????????????????????????????????????????????????????????????????????????????????????????????????
 FirstTimeWizardToadlet.continue=??????
 FirstTimeWizardToadlet.continueEnd=?????????????????????Freenet???
+FirstTimeWizardToadlet.datastoreSize=??????????????????
 
FirstTimeWizardToadlet.datastoreSizeLong=????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
 FirstTimeWizardToadlet.enableOpennet=??????????????????????????? Freenet ??????
-FirstTimeWizardToadlet.fivePercentDisk=?????? 5% ??????????????????
+FirstTimeWizardToadlet.fivePercentDisk=(??? 5% ?????????????????????)
 FirstTimeWizardToadlet.homepageTitle=Freenet ?????????????????????
 FirstTimeWizardToadlet.iDoTrust=???????????????????????? ${interface} (${ip}) 
????????????
 FirstTimeWizardToadlet.isNetworkTrusted=?????????????????????????????????
+FirstTimeWizardToadlet.isNetworkTrustedLong=?????????????????????????????????????
 ??????????????????, 
???????????????????????????????????????????????????????????????????????????????????????.
 ??????????????????????????????, 
????????????????????????????????????????????????????????????.
+FirstTimeWizardToadlet.memoryLimit=???????????????
 FirstTimeWizardToadlet.memoryLimitLong=???????????? Freenet 
??????????????????????????????????????????????????????/?????????Freenet 
?????????????????????????????????????????????????????????????????????????????????????????????????????????
 128MB ????????????????????? 1GB ????????????????????????????????? 
256MB????????????????????????????????? Freenet ???????????????
 FirstTimeWizardToadlet.noNetworkIF=???????????????????????????
 FirstTimeWizardToadlet.noNetworkIFLong=Freenet 
????????????????????????????????????????????????????????????????????? Freenet???
 
FirstTimeWizardToadlet.opennetNo=????????????????????????????????????????????????
 Freenet ?????????????????????????????????????????????????????????
-FirstTimeWizardToadlet.opennetWarning=?????? Freenet 
?????????????????????????????????????????????????????? Freenet 
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????Freenet
 ?????????????????????????????????????????????????????????????????????
+FirstTimeWizardToadlet.opennetWarning=?????? Freenet 
?????????????????????????????????????????????????????? Freenet 
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????Freenet
 ??????????????????????????????????????????????????????????????????
 
FirstTimeWizardToadlet.opennetYes=?????????????????????????????????????????????????????????
 FirstTimeWizardToadlet.skipWizard=??????????????????????????????????????????
+FirstTimeWizardToadlet.step1Title=Freenet ????????????????????? - 
??????????????????
+FirstTimeWizardToadlet.step2Title=Freenet ??????????????????! - 
??????????????????
 FirstTimeWizardToadlet.step3Title=Freenet ?????????????????? - ????????????
 FirstTimeWizardToadlet.step4Title=Freenet ?????????????????? - 
??????????????????
+FirstTimeWizardToadlet.step5Title=Freenet ??????????????????! - ????????????
 FirstTimeWizardToadlet.step6Title=Freenet ?????????????????? - 
??????????????????
+FirstTimeWizardToadlet.step7Title=Freenet ??????????????????! - ??????, 
??????????????????????????????
+FirstTimeWizardToadlet.tenPercentDisk=(??? 10% ?????????????????????)
+FirstTimeWizardToadlet.warningTitle=??????!
+FirstTimeWizardToadlet.welcomeInfoboxContent1=Freenet 
????????????????????????????????????. 
??????????????????????????????????????????????????????????????????????????????.
 FirstTimeWizardToadlet.welcomeInfoboxTitle=???????????? Freenet 
?????????????????????
+FirstTimeWizardToadlet.memory.128M=128 ?????????(MiB) - ??????????????????
+FirstTimeWizardToadlet.memory.192M=192 ?????????(MiB) - ??????????????????
+FirstTimeWizardToadlet.memory.256M=256 ?????????(MiB) - ?????????????????? 1GB 
??????
+FirstTimeWizardToadlet.memory.512M=512 ?????????(MiB) - 
???????????????????????????
+FirstTimeWizardToadlet.memory.64M=64 ?????????(MiB) - 
???????????????????????????
+GIFFilter.invalidHeader=??????????????????????????? GIF ??????.
+GIFFilter.invalidHeaderTitle=??????????????????
+GIFFilter.notGif=??????????????????????????????????????? GIF ???. 
?????????????????????????????????, 
???????????????????????????????????????????????????, 
???????????????????????????.
+GIFFilter.tooShort=??? GIF ?????????????????????????????????.
+GIFFilter.tooShortTitle=????????????
+GenericReadFilterCallback.couldNotParseAbsoluteFreenetURI=????????????????????????
 Freenet URI
+GenericReadFilterCallback.couldNotParseFormURIWithError=????????????????????????
 URI ??????: ${error}
+GenericReadFilterCallback.couldNotParseRelativeFreenetURI=????????????????????????
 Freenet URI
+GenericReadFilterCallback.couldNotParseURIWithError=???????????????????????? 
URI: ${error}
+GenericReadFilterCallback.invalidFormURI=??????????????? URI: 
??????????????????
+GenericReadFilterCallback.invalidFormURIAttemptToEscape=????????????????????????
 GenericReadFilterCallback.malformedAbsoluteURL=?????????????????? URL 
?????????${error}
 GenericReadFilterCallback.malformedRelativeURL=?????????????????? URL 
?????????${error}
+GenericReadFilterCallback.protocolNotEscaped=????????????????????????: 
${protocol}
+HTMLFilter.couldNotParseStyle=?????????????????????????????????
+HTMLFilter.deletedUnknownStyle=?????????????????????
+HTMLFilter.failedToParseLabel=HTML ?????????????????????????????????
+HTMLFilter.tooManyNestedStyleOrScriptTags=???????????????????????????????????????
 - ???????????????????????????????????????
+HTMLFilter.tooManyNestedStyleOrScriptTagsLong=?????? </style> ??????????????? 
- ???????????????????????????????????????, ???????????????????????????, 
???????????????????????????????????? - 
????????????????????????????????????????????????
+HTMLFilter.unknownTag=??????????????? ${tag}
+IPDetectorPluginManager.connectionProblems=????????????:
+IPDetectorPluginManager.direct=?????????????????????????????????????????????. 
??????, ??????????????????????????????????????? Freenet ??????.
+IPDetectorPluginManager.directTitle=??????????????????????????????
+IPDetectorPluginManager.forwardPortMaybeForwarded=???????????????????????????????????????????????????(NAT,
 ????????????????????????)??????. ??????????????????, ???????????????????????? 
UDP (?????? TCP) ???????????? ${port}, ?????????????????????. 
??????????????????????????????; Freenet 
??????????????????????????????????????????. 
????????????????????????${link}??????${/link}.
+IPDetectorPluginManager.forwardPortNotForwarded=???????????????????????????????????????????????????(NAT,
 ????????????????????????)??????. ??????????????????, ???????????????????????? 
UDP (?????? TCP) ???????????? ${port}, ?????????????????????. 
???????????????????????????????????????, ?????? Freenet ????????????. 
????????????????????????${link}??????${/link}.
+IPDetectorPluginManager.forwardPortShortMaybeForwarded=?????? UDP ??? ${port} 
???????????? (???????????????????????????).
+IPDetectorPluginManager.forwardPortShortNotForwarded=?????? UDP ??? ${port} 
???????????? (?????????????????????).
+IPDetectorPluginManager.forwardTwoPortsMaybeForwarded=???????????????????????????????????????????????????(NAT,
 ????????????????????????)??????. ??????????????????, ???????????????????????? 
UDP (?????? TCP) ???????????? ${port1} ??? ${port2}, ?????????????????????. 
??????????????????????????????; Freenet 
??????????????????????????????????????????. 
????????????????????????${link}??????${/link}.
+IPDetectorPluginManager.forwardTwoPortsNotForwarded=???????????????????????????????????????????????????(NAT,
 ????????????????????????)??????. ??????????????????, ???????????????????????? 
UDP (?????? TCP) ???????????? ${port1} ??? ${port2}, ?????????????????????. 
???????????????????????????????????????, ?????? Freenet ????????????. 
????????????????????????${link}??????${/link}.
+IPDetectorPluginManager.forwardTwoPortsShortMaybeForwarded=?????? UDP ??? 
${port1} ??? ${port2} ???????????? (???????????????????????????).
+IPDetectorPluginManager.forwardTwoPortsShortNotForwarded=?????? UDP ??? 
${port1} and ${port2} ???????????? (?????????????????????).
+IPDetectorPluginManager.fullCone=??????????????????????????????????????????"??????????????????"??????????????????(NAT).
 ??????, ??????????????????????????????????????? Freenet ??????.
+IPDetectorPluginManager.fullConeTitle=??????????????????????????????????????????
+IPDetectorPluginManager.maybeAlreadyForwarded=???????????????????????????(Freenet
 ?????????????????????).
+IPDetectorPluginManager.noConnectivity=??????????????????????????????????????????
 UDP. ??????????????????, ?????? Freenet 
???????????????????????????????????????.
+IPDetectorPluginManager.noConnectivityTitle=?????? UDP ????????????
+IPDetectorPluginManager.noConnectivityshort=?????????????????????: ?????? UDP 
????????????, Freenet ????????????!
+IPDetectorPluginManager.portForwardHelpURL=http://wiki.freenetproject.org/FirewallAndRouterIssues
+IPDetectorPluginManager.portRestricted=??????????????????????????????????????????????????????????????????????????????????????????(NAT)???????????????.
 ???????????????????????????????????????, 
???????????????????????????????????????????????????????????????.
+IPDetectorPluginManager.portRestrictedTitle=??????????????????????????????????????????????????????
+IPDetectorPluginManager.restricted=????????????????????????????????????"??????????????????"??????????????????(NAT).
 ?????????????????????????????????????????????.
+IPDetectorPluginManager.restrictedTitle=??????????????????????????????????????????
+IPDetectorPluginManager.seriousConnectionProblems=?????????????????????:
+IPDetectorPluginManager.suggestForwardPort=?????????????????????????????????????????????(UDP
 ?????? ${port}). (?????? 
http://wiki.freenetproject.org/FirewallAndRouterIssues ).
+IPDetectorPluginManager.suggestForwardPortWithLink=???????????????????????????${link}??????????????????${/link}(UDP
 ?????? ${port}) (??????????????????????????????, Freenet 
?????????????????????).
+IPDetectorPluginManager.suggestForwardTwoPorts=Y?????????????????????????????????????????????(UDP
 ?????? ${port1} ??? ${port2}). (?????? 
http://wiki.freenetproject.org/FirewallAndRouterIssues ).
+IPDetectorPluginManager.suggestForwardTwoPortsWithLink=???????????????????????????${link}??????????????????${/link}(UDP
 ?????? ${port1} ??? ${port2}) (??????????????????????????????, Freenet 
?????????????????????).
+IPDetectorPluginManager.symmetric=????????????????????????????????????????????????????????????????????????(NAT)???????????????.
 ????????????????????????????????????????????????????????????, 
???????????????????????????????????????????????????????????????.
+IPDetectorPluginManager.symmetricPS=????????????????????????????????????????????????(NAT)??????,
 ???????????????????????????, ?????????????????????????????????????????????, 
????????????????????????????????????????????????!
+IPDetectorPluginManager.symmetricTitle=???????????????????????????
+IPUndetectedUserAlert.detecting=Freenet ??????????????????????????????. 
????????????????????????????????????, ?????????????????????...
+IPUndetectedUserAlert.detectingShort=Freenet ??????????????????????????????.
+IPUndetectedUserAlert.detectingWithConfigLink=Freenet 
??????????????????????????????. ????????????????????????????????????, 
?????????????????????, 
?????????????????????${link}??????${/link}?????????????????????.
+IPUndetectedUserAlert.suggestForwardPort=??????, 
????????????????????????????????????????????? ${port} ???(UDP), 
????????????????????????????????????????????????.
+IPUndetectedUserAlert.suggestForwardTwoPorts=??????, 
????????????????????????????????????????????? ${port1} ??? ${port2} ???(UDP), 
????????????????????????????????????????????????.
+IPUndetectedUserAlert.unknownAddress=Freenet 
???????????????????????????????????????(????????????????????????(NAT)???????????????????????????).
 ?????????????????????????????????????????????, 
??????????????????????????????????????????????????????????????????????????????????????????.
 ????????????????????????????????????, Freenet 
??????????????????????????????????????????. ??????????????????????????????, 
???'?????????????????????????????????'${link}????????????${/link}?????????????????????.
+IPUndetectedUserAlert.unknownAddressShort=Freenet 
?????????????????????????????????. ???????????????????????????.
+IPUndetectedUserAlert.unknownAddressTitle=??????????????????
+IPUndetectedUserAlert.unknownAddressWithConfigLink=Freenet 
???????????????????????????????????????(??????????????????(NAT)?????????????????????????????????).
 ?????????????????????????????????????????????, 
??????????????????????????????????????????????????????????????????????????????????????????.
 ????????????????????????????????????, Freenet 
??????????????????????????????????????????. ??????????????????????????????, 
???'?????????????????????????????????'${link}????????????${/link}?????????????????????.
+InsertException.longError.1=?????????????????? URI ????????????
+InsertException.longError.10=?????????????????????
+InsertException.longError.11=??? URI ???????????????????????????(???????????? 
'/' ??????)
+InsertException.longError.12=???????????????????????????
+InsertException.longError.2=?????????????????????: 
?????????????????????????????????????
+InsertException.longError.3=????????????
+InsertException.longError.4=???????????????????????????????????????
+InsertException.longError.5=????????????????????????????????????????????????(????????????????????????,
 ????????????????????????)
+InsertException.longError.6=?????????????????????????????????????????????
+InsertException.longError.7=?????????????????????: 
??????????????????(???????????????????????????)
+InsertException.longError.8=????????????????????????????????????
+InsertException.longError.9=??????????????????????????????????????????????????????????????????
+InsertException.shortError.1=URI ????????????
 InsertException.shortError.10=?????????
+InsertException.shortError.11=???????????????????????????
+InsertException.shortError.12=???????????????????????????
+InsertException.shortError.2=???????????????
 InsertException.shortError.3=????????????
+InsertException.shortError.4=???????????????
+InsertException.shortError.5=???????????????
+InsertException.shortError.6=????????????????????????????????????
+InsertException.shortError.7=??????????????????????????????
+InsertException.shortError.8=????????????????????????
+InsertException.shortError.9=?????????????????????
 IntOption.parseError=????????????????????????????????? 32 ????????? : ${val}
-JPEGFilter.notJpeg=???????????????????????????????????????JPEG????????????????????????????????????????????????????????????????????????????????????????????????????????????
+InvalidAddressOverrideUserAlert.unknownAddress=Freenet ?????????????????? 
ipAddressOverride ??????????????????, 
????????????????????????????????????????????????, IPv4 ??????, ?????? IPv6 
???????????????(IPv6 ??????????????????????????????????????????????????????).
+InvalidAddressOverrideUserAlert.unknownAddressShort=???????????? 
ipAddressOverride ?????????. ?????????????????????.
+InvalidAddressOverrideUserAlert.unknownAddressTitle=???????????????????????????
+InvalidAddressOverrideUserAlert.unknownAddressWithConfigLink=Freenet 
?????????????????? ipAddressOverride ??????????????????, 
????????????????????????????????????????????????, IPv4 ??????, ?????? IPv6 
???????????????(IPv6 ??????????????????????????????????????????????????????). 
???????????????"????????????????????????"??????${link}????????????${/link}
+JPEGFilter.notJpeg=??????????????????????????????????????? JPEG 
????????????????????????????????????????????????????????????????????????????????????????????????????????????
 JPEGFilter.tooShort=?????????????????????????????????JPEG?????????
 JPEGFilter.tooShortTitle=????????????
+KnownUnsafeContentTypeException.dangerousInlines=??????????????????????????????????????????????????????,
 ??????????????????????????????????????????????????????, 
???????????????????????????.
+KnownUnsafeContentTypeException.dangerousInlinesLabel=?????????????????????:
+KnownUnsafeContentTypeException.dangerousLinks=???????????????????????????????????????????????????????????????;
 ?????????????????????(???????????????), 
???????????????????????????????????????.
+KnownUnsafeContentTypeException.dangerousLinksLabel=???????????????:
+KnownUnsafeContentTypeException.dangerousMetadata=??????????????????????????????????????????(metadata),
 ?????????????????????????????????????????????????????????, 
??????????????????????????????????????????????????????.
+KnownUnsafeContentTypeException.dangerousMetadataLabel=?????????????????????:
+KnownUnsafeContentTypeException.dangerousScripts=???????????????????????????????????????????????????,
 ?????????????????????????????????????????????????????????????????????, 
??????????????????????????????, .
+KnownUnsafeContentTypeException.dangerousScriptsLabel=?????????????????????:
+KnownUnsafeContentTypeException.knownUnsafe=?????? MIME 
????????????????????????. ???????????????????????????, 
????????????????????????????????????, ????????????????????????, 
??????????????????????????????????????????????????????????????????????????????. 
?????????:
+KnownUnsafeContentTypeException.noFilter=????????????????????????????????????????????????,
 ????????????????????????????????????!
+KnownUnsafeContentTypeException.title=?????????????????????: ${type}
+LocalFileInsertToadlet.checkPathExist=?????????????????????????????????.
+LocalFileInsertToadlet.checkPathIsDir=??????????????????????????????????????????.
+LocalFileInsertToadlet.checkPathReadable=????????????????????????????????????????????????????????????????????????.
+LocalFileInsertToadlet.dirAccessDenied=?????????????????????
+LocalFileInsertToadlet.dirCannotBeRead=?????????????????? "${path}"
 LocalFileInsertToadlet.fileHeader=??????
 LocalFileInsertToadlet.insert=??????
+LocalFileInsertToadlet.listing=????????????: ${path}
+LocalFileInsertToadlet.listingTitle=${path} ?????????
 LocalFileInsertToadlet.sizeHeader=??????
+LogConfigHandler.detaildPriorityThreshold=?????????????????????????????????
+LogConfigHandler.detaildPriorityThresholdLong=?????????????????????????????????,
 ????????? freenet:normal, freenet.node:minor
+LogConfigHandler.dirName=????????????
+LogConfigHandler.dirNameLong=?????????????????????????????????
+LogConfigHandler.enabled=???????????????????
+LogConfigHandler.enabledLong=???????????????????????????????????????
+LogConfigHandler.maxCachedBytes=??????????????? RAM ?????????????????????
+LogConfigHandler.maxCachedBytesLong=?????????????????????????????????(RAM)?????????????????????
+LogConfigHandler.maxCachedLines=??????????????? RAM ??????????????????
+LogConfigHandler.maxCachedLinesLong=?????????????????????????????????(RAM)??????????????????
+LogConfigHandler.maxZippedLogsSize=????????????????????????????????????
+LogConfigHandler.maxZippedLogsSizeLong=?????????????????????????????????????????????
+LogConfigHandler.minLoggingPriority=??????????????????????????????
+LogConfigHandler.minLoggingPriorityLong=???????????????????????????????????????.
 ????????????????????????????????? debug, minor, normal ??? error.
+LogConfigHandler.rotationInterval=??????????????????
+LogConfigHandler.rotationIntervalLong=??????????????????????????? - 
??????????????????????????????????????????. 
????????????????????????????????????????????????(??????????????????????????????),
 ??????????????????????????????????????? maxZippedLogsSize 
????????????????????????.
 LoggerHook.unrecognizedPriority=??????????????????????????????: ${name}.
 LongOption.parseError=????????????????????????????????? 64 ????????? : ${val}
-MeaningfulNodeNameUserAlert.noNodeNick=??????????????????????????????????????????.
 ????????????, ?????????????????????????????????????????? IRC 
?????????????????????, ??????????????????????????????????????????. (?????????, 
????????????????????????????????? darknet ????????????????????????????????????, 
????????????????????????)
+MeaningfulNodeNameUserAlert.noNodeNick=??????????????????????????????????????????.
 ????????????, ?????????????????????????????????????????? IRC 
?????????????????????, ??????????????????????????????????????????. (?????????, 
?????????????????????????????????????????????(darknet)????????????????????????????????????,
 ????????????????????????)
 
MeaningfulNodeNameUserAlert.noNodeNickShort=????????????(??????)????????????????????????
 
MeaningfulNodeNameUserAlert.noNodeNickTitle=????????????(??????)????????????????????????
+N2NTMToadlet.composingMessageLabel=????????????????????????????????????, 
????????????????????????:
+N2NTMToadlet.delayed=?????????: ??????????????????????????????????????????
+N2NTMToadlet.delayedTitle=?????????
+N2NTMToadlet.failed=???????????????????????????: ???????????????
+N2NTMToadlet.failedTitle=??????
 N2NTMToadlet.friends=??????
+N2NTMToadlet.noSuchFileOrCannotRead=??????????????????: ?????????????????????, 
??????????????????.
+N2NTMToadlet.peerName=????????????
+N2NTMToadlet.peerNotFoundTitle=???????????????
+N2NTMToadlet.peerNotFoundWithHash=????????????????????? \u201C${hash}\u201D 
?????????.
 N2NTMToadlet.processingSend=?????????????????????????????????
+N2NTMToadlet.queued=???????????????: ???????????????, 
???????????????????????????, ?????????????????????
+N2NTMToadlet.queuedTitle=???????????????
 N2NTMToadlet.returnToFriends=??????????????????
-N2NTMToadlet.sentTitle=??????
-N2NTMToadlet.tooLongTitle=??????
+N2NTMToadlet.sendMessage=???????????????????????????
+N2NTMToadlet.sendMessageShort=????????????
+N2NTMToadlet.sendStatus=??????????????????
+N2NTMToadlet.sent=????????????????????????
+N2NTMToadlet.sentTitle=?????????
+N2NTMToadlet.tooLong=?????????????????????????????? 1024 ???????????????
+N2NTMToadlet.tooLongTitle=????????????
 N2NTMUserAlert.delete=??????
+N2NTMUserAlert.header=??????: ${from} (${composed} ?????? | ${sent} ?????? | 
${received}) ??????
+N2NTMUserAlert.headerShort=?????? ${from} ?????????
 N2NTMUserAlert.reply=??????
 
N2NTMUserAlert.title=???${peername}(${peer})???????????????????????????${number}
-Node.inBWLimit=???????????????????????????????????????
-Node.inBWLimitLong=???????????????????????????????????????????????????????????????????????????????????????
 -1 ??????????????????????????????
+Node.acceptSeedConnections=?????????, 
????????????????????????????????????????????????????????????, 
????????????????????????????????????. 
??????????????????????????????????????????????????????????????????, 
???????????????????????????: 
????????????????????????????????????????????????????????????(????????????????????????,
 ????????????????????????"?????????"????????????).
+Node.acceptSeedConnectionsShort=???????????????????
+Node.alwaysAllowLocalAddresses=???????????????????????????????????????????????????????
+Node.alwaysAllowLocalAddressesLong=?????????, 
?????????????????????????????????, 
?????????????????????????????????????????????, 
???????????????????????????(?????????????????????)????????????. ????????????, 
?????????????????????????????????????????????(??????????????????????????????)??????????????????.
 ?????????????????????????????????????????????, 
?????????????????????????????????????????????????????? UDP 
?????????????????????????????????, ???????????????.
+Node.assumeNATed=?????????????????????????????????.
+Node.assumeNATedLong=????????????????????????????????????????????????????????????(NAT)????????????????????????,
 ?????????????????????????????????, ????????????????????????????????????(??? 10 
??? 30 ?????????)?
+Node.bandwidthLimitMustBePositiveOrMinusOne=????????????????????????????????? 
-1
+Node.bindTo=??????????????????
+Node.bindToLong=??????????????? IP ??????
+Node.buggyJVM=??????????????? JVM ??????(${version})???????????????. 
????????????????????????, ?????????????????? OutOfMemoryError ??????. 
?????????????????? Sun ???????????? Java 1.4.2_13 ???, 1.5.0_10 ???, ?????? 1.6 
???(????????????). ???????????? 
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4855795 .
+Node.buggyJVMShort=Freenet ???????????? Java ?????? ${version} 
??????????????????. ???????????????, ????????????????????? Java 
???????????????????????????.
+Node.buggyJVMTitle=JVM ????????????
+Node.buggyJVMWithLink=??????????????? JVM 
??????(${version})?????????${link}??????${/link}. ????????????????????????, 
?????????????????? OutOfMemoryError ??????. ?????????????????? Sun ???????????? 
Java 1.4.2_13 ???, 1.5.0_10 ???, ?????? 1.6 ???(????????????).
+Node.bwlimitMustBePositive=???????????????????????????
+Node.databaseMemory=????????????????????????????????????
+Node.databaseMemoryLong=????????????????????????????????????????????????????????????.
 0 ??????????????????(??????????????? 30% ??????????????????)
+Node.deadlockTitle=???????????????????????? JVM 
?????????????????????????????????
+Node.deadlockWarning=??????: ???????????????????????? NPTL ??????????????? Sun 
JVM. ???????????????????????? JVM ???????????????????????????????????????. 
??????????????????????????????????????? LD_ASSUME_KERNEL ??? 2.4.1 ????????? 
NPTL. ??????????????? Freenet ????????????????????????????????????; 
?????????????????????, ?????????????????? run.sh 
(https://emu.freenetproject.org/svn/trunk/apps/installer/installclasspath/run.sh)
 ???????????????. ???????????????????????????????????? pthreads 
?????????????????? JVM ??????. ???????????????, ??????????????????????????????, 
??????????????????????????????, ??????????????????????????? 100% ??????, 
????????????????????????????????????.
+Node.disableHangCheckers=???????????????????????????
+Node.disableHangCheckersLong=??????????????????????????????????????????. 
??????????????? Fred ?????????????????????????????????????????????.
+Node.disablePHTLS=?????? probabilistic HTL
+Node.disablePHTLSLong=?????? probabilistic HTL (?????????????????????, 
?????????????????????????????????)
+Node.dropPacketEvery=????????????????????????
+Node.dropPacketEveryLong=?????????????????????. 
?????????????????????????????????, ????????????????????????. 0 
??????????????????????????????. ?????????????????????!
+Node.enableARKs=?????? ARKs? (????????????!)
+Node.enableARKsLong=???????????? ARKs? (??????????????????!).
+Node.enablePacketCoalescing=???????????????????
+Node.enablePacketCoalescingLong=???????????????????????????? 
??????????????????????????????????????????, ?????? CPU ?????????, 
???????????????????????????????????????, 
??????????????????????????????????????????. ?????????????????????????????????, 
??????????????????.
+Node.enablePerNodeFailureTables=????????????????????????????????????????
+Node.enablePerNodeFailureTablesLong=?????????????????? 10 
???????????????????????????????????????????????????????
+Node.enableSwapQueueing=??????????????????????????????? (????????????!)
+Node.enableSwapQueueingLong=?????????????????????????????????????????????? 
(??????????????????!)
+Node.enableSwapping=??????????????????? (????????????!)
+Node.enableSwappingLong=????????????????????????? (??????????????????! 
????????????????????????????????????).
+Node.enableULPRDataPropagation=?????? ULRP ????????????????
+Node.enableULPRDataPropagationLong=????????????????????????????????????, 
??????????????????????????????????????????????????????? 
(????????????????????????????????????; ULPR)
+Node.errorApplyingConfig=????????????????????????????????? : ${error}
+Node.extraPeerDir=????????????????????????
+Node.extraPeerDirLong=??????????????????????????????????????????
+Node.forceBigShrink=????????????????????????
+Node.forceBigShrinkLong=???????????????????????????(?????? 
10%)?????????????????????(????????????????????????????????????). 
??????????????????????????????????????????????????????, 
???????????????????????????; 
???????????????????????????????????????????????????.
+Node.inBWLimit=????????????????????????????????????
+Node.inBWLimitLong=?????????????????????????????????????????????; 
??????????????????????????????????????????; ?????? -1 
???????????????????????????
+Node.invalidStoreSize=??????????????????????????? 32MB
+Node.java14ShortText=???????????????????????? Java 1.4 ???, ???????????? 1.5 
???.
+Node.java14Text=???????????? Java 1.4 ????????? Freenet ??????. 
?????????????????? 1.5 ???. ??????????????????????????????????????????, 
?????????????????????????????????????????????????????? Java ????????????.
+Node.java14Title=???????????? Java 1.4 ???
 Node.l10nLanguage=????????????????????????
 
Node.l10nLanguageLong=???????????????????????????????????????????????????????????????????????????????????????
+Node.maxHTL=HTL ?????????
+Node.maxHTLLong=HTL ?????????(?????????????????????!)
+Node.maxOpennetPeers=????????????????????????????????????
+Node.maxOpennetPeersLong=????????????(Opennet)????????????????????????(?????????
 0 ??? 20 ??????, 
???????????????????????????????????????(darknet)???????????????)
+Node.maxOpennetPeersMustBeTwentyOrLess=????????????????????? 20
+Node.mustBePositive=????????????????????????
+Node.nodeDir=????????????
+Node.nodeDirLong=????????????????????????(?????????????????????)???????????????
 Node.nodeName=??????????????????
 Node.nodeNameLong=????????????????????????????????????????????????
+Node.notUsingSunVM=????????????????????? Sun ????????? JVM ???????????????: 
${vendor} ${version}. ????????????????????????: ??????????????????????????????. 
?????????????????? http://www.java.com/getjava/ ?????? Sun ????????? Java 
??????.
+Node.notUsingSunVMShort=Freenet ??????????????? Sun ????????? Java 
??????????????????, ????????????????????????, ?????????????????? Sun Java 
??????.
+Node.notUsingSunVMTitle=???????????? Sun ??? JVM
+Node.notUsingWrapper=????????????????????????????????????. 
????????????????????????. ?????????????????????????????????, 
??????????????????????????????, ???????????? JVM ???????????????, 
?????????????????????. ?????????????????????????????????????????????, 
??????????????????????????????.
+Node.notUsingWrapperShort=Freenet ??????????????????????????????. 
????????????????????????.
+Node.notUsingWrapperTitle=????????????????????????!
+Node.oneConnectionPerIP=????????????????????????????????????????
+Node.oneConnectionPerIPLong=??????????????????????????????????????????????????????????
 ????????????????????????????????????????????????????????????, 
?????????????????????????????????????????????????????????, 
?????????????????????????????????????????????. 
?????????????????????????????????????????????????????????(darknet)???????????????(opennet).
+Node.opennetEnabled=??????????????????????????????(???????????????????????????????????????)?
+Node.opennetEnabledLong=??????????????????????????????(?????????????????????(opennet))?
 ??????????????????, 
?????????????????????????????????????????????????????????????????????(???????????????"?????????",
 ?????????"??????"). ????????????????????????????????????????????????, 
???????????????????????????. ?????????????????????????????? Freenet ?????????, 
?????????????????????????????????????????????("??????"), 
???????????????????????????.
 Node.outBWLimit=???????????????????????????????????????
+Node.outBWLimitLong=???????????????????????????(?????????????????????); 
????????????????????????????????????????????????
+Node.passOpennetPeersThroughDarknet=???????????????????????????????????????????????????????
+Node.passOpennetPeersThroughDarknetLong=????????????, 
??????????????????(opennet)??????????????????(??????????????????????????????)??????????????????????????????(darknet)????????????.
 
???????????????(??????????????????????????????)??????????????????????????????????????????????????????.
 ??????????????????, ?????????????????????????????????, 
?????????????????????????????????, 
???????????????????????????????????????????????????. 
????????????????????????????????????????????????, 
???????????????????????????????????????.
+Node.port=FNP ??????????????????(UDP)
+Node.portLong=???????????????????????? UDP ????????????(Freenet 
??????????????????)
+Node.publishOurPeersLocation=???????????????????????????????????????????
+Node.publishOurPeersLocationLong=??????????????????????????????????????????? 
??????????????????????????????, 
???????????????????????????????????????????????????.
+Node.routeAccordingToOurPeersLocation=???????????????????????????????????????????????????????????????????????????????
+Node.routeAccordingToOurPeersLocationLong=???????????????????????????????????????????????????????????????????????????????
 ??????????????????????????????, ?????????????????????????????????.
+Node.storeDirectory=????????????
+Node.storeDirectoryLong=?????????????????????????????????
+Node.storeMaxMemTooHigh=??????????????????????????? 80% ???????????? BDB 
?????????!
 Node.storeSize=???????????????????????????
 Node.storeSizeLong=???????????????????????????
-PluginToadlet.addPluginTitle=??????plugin
-PluginToadlet.failedToLoadPluginTitle=Plugin????????????
-PluginToadlet.noWebInterfaceTitle=???plugin???????????????
-PluginToadlet.pluginList=Plugin??????
-PluginToadlet.pluginListTitle=Plugin??????
-PluginToadlet.pluginNameTitle=Plugin??????
-PluginToadlet.pluginNotFoundTitle=????????????plugin
-PluginToadlet.unsupportedMethod=????????????method.
+Node.storeType=????????????(????????????)
+Node.storeTypeLong=??????????????????. ??????????????? bdb-index ?????? ram 
(bdb-index ??? BerkeleyDBFreenetStore ???????????????, 
??????????????????????????????????????????; ram 
??????????????????????????????????????????). 
???????????????????????????????????????, 
???????????????????????????????????????????????????, ????????? ram 
(??????????????????????????????????????????)!
+Node.swapRInterval=?????????????????????????????????(??????)
+Node.swapRIntervalLong=???????????????????????????????????????, 
???????????????. ????????????!
+Node.throttleLocalTraffic=???????????????????
+Node.throttleLocalTrafficLong=?????????????????????????????????? 
???????????????, 
?????????????????????(LAN)??????????????????????????????????????????????????????.
+Node.tooSmallMTU=MTU ??????
+Node.tooSmallMTULong=???????????????????????????????????????(MTU)????????? 
${mtu} ?????????. Freenet ????????? MTU ?????? ${minMTU} 
?????????????????????????????????: Freenet ??????????????????, 
????????????????????????. ???????????????????????????????????????.
+Node.tooSmallMTUShort=????????????: ??????????????? MTU ??????, Freenet 
??????????????????. ?????????????????????.
+Node.withAnnouncement=????????????????????????????????????????????????????
+Node.withAnnouncementLong=??????????????????????????????????????????????????????????
 ?????????????????????????????????, ?????????????????????????????????.
+NodeClientCore.couldNotFindOrCreateDir=???????????????????????????
+NodeClientCore.downloadAllowedDirs=???????????????????????????
+NodeClientCore.downloadAllowedDirsLong=???????????????????????????????????????,
 ??????????????????. ???????????? downloads ???????????????????????????, 
?????????????????????????????????????????????????????????, ????????? all 
??????????????????????????????????????????. ??????! ??????????????? all ??????, 
???????????????????????????????????????????????????, 
??????????????????????????????????????????!
+NodeClientCore.downloadDir=??????????????????
+NodeClientCore.downloadDirLong=??????????????????????????????????????????
+NodeClientCore.fileForClientStats=????????????????????????????????????
+NodeClientCore.fileForClientStatsLong=??????????????????????????????????????????(?????????????????????????????????)
+NodeClientCore.lazyResume=???????????????????????????????????????? 
(????????????????????????)
+NodeClientCore.lazyResumeLong=?????????????????????????????????????????????, 
??????????????????????????????????????????, 
????????????????????????????????????????????????. ?????????????????????, 
??????????????????????????????.
+NodeClientCore.maxUSKFetchers=????????? USK ?????????????????????
+NodeClientCore.maxUSKFetchersLong=????????? USK ?????????????????????
+NodeClientCore.maxUSKFetchersMustBeGreaterThanZero=???????????????
+NodeClientCore.movingTempDirOnTheFlyNotSupported=????????????????????????????????????????????????
+NodeClientCore.persistentTempDir=???????????????????????????
+NodeClientCore.persistentTempDirLong=???????????????????????????????????????
+NodeClientCore.startingUp=?????? Freenet ?????????????????????????????????, 
?????????????????????????????????????????????, 
???????????????????????????????????????.
+NodeClientCore.startingUpShort=Freenet ???????????????, 
??????????????????????????????, ???????????????????????????.
+NodeClientCore.startingUpTitle=Freenet ???????????????
+NodeClientCore.tempDir=??????????????????
+NodeClientCore.tempDirLong=??????????????????????????????
+NodeClientCore.uploadAllowedDirs=???????????????????????????
+NodeClientCore.uploadAllowedDirsLong=???????????????????????????????????????, 
??????????????????. 
??????????????????????????????????????????????????????????????????, ????????? 
all 
????????????????????????????????????????????????(????????????????????????!). 
??????! ??????????????? all ??????, 
??????????????????????????????????????????????????????????????????????????????!
+NodeIPDectector.inclLocalAddress=?????????????????????????????????????????????
+NodeIPDectector.inclLocalAddressLong=?????????????????????????????????????????????????????????(????????????????????????????????????????????????).
 ???????????????????????????????????????????????????????????? 
allowLocalAddresses=true 
(?????????????????????????????????????????????????????????), 
???????????????????????????.
+NodeIPDectector.ipOverride=????????????????????????
+NodeIPDectector.ipOverrideLong=???????????????????????????(????????????????????????)
 - ???????????????????????????????????????*??????*???(???????????????: 
?????????, ?????? dyndns ??????), ????????????????????????????????????, 
????????????????????????????????????????????????.
+NodeIPDectector.tempAddressHint=?????????????????????????????????
+NodeIPDectector.tempAddressHintLong=??????????????????????????????; 
????????????????????????
+NodeIPDetector.maybeSymmetric=??????????????????????????????????????????????????????(NAT)??????.
 ???????????????????????????: 
???????????????????????????????????????????????????????????????, 
??????????????????????????????????????????????????????????????????.
+NodeIPDetector.maybeSymmetricShort=????????????: 
?????????????????????????????????????????????(NAT)??????.
+NodeIPDetector.maybeSymmetricTitle=????????????
+NodeIPDetector.unknownHostErrorInIPOverride=???????????????: ${error}
+NodeStat.aggressiveGC=AggressiveGC ?????????
+NodeStat.aggressiveGCLong=????????????????????????????????? (GC) 
???????????????????????????. ????????????????????????????????????, 
??????????????????! ?????? -1 ??????: ????????? System.gc() ??? 
System.runFinalization() ?????????????????????
+NodeStat.freeHeapBytesThreshold=???????????????????????????????????????
+NodeStat.freeHeapBytesThresholdLong=?????????????????????????????????????????????(??????????????????)??????????????????,
 ??????????????????????????????????????????
+NodeStat.freeHeapPercentThreshold=?????????????????????????????????
+NodeStat.freeHeapPercentThresholdLong=??????????????????????????????????????????????????????????????????????????????,
 ??????????????????????????????????????????
+NodeStat.ignoreLocalVsRemoteBandwidthLiability=??????????????????????????????, 
??????????????????????????????????
+NodeStat.ignoreLocalVsRemoteBandwidthLiabilityLong=???????????????????????????????????????????????????????????????,
 
?????????????????????????????????????????????????????????????????????(?????????????????????????????????,
 ????????????????????????????????????????????????)
+NodeStat.memCheck=?????????????????????
+NodeStat.memCheckLong=??????????????????????????? 
(?????????????????????????????????, aggressiveGC 
????????????????????????????????????!)
+NodeStat.statsPersister=?????????????????????????????????
+NodeStat.statsPersisterLong=?????????????????????????????????(???????????????????????????,
 ???????????????????????????????????????, ????????????????????????)
+NodeStat.threadLimit=????????????
+NodeStat.threadLimitLong=??????????????????????????????????????????????????????,
 ?????????????????????.
+NodeStats.mustBePercentValueNotFull=????????????????????????, ???????????? 0 
??? 99 ??????.
+NodeStats.valueTooLow=????????????????????????, ??????????????????, 
?????????????????????!
+NodeUpdateManager.enabled=???????????????????????????
+NodeUpdateManager.enabledLong=???????????????????????????????????? Freenet 
??????. ??????, ?????????????????????????????????, ????????????????????????, 
????????????????????????. ?????????????????????????????????????????????, 
?????????????????????????????????.
+NodeUpdateManager.extURI=??????????????????????????? freenet-ext.jar ??????????
+NodeUpdateManager.extURILong=??????????????????????????? freenet-ext.jar 
??????????
+NodeUpdateManager.installNewVersions=????????????????????????
+NodeUpdateManager.installNewVersionsLong=?????????????????????????????????, 
????????????????????????????????? Freenet ???????
+NodeUpdateManager.invalidExtURI=???????????????????????? URI: ${error}
+NodeUpdateManager.invalidRevocationURI=??????????????????????????? URI: 
${error}
+NodeUpdateManager.invalidUpdateURI=??????????????????????????? URI: ${error}
+NodeUpdateManager.noUpdateWithoutWrapper=??????????????????????????????, 
??????????????????????????????
+NodeUpdateManager.revocationURI=????????????????????????????????????????
+NodeUpdateManager.revocationURILong=??????????????? URI. 
????????????????????????????????????, ????????????????????????, 
??????????????????????????????.
+NodeUpdateManager.updateCatastropheTitle=????????????????????????!
+NodeUpdateManager.updateFailed=????????????: ${reason}
+NodeUpdateManager.updateFailedShort=????????????: ${reason}
+NodeUpdateManager.updateFailedTitle=????????????!
+NodeUpdateManager.updateURI=??????????????????????????????????
+NodeUpdateManager.updateURILong=??????????????????????????????????
+NotEnoughNiceLevelsUserAlert.content=???????????????????????????????????????????????????????????????.
 ????????????????????????????????????????????????, 
??????????????????????????????. 
???????????????????????????????????????????????????! (??? run.sh ????????? 
PRIORITY ?????????, ??????????????????) ????????????????????? ${available} 
?????????????????????, ?????????????????? ${required} ???.
+NotEnoughNiceLevelsUserAlert.short=?????????????????????????????????! 
?????????????????????????????????????????? Freenet.
+NotEnoughNiceLevelsUserAlert.title=?????????????????????????????????!
+OpennetConnectionsToadlet.fullTitle=${name} ??? ${counts} 
????????????(??????????????????)
+OpennetConnectionsToadlet.peersListTitle=??????????????????????????????(??????????????????????????????????????????????????????)
+OpennetConnectionsToadlet.successTime=??????????????????????????????????????????
 CHK ?????????
+OpennetConnectionsToadlet.successTimeTitle=??????????????????
+OpennetUserAlert.warning=Freenet ????????????????????????????????????. 
??????????????????????????????????????? Freenet, 
???????????????????????????????????????. 
?????????????????????????????????????????????, 
????????????????????????????????????????????????????????????, 
????????????????????????????????????. ??????????????? 10 
?????????????????????(??????????????????????????????????????????, 
?????????????????????????????????????????????), 
?????????????????????????????????, ?????? Freenet 
????????????????????????????????????????????????.
+OpennetUserAlert.warningShort=????????????????????????.
+OpennetUserAlert.warningTitle=??????: ????????????????????????: 
??????????????????????????????
+PNGFilter.invalidHeader=??????????????????????????????????????? PNG ???, 
?????????????????????????????? PNG ??????. ?????????????????????????????????, 
???????????????????????????????????????????????????, 
???????????????????????????.
+PNGFilter.invalidHeaderTitle=????????? PNG - ??????????????????
+PageMaker.modeAdvanced=??????????????????
+PageMaker.modeAdvancedTooltip=??????????????? Freenet 
?????????????????????????????????????????????????????????
+PageMaker.modeSimple=??????????????????
+PageMaker.modeSimpleTooltip=???????????????????????????????????????
+PeerManagerUserAlert.clockProblem=????????? ${count} ?????????????????????, 
????????????????????????????????????????????? 24 ????????????. 
??????????????????????????????????????????. 
??????????????????????????????????????????????????????????????????????????????.
+PeerManagerUserAlert.clockProblemTitle=????????????
+PeerManagerUserAlert.connError=??? ${count} 
??????????????????????????????????????????, ?????????????????????????????????, 
?????????????????????????????????.
+PeerManagerUserAlert.connErrorTitle=????????????????????????
+PeerManagerUserAlert.noConns=???????????????????????????????????????????????????,
 ??????????????????. ???????????????????????????????????????; 
???????????????????????????, ??????????????????????????????. 
??????????????????????????? 3 ???????????????, ???????????????????????? 5 ??? 
10 ???.
+PeerManagerUserAlert.noConnsTitle=?????????????????????
+PeerManagerUserAlert.noPeersDarknet=?????????????????????????????????, 
????????????????????????. 
???????????????????????????????????????????????????(????????????????????????, 
??????????????????????????????, ????????????????????????????????????). 
??????????????????????????? 3 ??????????????????, ???????????? 5 ??? 10 ???. 
?????????????????????????????????(????????????; opennet), 
???????????????????????????????????????.
+PeerManagerUserAlert.noPeersTestnet=?????????????????????????????????, 
????????????????????????. 
???????????????????????????????????????????????????(????????????????????????, 
??????????????????????????????, ????????????????????????????????????). 
??????????????????????????? 3 ??????????????????, ???????????? 5 ??? 10 ???. 
?????????????????????????????????(????????????; opennet), 
???????????????????????????????????????.
+PeerManagerUserAlert.noPeersTitle=????????????
+PeerManagerUserAlert.oneConn=????????????????????????. 
???????????????????????????, ?????????????????????; 
???????????????????????????, ?????????????????????????????????????????????. 
????????????"??????"???????????????????????????, 
?????????????????????????????????. ??????????????????????????????????????? 3 
?????????(?????? 5 ??? 10 ????????????).
+PeerManagerUserAlert.onlyFewConnsTitle=?????? ${count} ??????????????????
+PeerManagerUserAlert.tooHighBwlimitDelayTime=????????????????????????????????????????????????(${delay}ms
 > ${max}ms). ?????????????????????????????????, 
??????/????????????????????????, ????????????????????????.
+PeerManagerUserAlert.tooHighBwlimitDelayTimeTitle=bwlimitDelayTime ????????????
+PeerManagerUserAlert.tooHighPingTime=??????????????????????????????????????????(${ping}ms
 > ${max}ms). ?????????????????????????????????, 
??????/????????????????????????, ????????????????????????.
+PeerManagerUserAlert.tooHighPingTimeTitle=nodeAveragePingTime ????????????
+PeerManagerUserAlert.tooManyConns=????????????????????????(${count} > ${max}). 
??????????????????????????????????????????????????????, ?????????????????????, 
?????????????????????????????????????????????.
+PeerManagerUserAlert.tooManyConnsTitle=????????????????????????
+PeerManagerUserAlert.tooManyDisconnected=?????????????????????????????????(${count}
 > ${max}). ???????????????????????????????????????????????????, 
??????????????????????????????????????????????????????????????????. 
?????????"??????"??????????????????. ?????????, 
????????????????????????????????????????????????. ??????????????????, 
????????????????????????????????????????????????????????????????????????.
+PeerManagerUserAlert.tooManyDisconnectedTitle=????????????????????????
+PeerManagerUserAlert.tooManyNeverConnected=???????????????????????????(?????? 
${count} ???)?????????????????????. 
????????????????????????????????????????????????????????????????????????, 
??????????????????????????????.
+PeerManagerUserAlert.tooManyNeverConnectedTitle=?????????????????????????????????
+PeerManagerUserAlert.tooManyNeverConnectedWithLink=???????????????????????????(??????
 ${count} ???)?????????????????????. 
?????????????????????????????????${link}????????????${/link}???????????????????????????,
 ??????????????????????????????.
+PeerManagerUserAlert.tooManyPeers=???????????????????????????(${count} > 
${max}). ?????????????????????????????????????????????????????????????????????, 
?????????????????????????????????????????????. ????????????, 
???????????????????????????????????????????????????????????????, 
??????????????????????????????. ?????????"??????"??????????????????.
+PeerManagerUserAlert.tooManyPeersTitle=????????????????????????
+PeerManagerUserAlert.tooOldNeverConnectedPeers=???????????????????????????, 
????????????????????????????????????????????????. ?????????????????????, 
?????????????????????????????????(??????????????????????????????????????????).
+PeerManagerUserAlert.tooOldNeverConnectedPeersTitle=??????????????????????????????
+PeerManagerUserAlert.twoConns=????????????????????????. 
????????????????????????????????????, 
??????????????????????????????????????????. 
?????????"??????"???????????????????????????, 
?????????????????????????????????(????????????). 
??????????????????????????????????????? 3 ?????????(?????? 5 ??? 10 
????????????).
+PeersSayKeyBlownAlert.connectedSayBlownLabel=????????????????????????????????????????????????(???????????????????????????????????????????????????):
+PeersSayKeyBlownAlert.disconnectedSayBlownLabel=?????????????????????????????????????????????,
 ????????????????????????, ????????????????????????????????????:
+PeersSayKeyBlownAlert.failedFetch=????????????????????????????????????. 
???????????????????????????????????????, 
??????????????????????????????????????????????????????, 
?????????????????????????????????????????????. 
????????????????????????????????? Freenet ????????????????????????.
+PeersSayKeyBlownAlert.failedTransferSayBlownLabel=??????????????????????????????????????????,
 ????????????????????????????????????:
+PeersSayKeyBlownAlert.fetching=???????????????????????????????????????????????????????????????.
+PeersSayKeyBlownAlert.intro=????????????????????????????????????????????????????????????!
 ??????????????????????????????????????????????????????????????????, 
???????????????????????????????????????????????????(???????????????????????????)!
 ???????????????????????????????????????. 
?????????????????????????????????????????????.
+PeersSayKeyBlownAlert.short=???????????????????????????????????????????????????!
+PeersSayKeyBlownAlert.titleWithCount=${count} ?????????: 
????????????????????????!
+PluginConfig.configFile=??????????????????
+PluginConfig.configFileLong=?????????????????????????????????????????????
+PluginConfig.installDir=??????????????????
+PluginConfig.installDirLong=?????????????????????
+PluginManager.cannotSetOnceLoaded=??????????????????????????????????????????
+PluginManager.loadedOnStartup=????????????????????????
+PluginManager.loadedOnStartupLong=???????????????, 
?????????????????????????????????, ???????????????.
+PluginManager.loadedPlugins=????????????????????????
+PluginManager.loadedPluginsLong=??????????????????, ???????????????????????????
+PluginManager.pluginLoadingFailed=??????????????? ${name} ????????????
+PluginManager.pluginLoadingFailedShort=?????????????????? ${name}!
+PluginManager.pluginLoadingFailedTitle=??????????????????!
+PluginManager.pluginLoadingFailedWithMessage=??????????????? ${name} 
????????????: ${message}
+PluginManager.pluginReqNewerJVM=?????? ${name} ????????????????????? JVM 
????????????. ?????????????????? Sun Java 1.5 ???????????? JVM, 
?????????????????????.
+PluginManager.pluginReqNewerJVMTitle=?????? ${name} ??????????????? JVM 
????????????.
+PluginToadlet.addPluginTitle=????????????
+PluginToadlet.failedToLoadPlugin=??????????????????.
+PluginToadlet.failedToLoadPluginCheckClass=?????????????????????????????????. 
??????????????????????????????????????????, ?????????????????? URL 
??????????????????.
+PluginToadlet.failedToLoadPluginTitle=??????????????????
+PluginToadlet.internalNameTitle=????????????
+PluginToadlet.loadPluginCommand=????????????
+PluginToadlet.noWebInterface=?????????????????????????????????, 
??????????????????????????????.
+PluginToadlet.noWebInterfaceTitle=??????????????????????????????
+PluginToadlet.pluginList=????????????
+PluginToadlet.pluginListTitle=????????????
+PluginToadlet.pluginNameTitle=????????????
+PluginToadlet.pluginNotFound=????????????????????????.
+PluginToadlet.pluginNotFoundTitle=??????????????????
+PluginToadlet.returnToPluginsWithLinks=??? ${link}??????${/link} ????????????.
+PluginToadlet.unsupportedMethod=??????????????????.
+PluginToadlet.unsupportedMethodTitle=??????????????????
 PluginToadlet.visit=??????
+PproxyToadlet.Error=??????
+PproxyToadlet.Load=??????
 PproxyToadlet.cancel=??????
-PproxyToadlet.classNameTitle=Class??????
-PproxyToadlet.internalIDTitle=????????????
+PproxyToadlet.changeReloadOnStartup=??????
+PproxyToadlet.classNameTitle=????????????
+PproxyToadlet.downloadNotAllowedFromRemoteServer=??????????????????????????????????????????.
+PproxyToadlet.fileonly=??????????????????
+PproxyToadlet.internalIDTitle=???????????????
+PproxyToadlet.loadFreenetPlugin=??? Freenet ????????????????????????
+PproxyToadlet.loadFreenetPluginText=???????????????????????????????????????????????????
 Freenet URI. ?????????????????????????????????, 
??????????????????????????????????????????, ??????????????????????????????, 
????????????????????????????????????.
+PproxyToadlet.loadFreenetURLLabel=????????????
+PproxyToadlet.loadOfficialPlugin=??????????????????
+PproxyToadlet.loadOfficialPluginLabel=??????????????????
+PproxyToadlet.loadOfficialPluginText=?????????????????? Freenet 
?????????????????????. ????????????????????????????????????????????????, 
????????????????????????.
+PproxyToadlet.loadOfficialPluginWarning=??????: 
????????????????????????????????????????????????, ????????? Freenet ??????. 
???????????????????????????????????????, ???????????????. 
???????????????????????????????????????, ??????????????????????????????.
+PproxyToadlet.loadOtherPlugin=?????????????????????
+PproxyToadlet.loadOtherPluginText=?????????????????????????????????????????? 
URL. ?????????????????????????????????????????????????????????, 
?????????????????????????????????????????????????????????. 
????????????????????????????????????????????????????????????, 
????????????????????????.
+PproxyToadlet.loadOtherURLLabel=????????? URL
 PproxyToadlet.loadPluginLabel=??????Plugin:
-PproxyToadlet.noPlugins=??????????????????plugins
-PproxyToadlet.pluginNotFoundReload=??????????????????????????????plugin.
-PproxyToadlet.pluginNotFoundReloadTitle=???????????????Plugin(??????)
-PproxyToadlet.pluginUnloaded=???plugin????????????
-PproxyToadlet.pluginUnloadedWithName=${name}??????plugin????????????.
-PproxyToadlet.plugins=Plugins
-PproxyToadlet.pluginsWithNodeName=${name}???plugins
+PproxyToadlet.noPlugins=????????????????????????
+PproxyToadlet.noVersion=???
+PproxyToadlet.pluginDirectoryNotCreated=????????????????????????.
+PproxyToadlet.pluginNotDownloaded=??????????????????.
+PproxyToadlet.pluginNotFoundReload=?????????????????????????????????.
+PproxyToadlet.pluginNotFoundReloadTitle=??????????????????(??????)
+PproxyToadlet.pluginStopping=???????????????
+PproxyToadlet.pluginUnloaded=??????????????????
+PproxyToadlet.pluginUnloadedWithName=?????????????????? ${name} ???.
+PproxyToadlet.plugins=??????
+PproxyToadlet.pluginsWithNodeName=${name} ?????????
+PproxyToadlet.refreshOnStartup=???????????????????????????
 PproxyToadlet.reload=??????
-PproxyToadlet.returnToPluginPage=??????plugin??????
-PproxyToadlet.startedAtTitle=????????????
+PproxyToadlet.reloadExplanation=?????????????????????????????????????????????????????????.
+PproxyToadlet.reloadOnStartupShort=???????????????
+PproxyToadlet.reloadPluginTitle=????????????
+PproxyToadlet.reloadPurgeWarning=???????????????????????????????????????. 
?????????????????????????????????????????????, ??????????????????????????????!
+PproxyToadlet.reloadWarning=???????????????????????????????????????!
+PproxyToadlet.returnToPluginPage=??????????????????
+PproxyToadlet.startedAtTitle=????????????
+PproxyToadlet.startingPluginName=????????????
+PproxyToadlet.startingPluginStatus=????????????
+PproxyToadlet.startingPluginTime=????????????
+PproxyToadlet.startingPluginsTitle=???????????????
+PproxyToadlet.unauthorized=??????????????????????????????.
+PproxyToadlet.unauthorizedTitle=????????????
 PproxyToadlet.unload=??????
-PproxyToadlet.unloadPluginTitle=?????????plugin?
-PproxyToadlet.unloadPluginWithName=??????????????????${name}????
-QueueToadlet.change=?????????
+PproxyToadlet.unloadPluginTitle=???????????????????
+PproxyToadlet.unloadPluginWithName=?????????????????? ${name} ????
+PproxyToadlet.unloadPurge=????????????????????????
+PproxyToadlet.versionTitle=??????
+PproxyToadlet.startingPluginStatus.downloading=??????????????????
+PproxyToadlet.startingPluginStatus.starting=?????????
+QueueToadlet.DUinProgress=???????????????????????? (${size})
+QueueToadlet.DinProgress=???????????????????????? (${size})
+QueueToadlet.UinProgress=???????????????????????? (${size})
+QueueToadlet.change=??????
+QueueToadlet.completedDU=?????????????????????????????? (${size})
+QueueToadlet.completedDinDownloadDirectory=????????????????????????????????????????????????
 (${size})
+QueueToadlet.completedDinTempDirectory=????????????????????????????????????????????????
 (${size})
+QueueToadlet.completedDtoDisk=????????????????????????????????? (${size})
+QueueToadlet.completedDtoTemp=?????????????????????????????????????????? 
(${size})
+QueueToadlet.completedU=???????????????????????? (${size})
+QueueToadlet.completedUDirectory=???????????????????????? (${size})
 QueueToadlet.delete=??????
 QueueToadlet.download=??????
-QueueToadlet.fileName=?????????
-QueueToadlet.identifier=??????
+QueueToadlet.downloadFiles=????????????
+QueueToadlet.downloadFilesInstructions=??????????????????????????????????????????????????????(??????????????????)
+QueueToadlet.downloadSucceeded=?????? ${origlink}${filename}${/origlink} 
?????????????????????. ???${link}?????????${/link}????????????  (${size}).
+QueueToadlet.downloadSucceededTitle=????????????: ${filename}
+QueueToadlet.enqueuedFailure=?????? ${number} ???????????????????????????:
+QueueToadlet.enqueuedSuccessfully=?????? ${number} 
?????????????????????????????????:
+QueueToadlet.errorAccessDenied=????????????: ????????????!
+QueueToadlet.errorAccessDeniedFile=?????????????????????????????????????????????
 "${file}".
+QueueToadlet.errorDToDisk=????????????????????????
+QueueToadlet.errorDToDiskConfig=??????????????????????????????????????????????????????????????????.
+QueueToadlet.errorDownloadNotCompleted=??????????????????
+QueueToadlet.errorDownloadNotFound=?????????????????????
+QueueToadlet.errorDownloadNotFoundExplanation=?????????????????????. 
????????????????????????????
+QueueToadlet.errorInvalidURI=??????????????? URI
+QueueToadlet.errorInvalidURIToD=?????? URI ??????????????????????????????.
+QueueToadlet.errorInvalidURIToU=???????????????????????? URI ????????????.
+QueueToadlet.errorNoFileOrCannotRead=?????????????????????????????????
+QueueToadlet.errorNoFileSelected=??????????????????
+QueueToadlet.errorNoFileSelectedU=??????????????????????????????.
+QueueToadlet.errorNoKey=??????????????????????????????
+QueueToadlet.errorNoKeyToD=??????????????????????????????.
+QueueToadlet.failedD=??????????????? (${size})
+QueueToadlet.failedDU=??????????????????????????? (${size})
+QueueToadlet.failedToRemove=?????? ${id} ??????: ${message}
+QueueToadlet.failedToRemoveId=????????????: ${id}
+QueueToadlet.failedToRemoveRequest=??????????????????
+QueueToadlet.failedToRestart=????????????: ${id}
+QueueToadlet.failedToRestartRequest=????????????????????????
+QueueToadlet.failedU=????????????????????? (${size})
+QueueToadlet.fcpIsMissing=?????? FCP ?????????
+QueueToadlet.fileName=??????
+QueueToadlet.files=??????
+QueueToadlet.follow=????????????
+QueueToadlet.globalQueueIsEmpty=???????????????????????????
+QueueToadlet.identifier=?????????
 QueueToadlet.insertAs=?????????:
 QueueToadlet.insertFile=????????????
+QueueToadlet.insertFileBrowseLabel=???????????????????????????
+QueueToadlet.insertFileCompressLabel=??????
+QueueToadlet.insertFileInsertFileLabel=????????????
+QueueToadlet.insertFileLabel=??????????????????????????????(?????????!)
+QueueToadlet.insertFileResetForm=????????????
 QueueToadlet.key=??????
 QueueToadlet.legend=??????
+QueueToadlet.mimeType=MIME ??????
+QueueToadlet.noTaskOnGlobalQueue=????????????????????????????????????.
+QueueToadlet.none=???
+QueueToadlet.notLoadedYet=??????????????????????????????????????????. 
???????????????.
+QueueToadlet.notLoadedYetTitle=??????????????????
+QueueToadlet.panicButton=????????????
+QueueToadlet.panicButtonConfirmation=??????????????????????????????????????????!
+QueueToadlet.persistence=?????????
 QueueToadlet.persistenceForever=??????
 QueueToadlet.persistenceNone=???
+QueueToadlet.persistenceReboot=??????
 QueueToadlet.persistenceRebootr=??????
+QueueToadlet.pleaseEnableFCP=???????????? FCP ????????????????????????
 QueueToadlet.priority=?????????
 QueueToadlet.priority0=??????
 QueueToadlet.priority1=?????????
@@ -260,49 +1003,185 @@
 QueueToadlet.priority5=?????????
 QueueToadlet.priority6=????????????
 QueueToadlet.progress=??????
+QueueToadlet.progressbarAccurate=???????????????
+QueueToadlet.progressbarNotAccurate=???????????????????????????????????????????????????????????????
 QueueToadlet.reason=??????
+QueueToadlet.remove=??????
+QueueToadlet.requestNavigation=????????????
 QueueToadlet.restart=??????
+QueueToadlet.siteUploadSucceeded=?????? freesite ${filename} (${files} 
?????????, ??????????????? ${size}) ????????????????????? Freenet ???. 
${link}?????????${/link}????????????????????????.
+QueueToadlet.siteUploadSucceededTitle=Freesite ????????????: ${filename}
 QueueToadlet.size=??????
 QueueToadlet.starting=?????????
 QueueToadlet.title=${nodeName}???????????????
 QueueToadlet.totalSize=????????????
 QueueToadlet.unknown=??????
+QueueToadlet.uploadProgressbarNotAccurate=????????????????????????????????????????????????????????????????????????
+QueueToadlet.uploadSucceeded=?????? ${filename} (?????? ${size}) 
????????????????????? Freenet ???. ???${link}?????????${/link} ????????????.
+QueueToadlet.uploadSucceededTitle=????????????: ${filename}
+QueueToadlet.warningUnsafeContent=?????????????????????
+QueueToadlet.warningUnsafeContentExplanation=???????????????????????????????????????
 Freenet ????????????????????????! 
???????????????????????????????????????????????????????????????!
+QueueToadlet.wipD=?????????: ?????? (${size})
+QueueToadlet.wipDU=?????????: ???????????? (${size})
+QueueToadlet.wipU=?????????: ?????? (${size})
+RequestStarterGroup.scheduler=????????????????????????????????????: hard 
(???????????????????????????) ?????? soft (????????????????????????????????????)
+RequestStarterGroup.schedulerCHKInserts=??????????????????(CHK ??????)
+RequestStarterGroup.schedulerCHKRequests=??????????????????(CHK ??????)
+RequestStarterGroup.schedulerLong=???????????????????????????????????????.
+RequestStarterGroup.schedulerSSKInserts=??????????????????(SSK ??????)
+RequestStarterGroup.schedulerSSKRequests=??????????????????(SSK ??????)
+RevocationKeyFoundUserAlert.text=??????????????????????????????????????????????????????????????????.
 ????????????????????????????????????????????????????????????! ??????, 
???????????????????????????????????????, 
?????????"?????????"???????????????????????????. 
???????????????????????????????????????????????????????????????. 
?????????????????????????????????????????????. ???????????????: ${message}.
+RevocationKeyFoundUserAlert.title=????????????????????????????????????!
+SSL.enable=????????? SSL ??????????
+SSL.enableLong=????????? SSL ??????????
+SSL.keyPass=??????????????????
+SSL.keyPassLong=??????????????????
+SSL.keyStore=?????????????????????????????????
+SSL.keyStoreLong=?????????????????????????????????
+SSL.keyStorePass=????????????????????????
+SSL.keyStorePassLong=????????????????????????
+SSL.version=SSL ??????
+SSL.versionLong=SSL ??????, ??????????????? SSLv3 ?????? TLSv1 (???????????? 
SSLv3)
+ShortOption.parseError=????????????????????????????????????????????????: 
${error}
+SimpleToadletServer.advancedMode=?????????????????????????
+SimpleToadletServer.advancedModeLong=????????????????????????????????????????????????????????????.
 ?????????????????????????????????.
+SimpleToadletServer.allowedFullAccess=??? FProxy 
??????????????????????????????(???????????????)
+SimpleToadletServer.allowedFullAccessLong=?????????????????????????????????(?????????????????????,
 ????????????)?????????. ??????: ??????????????? fproxy 
?????????????????????????????????!
+SimpleToadletServer.allowedHosts=??????????????? FProxy 
????????????????????????????????????.
+SimpleToadletServer.allowedHostsLong=???????????????????????????????????? CIDR 
?????????????????????(?????? 192.168.0.0/24)?????????, ???????????????. ??????, 
??????????????????????????????????????????????????????????????????.
+SimpleToadletServer.bindTo=??????????????????
+SimpleToadletServer.bindToLong=??????????????????????????????
+SimpleToadletServer.cannotChangePortOnTheFly=???????????????????????? FProxy 
?????????????????????
+SimpleToadletServer.couldNotChangeBindTo=???????????? FProxy 
?????????????????????: ${error}.
 SimpleToadletServer.cssName=??????????????????
-StatisticsToadlet.activityInserts=??????: ?????? ${totalSenders} ????????????, 
${CHKhandlers} ???CHK?????????, ${SSKhandlers} ???SSK?????????
-StatisticsToadlet.activityRequests=??????: ?????? ${totalSenders} 
????????????, ${CHKhandlers} ???CHK?????????, ${SSKhandlers} ???SSK?????????
-StatisticsToadlet.allocMemory=Java??????????????????: ${memory}
+SimpleToadletServer.cssNameLong=?????? Freenet ?????????????????????
+SimpleToadletServer.cssOverride=???????????? CSS ???????????????(??????!)
+SimpleToadletServer.cssOverrideCantRead=????????????????????? CSS ?????????: 
${filename}
+SimpleToadletServer.cssOverrideLong=???????????????????????????????????? CSS 
????????????????????????. ??????: CSS ??????????????????, ????????????????????? 
CSS ????????????! ?????????????????????. (?????????????????? CSS ?????? devl at 
freenetproject ???????????????????????????????????????????????? ;))
+SimpleToadletServer.cssOverrideNotInUploads=???????????????????????????: 
?????? ${filename} ?????????????????????????????????!
+SimpleToadletServer.doRobots=??? robots.txt ???????????????????
+SimpleToadletServer.doRobotsLong=???????????? /robots.txt ?????? google, 
????????????, ?????? wget ???????????????
+SimpleToadletServer.enableInlinePrefetch=?????????????????????????????????????
+SimpleToadletServer.enableInlinePrefetchLong=?????????????????????????????????????????????????????????,
 ??????????????????????????????. ??????????????????.
+SimpleToadletServer.enableJS=??? FProxy ?????? Javascript?
+SimpleToadletServer.enableJSLong=???????????? FProxy ?????? Javascript 
"????????????". ??????????????????????????????. ?????????, 
????????????????????????, freesite ??????????????? Javascript.
+SimpleToadletServer.enablePersistentConnections=?????????????????? HTTP 
??????? (?????????????????????)
+SimpleToadletServer.enablePersistentConnectionsLong=???????????????????????????,
 ????????????????????????????????????????????????????????? HTTP ??????, 
????????????????????????.
+SimpleToadletServer.enabled=???????????? FProxy?
+SimpleToadletServer.enabledLong=??????????????? FProxy ???????????? HTTP ??????
+SimpleToadletServer.illegalCSSName=CSS ?????????????????????????????????!
+SimpleToadletServer.panicButton=?????????????????????????
+SimpleToadletServer.panicButtonLong=?????????????????????'????????????', 
????????????????????????????????????????????????, ???????????????????????????.
+SimpleToadletServer.port=FProxy ????????????
+SimpleToadletServer.portLong=FProxy ??????????????? TCP ????????????
+SimpleToadletServer.ssl=?????? SSL?
+SimpleToadletServer.sslLong=????????? FProxy ????????? SSL
+StartupToadlet.entropyErrorContent=???????????????????????????... Freenet 
?????????????????????????????????.
+StartupToadlet.entropyErrorTitle=????????????!
+StartupToadlet.isStartingUp=?????????????????????, ?????????.
+StartupToadlet.title=Freenet ???????????????
+StaticToadlet.pathInvalidChars=????????? URI ??????????????????????????????.
+StaticToadlet.pathNotFound=????????????????????????.
+StaticToadlet.pathNotFoundTitle=??????????????????
+StatisticsToadlet.ackOnlyBytes=?????????????????????: ${total}
+StatisticsToadlet.activityInserts=??????: ?????? ${totalSenders} ????????????, 
${CHKhandlers} ??? CHK ?????????, ${SSKhandlers} ??? SSK ?????????
+StatisticsToadlet.activityRequests=??????: ?????? ${totalSenders} 
????????????, ${CHKhandlers} ??? CHK ?????????, ${SSKhandlers} ??? SSK ?????????
+StatisticsToadlet.adminBytes=????????????: ${initial} ???????????????, 
${changedIP} ???????????????????????????, ${disconn} ???????????????, 
${routingStatus} ?????????????????????
+StatisticsToadlet.allocMemory=Java ??????????????????: ${memory}
+StatisticsToadlet.announceBytes=????????????: ${total}
+StatisticsToadlet.authBytes=????????????: ?????? ${total}
 StatisticsToadlet.bandwidthTitle=??????
 StatisticsToadlet.cpus=?????????CPU??????: ${count}
+StatisticsToadlet.debuggingBytes=????????????: ${netColoring} ???????????????, 
${ping} ??? ping, ${probe} ???????????????, ${routed} ?????????????????????.
+StatisticsToadlet.fullTitle=${name} ???????????????
 StatisticsToadlet.getLogs=???????????????????????????
 StatisticsToadlet.inputRate=????????????: ?????? ${rate} (???????????? ${max})
-StatisticsToadlet.jeDumpButton=????????????JE??????
+StatisticsToadlet.insertOutput=????????????(???????????????): CHK ${chk} SSK 
${ssk}.
+StatisticsToadlet.javaVersion=Java ??????: ${version}
+StatisticsToadlet.jeDumpButton=?????? JE ??????
 StatisticsToadlet.jvmInfoTitle=JVM??????
 StatisticsToadlet.jvmVendor=JVM ???????????? ${vendor}
 StatisticsToadlet.jvmVersion=JVM??????: ${version}
-StatisticsToadlet.maxMemory=Java???????????????: ${memory}
+StatisticsToadlet.maxMemory=Java ???????????????: ${memory}
+StatisticsToadlet.noRequests=???????????????????????????????????????.
+StatisticsToadlet.nodeToNodeBytes=???????????????: ${total}
+StatisticsToadlet.offerReplys=????????????????????????: ${chk} ??? CHK, ${ssk} 
??? SSK.
+StatisticsToadlet.offeredKeyOutput=????????????: ???????????? ${total}, 
???????????? ${offered}
 StatisticsToadlet.osArch=????????????????????????: ${arch}
 StatisticsToadlet.osName=??????????????????: ${name}
 StatisticsToadlet.osVersion=??????????????????: ${version}
 StatisticsToadlet.outputRate=????????????: ?????? ${rate} (???????????? ${max})
 StatisticsToadlet.payloadOutput=????????????: ${total} (?????? ${rate}) 
(${percent}%)
 StatisticsToadlet.peerStatsTitle=????????????
-StatisticsToadlet.threadDumpButton=????????????????????????
+StatisticsToadlet.priority=?????????
+StatisticsToadlet.requestOutput=????????????(???????????????): CHK ${chk} SSK 
${ssk}.
+StatisticsToadlet.resendBytes=????????????: ${total}
+StatisticsToadlet.routingDisabled=??????????????????(??????????????????????????????,
 ????????????????????????????????????)
+StatisticsToadlet.routingDisabledShort=??????????????????
+StatisticsToadlet.running=?????????
+StatisticsToadlet.statisticGatheringTitle=????????????
+StatisticsToadlet.swapOutput=????????????: ${total}.
+StatisticsToadlet.threadDumpButton=??????????????????
 StatisticsToadlet.threads=??????????????????: ${running}/${max}
+StatisticsToadlet.threadsByPriority=???????????????????????????
 StatisticsToadlet.totalInput=????????????: ${total} (?????? ${rate})
 StatisticsToadlet.totalOutput=????????????: ${total} (?????? ${rate})
-StatisticsToadlet.transferringRequests=????????????: ?????? ${senders}, ?????? 
${receivers}
-StatisticsToadlet.usedMemory=Java??????????????????: ${memory}
+StatisticsToadlet.totalOverhead=?????????????????????: ?????? ${rate} 
(${percent}%).
+StatisticsToadlet.transferringRequests=??????????????????: ${senders} 
???????????????, ${receivers} ???????????????
+StatisticsToadlet.unaccountedBytes=????????????: ${total} (${percent}%)
+StatisticsToadlet.uomBytes=??????????????????: ${total}
+StatisticsToadlet.usedMemory=Java ??????????????????: ${memory}
 StatisticsToadlet.versionTitle=??????????????????
+StatisticsToadlet.waiting=?????????
 SymlinkerToadlet.symlinks=ToadletServer??????????????????
+SymlinkerToadlet.symlinksLong=????????? "??????#??????" ??????????????????, 
???????????????????????????
+TestnetHandler.cannotEnableDisableOnTheFly=???????????????????????????????????????(testnet)??????;
 ????????????????????????????????????
+TestnetHandler.enable=????????????????????????(testnet)???????(??????!)
+TestnetHandler.enableLong=???????????????????????????(testnet)??????(??????!). 
?????????????????????????????????????????????????????????????????????, 
??????????????????????????????????????????.
+TestnetHandler.port=????????????(Testnet)???????????????
+TestnetHandler.portLong=????????????(Testnet)?????????????????????(-1 
????????????????????????????????? 1000)
 TextModeClientInterfaceServer.allowedHosts=??????????????????
+TextModeClientInterfaceServer.allowedHostsLong=????????????????????????????????????????????????????????????.
 ?????????????????????????????????: ?????????, ?????????????????????, ????????? 
CIDR ?????????????????????(?????? 192.168.0.0/24).
 TextModeClientInterfaceServer.bindTo=??????????????????
 TextModeClientInterfaceServer.bindToLong=???????????????IP??????
 TextModeClientInterfaceServer.enableInputOutput=?????????stdout/stdin?
+TextModeClientInterfaceServer.enableInputOutputLong=??????????????????????????????????????????????????????????????????????
 (????????????????????????????????? telnet ??????????????????, 
???????????????????????? socket ????????????)
 TextModeClientInterfaceServer.enabled=??????????????????
 
TextModeClientInterfaceServer.enabledLong=???????????????????????????????????????
+TextModeClientInterfaceServer.ssl=?????? SSL?
+TextModeClientInterfaceServer.sslLong=????????????????????????????????????????????????
 SSL
 TextModeClientInterfaceServer.telnetPortNumber=???????????????
+TextModeClientInterfaceServer.telnetPortNumberLong=????????????????????????????????????
 TCP ????????????
+TimeSkewDetectedUserAlert.shortText=?????????????????????????????????????????????.
 Freenet ???????????????????????????!
+TimeSkewDetectedUserAlert.text=???????????????????????????????????????????????????.
 ???????????????. ??????????????????????????????, ????????????????????????. 
???????????????????????????????????????????????????, ??????????????????, 
????????????????????????.
+TimeSkewDetectedUserAlert.title=?????????????????????!
 Toadlet.cancel=??????
-TranslationToadlet.bracketRemoveOverride=(?????????????????????!)
+Toadlet.clickHere=?????????
+Toadlet.homepage=??????
+Toadlet.internalErrorPleaseReport=????????????: ?????????
+Toadlet.internalErrorTitle=????????????
+Toadlet.no=???
+Toadlet.nodeHomepage=????????????
+Toadlet.notSupportedTitle=?????????
+Toadlet.notSupportedWithClass=?????????????????????????????? Freenet 
(${class}) ?????????????????????.
+Toadlet.ok=???
+Toadlet.permRedirectWithReason=????????????: ${reason}
+Toadlet.returnToNodeHomepage=??????????????????
+Toadlet.returnToPrevPage=???????????????
+Toadlet.returnToQueuepage=??????????????????
+Toadlet.tempRedirectWithReason=????????????: ${reason}
+Toadlet.unauthorized=?????????????????????????????????.
+Toadlet.unauthorizedTitle=????????????
+Toadlet.yes=???
+ToadletContextImpl.cannotParseContentLength=????????????????????????: ${error}
+ToadletContextImpl.cannotParseContentLengthWithError=????????????????????????: 
${error}
+ToadletContextImpl.headersLineTooLong=?????????????????????????????????????????????
+ToadletContextImpl.methodNotAllowed=HTTP ???????????????
+ToadletContextImpl.noContentLengthInPOST=??? POST 
?????????????????????????????????
+ToadletContextImpl.noSuchToadlet=???????????????????????? Toadlet
+ToadletContextImpl.parseErrorWithError=????????????: ${error}
+ToadletContextImpl.uriParseErrorTitle=URI ????????????
+TranslationToadlet.bracketRemoveOverride=(????????????????????????!)
 TranslationToadlet.bracketTranslateIt=(???????????????????????????!)
 TranslationToadlet.bracketUpdateTranslation=(??????????????????)
 
TranslationToadlet.confirmRemoveOverride=????????????????????????????????????:(${key}
 - ${value})????
@@ -310,75 +1189,127 @@
 TranslationToadlet.currentTranslationLabel=????????????
 TranslationToadlet.downloadTranslationsFile=????????????????????????
 TranslationToadlet.hideAlreadyTranslated=?????????????????????????????????
+TranslationToadlet.noCustomTranslations=????????????????????????.
 TranslationToadlet.originalVersionLabel=???????????????(????????????)
 TranslationToadlet.reEdit=????????????????????????
 TranslationToadlet.remove=??????
+TranslationToadlet.removeOverrideTitle=?????????????????????
+TranslationToadlet.removeOverrideWarningTitle=????????????????????????????????????!
 TranslationToadlet.returnToTranslations=??????????????????
 
TranslationToadlet.showEverything=????????????,?????????????????????????????????
 TranslationToadlet.translationKeyLabel=????????????
 TranslationToadlet.translationUpdateTitle=????????????
 TranslationToadlet.translationUpdatedTitle=??????????????????!
 TranslationToadlet.updateTranslationCommand=??????????????????!
-UpdatedVersionAvailableUserAlert.armed=???????????????????????????????????????????????????Freenet?????????,??????????????????.
+UnknownContentTypeException.explanation=?????? Freenet ????????????????????? 
MIME ??????. ????????????, 
???????????????????????????????????????????????????????????????, 
????????????????????????. ?????????, 
???????????????????????????????????????????????????????????????, 
???????????????????????????????????????; ??????????????????????????????, 
?????????????????????????????????, 
?????????????????????????????????(?????????????????????????????????????????????,
 ?????????????????????????????????????????????). ?????????????????????, 
????????????????????????????????????????????????, ?????????????????? script 
?????????????????????????????????????????????.
+UnknownContentTypeException.title=??????????????????????????????????????????: 
${type}
+UpdateDeployContext.cannotUpdateNoExtJar=????????? wrapper.conf 
??????????????? freenet-ext.jar (????????????????????? freenet.jar: 
${mainFilename})
+UpdateDeployContext.cannotUpdateNoJars=????????? wrapper.conf ????????? 
Freenet ????????? jar ??????
+UpdateDeployContext.cannotUpdateNoMainJar=????????? wrapper.conf 
??????????????? freenet.jar (????????????????????? freenet-ext.jar: 
${extFilename})
+UpdateDeployContext.updateCatastrophe=??????????????????: 
????????????????????? ${old}, ???????????????????????? ${new} ????????? ${old}, 
??????*?????????????????????*! ???????????????????????? ${new} ????????? ${old} 
?????????????????????.
+UpdateDeployContext.updateFailedCannotDeleteOldConfig=????????????????????? 
${old}, ??????????????????????????????????????????. ??????????????????.
+UpdateDeployContext.updateFailedNonStandardConfig=?????????????????????????????????????????????????????????:
 ???????????? main=${main} ext=${ext} - ????????????????????????! 
?????????????????????????????????, ??????????????? wrapper.conf ??????.
+UpdatedVersionAvailableUserAlert.alsoDownloadedNewExtJar=???????????????????????????
 Freenet ????????????, ????????? ${version}
+UpdatedVersionAvailableUserAlert.armed=?????????????????????????????? Freenet 
????????????????????????,??????????????????.
+UpdatedVersionAvailableUserAlert.clickToUpdateASAP=??????????????????, 
???????????????????????????????????????.
 
UpdatedVersionAvailableUserAlert.clickToUpdateNow=????????????????????????????????????????????????.
-UpdatedVersionAvailableUserAlert.downloadedNewExtJar=???????????????????????????????????????Freenet????????????,?????????${version}.
-UpdatedVersionAvailableUserAlert.downloadedNewJar=???????????????????????????????????????Freenet??????,?????????${version}.
-UpdatedVersionAvailableUserAlert.fetchingNewNode=?????????????????????????????????????????????Freenet??????(????????????
 ${nodeVersion}).
-UpdatedVersionAvailableUserAlert.notLatest=??????????????????????????????????????????????????????.
-UpdatedVersionAvailableUserAlert.title=Freenet????????????????????????????????????
+UpdatedVersionAvailableUserAlert.downloadedNewExtJar=??????????????????????????????
 Freenet ????????????, ????????? ${version}.
+UpdatedVersionAvailableUserAlert.downloadedNewJar=??????????????????????????????
 Freenet ??????, ????????? ${version}.
+UpdatedVersionAvailableUserAlert.fetchingNewBoth=??????????????????????????? 
Freenet ?????? (??????????????? ${nodeVersion}, ????????????????????? 
${extVersion}).
+UpdatedVersionAvailableUserAlert.fetchingNewExt=??????????????????????????? 
Freenet ?????? (??? ${extVersion} ?????????????????? jar ??????).
+UpdatedVersionAvailableUserAlert.fetchingNewNode=?????????????????????????????????
 Freenet ?????? (??????????????? ${nodeVersion}).
+UpdatedVersionAvailableUserAlert.finalCheck=????????????????????????????????????????????????????????????
 (??????: ${count}/${max}, ????????????????????????: ${time}).
+UpdatedVersionAvailableUserAlert.notLatest=???????????????????????????????????????????????????.
+UpdatedVersionAvailableUserAlert.shortArmed=??????????????????????????? 
Freenet ??????, ???????????????????????????.
+UpdatedVersionAvailableUserAlert.shortNotReadyNotArmed=???????????????????????????
 Freenet ??????, ???????????????????????????????????????.
+UpdatedVersionAvailableUserAlert.shortReadyNotArmed=??????????????????????????????
 Freenet ??????, ???????????????????????????????????????.
+UpdatedVersionAvailableUserAlert.title=???????????? Freenet ??????????????????
 UpdatedVersionAvailableUserAlert.updateASAPButton=????????????
-UpdatedVersionAvailableUserAlert.updateASAPQuestion=??????????????????????????????????????????????????????????????????????
+UpdatedVersionAvailableUserAlert.updateASAPQuestion=???????????????????????????????????????????????????,
 ??????????????????????
 UpdatedVersionAvailableUserAlert.updateNowButton=????????????!
 UserAlert.apply=??????
 UserAlert.hide=??????
 UserAlert.reset=??????
-UserAlertManager.criticalErrorCountLabel=????????????:
+UserAlertManager.alertsOnAlertsPage=| 
??????${link}????????????${/link}??????????????????.
+UserAlertManager.alertsTitle=???????????????
+UserAlertManager.clickForMore=????????????????????????????????????????????????,
 ??????????????????.
+UserAlertManager.criticalErrorCountLabel=????????????:
+UserAlertManager.dumpEventsButton=?????????????????????
 UserAlertManager.errorCountLabel=??????:
 UserAlertManager.minorCountLabel=??????:
 UserAlertManager.totalLabel=??????:
 UserAlertManager.warningCountLabel=??????:
 UserAlertsToadlet.titleWithName=${name} ???????????????
-WelcomeToadlet.activityTitle=????????????
+WelcomeToadlet.activityTitle=????????????
 WelcomeToadlet.alertsSummary=??????????????????
 WelcomeToadlet.arkFetchCount=ARK?????????: ${total}
 WelcomeToadlet.confirmAddBookmarkSubTitle=??????????????????
-WelcomeToadlet.confirmExternalLinkTitle=?????????????????????
-WelcomeToadlet.confirmExternalLinkWithURL=??????????????????????????????????????????${url}????????????????????????
 Freenet 
?????????????????????????????????????????????????????????????????????????????????????????????
+WelcomeToadlet.confirmAddBookmarkTitle=????????????
+WelcomeToadlet.confirmAddBookmarkWithKey=???????????????????????? ${key} 
??????????????????, ???????????????????????????:
+WelcomeToadlet.confirmExternalLinkSubTitle=??????????????????
+WelcomeToadlet.confirmExternalLinkTitle=??????: ????????????
+WelcomeToadlet.confirmExternalLinkWithURL=??????????????????????????????????????????${url}???????????????????????????
 Freenet 
?????????????????????????????????????????????????????????????????????????????????????????????
+WelcomeToadlet.confirmFIN=?????????????????????????????? Frost ???????
+WelcomeToadlet.databaseStatsSubTitle=???????????????
+WelcomeToadlet.databaseStatsTitle=?????? JE ??????
 WelcomeToadlet.disabledAlert=????????????
 WelcomeToadlet.extVersion=Freenet-ext ????????????:${build} r${rev}
 WelcomeToadlet.extVersionWithRecommended=Freenet-ext ????????????:${build} 
(??????????????????${recbuild}) ????????????:${rev}
-WelcomeToadlet.fetch=???
-WelcomeToadlet.fetchKeyLabel=?????? Key
-WelcomeToadlet.finInsertSuccessWithKey=????????????????????????????????? 
${key} ???
+WelcomeToadlet.fetch=??????
+WelcomeToadlet.fetchKeyLabel=????????????
+WelcomeToadlet.finInsertSuccessWithKey=??????????????????????????? ${key}.
+WelcomeToadlet.finInsertedTitle=??????
+WelcomeToadlet.finTitle=?????? Frost ????????????
+WelcomeToadlet.fromHeader=??????
+WelcomeToadlet.goToExternalLink=?????????????????????
 WelcomeToadlet.homepageFullTitleWithName=${name} ??? Freenet FProxy ??????
 WelcomeToadlet.ieWarning=???????????????????????????Internet 
Explorer???????????????????????????????????????????????????
+WelcomeToadlet.ieWarningTitle=??????????????????!
 WelcomeToadlet.insertCount=??????: ${total}
-WelcomeToadlet.insertFailedTitle=????????????
-WelcomeToadlet.insertSucceededTitle=??????????????????
-WelcomeToadlet.insertedTitle=????????????
-WelcomeToadlet.keyInsertedSuccessfullyWithKeyAndName=?????????????????? key 
${link}${name}${/link}???
+WelcomeToadlet.insertFailedTitle=????????????
+WelcomeToadlet.insertFailedWithMessage=???????????????, ???????????????: 
${message}
+WelcomeToadlet.insertSucceededTitle=????????????
+WelcomeToadlet.insertedTitle=??????
+WelcomeToadlet.keyInsertedSuccessfullyWithKeyAndName=?????? 
${link}${name}${/link} ?????????????????????.
+WelcomeToadlet.keyRequestLabel=??????:
+WelcomeToadlet.messageHeader=??????
 WelcomeToadlet.nodeUpdateConfirm=????????????????????????Freenet??????????
 WelcomeToadlet.nodeUpdateConfirmTitle=??????????????????
+WelcomeToadlet.post=??????
 WelcomeToadlet.privateKeyHeader=??????
 WelcomeToadlet.publicKeyHeader=??????
-WelcomeToadlet.requestCount=??????: ${total}
+WelcomeToadlet.requestCount=??????: ${total}
 WelcomeToadlet.restart=??????
 WelcomeToadlet.restartConfirm=??????????????????????????????Freenet??????????
 WelcomeToadlet.restartConfirmTitle=????????????
 WelcomeToadlet.restartNode=????????????
-WelcomeToadlet.restarting=??????????????????????????????????????????,???????????????????????????????????????.???????????????Freenet.
-WelcomeToadlet.restartingTitle=???Freenet?????????????????????.
+WelcomeToadlet.restarting=???????????????????????????????????????, 
???????????????????????????????????????. ???????????????Freenet.
+WelcomeToadlet.restartingTitle=Freenet ?????????????????????.
 WelcomeToadlet.shutdown=??????
 WelcomeToadlet.shutdownConfirm=???????????????????????? Freenet ????????????
 WelcomeToadlet.shutdownConfirmTitle=????????????
+WelcomeToadlet.shutdownDone=Freenet ?????????????????????.
 WelcomeToadlet.shutdownNode=????????????
 WelcomeToadlet.splitfileErrorLabel=??????????????????
+WelcomeToadlet.startIndexHeader=???????????????
+WelcomeToadlet.subjectHeader=??????
+WelcomeToadlet.targetBoardHeader=???????????????
+WelcomeToadlet.testnetWarning=???????????????(testnet)???????????????. 
?????????????????????????????????!
 WelcomeToadlet.testnetWarningTitle=??????(????????????)??????
 WelcomeToadlet.thanks=???????????? Freenet.
-WelcomeToadlet.transferringRequestCount=????????????: ${total}
+WelcomeToadlet.threadDumpNotUsingWrapper=?????????????????????????????????, 
????????????????????????????????????!
+WelcomeToadlet.threadDumpSubTitle=????????????????????????
+WelcomeToadlet.threadDumpTitle=??????????????????
+WelcomeToadlet.threadDumpWithFilename=????????????????????????, 
??????????????? ${filename} ???????????????.
+WelcomeToadlet.transferringRequestCount=??????????????????: ${total}
 WelcomeToadlet.update=??????
 
WelcomeToadlet.updating=???Freenet??????????????????,?????????????????????????????????.???????????????????????????????????????????????????,???????????????????????????????????????.
 WelcomeToadlet.updatingTitle=???????????????
+WelcomeToadlet.uriWouldHaveBeen=URI ?????????: ${uri}
 WelcomeToadlet.version=Freenet ??????:${fullVersion} ????????????:${build} 
r${rev}
 WelcomeToadlet.versionHeader=?????????????????????
+WelcomeToadlet.writtenDatabaseStats=????????????????????????????????????????????????????????????????????????
+WrapperConfig.wrapper.java.maxmemory.long=Freenet ?????????????????????. 
?????????????????????????????????, Freenet ???????????????????????????; 
??????????????????????????????????????????, ????????????????????????. 
?????????????????????????????? Freenet ??????????????????.
+WrapperConfig.wrapper.java.maxmemory.short=???????????????(?????????MiB)
+testing.test=??????$(test1)??????$(test2)??????
 End

Modified: branches/db4o/freenet/src/freenet/l10n/freenet.l10n.zh-tw.properties
===================================================================
--- branches/db4o/freenet/src/freenet/l10n/freenet.l10n.zh-tw.properties        
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/l10n/freenet.l10n.zh-tw.properties        
2008-08-07 18:30:55 UTC (rev 21657)
@@ -1,8 +1,20 @@
+Announcer.announceAlertIntro=Freenet ????????????????????? - 
?????????????????????????????????. ????????????????????????, 
????????????????????????. ????????????????????? Freenet 
????????????????????????, ????????????????????????, ??????????????? 24 
??????????????????.
+Announcer.announceAlertNoSeednodes=????????? seednodes.fref ??????, 
????????????????????????????????????????????????(opennet)???. 
???????????????????????????, ????????? 
http://downloads.freenetproject.org/alpha/opennet/ ?????????????????????.
+Announcer.announceAlertShort=?????????????????????????????????, 
????????????????????????.
+Announcer.announceAlertTitle=???????????????
+Announcer.announceDetails=????????????????????? ${recentSentAnnouncements} 
???????????????, ????????? ${runningAnnouncements} ??????????????????, 
??????????????? ${addedNodes} ?????????(????????? ${refusedNodes} 
??????????????????). ????????????????????? ${connectedSeednodes} 
?????????????????????, ???????????????????????? ${disconnectedSeednodes} 
???????????????.
+Announcer.announceDisabledTooOld=???????????????????????????, 
???????????????????????? Freenet ????????????. ???????????????????????????, 
????????????????????????????????????. 
?????????????????????????????????(????????????????????????????????????????????????,
 ?????????????????????).
+Announcer.announceDisabledTooOldShort=??????????????????????????????, 
???????????? Freenet ???????????????. ???????????????????????????.
+Announcer.announceDisabledTooOldTitle=?????????????????????(????????????)
+Announcer.announceLoading=Freenet ???????????????????????????, 
???????????????????????????????????????. 
??????????????????????????????????????????.
+Announcer.coolingOff=??????????????? ${time} ?????????, 
??????????????????????????????????????????????????????????????????, 
???????????????????????????????????????, ??????????????????????????????.
+Bookmark.noName=??????
 BookmarkEditorToadlet.addBookmark=????????????
 BookmarkEditorToadlet.addCategory=????????????
+BookmarkEditorToadlet.addDefaultBookmarks=??????????????????????????????.
 BookmarkEditorToadlet.addNewBookmark=??????????????????
 BookmarkEditorToadlet.addNewCategory=???????????????
-BookmarkEditorToadlet.addedNewBookmark=??????????????????????????????.
+BookmarkEditorToadlet.addedNewBookmark=??????????????????????????????.
 BookmarkEditorToadlet.addedNewBookmarkTitle=?????????????????????
 BookmarkEditorToadlet.bookmarkDoesNotExist="${bookmark}"?????????????????????.
 BookmarkEditorToadlet.cancelCut=????????????
@@ -18,106 +30,222 @@
 
BookmarkEditorToadlet.deleteCategoryConfirm=??????????????????${bookmark}??????????????????????????????????????????????
 BookmarkEditorToadlet.deleteSucceeded=??????????????????????????????.
 BookmarkEditorToadlet.deleteSucceededTitle=????????????
+BookmarkEditorToadlet.descLabel=????????????:
 BookmarkEditorToadlet.edit=??????
 BookmarkEditorToadlet.editBookmarkTitle=????????????
 BookmarkEditorToadlet.editCategoryTitle=????????????
 BookmarkEditorToadlet.error=??????
+BookmarkEditorToadlet.hasAnActivelinkLabel=?????? freesite 
?????????????????????????
+BookmarkEditorToadlet.invalidKey=?????????Freenet??????.
 BookmarkEditorToadlet.invalidKeyTitle=????????????
-BookmarkEditorToadlet.invalidKeyWithReason=?????????Freenet??????.
+BookmarkEditorToadlet.invalidKeyWithReason=????????? Freenet ??????.
 BookmarkEditorToadlet.keyLabel=??????:
 BookmarkEditorToadlet.moveDown=??????
 BookmarkEditorToadlet.moveUp=??????
 BookmarkEditorToadlet.myBookmarksTitle=????????????
 BookmarkEditorToadlet.nameLabel=??????:
 BookmarkEditorToadlet.paste=??????
-BookmarkEditorToadlet.pasteOrCancel=??????????????????????????????????????????,??????????????????.
+BookmarkEditorToadlet.pasteOrCancel=????????????????????????????????????, 
??????????????????.
 BookmarkEditorToadlet.pasteTitle=??????/??????
 BookmarkEditorToadlet.save=??????
 BookmarkEditorToadlet.title=???????????????
+BookmarkEditorToadlet.urlDecodeError=URL????????????
+BookmarkItem.bookmarkUpdated=???????????????????????? ${name} 
?????????????????? ${edition} ???.
+BookmarkItem.bookmarkUpdatedShort=?????????????????? freesite ????????????: 
${name}
+BookmarkItem.bookmarkUpdatedTitle=??????????????????: ${name}
+BookmarkItem.bookmarkUpdatedWithLink=???????????????????????? 
${link}${name}${/link} ?????????????????? ${edition} ???.
+BookmarkItem.deleteBookmarkUpdateNotification=????????????
+BookmarkItem.unnamedBookmark=???????????????
 BookmarkManager.list=????????????
+BookmarkManager.listLong=?????????????????? freesite ??????
+BookmarkManager.malformedBookmark=?????????????????????
 BooleanOption.parseError=????????????????????????: ${val} - ????????? true ??? 
false
-BuildOldAgeUserAlert.tooOld=???????????????????????????????????????????????????????????????????????????????????????????????????(Build
 #${lastgood}). ???????????????????????????, 
??????????????????????????????"??????"?????????????????????. 
(????????????????????????, Freenet ??????????????????????????????????????????)
-BuildOldAgeUserAlert.tooOldShort=????????????????????? Freenet 
??????????????????, ?????????????????????????????????????????????! 
???????????????!
-BuildOldAgeUserAlert.tooOldTitle=???????????????
+BuildOldAgeUserAlert.tooOld=????????????????????????????????????????????????????????????????????????????????????????????????(Build
 #${lastgood}). ???????????????????????????, 
??????????????????????????????"??????"?????????????????????. 
(????????????????????????, Freenet 
?????????????????????????????????????????????)
+BuildOldAgeUserAlert.tooOldShort=??????????????? Freenet 
????????????????????????, ?????????????????????????????????????????????! 
???????????????!
+BuildOldAgeUserAlert.tooOldTitle=????????????
+CSSTokenizerFilter.deletedDisallowedString=????????????????????????
+CSSTokenizerFilter.deletedUnmatchedChar=????????????????????????:
+CSSTokenizerFilter.deletedUnofficialIdent=????????????????????????
+CSSTokenizerFilter.deletedUnofficialIdentWithURL=???????????????????????? url 
?????????
+CSSTokenizerFilter.invalidURLContents=url() ?????????????????????
+CSSTokenizerFilter.supplementalCharsNotSupported=????????????????????? 0xFFFF 
??? UCS-4 ??????!
+CSSTokenizerFilter.unknownAtIdentifierLabel=????????? @ ?????????:
+ClockProblemDetectedUserAlert.shortText=??????????????????????????????, 
Freenet ??????????????????.
+ClockProblemDetectedUserAlert.text=Freenet 
???????????????????????????(???????????????)????????????. 
??????????????????????????????????????????, Freenet ??????????????????.
+ClockProblemDetectedUserAlert.title=??????????????????.
+ConfigToadlet.appliedFailureExceptions=???????????????????????????, 
???????????????????????????:
+ConfigToadlet.appliedFailureTitle=??????????????????
+ConfigToadlet.appliedSuccess=??????????????????????????????.
 ConfigToadlet.appliedTitle=?????????????????????
 ConfigToadlet.apply=??????
+ConfigToadlet.configNavTitle=????????????
+ConfigToadlet.console=????????????
+ConfigToadlet.contributeTranslation=????????????????????????
+ConfigToadlet.defaultIs=?????????: '${default}'.
+ConfigToadlet.false=???
+ConfigToadlet.fcp=????????????
+ConfigToadlet.fproxy=????????????
 ConfigToadlet.fullTitle=${name} ??? Freenet ????????????
+ConfigToadlet.logger=?????????
+ConfigToadlet.modeAdvanced=??????????????????
+ConfigToadlet.modeSimple=??????????????????
+ConfigToadlet.node=??????
+ConfigToadlet.pluginmanager=???????????????
+ConfigToadlet.pluginmanager2=???????????????2
+ConfigToadlet.possibilitiesTitle=??????
 ConfigToadlet.reset=??????
+ConfigToadlet.returnToNodeConfig=??????????????????
 ConfigToadlet.shortTitle=??????
+ConfigToadlet.ssl=SSL (????????????)
+ConfigToadlet.title=Freenet ????????????
+ConfigToadlet.toadletsymlinker=toadlet???????????????
+ConfigToadlet.true=???
+ConfigToadlet.wrapper=????????????
+ConfigToadlet.wrapperSettingsTitle=??????????????????
+ConfigToadlet.node.load=??????.??????
+ConfigToadlet.node.opennet=??????.????????????
+ConfigToadlet.node.scheduler=??????.?????????
+ConfigToadlet.node.testnet=??????.????????????
+ConfigToadlet.node.updater=??????.????????????
 
ConfigurablePersister.doesNotExistCannotCreate=???????????????????????????????????????.
 
ConfigurablePersister.existsCannotReadWrite=??????????????????????????????????????????
 ConnectionsToadlet.nodeStatus.BACKED OFF=?????????
+ConnectionsToadlet.nodeStatus.BURSTING=?????????
+ConnectionsToadlet.nodeStatus.BUSY=?????????
+ConnectionsToadlet.nodeStatus.CLOCK PROBLEM=????????????
 ConnectionsToadlet.nodeStatus.CONNECTED=?????????
 ConnectionsToadlet.nodeStatus.CONNECTION ERROR=????????????
+ConnectionsToadlet.nodeStatus.DISABLED=?????????
 ConnectionsToadlet.nodeStatus.DISCONNECTED=?????????
+ConnectionsToadlet.nodeStatus.DISCONNECTING=?????????
+ConnectionsToadlet.nodeStatus.LISTEN ONLY=?????????
+ConnectionsToadlet.nodeStatus.LISTENING=?????????
+ConnectionsToadlet.nodeStatus.NEVER CONNECTED=????????????
+ConnectionsToadlet.nodeStatus.ROUTING DISABLED=???????????????
 ConnectionsToadlet.nodeStatus.TOO NEW=??????
 ConnectionsToadlet.nodeStatus.TOO OLD=??????
 ConnectionsToadlet.nodeStatus.UNKNOWN STATUS=????????????
+ConnectivityToadlet.addressTitle=??????
+ConnectivityToadlet.byIPTitle=${ip} ?????????????????????????????? - ${status} 
(????????????????????? ${tunnelLength})
+ConnectivityToadlet.byPortTitle=${port} ??????????????????????????? - 
${status} (????????????????????? ${tunnelLength})
+ConnectivityToadlet.connectivity=??????????????????
 ConnectivityToadlet.connectivityTitle=??????
+ConnectivityToadlet.firstReceiveLeadTime=???????????????????????????
+ConnectivityToadlet.firstSendLeadTime=???????????????????????????
+ConnectivityToadlet.local=??????
+ConnectivityToadlet.localRemoteTitle=??????/??????
+ConnectivityToadlet.noreply=????????????
+ConnectivityToadlet.remote=??????
+ConnectivityToadlet.sentReceivedTitle=??????/???????????????
 ConnectivityToadlet.summaryTitle=??????
-ContentDataFilter.unknownCharset=???????????????????????????????????????????????????.
 ????????????????????????????????????????????????, 
????????????????????????????????????.
+ConnectivityToadlet.title=${nodeName} ?????????????????????
+ContentDataFilter.unknownCharset=???????????????????????????????????????????????????.
 ????????????????????????????????????????????????, 
????????????????????????????????????.
 ContentDataFilter.unknownCharsetTitle=???????????????!
 ContentDataFilter.warningUnknownCharsetTitle=??????: ?????????????????? 
(${charset})
+ContentFilter.applicationPdfReadAdvice=Adobe(R) PDF ?????? - ????????????!
+ContentFilter.applicationPdfWriteAdvice=Adobe(R) PDF ?????? - ????????????!
+ContentFilter.imageGifReadAdvice=GIF ?????? - ???????????????
+ContentFilter.imageGifWriteAdvice=GIF ?????? - ???????????????, 
????????????????????????????????????
+ContentFilter.imageIcoReadAdvice=????????? - ???????????????
+ContentFilter.imageIcoWriteAdvice=????????? - 
???????????????(?????????????????????????????????????????????????)
+ContentFilter.imageJpegReadAdvice=JPEG ?????? - ???????????????
+ContentFilter.imageJpegWriteAdvice=JPEG ?????? - ???????????????, 
?????????????????? EXIF ??????
+ContentFilter.imagePngReadAdvice=PNG ?????? - ???????????????
+ContentFilter.imagePngWriteAdvice=PNG ?????? - ???????????????, 
???????????????????????????????????????????????????
+ContentFilter.textCssReadAdvice=CSS (cascading style sheet, ???????????????, 
??????????????? HTML) - ????????????????????????????????????, 
??????????????????????????????, ???????????????
+ContentFilter.textCssWriteAdvice=CSS (cascading style sheet, ???????????????, 
??????????????? HTML) - ????????????????????????(metadata), ???????????????
+ContentFilter.textHtmlReadAdvice=HTML - ??????????????????????????????
+ContentFilter.textHtmlWriteAdvice=HTML - 
????????????????????????????????????????????????(metadata); 
?????????????????????
+ContentFilter.textPlainReadAdvice=????????? - 
?????????????????????????????????(????????? IE, Internet 
Explorer)??????????????????
+ContentFilter.textPlainWriteAdvice=????????? - 
????????????????????????????????????, ???????????????
 DarknetConnectionsToadlet.activityInserts=??????: 
??????${totalSenders}????????????, ${CHKhandlers}???CHK?????????, 
${SSKhandlers}???SSK?????????
 DarknetConnectionsToadlet.activityRequests=??????: 
??????${totalSenders}????????????, ${CHKhandlers}???CHK?????????, 
${SSKhandlers}???SSK?????????
 DarknetConnectionsToadlet.activityTitle=????????????
 DarknetConnectionsToadlet.add=??????
 DarknetConnectionsToadlet.addPeerTitle=??????????????????
-DarknetConnectionsToadlet.backedOff=?????????????????????:????????????????????????????????????,?????????????????????????????????.
+DarknetConnectionsToadlet.alreadyInReferences=???????????????????????????.
+DarknetConnectionsToadlet.backedOff=?????????????????????: 
????????????????????????????????????, ?????????????????????????????????.
 DarknetConnectionsToadlet.backedOffShort=?????????
-DarknetConnectionsToadlet.busy=??????:????????????????????????,??????????????????????????????????????????????????????,??????????????????????????????????????????.
+DarknetConnectionsToadlet.bursting=?????????????????????: 
????????????????????????, ????????????????????????????????????, 
?????????????????????????????????????????????.
+DarknetConnectionsToadlet.burstingShort=?????????
+DarknetConnectionsToadlet.busy=??????: ????????????????????????, 
??????????????????????????????????????????????????????, 
???????????????????????????????????????.
 DarknetConnectionsToadlet.busyShort=??????
 DarknetConnectionsToadlet.cancel=??????
 DarknetConnectionsToadlet.cantFetchNoderefURL=????????? ${url} 
??????????????????.???????????????.
 
DarknetConnectionsToadlet.cantParseTryAgain=????????????????????????????????????:(${error}).???????????????.
 
DarknetConnectionsToadlet.cantParseWrongEnding=???????????????????????????:?????????????????????????????????End??????,?????????????????????????????????:${end}
+DarknetConnectionsToadlet.clockProblem=??????????????????????????????????????? 
24 ??????. ??????????????????????????????, 
????????????????????????????????????????????????????????????.
+DarknetConnectionsToadlet.clockProblemShort=????????????
+DarknetConnectionsToadlet.confirmRemoveNode=???????????????????????? "${name}" 
???? ?????????????????????????????????, ???????????????????????????, 
??????????????????????????????????????????????????????, 
???????????????????????????.
 DarknetConnectionsToadlet.confirmRemoveNodeTitle=?????????
 DarknetConnectionsToadlet.confirmRemoveNodeWarningTitle=????????????
+DarknetConnectionsToadlet.connError=????????????(????????????????)
+DarknetConnectionsToadlet.connErrorShort=????????????
 DarknetConnectionsToadlet.connected=?????????:??????????????????????????????
 DarknetConnectionsToadlet.connectedShort=?????????
-DarknetConnectionsToadlet.disabled=?????????????????????:????????????????????????????????????????????????.
-DarknetConnectionsToadlet.disabledShort=?????????
+DarknetConnectionsToadlet.darknetFnpPort=????????????(Darknet) FNP: 
${port}/UDP (???????????????????????????, ?????????"??????", ????????????; 
?????????????????????????????????????????????)
+DarknetConnectionsToadlet.disabled=?????????????????????: 
?????????????????????????????????????????????????????????.
+DarknetConnectionsToadlet.disabledShort=?????????
+DarknetConnectionsToadlet.disconnecting=????????? (?????????????????????, 
?????????????????????????????????, ????????????????????????)
+DarknetConnectionsToadlet.disconnectingShort=?????????
 DarknetConnectionsToadlet.enterDescription=???????????????:
+DarknetConnectionsToadlet.failedToAddNodeInternalError=??????????????????????????????????????????.
 ????????????????????????????????????:
 
DarknetConnectionsToadlet.failedToAddNodeInternalErrorTitle=??????????????????:????????????
 DarknetConnectionsToadlet.failedToAddNodeTitle=??????????????????
-DarknetConnectionsToadlet.fcpPort=FCP: ${port}/tcp 
(???Frost,Thaw???Freenet?????????????????????)
-DarknetConnectionsToadlet.fileReference=??????????????????????????????????????????:
+DarknetConnectionsToadlet.fcpDisabled=FCP ???????????? (??? Freenet 
???????????????, ?????? Frost ??? Thaw ??????)
+DarknetConnectionsToadlet.fcpPort=FCP: ${port}/TCP (??? Frost, Thaw ??? 
Freenet ?????????????????????)
+DarknetConnectionsToadlet.fileReference=?????????????????????????????????????????????:
 DarknetConnectionsToadlet.fnpPort=FNP: ${port}/udp 
(?????????????????????;??????????????????????????????????????????)
 DarknetConnectionsToadlet.forceRemove=????????????
 
DarknetConnectionsToadlet.fproxyDisabled=FProxy?????????????????????)???????????????
-DarknetConnectionsToadlet.fproxyPort=FProxy: ${port}/tcp (???web????????????)
+DarknetConnectionsToadlet.fproxyPort=FProxy: ${port}/TCP (??????????????????)
 DarknetConnectionsToadlet.fullTitle=${name}???${counts}?????????
 DarknetConnectionsToadlet.go=??????
 
DarknetConnectionsToadlet.idleTime=??????????????????????????????????????????????????????
 DarknetConnectionsToadlet.idleTimeTitle=?????????????????????
 
DarknetConnectionsToadlet.invalidSignature=??????????????????????????????????????????(${error}).
+DarknetConnectionsToadlet.ipAddress=??????????????????, ??? 
<??????>:<?????????> ??????
 DarknetConnectionsToadlet.ipAddressTitle=??????
+DarknetConnectionsToadlet.listenOnly=?????????????????????: 
???????????????????????????????????????, 
?????????????????????????????????????????????.
+DarknetConnectionsToadlet.listenOnlyShort=????????????
+DarknetConnectionsToadlet.listening=?????????????????????: 
???????????????????????????????????????, 
?????????????????????????????????????????????.
 DarknetConnectionsToadlet.listeningShort=?????????
 DarknetConnectionsToadlet.myFriends=????????????
 
DarknetConnectionsToadlet.myReferenceHeader=${linkref}??????????????????${/linkref}
 (${linktext}????????????${/linktext})
-DarknetConnectionsToadlet.nameClickToMessage=????????????.????????????????????????????????????????????????????????????
+DarknetConnectionsToadlet.nameClickToMessage=????????????. 
????????????????????????????????????????????????????????????
 DarknetConnectionsToadlet.nameTitle=??????
-DarknetConnectionsToadlet.neverConnected=????????????:????????????????????????????????????????????????.
+DarknetConnectionsToadlet.neverConnected=????????????: 
?????????????????????????????????????????????.
 DarknetConnectionsToadlet.neverConnectedShort=????????????
 
DarknetConnectionsToadlet.noPeersFirstHalf=Freenet???????????????????????????????????????,?????????????????????.??????
 
DarknetConnectionsToadlet.noPeersSecondHalf=??????,?????????????????????????????????????????????.
+DarknetConnectionsToadlet.noPeersWithHomepageLink=Freenet 
?????????????????????????????????????????????????????????. 
??????${link}????????????${/link}??????????????????????????????, 
???????????????????????????.
 
DarknetConnectionsToadlet.noRefOrURL=?????????????????????????????????????????????URL.
 ???????????????.
-DarknetConnectionsToadlet.nodePortsTitle=????????????????????????
-DarknetConnectionsToadlet.notConnected=?????????:???????????????,??????????????????????????????????????????????????????.
+DarknetConnectionsToadlet.nodePortsTitle=????????????????????????
+DarknetConnectionsToadlet.notConnected=?????????: ???????????????, 
??????????????????????????????????????????
 DarknetConnectionsToadlet.notConnectedShort=?????????
-DarknetConnectionsToadlet.pasteReference=?????????????????????????????????:
-DarknetConnectionsToadlet.privateNote=??????????????????????????????
+DarknetConnectionsToadlet.opennetFnpPort=????????????(Opennet) FNP: 
${port}/UDP (??????????????????????????????, ?????????"?????????", 
????????????; ??????????????????????????????????????????)
+DarknetConnectionsToadlet.pasteReference=?????????????????????????????????:
+DarknetConnectionsToadlet.privateNote=?????????????????????????????????
 DarknetConnectionsToadlet.privateNoteTitle=????????????
 
DarknetConnectionsToadlet.referenceCopyWarning=?????????????????????${bold}????????????${/bold}??????.??????????????????${bold}????????????${/bold}.
 DarknetConnectionsToadlet.remove=?????????!
 DarknetConnectionsToadlet.removePeers=?????????????????????
+DarknetConnectionsToadlet.routingDisabled=?????????????????? 
(???????????????????????????????????????, 
??????????????????????????????????????????)
+DarknetConnectionsToadlet.routingDisabledShort=??????????????????
+DarknetConnectionsToadlet.seedClients=?????????????????????????????????????????????.
+DarknetConnectionsToadlet.seedClientsShort=????????????
+DarknetConnectionsToadlet.seedServers=????????????????????????????????????.
 DarknetConnectionsToadlet.seedServersShort=??????
 DarknetConnectionsToadlet.selectAction=-- ???????????? --
-DarknetConnectionsToadlet.sendMessageTitle=???????????????????????????
-DarknetConnectionsToadlet.sendMessageToPeers=?????????????????????????????????????????????
+DarknetConnectionsToadlet.sendMessageTitle=???????????????????????????
+DarknetConnectionsToadlet.sendMessageToPeers=?????????????????????????????????????????????
+DarknetConnectionsToadlet.separator=??? ??? ???
 DarknetConnectionsToadlet.statusTitle=??????
-DarknetConnectionsToadlet.tmciPort=TMCI: ${port}/tcp 
(??????telnet????????????????????????)
+DarknetConnectionsToadlet.tmciDisabled=TMCI ???????????? (?????? telnet 
????????????????????????)
+DarknetConnectionsToadlet.tmciPort=TMCI: ${port}/TCP (?????? telnet 
????????????????????????)
+DarknetConnectionsToadlet.tooNew=?????????????????????: 
????????????????????????????????????????????????????????????.
 DarknetConnectionsToadlet.tooNewShort=??????
+DarknetConnectionsToadlet.tooOld=?????????????????????: 
????????????????????????????????????????????????????????????. 
???????????????????????????????????????.
 DarknetConnectionsToadlet.tooOldShort=??????
 DarknetConnectionsToadlet.transferringRequests=????????????: 
${senders}????????????, ${receivers}????????????
 
DarknetConnectionsToadlet.triedToAddSelf=????????????????????????????????????????????????.
@@ -125,132 +253,746 @@
 DarknetConnectionsToadlet.updateChangedPrivnotes=??????????????????????????????
 DarknetConnectionsToadlet.urlReference=????????????????????????URL:
 DarknetConnectionsToadlet.versionTitle=??????
+ExtOldAgeUserAlert.extTooOld=?????? freenet-ext.jar 
???????????????????????????, 
?????????????????????????????????????????????????????????: 
http://downloads.freenetproject.org/alpha/freenet-ext.jar.
+ExtOldAgeUserAlert.extTooOldShort=?????? freenet-ext.jar ???????????????. 
???????????????.
+ExtOldAgeUserAlert.extTooOldTitle=Freenet-ext ??????
+FProxyToadlet.abortToHomepage=?????????????????? FProxy ??????
+FProxyToadlet.alerts=?????????????????????
 FProxyToadlet.alertsTitle=??????
+FProxyToadlet.backToFProxy=${link}?????????${/link}?????? FProxy ??????.
+FProxyToadlet.backToReferrer=${link}?????????${/link}??????????????????.
+FProxyToadlet.cantBindPort=Fproxy ?????????????????????????????????!
 FProxyToadlet.config=??????/??????????????????
 FProxyToadlet.configTitle=??????
 FProxyToadlet.dangerousContentTitle=????????????????????????
+FProxyToadlet.dangerousRSS=Freenet 
????????????????????????????????????????????? RSS ??????. Freenet 
?????????????????? RSS ??????, ?????? RSS 
???????????????????????????(???????????????????????????, 
??????????????????????????????????????????????????????, 
????????????????????????). Firefox 2.0 ??? Internet Explorer 7.0 
???????????????????????? RSS ????????????, ????????????????????????????????? 
"${type}".
+FProxyToadlet.dangerousRSSSubtitle=RSS ??????????????????????????????
 FProxyToadlet.dangerousRSSTitle=???????????????????????? (RSS)
+FProxyToadlet.downloadInBackgroundToDisk=???????????????????????????????????????????????????
+FProxyToadlet.errorIsFatal=?????????????????????. 
???????????????????????????????????????.
+FProxyToadlet.errorWithReason=??????: ${error}
+FProxyToadlet.expectedKeyButGot=???????????? Freenet ??????, 
??????????????????:
+FProxyToadlet.expectedMimeType=?????? MIME ??????: ${mime}
+FProxyToadlet.explanationTitle=??????
+FProxyToadlet.fetchLargeFileAnywayAndDisplay=???????????????, 
??????????????????????????????????????????
+FProxyToadlet.fileInformationTitle=????????????
+FProxyToadlet.filenameLabel=??????:
 FProxyToadlet.friends=??????????????????
 FProxyToadlet.friendsTitle=??????
 FProxyToadlet.goBack=???????????????
+FProxyToadlet.goBackToPrev=???????????????
 FProxyToadlet.homepage=??????
+FProxyToadlet.invalidKeyTitle=??????????????????
+FProxyToadlet.invalidKeyWithReason=??????????????????: ${reason}
+FProxyToadlet.largeFile=??????
+FProxyToadlet.largeFileExplanationAndOptions=????????? Freenet 
?????????????????????. 
????????????????????????????????????????????????????????????, ?????? Freenet 
???????????????????????????????????????. ?????????????????????:
+FProxyToadlet.mayChange=(?????????)
 FProxyToadlet.mimeType=MIME ?????????${mime}
-FProxyToadlet.openForce=???${link}??????${/link}??????????????? ${mime} 
????????????????????????????????????????????????
-FProxyToadlet.opennetTitle=??????
+FProxyToadlet.notEnoughMetaStrings=??????????????????
+FProxyToadlet.notFoundTitle=?????????
+FProxyToadlet.openAsText=${link}?????????${/link}?????????????????????????????????
 (?????????????????????, ??????????????????????????????).
+FProxyToadlet.openAsThawIndex=${link}?????????${/link}?????? thaw 
???????????????????????????(????????????????????????!).
+FProxyToadlet.openForce=${link}?????????${/link}??????????????? ${mime} 
????????????????????????????????????????????????.
+FProxyToadlet.openForceDisk=${link}?????????${/link}????????????????????????????????????????????????.
+FProxyToadlet.openPossRSSAsPlainText=${link}?????????${/link}?????????????????????????????????(???
 IE7 ?????? FF2 ???${bold}??????????????????s${/bold}).
+FProxyToadlet.openPossRSSForceDisk=${link}?????????${/link}????????????????????????????????????????????????(???????????????
 Firefox 2.0.0, ${bold}??????????????????????????????${/bold}, 2.0.1 
?????????????????????????????????).
+FProxyToadlet.openRSSAsRSS=${link}?????????${/link}?????? RSS 
?????????????????? 
(???????????????????????????????????????${bold}????????????${/bold}, Freenet 
???????????????????????? RSS ????????????).
+FProxyToadlet.openRSSForce=${link}????????????${/link}?????? ${mime} 
??????????????????(??? IE7 ?????? FF2 ???${bold}??????????????????${/bold}).
+FProxyToadlet.opennet=????????????????????????
+FProxyToadlet.opennetTitle=?????????
+FProxyToadlet.options=???????????????:
+FProxyToadlet.pathNotFound=?????????????????????.
 FProxyToadlet.pathNotFoundTitle=?????????????????????
+FProxyToadlet.plugins=?????????????????????
 FProxyToadlet.pluginsTitle=????????????
 FProxyToadlet.queue=????????????????????????
 FProxyToadlet.queueTitle=??????
+FProxyToadlet.retryNow=????????????
+FProxyToadlet.sizeLabel=??????:
 FProxyToadlet.sizeUnknown=??????????????????
+FProxyToadlet.stats=??????????????????
 FProxyToadlet.statsTitle=??????
 FProxyToadlet.translationTitle=??????
+FProxyToadlet.unableToRetrieve=Freenet ????????????????????????.
 FProxyToadlet.unknownMIMEType=MIME ??????????????????
 FProxyToadlet.welcome=??????
 FProxyToadlet.welcomeTitle=??????
 FcpServer.allowedHosts=??????????????????(????????????????????????)
 FcpServer.allowedHostsFullAccess=?????????????????????????????????
+FcpServer.allowedHostsFullAccessLong=?????????????????????????????????????????????.
 ??????????????????????????????????????????????????????, ??????????????????. 
??????, ???????????????????????????????????????????????????!
 
FcpServer.allowedHostsLong=?????????????????????????????????IP?????????????????????????????????????????????????????????????????????IP???????????????CIDR?????????IP????????????(???
 192.168.0.0/24)???
+FcpServer.assumeDownloadDDAIsAllowed=????????????????????? DDA?
+FcpServer.assumeDownloadDDAIsAllowedLong=?????????????????????????????????????????????(DDA)?
 ?????????, ?????????????????? DDA ????????????????????? TestDDARequest ??????.
+FcpServer.assumeUploadDDAIsAllowed=????????????????????? DDA?
+FcpServer.assumeUploadDDAIsAllowedLong=?????????????????????????????????????????????(DDA)?
 ?????????, ?????????????????? DDA ????????????????????? TestDDARequest ??????.
+FcpServer.bindTo=??????????????????
+FcpServer.bindToLong=FCP ??????????????????????????????????????????.
+FcpServer.cannotStartOrStopOnTheFly=????????????????????????????????? FCP 
?????????
+FcpServer.couldNotChangeBindTo=???????????? FCP ?????????????????????: 
${error}.
+FcpServer.downloadsFileCanCreateCannotReadOrWrite=?????????????????????????????????
+FcpServer.downloadsFileDoesNotExistCannotCreate=?????????????????????????????????
+FcpServer.downloadsFileExistsCannotReadOrWrite=?????????????????????????????????
+FcpServer.downloadsFileIsDirectory=??????????????????????????????????????????: 
??????????????????
+FcpServer.downloadsFileParentDoesNotExist=?????????????????????
+FcpServer.downloadsFileUnreadable=?????????????????????????????????
+FcpServer.enablePersistentDownload=??????????????????????
+FcpServer.enablePersistentDownloadLong=??????????????? FCP ???????????? 
Persistence=forever. 
??????????????????????????????????????????????????????????????????; 
?????????????????????????????????, 
?????????????????????????????????????????????.
+FcpServer.filenameToStorePData=??????????????????????????????
+FcpServer.filenameToStorePDataLong=??????????????????????????????????????????
+FcpServer.intervalBetweenWrites=?????????????????????????????????????????????
+FcpServer.intervalBetweenWritesLong=?????????????????????????????????????????????.
 FcpServer.isEnabled=??????FCP?????????
+FcpServer.isEnabledLong=???????????? Freenet ???????????????(FCP)?????????
 FcpServer.portNumber=FCP???
+FcpServer.portNumberLong=FCP ???????????????????????? TCP ?????????
+FcpServer.ssl=?????? SSL?
+FcpServer.sslLong=????????? FCP ?????????????????? SSL
+FetchException.longError.1=?????????????????????????????????
+FetchException.longError.10=????????????????????????
+FetchException.longError.11=????????????????????? - ?????????????????????? 
?????????????????????
+FetchException.longError.12=?????????????????????, 
????????????????????????????????????????
+FetchException.longError.13=???????????????
+FetchException.longError.14=??????????????? - 
???????????????????????????????????????????????????
+FetchException.longError.15=????????????????????????????????????
+FetchException.longError.16=?????????????????? - ???????????????????
+FetchException.longError.17=????????????, ??????????????????
+FetchException.longError.18=??????????????????, ??????????????????????????????
+FetchException.longError.19=???????????????
+FetchException.longError.2=?????????????????????????????????
+FetchException.longError.20=URI ????????????
+FetchException.longError.21=????????????
+FetchException.longError.22=??????????????????
+FetchException.longError.23=??????????????????????????????
+FetchException.longError.24=?????? URI 
???????????????????????????(????????????)
+FetchException.longError.25=?????????
+FetchException.longError.26=??????????????????
+FetchException.longError.27=???????????????: ???????????? URI
+FetchException.longError.28=????????????????????????; 
??????????????????????????????, ?????????????????????????????????
+FetchException.longError.29=????????? MIME ??????: 
??????????????????????????????????????????????????????
+FetchException.longError.3=????????????????????????????????????
+FetchException.longError.30=??????????????????????????????, 
??????????????????????????????????????????????????????, ?????????????????????.
+FetchException.longError.4=????????????????????????
+FetchException.longError.5=?????????????????????????????????
+FetchException.longError.6=?????????????????????
+FetchException.longError.7=???????????????????????????????????????
+FetchException.longError.8=?????????????????????????????????????????????????????????
+FetchException.longError.9=??????(??????)????????????
+FetchException.shortError.1=?????????????????????
+FetchException.shortError.10=??????????????????
+FetchException.shortError.11=?????????????????????
+FetchException.shortError.12=???????????????
+FetchException.shortError.13=???????????????
+FetchException.shortError.14=???????????????
+FetchException.shortError.15=???????????????
+FetchException.shortError.16=??????????????????
+FetchException.shortError.17=????????????
+FetchException.shortError.18=????????????
+FetchException.shortError.19=???????????????
+FetchException.shortError.2=??????????????????????????????
+FetchException.shortError.20=URI ????????????
+FetchException.shortError.21=????????????
+FetchException.shortError.22=??????????????????
+FetchException.shortError.23=??????????????????????????????
+FetchException.shortError.24=??????????????????
+FetchException.shortError.25=??????????????????
+FetchException.shortError.26=??????????????????
+FetchException.shortError.27=?????? URI
+FetchException.shortError.28=?????????????????????
+FetchException.shortError.29=????????? MIME ??????
+FetchException.shortError.3=?????????????????????
+FetchException.shortError.30=???????????????(??????????????????)
+FetchException.shortError.4=????????????????????????
+FetchException.shortError.5=???????????????
+FetchException.shortError.6=??????????????????
+FetchException.shortError.7=??????????????????????????????
+FetchException.shortError.8=???????????????????????????
+FetchException.shortError.9=???????????????
+FileOffer.acceptTransferButton=????????????
+FileOffer.askUserTitle=??????????????????
+FileOffer.commentLabel=??????:
+FileOffer.failedReceiveHeader=??? ${node} ???????????? ${filename} ??????.
+FileOffer.failedReceiveShort=??? ${node} ???????????? ${filename} ??????.
+FileOffer.failedReceiveTitle=??????????????????
+FileOffer.fileLabel=??????:
+FileOffer.mimeLabel=MIME ??????:
+FileOffer.offeredFileHeader=?????? ${name} ???????????????:
+FileOffer.offeredFileShort=???????????? ${node} ??????????????? ${filename}.
+FileOffer.rejectTransferButton=????????????
+FileOffer.senderLabel=?????????:
+FileOffer.sizeLabel=??????:
+FileOffer.succeededReceiveHeader=??? ${node} ???????????? ${filename} ??????.
+FileOffer.succeededReceiveShort=??? ${node} ?????? ${filename} ?????????.
+FileOffer.succeededReceiveTitle=??????????????????
 FirstTimeWizardToadlet.bandwidthLimit=????????????
 
FirstTimeWizardToadlet.bandwidthLimitLong=?????????????????????????????????????????????????????????????????????
 FirstTimeWizardToadlet.bwlimitHigherSpeed=?????????
 FirstTimeWizardToadlet.bwlimitLowerSpeed=?????????
 FirstTimeWizardToadlet.chooseNodeName=????????????????????????
+FirstTimeWizardToadlet.chooseNodeNameLong=???????????????????????????????????????(?????????????????????,
 ????????????????????????????????????). 
???????????????????????????(?????????????????????????????????????????????)?????????????????????????????????.
 ?????????(?????????????????????????????????????????????)?????????????????????. 
?????????, 
????????????????????????????????????????????????????????????????????????????????????,
 ????????????????????????????????????, 
??????????????????????????????????????????????????????.
 FirstTimeWizardToadlet.clickContinue=??????????????????
 FirstTimeWizardToadlet.congratz=????????????????????????
+FirstTimeWizardToadlet.congratzLong=??????, ????????????????????????????????? 
Freenet ?????????. 
????????????"??????"?????????????????????????????????????????????, 
????????????????????????????????????????????????. ?????????, Freenet 
???????????????????????????, ?????????????????????. 
?????????????????????????????????????????? Freenet. ?????????????????? Freenet 
??????????????????.
 FirstTimeWizardToadlet.connectToStrangers=?????????????????????
-FirstTimeWizardToadlet.connectToStrangersLong=????????????????????? Freenet 
????????????????????????????????????????????????????????????????????????????????????????????????????????????
 
Freenet????????????????????????????????????????????????????????????Freenet??????????????????????????????????????????????????????????????????????????????????????????
+FirstTimeWizardToadlet.connectToStrangersLong=????????????????????? Freenet 
????????????????????????????????????????????????????????????????????????????????????????????????????????????
 Freenet????????????????????????????????????????????? Freenet 
????????????????????????????????????????????????????????????????????????????????????????????????????????????
 FirstTimeWizardToadlet.continue=??????
 FirstTimeWizardToadlet.continueEnd=?????????????????????Freenet???
+FirstTimeWizardToadlet.datastoreSize=??????????????????
 
FirstTimeWizardToadlet.datastoreSizeLong=?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
 FirstTimeWizardToadlet.enableOpennet=??????????????????????????? Freenet ??????
-FirstTimeWizardToadlet.fivePercentDisk=?????? 5% ??????????????????
+FirstTimeWizardToadlet.fivePercentDisk=(??? 5% ?????????????????????)
 FirstTimeWizardToadlet.homepageTitle=Freenet ?????????????????????
 FirstTimeWizardToadlet.iDoTrust=???????????????????????? ${interface} (${ip}) 
????????????
 FirstTimeWizardToadlet.isNetworkTrusted=?????????????????????????????????
+FirstTimeWizardToadlet.isNetworkTrustedLong=?????????????????????????????????????
 ??????????????????, 
??????????????????????????????????????????????????????????????????????????????????????????.
 ??????????????????????????????, 
????????????????????????????????????????????????????????????.
+FirstTimeWizardToadlet.memoryLimit=??????????????????
 FirstTimeWizardToadlet.memoryLimitLong=???????????? Freenet 
????????????????????????????????????????????????????????????/?????????Freenet 
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
 128MB ????????????????????? 1GB ??????????????????????????????????????? 
256MB????????????????????????????????? Freenet ???????????????
 FirstTimeWizardToadlet.noNetworkIF=???????????????????????????
 FirstTimeWizardToadlet.noNetworkIFLong=Freenet 
????????????????????????????????????????????????????????????????????? Freenet???
 
FirstTimeWizardToadlet.opennetNo=????????????????????????????????????????????????
 Freenet ?????????????????????????????????????????????????????????
-FirstTimeWizardToadlet.opennetWarning=?????? Freenet 
?????????????????????????????????????????????????????? Freenet 
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????Freenet
 ?????????????????????????????????????????????????????????????????????
+FirstTimeWizardToadlet.opennetWarning=?????? Freenet 
?????????????????????????????????????????????????????? Freenet 
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????Freenet
 ??????????????????????????????????????????????????????????????????
 
FirstTimeWizardToadlet.opennetYes=?????????????????????????????????????????????????????????
 FirstTimeWizardToadlet.skipWizard=??????????????????????????????????????????
+FirstTimeWizardToadlet.step1Title=Freenet ????????????????????? - 
??????????????????
+FirstTimeWizardToadlet.step2Title=Freenet ??????????????????! - 
??????????????????
 FirstTimeWizardToadlet.step3Title=Freenet ?????????????????? - ????????????
 FirstTimeWizardToadlet.step4Title=Freenet ?????????????????? - 
??????????????????
+FirstTimeWizardToadlet.step5Title=Freenet ??????????????????! - ????????????
 FirstTimeWizardToadlet.step6Title=Freenet ?????????????????? - 
????????????????????????
+FirstTimeWizardToadlet.step7Title=Freenet ??????????????????! - ??????, 
??????????????????????????????
+FirstTimeWizardToadlet.tenPercentDisk=(??? 10% ?????????????????????)
+FirstTimeWizardToadlet.warningTitle=??????!
+FirstTimeWizardToadlet.welcomeInfoboxContent1=Freenet 
????????????????????????????????????. 
??????????????????????????????????????????????????????????????????????????????.
 FirstTimeWizardToadlet.welcomeInfoboxTitle=???????????? Freenet 
?????????????????????
+FirstTimeWizardToadlet.memory.128M=128 ???????????????(MiB) - 
??????????????????
+FirstTimeWizardToadlet.memory.192M=192 ???????????????(MiB) - 
??????????????????
+FirstTimeWizardToadlet.memory.256M=256 ???????????????(MiB) - 
?????????????????? 1GB ?????????
+FirstTimeWizardToadlet.memory.512M=512 ???????????????(MiB) - 
??????????????????????????????
+FirstTimeWizardToadlet.memory.64M=64 ???????????????(MiB) - 
???????????????????????????
+GIFFilter.invalidHeader=??????????????????????????? GIF ??????.
+GIFFilter.invalidHeaderTitle=??????????????????
+GIFFilter.notGif=??????????????????????????????????????? GIF ???. 
?????????????????????????????????, 
???????????????????????????????????????????????????, 
???????????????????????????.
+GIFFilter.tooShort=??? GIF ?????????????????????????????????.
+GIFFilter.tooShortTitle=????????????
+GenericReadFilterCallback.couldNotParseAbsoluteFreenetURI=????????????????????????
 Freenet URI
+GenericReadFilterCallback.couldNotParseFormURIWithError=????????????????????????
 URI ??????: ${error}
+GenericReadFilterCallback.couldNotParseRelativeFreenetURI=????????????????????????
 Freenet URI
+GenericReadFilterCallback.couldNotParseURIWithError=???????????????????????? 
URI: ${error}
+GenericReadFilterCallback.invalidFormURI=??????????????? URI: 
??????????????????
+GenericReadFilterCallback.invalidFormURIAttemptToEscape=????????????????????????
 GenericReadFilterCallback.malformedAbsoluteURL=?????????????????? URL 
?????????${error}
 GenericReadFilterCallback.malformedRelativeURL=?????????????????? URL 
?????????${error}
+GenericReadFilterCallback.protocolNotEscaped=????????????????????????: 
${protocol}
+HTMLFilter.couldNotParseStyle=?????????????????????????????????
+HTMLFilter.deletedUnknownStyle=?????????????????????
+HTMLFilter.failedToParseLabel=HTML ?????????????????????????????????
+HTMLFilter.tooManyNestedStyleOrScriptTags=???????????????????????????????????????
 - ???????????????????????????????????????
+HTMLFilter.tooManyNestedStyleOrScriptTagsLong=?????? </style> ??????????????? 
- ???????????????????????????????????????, ???????????????????????????, 
???????????????????????????????????? - 
????????????????????????????????????????????????
+HTMLFilter.unknownTag=??????????????? ${tag}
+IPDetectorPluginManager.connectionProblems=????????????:
+IPDetectorPluginManager.direct=????????????????????????????????????????????????.
 ??????, ??????????????????????????????????????? Freenet ??????.
+IPDetectorPluginManager.directTitle=?????????????????????????????????
+IPDetectorPluginManager.forwardPortMaybeForwarded=???????????????????????????????????????????????????(NAT,
 ????????????????????????)??????. ??????????????????, ???????????????????????? 
UDP (?????? TCP) ????????? ${port}, ?????????????????????. 
??????????????????????????????; Freenet 
???????????????????????????????????????. 
????????????????????????${link}??????${/link}.
+IPDetectorPluginManager.forwardPortNotForwarded=???????????????????????????????????????????????????(NAT,
 ????????????????????????)??????. ??????????????????, ???????????????????????? 
UDP (?????? TCP) ????????? ${port}, ?????????????????????. 
????????????????????????????????????, ?????? Freenet ????????????. 
????????????????????????${link}??????${/link}.
+IPDetectorPluginManager.forwardPortShortMaybeForwarded=?????? UDP ??? ${port} 
???????????? (???????????????????????????).
+IPDetectorPluginManager.forwardPortShortNotForwarded=?????? UDP ??? ${port} 
???????????? (?????????????????????).
+IPDetectorPluginManager.forwardTwoPortsMaybeForwarded=???????????????????????????????????????????????????(NAT,
 ????????????????????????)??????. ??????????????????, ???????????????????????? 
UDP (?????? TCP) ????????? ${port1} ??? ${port2}, ?????????????????????. 
??????????????????????????????; Freenet 
???????????????????????????????????????. 
????????????????????????${link}??????${/link}.
+IPDetectorPluginManager.forwardTwoPortsNotForwarded=???????????????????????????????????????????????????(NAT,
 ????????????????????????)??????. ??????????????????, ???????????????????????? 
UDP (?????? TCP) ????????? ${port1} ??? ${port2}, ?????????????????????. 
????????????????????????????????????, ?????? Freenet ????????????. 
????????????????????????${link}??????${/link}.
+IPDetectorPluginManager.forwardTwoPortsShortMaybeForwarded=?????? UDP ??? 
${port1} ??? ${port2} ???????????? (???????????????????????????).
+IPDetectorPluginManager.forwardTwoPortsShortNotForwarded=?????? UDP ??? 
${port1} and ${port2} ???????????? (?????????????????????).
+IPDetectorPluginManager.fullCone=?????????????????????????????????????????????"??????????????????"??????????????????(NAT).
 ??????, ??????????????????????????????????????? Freenet ??????.
+IPDetectorPluginManager.fullConeTitle=??????????????????????????????????????????
+IPDetectorPluginManager.maybeAlreadyForwarded=???????????????????????????(Freenet
 ?????????????????????).
+IPDetectorPluginManager.noConnectivity=?????????????????????????????????????????????
 UDP. ??????????????????, ?????? Freenet ????????????????????????????????????.
+IPDetectorPluginManager.noConnectivityTitle=?????? UDP ????????????
+IPDetectorPluginManager.noConnectivityshort=?????????????????????: ?????? UDP 
????????????, Freenet ????????????!
+IPDetectorPluginManager.portForwardHelpURL=http://wiki.freenetproject.org/FirewallAndRouterIssues
+IPDetectorPluginManager.portRestricted=??????????????????????????????????????????????????????????????????????????????????????????(NAT)???????????????.
 ???????????????????????????????????????, 
??????????????????????????????????????????????????????????????????.
+IPDetectorPluginManager.portRestrictedTitle=???????????????????????????????????????????????????
+IPDetectorPluginManager.restricted=???????????????????????????????????????"??????????????????"??????????????????(NAT).
 ?????????????????????????????????????????????.
+IPDetectorPluginManager.restrictedTitle=??????????????????????????????????????????
+IPDetectorPluginManager.seriousConnectionProblems=?????????????????????:
+IPDetectorPluginManager.suggestForwardPort=??????????????????????????????????????????(UDP
 ?????? ${port}). (?????? 
http://wiki.freenetproject.org/FirewallAndRouterIssues ).
+IPDetectorPluginManager.suggestForwardPortWithLink=???????????????????????????${link}???????????????${/link}(UDP
 ?????? ${port}) (??????????????????????????????, Freenet 
?????????????????????).
+IPDetectorPluginManager.suggestForwardTwoPorts=Y??????????????????????????????????????????(UDP
 ?????? ${port1} ??? ${port2}). (?????? 
http://wiki.freenetproject.org/FirewallAndRouterIssues ).
+IPDetectorPluginManager.suggestForwardTwoPortsWithLink=???????????????????????????${link}???????????????${/link}(UDP
 ?????? ${port1} ??? ${port2}) (??????????????????????????????, Freenet 
?????????????????????).
+IPDetectorPluginManager.symmetric=???????????????????????????????????????????????????????????????????????????(NAT)???????????????.
 ????????????????????????????????????????????????????????????, 
??????????????????????????????????????????????????????????????????.
+IPDetectorPluginManager.symmetricPS=????????????????????????????????????????????????(NAT)??????,
 ???????????????????????????, ??????????????????????????????????????????, 
????????????????????????????????????????????????!
+IPDetectorPluginManager.symmetricTitle=???????????????????????????
+IPUndetectedUserAlert.detecting=Freenet ??????????????????????????????. 
????????????????????????????????????, ?????????????????????...
+IPUndetectedUserAlert.detectingShort=Freenet ??????????????????????????????.
+IPUndetectedUserAlert.detectingWithConfigLink=Freenet 
??????????????????????????????. ????????????????????????????????????, 
?????????????????????, 
?????????????????????${link}??????${/link}?????????????????????.
+IPUndetectedUserAlert.suggestForwardPort=??????, 
????????????????????????????????????????????? ${port} ???(UDP), 
????????????????????????????????????????????????.
+IPUndetectedUserAlert.suggestForwardTwoPorts=??????, 
????????????????????????????????????????????? ${port1} ??? ${port2} ???(UDP), 
????????????????????????????????????????????????.
+IPUndetectedUserAlert.unknownAddress=Freenet 
??????????????????????????????????????????(????????????????????????(NAT)???????????????????????????).
 ?????????????????????????????????????????????, 
??????????????????????????????????????????????????????????????????????????????????????????.
 ????????????????????????????????????, Freenet 
??????????????????????????????????????????. ??????????????????????????????, 
???'????????????????????????????????????'${link}????????????${/link}?????????????????????.
+IPUndetectedUserAlert.unknownAddressShort=Freenet 
????????????????????????????????????. ???????????????????????????.
+IPUndetectedUserAlert.unknownAddressTitle=??????????????????
+IPUndetectedUserAlert.unknownAddressWithConfigLink=Freenet 
??????????????????????????????????????????(??????????????????(NAT)?????????????????????????????????).
 ?????????????????????????????????????????????, 
??????????????????????????????????????????????????????????????????????????????????????????.
 ????????????????????????????????????, Freenet 
??????????????????????????????????????????. ??????????????????????????????, 
???'????????????????????????????????????'${link}????????????${/link}?????????????????????.
+InsertException.longError.1=?????????????????? URI ????????????
+InsertException.longError.10=?????????????????????
+InsertException.longError.11=??? URI ????????????????????????(???????????? '/' 
??????)
+InsertException.longError.12=???????????????????????????
+InsertException.longError.2=?????????????????????: 
?????????????????????????????????????
+InsertException.longError.3=????????????
+InsertException.longError.4=???????????????????????????????????????
+InsertException.longError.5=????????????????????????????????????????????????(????????????????????????,
 ????????????????????????)
+InsertException.longError.6=?????????????????????????????????????????????
+InsertException.longError.7=?????????????????????: 
??????????????????(???????????????????????????)
+InsertException.longError.8=????????????????????????????????????
+InsertException.longError.9=??????????????????????????????????????????????????????????????????
+InsertException.shortError.1=URI ????????????
 InsertException.shortError.10=?????????
+InsertException.shortError.11=????????????????????????
+InsertException.shortError.12=???????????????????????????
+InsertException.shortError.2=???????????????
 InsertException.shortError.3=????????????
+InsertException.shortError.4=???????????????
+InsertException.shortError.5=???????????????
+InsertException.shortError.6=????????????????????????????????????
+InsertException.shortError.7=??????????????????????????????
+InsertException.shortError.8=????????????????????????
+InsertException.shortError.9=?????????????????????
 IntOption.parseError=????????????????????????????????? 32 ???????????? : ${val}
-JPEGFilter.notJpeg=???????????????????????????????????????JPEG????????????????????????????????????????????????????????????????????????????????????????????????????????????
+InvalidAddressOverrideUserAlert.unknownAddress=Freenet ?????????????????? 
ipAddressOverride ??????????????????, 
???????????????????????????????????????????????????, IPv4 ??????, ?????? IPv6 
???????????????(IPv6 ??????????????????????????????????????????????????????).
+InvalidAddressOverrideUserAlert.unknownAddressShort=???????????? 
ipAddressOverride ?????????. ?????????????????????.
+InvalidAddressOverrideUserAlert.unknownAddressTitle=???????????????????????????
+InvalidAddressOverrideUserAlert.unknownAddressWithConfigLink=Freenet 
?????????????????? ipAddressOverride ??????????????????, 
???????????????????????????????????????????????????, IPv4 ??????, ?????? IPv6 
???????????????(IPv6 ??????????????????????????????????????????????????????). 
???????????????"???????????????????????????"??????${link}????????????${/link}
+JPEGFilter.notJpeg=??????????????????????????????????????? JPEG 
????????????????????????????????????????????????????????????????????????????????????????????????????????????
 JPEGFilter.tooShort=?????????????????????????????????JPEG?????????
 JPEGFilter.tooShortTitle=????????????
+KnownUnsafeContentTypeException.dangerousInlines=??????????????????????????????????????????????????????,
 ??????????????????????????????????????????????????????, 
???????????????????????????.
+KnownUnsafeContentTypeException.dangerousInlinesLabel=?????????????????????:
+KnownUnsafeContentTypeException.dangerousLinks=???????????????????????????????????????????????????????????????;
 ?????????????????????(???????????????), 
???????????????????????????????????????.
+KnownUnsafeContentTypeException.dangerousLinksLabel=???????????????:
+KnownUnsafeContentTypeException.dangerousMetadata=??????????????????????????????????????????(metadata),
 ?????????????????????????????????????????????????????????, 
??????????????????????????????????????????????????????.
+KnownUnsafeContentTypeException.dangerousMetadataLabel=?????????????????????:
+KnownUnsafeContentTypeException.dangerousScripts=???????????????????????????????????????????????????,
 ?????????????????????????????????????????????????????????????????????, 
??????????????????????????????, .
+KnownUnsafeContentTypeException.dangerousScriptsLabel=?????????????????????:
+KnownUnsafeContentTypeException.knownUnsafe=?????? MIME 
????????????????????????. ???????????????????????????, 
????????????????????????????????????, ????????????????????????, 
??????????????????????????????????????????????????????????????????????????????. 
?????????:
+KnownUnsafeContentTypeException.noFilter=????????????????????????????????????????????????,
 ????????????????????????????????????!
+KnownUnsafeContentTypeException.title=?????????????????????: ${type}
+LocalFileInsertToadlet.checkPathExist=?????????????????????????????????.
+LocalFileInsertToadlet.checkPathIsDir=??????????????????????????????????????????.
+LocalFileInsertToadlet.checkPathReadable=????????????????????????????????????????????????????????????????????????.
+LocalFileInsertToadlet.dirAccessDenied=?????????????????????
+LocalFileInsertToadlet.dirCannotBeRead=?????????????????? "${path}"
 LocalFileInsertToadlet.fileHeader=??????
 LocalFileInsertToadlet.insert=??????
+LocalFileInsertToadlet.listing=????????????: ${path}
+LocalFileInsertToadlet.listingTitle=${path} ?????????
 LocalFileInsertToadlet.sizeHeader=??????
+LogConfigHandler.detaildPriorityThreshold=?????????????????????????????????
+LogConfigHandler.detaildPriorityThresholdLong=?????????????????????????????????,
 ????????? freenet:normal, freenet.node:minor
+LogConfigHandler.dirName=????????????
+LogConfigHandler.dirNameLong=??????????????????????????????
+LogConfigHandler.enabled=???????????????????
+LogConfigHandler.enabledLong=???????????????????????????????????????
+LogConfigHandler.maxCachedBytes=??????????????? RAM ????????????????????????
+LogConfigHandler.maxCachedBytesLong=????????????????????????????????????(RAM)????????????????????????
+LogConfigHandler.maxCachedLines=??????????????? RAM ??????????????????
+LogConfigHandler.maxCachedLinesLong=????????????????????????????????????(RAM)??????????????????
+LogConfigHandler.maxZippedLogsSize=????????????????????????????????????
+LogConfigHandler.maxZippedLogsSizeLong=?????????????????????????????????????????????
+LogConfigHandler.minLoggingPriority=??????????????????????????????
+LogConfigHandler.minLoggingPriorityLong=???????????????????????????????????????.
 ????????????????????????????????? debug, minor, normal ??? error.
+LogConfigHandler.rotationInterval=??????????????????
+LogConfigHandler.rotationIntervalLong=??????????????????????????? - 
??????????????????????????????????????????. 
?????????????????????????????????????????????(??????????????????????????????), 
??????????????????????????????????????? maxZippedLogsSize ?????????????????????.
 LoggerHook.unrecognizedPriority=??????????????????????????????: ${name}.
 LongOption.parseError=????????????????????????????????? 64 ???????????? : 
${val}
-MeaningfulNodeNameUserAlert.noNodeNick=??????????????????????????????????????????.
 ????????????, ?????????????????????????????????????????? IRC 
?????????????????????, ??????????????????????????????????????????. (?????????, 
????????????????????????????????? darknet ????????????????????????????????????, 
????????????????????????)
+MeaningfulNodeNameUserAlert.noNodeNick=??????????????????????????????????????????.
 ????????????, ?????????????????????????????????????????? IRC 
?????????????????????, ??????????????????????????????????????????. (?????????, 
?????????????????????????????????????????????(darknet)????????????????????????????????????,
 ????????????????????????)
 
MeaningfulNodeNameUserAlert.noNodeNickShort=????????????(??????)????????????????????????
 
MeaningfulNodeNameUserAlert.noNodeNickTitle=????????????(??????)????????????????????????
+N2NTMToadlet.composingMessageLabel=????????????????????????????????????, 
????????????????????????:
+N2NTMToadlet.delayed=?????????: ??????????????????????????????????????????
+N2NTMToadlet.delayedTitle=?????????
+N2NTMToadlet.failed=???????????????????????????: ???????????????
+N2NTMToadlet.failedTitle=??????
 N2NTMToadlet.friends=??????
+N2NTMToadlet.noSuchFileOrCannotRead=??????????????????: ?????????????????????, 
??????????????????.
+N2NTMToadlet.peerName=????????????
+N2NTMToadlet.peerNotFoundTitle=???????????????
+N2NTMToadlet.peerNotFoundWithHash=????????????????????? \u201C${hash}\u201D 
?????????.
 N2NTMToadlet.processingSend=?????????????????????????????????
+N2NTMToadlet.queued=???????????????: ???????????????, 
???????????????????????????, ?????????????????????
+N2NTMToadlet.queuedTitle=???????????????
 N2NTMToadlet.returnToFriends=??????????????????
-N2NTMToadlet.sentTitle=??????
-N2NTMToadlet.tooLongTitle=??????
+N2NTMToadlet.sendMessage=???????????????????????????
+N2NTMToadlet.sendMessageShort=????????????
+N2NTMToadlet.sendStatus=??????????????????
+N2NTMToadlet.sent=????????????????????????
+N2NTMToadlet.sentTitle=?????????
+N2NTMToadlet.tooLong=?????????????????????????????? 1024 ???????????????
+N2NTMToadlet.tooLongTitle=????????????
 N2NTMUserAlert.delete=??????
+N2NTMUserAlert.header=??????: ${from} (${composed} ?????? | ${sent} ?????? | 
${received}) ??????
+N2NTMUserAlert.headerShort=?????? ${from} ?????????
 N2NTMUserAlert.reply=??????
 
N2NTMUserAlert.title=???${peername}(${peer})???????????????????????????${number}
-Node.inBWLimit=??????????????????????????????????????????
-Node.inBWLimitLong=??????????????????????????????????????????????????????????????????????????????????????????
 -1 ??????????????????????????????
+Node.acceptSeedConnections=?????????, 
????????????????????????????????????????????????????????????, 
????????????????????????????????????. 
??????????????????????????????????????????????????????????????????, 
???????????????????????????: 
????????????????????????????????????????????????????????????(????????????????????????,
 ????????????????????????"?????????"????????????).
+Node.acceptSeedConnectionsShort=???????????????????
+Node.alwaysAllowLocalAddresses=???????????????????????????????????????????????????????
+Node.alwaysAllowLocalAddressesLong=?????????, 
?????????????????????????????????, 
?????????????????????????????????????????????, 
???????????????????????????(?????????????????????)????????????. ????????????, 
?????????????????????????????????????????????(??????????????????????????????)??????????????????.
 ?????????????????????????????????????????????, 
?????????????????????????????????????????????????????? UDP 
?????????????????????????????????, ???????????????.
+Node.assumeNATed=??????????????????????????????.
+Node.assumeNATedLong=?????????????????????????????????????????????????????????(NAT)????????????????????????,
 ?????????????????????????????????, ????????????????????????????????????(??? 10 
??? 30 ?????????)?
+Node.bandwidthLimitMustBePositiveOrMinusOne=????????????????????????????????? 
-1
+Node.bindTo=??????????????????
+Node.bindToLong=??????????????? IP ??????
+Node.buggyJVM=??????????????? JVM ??????(${version})???????????????. 
???????????????????????????, ?????????????????? OutOfMemoryError ??????. 
?????????????????? Sun ???????????? Java 1.4.2_13 ???, 1.5.0_10 ???, ?????? 1.6 
???(????????????). ???????????? 
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4855795 .
+Node.buggyJVMShort=Freenet ???????????? Java ?????? ${version} 
??????????????????. ???????????????, ????????????????????? Java 
???????????????????????????.
+Node.buggyJVMTitle=JVM ????????????
+Node.buggyJVMWithLink=??????????????? JVM 
??????(${version})?????????${link}??????${/link}. ???????????????????????????, 
?????????????????? OutOfMemoryError ??????. ?????????????????? Sun ???????????? 
Java 1.4.2_13 ???, 1.5.0_10 ???, ?????? 1.6 ???(????????????).
+Node.bwlimitMustBePositive=???????????????????????????
+Node.databaseMemory=???????????????????????????????????????
+Node.databaseMemoryLong=???????????????????????????????????????????????????????????????.
 0 ??????????????????(??????????????? 30% ?????????????????????)
+Node.deadlockTitle=???????????????????????? JVM 
?????????????????????????????????
+Node.deadlockWarning=??????: ???????????????????????? NPTL ??????????????? Sun 
JVM. ???????????????????????? JVM ???????????????????????????????????????. 
??????????????????????????????????????? LD_ASSUME_KERNEL ??? 2.4.1 ????????? 
NPTL. ??????????????? Freenet ????????????????????????????????????; 
?????????????????????, ?????????????????? run.sh 
(https://emu.freenetproject.org/svn/trunk/apps/installer/installclasspath/run.sh)
 ???????????????. ???????????????????????????????????? pthreads 
?????????????????? JVM ??????. ???????????????, ??????????????????????????????, 
??????????????????????????????, ??????????????????????????? 100% ??????, 
????????????????????????????????????.
+Node.disableHangCheckers=???????????????????????????
+Node.disableHangCheckersLong=??????????????????????????????????????????. 
??????????????? Fred ?????????????????????????????????????????????.
+Node.disablePHTLS=?????? probabilistic HTL
+Node.disablePHTLSLong=?????? probabilistic HTL (?????????????????????, 
?????????????????????????????????)
+Node.dropPacketEvery=????????????????????????
+Node.dropPacketEveryLong=?????????????????????. 
?????????????????????????????????, ????????????????????????. 0 
??????????????????????????????. ?????????????????????!
+Node.enableARKs=?????? ARKs? (????????????!)
+Node.enableARKsLong=???????????? ARKs? (??????????????????!).
+Node.enablePacketCoalescing=???????????????????
+Node.enablePacketCoalescingLong=???????????????????????????? 
??????????????????????????????????????????, ?????? CPU ?????????, 
???????????????????????????????????????, 
??????????????????????????????????????????. ?????????????????????????????????, 
??????????????????.
+Node.enablePerNodeFailureTables=????????????????????????????????????????
+Node.enablePerNodeFailureTablesLong=?????????????????? 10 
???????????????????????????????????????????????????????
+Node.enableSwapQueueing=??????????????????????????????? (????????????!)
+Node.enableSwapQueueingLong=?????????????????????????????????????????????? 
(??????????????????!)
+Node.enableSwapping=??????????????????? (????????????!)
+Node.enableSwappingLong=????????????????????????? (??????????????????! 
????????????????????????????????????).
+Node.enableULPRDataPropagation=?????? ULRP ????????????????
+Node.enableULPRDataPropagationLong=????????????????????????????????????, 
??????????????????????????????????????????????????????? 
(????????????????????????????????????; ULPR)
+Node.errorApplyingConfig=????????????????????????????????? : ${error}
+Node.extraPeerDir=????????????????????????
+Node.extraPeerDirLong=??????????????????????????????????????????
+Node.forceBigShrink=????????????????????????
+Node.forceBigShrinkLong=???????????????????????????(?????? 
10%)?????????????????????(????????????????????????????????????). 
??????????????????????????????????????????????????????, 
???????????????????????????; 
???????????????????????????????????????????????????.
+Node.inBWLimit=???????????????????????????????????????
+Node.inBWLimitLong=????????????????????????????????????????????????; 
??????????????????????????????????????????; ?????? -1 
???????????????????????????
+Node.invalidStoreSize=??????????????????????????? 32MB
+Node.java14ShortText=???????????????????????? Java 1.4 ???, ???????????? 1.5 
???.
+Node.java14Text=???????????? Java 1.4 ????????? Freenet ??????. 
?????????????????? 1.5 ???. ??????????????????????????????????????????, 
?????????????????????????????????????????????????????? Java ????????????.
+Node.java14Title=???????????? Java 1.4 ???
 Node.l10nLanguage=????????????????????????
 
Node.l10nLanguageLong=???????????????????????????????????????????????????????????????????????????????????????
+Node.maxHTL=HTL ?????????
+Node.maxHTLLong=HTL ?????????(?????????????????????!)
+Node.maxOpennetPeers=????????????????????????????????????
+Node.maxOpennetPeersLong=????????????(Opennet)????????????????????????(?????????
 0 ??? 20 ??????, 
???????????????????????????????????????(darknet)???????????????)
+Node.maxOpennetPeersMustBeTwentyOrLess=????????????????????? 20
+Node.mustBePositive=????????????????????????
+Node.nodeDir=????????????
+Node.nodeDirLong=????????????????????????(?????????????????????)???????????????
 Node.nodeName=??????????????????
 Node.nodeNameLong=????????????????????????????????????????????????
+Node.notUsingSunVM=????????????????????? Sun ????????? JVM ???????????????: 
${vendor} ${version}. ????????????????????????: ??????????????????????????????. 
?????????????????? http://www.java.com/getjava/ ?????? Sun ????????? Java 
??????.
+Node.notUsingSunVMShort=Freenet ??????????????? Sun ????????? Java 
?????????????????????, ????????????????????????, ?????????????????? Sun Java 
??????.
+Node.notUsingSunVMTitle=???????????? Sun ??? JVM
+Node.notUsingWrapper=????????????????????????????????????. 
????????????????????????. ?????????????????????????????????, 
??????????????????????????????, ???????????? JVM ???????????????, 
?????????????????????. ?????????????????????????????????????????????, 
??????????????????????????????.
+Node.notUsingWrapperShort=Freenet ??????????????????????????????. 
????????????????????????.
+Node.notUsingWrapperTitle=????????????????????????!
+Node.oneConnectionPerIP=????????????????????????????????????????
+Node.oneConnectionPerIPLong=??????????????????????????????????????????????????????????
 ????????????????????????????????????????????????????????????, 
?????????????????????????????????????????????????????????, 
?????????????????????????????????????????????. 
?????????????????????????????????????????????????????????(darknet)???????????????(opennet).
+Node.opennetEnabled=??????????????????????????????(???????????????????????????????????????)?
+Node.opennetEnabledLong=??????????????????????????????(?????????????????????(opennet))?
 ??????????????????, 
?????????????????????????????????????????????????????????????????????(???????????????"?????????",
 ?????????"??????"). ????????????????????????????????????????????????, 
???????????????????????????. ?????????????????????????????? Freenet ?????????, 
?????????????????????????????????????????????("??????"), 
???????????????????????????.
 Node.outBWLimit=??????????????????????????????????????????
+Node.outBWLimitLong=???????????????????????????(????????????????????????); 
????????????????????????????????????????????????
+Node.passOpennetPeersThroughDarknet=???????????????????????????????????????????????????????
+Node.passOpennetPeersThroughDarknetLong=????????????, 
??????????????????(opennet)??????????????????(??????????????????????????????)??????????????????????????????(darknet)????????????.
 
???????????????(??????????????????????????????)??????????????????????????????????????????????????????.
 ??????????????????, ?????????????????????????????????, 
?????????????????????????????????, 
???????????????????????????????????????????????????. 
????????????????????????????????????????????????, 
???????????????????????????????????????.
+Node.port=FNP ???????????????(UDP)
+Node.portLong=???????????????????????? UDP ?????????(Freenet 
??????????????????)
+Node.publishOurPeersLocation=???????????????????????????????????????????
+Node.publishOurPeersLocationLong=??????????????????????????????????????????? 
??????????????????????????????, 
???????????????????????????????????????????????????.
+Node.routeAccordingToOurPeersLocation=???????????????????????????????????????????????????????????????????????????????
+Node.routeAccordingToOurPeersLocationLong=???????????????????????????????????????????????????????????????????????????????
 ??????????????????????????????, ?????????????????????????????????.
+Node.storeDirectory=????????????
+Node.storeDirectoryLong=?????????????????????????????????
+Node.storeMaxMemTooHigh=??????????????????????????? 80% ??????????????? BDB 
?????????!
 Node.storeSize=???????????????????????????
 Node.storeSizeLong=???????????????????????????
-PluginToadlet.addPluginTitle=??????plugin
-PluginToadlet.failedToLoadPluginTitle=Plugin????????????
-PluginToadlet.noWebInterfaceTitle=???plugin???????????????
-PluginToadlet.pluginList=Plugin??????
-PluginToadlet.pluginListTitle=Plugin??????
-PluginToadlet.pluginNameTitle=Plugin??????
-PluginToadlet.pluginNotFoundTitle=????????????plugin
-PluginToadlet.unsupportedMethod=????????????method.
+Node.storeType=????????????(????????????)
+Node.storeTypeLong=??????????????????. ??????????????? bdb-index ?????? ram 
(bdb-index ??? BerkeleyDBFreenetStore ???????????????, 
??????????????????????????????????????????; ram 
?????????????????????????????????????????????). 
???????????????????????????????????????, 
??????????????????????????????????????????????????????, ????????? ram 
(??????????????????????????????????????????)!
+Node.swapRInterval=?????????????????????????????????(??????)
+Node.swapRIntervalLong=???????????????????????????????????????, 
???????????????. ????????????!
+Node.throttleLocalTraffic=???????????????????
+Node.throttleLocalTrafficLong=?????????????????????????????????? 
???????????????, 
?????????????????????(LAN)??????????????????????????????????????????????????????.
+Node.tooSmallMTU=MTU ??????
+Node.tooSmallMTULong=???????????????????????????????????????(MTU)????????? 
${mtu} ????????????. Freenet ????????? MTU ?????? ${minMTU} 
????????????????????????????????????: Freenet ??????????????????, 
????????????????????????. ???????????????????????????????????????.
+Node.tooSmallMTUShort=????????????: ??????????????? MTU ??????, Freenet 
??????????????????. ?????????????????????.
+Node.withAnnouncement=????????????????????????????????????????????????????
+Node.withAnnouncementLong=??????????????????????????????????????????????????????????
 ?????????????????????????????????, ?????????????????????????????????.
+NodeClientCore.couldNotFindOrCreateDir=???????????????????????????
+NodeClientCore.downloadAllowedDirs=???????????????????????????
+NodeClientCore.downloadAllowedDirsLong=???????????????????????????????????????,
 ??????????????????. ???????????? downloads ???????????????????????????, 
?????????????????????????????????????????????????????????, ????????? all 
??????????????????????????????????????????. ??????! ??????????????? all ??????, 
???????????????????????????????????????????????????, 
???????????????????????????????????????!
+NodeClientCore.downloadDir=??????????????????
+NodeClientCore.downloadDirLong=??????????????????????????????????????????
+NodeClientCore.fileForClientStats=????????????????????????????????????
+NodeClientCore.fileForClientStatsLong=??????????????????????????????????????????(?????????????????????????????????)
+NodeClientCore.lazyResume=???????????????????????????????????????? 
(???????????????????????????)
+NodeClientCore.lazyResumeLong=?????????????????????????????????????????????, 
?????????????????????????????????????????????, 
????????????????????????????????????????????????. ?????????????????????, 
?????????????????????????????????.
+NodeClientCore.maxUSKFetchers=????????? USK ?????????????????????
+NodeClientCore.maxUSKFetchersLong=????????? USK ?????????????????????
+NodeClientCore.maxUSKFetchersMustBeGreaterThanZero=???????????????
+NodeClientCore.movingTempDirOnTheFlyNotSupported=????????????????????????????????????????????????
+NodeClientCore.persistentTempDir=???????????????????????????
+NodeClientCore.persistentTempDirLong=???????????????????????????????????????
+NodeClientCore.startingUp=?????? Freenet ?????????????????????????????????, 
?????????????????????????????????????????????, 
???????????????????????????????????????.
+NodeClientCore.startingUpShort=Freenet ???????????????, 
??????????????????????????????, ???????????????????????????.
+NodeClientCore.startingUpTitle=Freenet ???????????????
+NodeClientCore.tempDir=??????????????????
+NodeClientCore.tempDirLong=??????????????????????????????
+NodeClientCore.uploadAllowedDirs=???????????????????????????
+NodeClientCore.uploadAllowedDirsLong=???????????????????????????????????????, 
??????????????????. 
??????????????????????????????????????????????????????????????????, ????????? 
all ????????????????????????????????????????????????(?????????????????????!). 
??????! ??????????????? all ??????, 
???????????????????????????????????????????????????????????????????????????!
+NodeIPDectector.inclLocalAddress=?????????????????????????????????????????????
+NodeIPDectector.inclLocalAddressLong=?????????????????????????????????????????????????????????(????????????????????????????????????????????????).
 ???????????????????????????????????????????????????????????? 
allowLocalAddresses=true 
(?????????????????????????????????????????????????????????), 
???????????????????????????.
+NodeIPDectector.ipOverride=???????????????????????????
+NodeIPDectector.ipOverrideLong=??????????????????????????????(????????????????????????)
 - 
?????????????????????????????????????????????*??????*???(?????????????????????: 
?????????, ?????? dyndns ??????), ????????????????????????????????????, 
????????????????????????????????????????????????.
+NodeIPDectector.tempAddressHint=????????????????????????????????????
+NodeIPDectector.tempAddressHintLong=??????????????????????????????; 
????????????????????????
+NodeIPDetector.maybeSymmetric=??????????????????????????????????????????????????????(NAT)??????.
 ???????????????????????????: 
???????????????????????????????????????????????????????????????, 
?????????????????????????????????????????????????????????????????????.
+NodeIPDetector.maybeSymmetricShort=????????????: 
?????????????????????????????????????????????(NAT)??????.
+NodeIPDetector.maybeSymmetricTitle=????????????
+NodeIPDetector.unknownHostErrorInIPOverride=???????????????: ${error}
+NodeStat.aggressiveGC=AggressiveGC ?????????
+NodeStat.aggressiveGCLong=????????????????????????????????? (GC) 
???????????????????????????. ????????????????????????????????????, 
??????????????????! ?????? -1 ??????: ????????? System.gc() ??? 
System.runFinalization() ?????????????????????
+NodeStat.freeHeapBytesThreshold=??????????????????????????????????????????
+NodeStat.freeHeapBytesThresholdLong=?????????????????????????????????????????????(?????????????????????)??????????????????,
 ??????????????????????????????????????????
+NodeStat.freeHeapPercentThreshold=?????????????????????????????????
+NodeStat.freeHeapPercentThresholdLong=??????????????????????????????????????????????????????????????????????????????,
 ??????????????????????????????????????????
+NodeStat.ignoreLocalVsRemoteBandwidthLiability=??????????????????????????????, 
??????????????????????????????????
+NodeStat.ignoreLocalVsRemoteBandwidthLiabilityLong=???????????????????????????????????????????????????????????????,
 
?????????????????????????????????????????????????????????????????????(?????????????????????????????????,
 ????????????????????????????????????????????????)
+NodeStat.memCheck=?????????????????????
+NodeStat.memCheckLong=??????????????????????????? 
(??????????????????????????????, aggressiveGC 
????????????????????????????????????!)
+NodeStat.statsPersister=?????????????????????????????????
+NodeStat.statsPersisterLong=?????????????????????????????????(???????????????????????????,
 ???????????????????????????????????????, ????????????????????????)
+NodeStat.threadLimit=???????????????
+NodeStat.threadLimitLong=?????????????????????????????????????????????????????????,
 ?????????????????????.
+NodeStats.mustBePercentValueNotFull=????????????????????????, ???????????? 0 
??? 99 ??????.
+NodeStats.valueTooLow=????????????????????????, ??????????????????, 
?????????????????????!
+NodeUpdateManager.enabled=???????????????????????????
+NodeUpdateManager.enabledLong=???????????????????????????????????? Freenet 
??????. ??????, ?????????????????????????????????, ????????????????????????, 
????????????????????????. ?????????????????????????????????????????????, 
?????????????????????????????????.
+NodeUpdateManager.extURI=??????????????????????????? freenet-ext.jar ??????????
+NodeUpdateManager.extURILong=??????????????????????????? freenet-ext.jar 
??????????
+NodeUpdateManager.installNewVersions=????????????????????????
+NodeUpdateManager.installNewVersionsLong=?????????????????????????????????, 
????????????????????????????????? Freenet ???????
+NodeUpdateManager.invalidExtURI=???????????????????????? URI: ${error}
+NodeUpdateManager.invalidRevocationURI=??????????????????????????? URI: 
${error}
+NodeUpdateManager.invalidUpdateURI=??????????????????????????? URI: ${error}
+NodeUpdateManager.noUpdateWithoutWrapper=??????????????????????????????, 
??????????????????????????????
+NodeUpdateManager.revocationURI=????????????????????????????????????????
+NodeUpdateManager.revocationURILong=??????????????? URI. 
????????????????????????????????????, ????????????????????????, 
??????????????????????????????.
+NodeUpdateManager.updateCatastropheTitle=????????????????????????!
+NodeUpdateManager.updateFailed=????????????: ${reason}
+NodeUpdateManager.updateFailedShort=????????????: ${reason}
+NodeUpdateManager.updateFailedTitle=????????????!
+NodeUpdateManager.updateURI=??????????????????????????????????
+NodeUpdateManager.updateURILong=??????????????????????????????????
+NotEnoughNiceLevelsUserAlert.content=???????????????????????????????????????????????????????????????.
 ????????????????????????????????????????????????, 
??????????????????????????????. 
???????????????????????????????????????????????????! (??? run.sh ????????? 
PRIORITY ?????????, ??????????????????) ????????????????????? ${available} 
?????????????????????, ?????????????????? ${required} ???.
+NotEnoughNiceLevelsUserAlert.short=?????????????????????????????????! 
?????????????????????????????????????????? Freenet.
+NotEnoughNiceLevelsUserAlert.title=?????????????????????????????????!
+OpennetConnectionsToadlet.fullTitle=${name} ??? ${counts} 
????????????(??????????????????)
+OpennetConnectionsToadlet.peersListTitle=??????????????????????????????(??????????????????????????????????????????????????????)
+OpennetConnectionsToadlet.successTime=??????????????????????????????????????????
 CHK ?????????
+OpennetConnectionsToadlet.successTimeTitle=??????????????????
+OpennetUserAlert.warning=Freenet ????????????????????????????????????. 
??????????????????????????????????????? Freenet, 
???????????????????????????????????????. 
?????????????????????????????????????????????, 
????????????????????????????????????????????????????????????, 
????????????????????????????????????. ??????????????? 10 
?????????????????????(??????????????????????????????????????????, 
?????????????????????????????????????????????), 
?????????????????????????????????, ?????? Freenet 
????????????????????????????????????????????????.
+OpennetUserAlert.warningShort=????????????????????????.
+OpennetUserAlert.warningTitle=??????: ????????????????????????: 
??????????????????????????????
+PNGFilter.invalidHeader=??????????????????????????????????????? PNG ???, 
?????????????????????????????? PNG ??????. ?????????????????????????????????, 
???????????????????????????????????????????????????, 
???????????????????????????.
+PNGFilter.invalidHeaderTitle=????????? PNG - ??????????????????
+PageMaker.modeAdvanced=??????????????????
+PageMaker.modeAdvancedTooltip=??????????????? Freenet 
?????????????????????????????????????????????????????????
+PageMaker.modeSimple=??????????????????
+PageMaker.modeSimpleTooltip=??????????????????????????????????????????
+PeerManagerUserAlert.clockProblem=????????? ${count} ?????????????????????, 
????????????????????????????????????????????? 24 ????????????. 
???????????????????????????????????????. 
??????????????????????????????????????????????????????????????????????????????.
+PeerManagerUserAlert.clockProblemTitle=????????????
+PeerManagerUserAlert.connError=??? ${count} 
??????????????????????????????????????????, ?????????????????????????????????, 
?????????????????????????????????.
+PeerManagerUserAlert.connErrorTitle=????????????????????????
+PeerManagerUserAlert.noConns=???????????????????????????????????????????????????,
 ??????????????????. ???????????????????????????????????????; 
???????????????????????????, ??????????????????????????????. 
??????????????????????????? 3 ???????????????, ???????????????????????? 5 ??? 
10 ???.
+PeerManagerUserAlert.noConnsTitle=?????????????????????
+PeerManagerUserAlert.noPeersDarknet=?????????????????????????????????, 
????????????????????????. 
???????????????????????????????????????????????????(????????????????????????, 
??????????????????????????????, ????????????????????????????????????). 
??????????????????????????? 3 ??????????????????, ???????????? 5 ??? 10 ???. 
?????????????????????????????????(????????????; opennet), 
???????????????????????????????????????.
+PeerManagerUserAlert.noPeersTestnet=?????????????????????????????????, 
????????????????????????. 
???????????????????????????????????????????????????(????????????????????????, 
??????????????????????????????, ????????????????????????????????????). 
??????????????????????????? 3 ??????????????????, ???????????? 5 ??? 10 ???. 
?????????????????????????????????(????????????; opennet), 
???????????????????????????????????????.
+PeerManagerUserAlert.noPeersTitle=????????????
+PeerManagerUserAlert.oneConn=????????????????????????. 
???????????????????????????, ?????????????????????; 
???????????????????????????, ?????????????????????????????????????????????. 
????????????"??????"???????????????????????????, 
?????????????????????????????????. ??????????????????????????????????????? 3 
?????????(?????? 5 ??? 10 ????????????).
+PeerManagerUserAlert.onlyFewConnsTitle=?????? ${count} ??????????????????
+PeerManagerUserAlert.tooHighBwlimitDelayTime=????????????????????????????????????????????????(${delay}ms
 > ${max}ms). ?????????????????????????????????, 
??????/????????????????????????, ????????????????????????.
+PeerManagerUserAlert.tooHighBwlimitDelayTimeTitle=bwlimitDelayTime ????????????
+PeerManagerUserAlert.tooHighPingTime=??????????????????????????????????????????(${ping}ms
 > ${max}ms). ?????????????????????????????????, 
??????/????????????????????????, ????????????????????????.
+PeerManagerUserAlert.tooHighPingTimeTitle=nodeAveragePingTime ????????????
+PeerManagerUserAlert.tooManyConns=????????????????????????(${count} > ${max}). 
??????????????????????????????????????????????????????, ?????????????????????, 
?????????????????????????????????????????????.
+PeerManagerUserAlert.tooManyConnsTitle=????????????????????????
+PeerManagerUserAlert.tooManyDisconnected=?????????????????????????????????(${count}
 > ${max}). ???????????????????????????????????????????????????, 
??????????????????????????????????????????????????????????????????. 
?????????"??????"??????????????????. ?????????, 
????????????????????????????????????????????????. ??????????????????, 
????????????????????????????????????????????????????????????????????????.
+PeerManagerUserAlert.tooManyDisconnectedTitle=????????????????????????
+PeerManagerUserAlert.tooManyNeverConnected=???????????????????????????(?????? 
${count} ???)?????????????????????. 
????????????????????????????????????????????????????????????????????????, 
??????????????????????????????.
+PeerManagerUserAlert.tooManyNeverConnectedTitle=?????????????????????????????????
+PeerManagerUserAlert.tooManyNeverConnectedWithLink=???????????????????????????(??????
 ${count} ???)?????????????????????. 
?????????????????????????????????${link}????????????${/link}???????????????????????????,
 ??????????????????????????????.
+PeerManagerUserAlert.tooManyPeers=???????????????????????????(${count} > 
${max}). ?????????????????????????????????????????????????????????????????????, 
?????????????????????????????????????????????. ????????????, 
???????????????????????????????????????????????????????????????, 
??????????????????????????????. ?????????"??????"??????????????????.
+PeerManagerUserAlert.tooManyPeersTitle=????????????????????????
+PeerManagerUserAlert.tooOldNeverConnectedPeers=???????????????????????????, 
????????????????????????????????????????????????. ?????????????????????, 
?????????????????????????????????(??????????????????????????????????????????).
+PeerManagerUserAlert.tooOldNeverConnectedPeersTitle=??????????????????????????????
+PeerManagerUserAlert.twoConns=????????????????????????. 
????????????????????????????????????, 
??????????????????????????????????????????. 
?????????"??????"???????????????????????????, 
?????????????????????????????????(????????????). 
??????????????????????????????????????? 3 ?????????(?????? 5 ??? 10 
????????????).
+PeersSayKeyBlownAlert.connectedSayBlownLabel=????????????????????????????????????????????????(???????????????????????????????????????????????????):
+PeersSayKeyBlownAlert.disconnectedSayBlownLabel=?????????????????????????????????????????????,
 ????????????????????????, ????????????????????????????????????:
+PeersSayKeyBlownAlert.failedFetch=????????????????????????????????????. 
???????????????????????????????????????, 
??????????????????????????????????????????????????????, 
?????????????????????????????????????????????. 
????????????????????????????????? Freenet ????????????????????????.
+PeersSayKeyBlownAlert.failedTransferSayBlownLabel=??????????????????????????????????????????,
 ????????????????????????????????????:
+PeersSayKeyBlownAlert.fetching=???????????????????????????????????????????????????????????????.
+PeersSayKeyBlownAlert.intro=????????????????????????????????????????????????????????????!
 ??????????????????????????????????????????????????????????????????, 
???????????????????????????????????????????????????(???????????????????????????)!
 ???????????????????????????????????????. 
?????????????????????????????????????????????.
+PeersSayKeyBlownAlert.short=???????????????????????????????????????????????????!
+PeersSayKeyBlownAlert.titleWithCount=${count} ?????????: 
????????????????????????!
+PluginConfig.configFile=???????????????
+PluginConfig.configFileLong=???????????????????????????????????????
+PluginConfig.installDir=??????????????????
+PluginConfig.installDirLong=?????????????????????
+PluginManager.cannotSetOnceLoaded=??????????????????????????????????????????
+PluginManager.loadedOnStartup=????????????????????????
+PluginManager.loadedOnStartupLong=???????????????, 
?????????????????????????????????, ???????????????.
+PluginManager.loadedPlugins=????????????????????????
+PluginManager.loadedPluginsLong=??????????????????, ???????????????????????????
+PluginManager.pluginLoadingFailed=??????????????? ${name} ????????????
+PluginManager.pluginLoadingFailedShort=?????????????????? ${name}!
+PluginManager.pluginLoadingFailedTitle=??????????????????!
+PluginManager.pluginLoadingFailedWithMessage=??????????????? ${name} 
????????????: ${message}
+PluginManager.pluginReqNewerJVM=?????? ${name} ????????????????????? JVM 
????????????. ?????????????????? Sun Java 1.5 ???????????? JVM, 
?????????????????????.
+PluginManager.pluginReqNewerJVMTitle=?????? ${name} ??????????????? JVM 
????????????.
+PluginToadlet.addPluginTitle=????????????
+PluginToadlet.failedToLoadPlugin=??????????????????.
+PluginToadlet.failedToLoadPluginCheckClass=?????????????????????????????????. 
????????????????????????????????????????????????, ?????????????????? URL 
??????????????????.
+PluginToadlet.failedToLoadPluginTitle=??????????????????
+PluginToadlet.internalNameTitle=????????????
+PluginToadlet.loadPluginCommand=????????????
+PluginToadlet.noWebInterface=?????????????????????????????????, 
??????????????????????????????.
+PluginToadlet.noWebInterfaceTitle=??????????????????????????????
+PluginToadlet.pluginList=????????????
+PluginToadlet.pluginListTitle=????????????
+PluginToadlet.pluginNameTitle=????????????
+PluginToadlet.pluginNotFound=????????????????????????.
+PluginToadlet.pluginNotFoundTitle=??????????????????
+PluginToadlet.returnToPluginsWithLinks=??? ${link}??????${/link} ????????????.
+PluginToadlet.unsupportedMethod=??????????????????.
+PluginToadlet.unsupportedMethodTitle=??????????????????
 PluginToadlet.visit=??????
+PproxyToadlet.Error=??????
+PproxyToadlet.Load=??????
 PproxyToadlet.cancel=??????
-PproxyToadlet.classNameTitle=Class??????
-PproxyToadlet.internalIDTitle=????????????
+PproxyToadlet.changeReloadOnStartup=??????
+PproxyToadlet.classNameTitle=????????????
+PproxyToadlet.downloadNotAllowedFromRemoteServer=????????????????????????????????????????????????.
+PproxyToadlet.fileonly=??????????????????
+PproxyToadlet.internalIDTitle=???????????????
+PproxyToadlet.loadFreenetPlugin=??? Freenet ??????????????????????????????
+PproxyToadlet.loadFreenetPluginText=???????????????????????????????????????????????????
 Freenet URI. ?????????????????????????????????, 
??????????????????????????????????????????, ??????????????????????????????, 
????????????????????????????????????.
+PproxyToadlet.loadFreenetURLLabel=????????????
+PproxyToadlet.loadOfficialPlugin=??????????????????
+PproxyToadlet.loadOfficialPluginLabel=??????????????????
+PproxyToadlet.loadOfficialPluginText=???????????????????????? Freenet 
?????????????????????. ????????????????????????????????????????????????, 
????????????????????????.
+PproxyToadlet.loadOfficialPluginWarning=??????: 
???????????????????????????????????????????????????, ????????? Freenet ??????. 
???????????????????????????????????????, ???????????????. 
???????????????????????????????????????, ??????????????????????????????.
+PproxyToadlet.loadOtherPlugin=?????????????????????
+PproxyToadlet.loadOtherPluginText=?????????????????????????????????????????? 
URL. ?????????????????????????????????????????????????????????, 
?????????????????????????????????????????????????????????. 
????????????????????????????????????????????????????????????, 
????????????????????????.
+PproxyToadlet.loadOtherURLLabel=????????? URL
 PproxyToadlet.loadPluginLabel=??????Plugin:
-PproxyToadlet.noPlugins=??????????????????plugins
-PproxyToadlet.pluginNotFoundReload=??????????????????????????????plugin.
-PproxyToadlet.pluginNotFoundReloadTitle=???????????????Plugin(????????????)
-PproxyToadlet.pluginUnloaded=???plugin????????????
-PproxyToadlet.pluginUnloadedWithName=${name}??????plugin????????????.
-PproxyToadlet.plugins=Plugins
-PproxyToadlet.pluginsWithNodeName=${name}???plugins
+PproxyToadlet.noPlugins=????????????????????????
+PproxyToadlet.noVersion=???
+PproxyToadlet.pluginDirectoryNotCreated=????????????????????????.
+PproxyToadlet.pluginNotDownloaded=????????????????????????.
+PproxyToadlet.pluginNotFoundReload=?????????????????????????????????.
+PproxyToadlet.pluginNotFoundReloadTitle=??????????????????(????????????)
+PproxyToadlet.pluginStopping=???????????????
+PproxyToadlet.pluginUnloaded=??????????????????
+PproxyToadlet.pluginUnloadedWithName=?????????????????? ${name} ???.
+PproxyToadlet.plugins=????????????
+PproxyToadlet.pluginsWithNodeName=${name} ???????????????
+PproxyToadlet.refreshOnStartup=?????????????????????????????????
 PproxyToadlet.reload=????????????
-PproxyToadlet.returnToPluginPage=??????plugin??????
-PproxyToadlet.startedAtTitle=????????????
+PproxyToadlet.reloadExplanation=?????????????????????????????????????????????????????????.
+PproxyToadlet.reloadOnStartupShort=???????????????
+PproxyToadlet.reloadPluginTitle=??????????????????
+PproxyToadlet.reloadPurgeWarning=???????????????????????????????????????????????????.
 ??????????????????????????????????????????????????????, 
??????????????????????????????!
+PproxyToadlet.reloadWarning=???????????????????????????????????????!
+PproxyToadlet.returnToPluginPage=????????????????????????
+PproxyToadlet.startedAtTitle=????????????
+PproxyToadlet.startingPluginName=????????????
+PproxyToadlet.startingPluginStatus=????????????
+PproxyToadlet.startingPluginTime=????????????
+PproxyToadlet.startingPluginsTitle=???????????????
+PproxyToadlet.unauthorized=??????????????????????????????.
+PproxyToadlet.unauthorizedTitle=????????????
 PproxyToadlet.unload=??????
-PproxyToadlet.unloadPluginTitle=?????????plugin?
-PproxyToadlet.unloadPluginWithName=??????????????????${name}????
-QueueToadlet.change=?????????
+PproxyToadlet.unloadPluginTitle=???????????????????
+PproxyToadlet.unloadPluginWithName=?????????????????? ${name} ????
+PproxyToadlet.unloadPurge=??????????????????????????????
+PproxyToadlet.versionTitle=??????
+PproxyToadlet.startingPluginStatus.downloading=??????????????????
+PproxyToadlet.startingPluginStatus.starting=?????????
+QueueToadlet.DUinProgress=???????????????????????? (${size})
+QueueToadlet.DinProgress=???????????????????????? (${size})
+QueueToadlet.UinProgress=???????????????????????? (${size})
+QueueToadlet.change=??????
+QueueToadlet.completedDU=?????????????????????????????? (${size})
+QueueToadlet.completedDinDownloadDirectory=????????????????????????????????????????????????
 (${size})
+QueueToadlet.completedDinTempDirectory=????????????????????????????????????????????????
 (${size})
+QueueToadlet.completedDtoDisk=????????????????????????????????? (${size})
+QueueToadlet.completedDtoTemp=?????????????????????????????????????????? 
(${size})
+QueueToadlet.completedU=???????????????????????? (${size})
+QueueToadlet.completedUDirectory=???????????????????????? (${size})
 QueueToadlet.delete=??????
 QueueToadlet.download=??????
-QueueToadlet.fileName=?????????
-QueueToadlet.identifier=??????
+QueueToadlet.downloadFiles=????????????
+QueueToadlet.downloadFilesInstructions=??????????????????????????????????????????????????????(??????????????????)
+QueueToadlet.downloadSucceeded=?????? ${origlink}${filename}${/origlink} 
?????????????????????. ???${link}?????????${/link}????????????  (${size}).
+QueueToadlet.downloadSucceededTitle=????????????: ${filename}
+QueueToadlet.enqueuedFailure=?????? ${number} ???????????????????????????:
+QueueToadlet.enqueuedSuccessfully=?????? ${number} 
?????????????????????????????????:
+QueueToadlet.errorAccessDenied=????????????: ????????????!
+QueueToadlet.errorAccessDeniedFile=?????????????????????????????????????????????
 "${file}".
+QueueToadlet.errorDToDisk=????????????????????????
+QueueToadlet.errorDToDiskConfig=??????????????????????????????????????????????????????????????????.
+QueueToadlet.errorDownloadNotCompleted=??????????????????
+QueueToadlet.errorDownloadNotFound=?????????????????????
+QueueToadlet.errorDownloadNotFoundExplanation=?????????????????????. 
????????????????????????????
+QueueToadlet.errorInvalidURI=??????????????? URI
+QueueToadlet.errorInvalidURIToD=?????? URI ??????????????????????????????.
+QueueToadlet.errorInvalidURIToU=???????????????????????? URI ????????????.
+QueueToadlet.errorNoFileOrCannotRead=?????????????????????????????????
+QueueToadlet.errorNoFileSelected=??????????????????
+QueueToadlet.errorNoFileSelectedU=??????????????????????????????.
+QueueToadlet.errorNoKey=??????????????????????????????
+QueueToadlet.errorNoKeyToD=??????????????????????????????.
+QueueToadlet.failedD=??????????????? (${size})
+QueueToadlet.failedDU=??????????????????????????? (${size})
+QueueToadlet.failedToRemove=?????? ${id} ??????: ${message}
+QueueToadlet.failedToRemoveId=????????????: ${id}
+QueueToadlet.failedToRemoveRequest=??????????????????
+QueueToadlet.failedToRestart=????????????: ${id}
+QueueToadlet.failedToRestartRequest=????????????????????????
+QueueToadlet.failedU=????????????????????? (${size})
+QueueToadlet.fcpIsMissing=?????? FCP ?????????
+QueueToadlet.fileName=??????
+QueueToadlet.files=??????
+QueueToadlet.follow=????????????
+QueueToadlet.globalQueueIsEmpty=???????????????????????????
+QueueToadlet.identifier=?????????
 QueueToadlet.insertAs=?????????:
 QueueToadlet.insertFile=????????????
+QueueToadlet.insertFileBrowseLabel=???????????????????????????
+QueueToadlet.insertFileCompressLabel=??????
+QueueToadlet.insertFileInsertFileLabel=????????????
+QueueToadlet.insertFileLabel=??????????????????????????????(?????????!)
+QueueToadlet.insertFileResetForm=????????????
 QueueToadlet.key=??????
 QueueToadlet.legend=??????
+QueueToadlet.mimeType=MIME ??????
+QueueToadlet.noTaskOnGlobalQueue=????????????????????????????????????.
+QueueToadlet.none=???
+QueueToadlet.notLoadedYet=??????????????????????????????????????????. 
???????????????.
+QueueToadlet.notLoadedYetTitle=??????????????????
+QueueToadlet.panicButton=????????????
+QueueToadlet.panicButtonConfirmation=??????????????????????????????????????????!
+QueueToadlet.persistence=?????????
 QueueToadlet.persistenceForever=??????
 QueueToadlet.persistenceNone=???
+QueueToadlet.persistenceReboot=??????
 QueueToadlet.persistenceRebootr=??????
+QueueToadlet.pleaseEnableFCP=???????????? FCP ????????????????????????
 QueueToadlet.priority=?????????
 QueueToadlet.priority0=??????
 QueueToadlet.priority1=?????????
@@ -260,49 +1002,185 @@
 QueueToadlet.priority5=?????????
 QueueToadlet.priority6=????????????
 QueueToadlet.progress=??????
+QueueToadlet.progressbarAccurate=???????????????
+QueueToadlet.progressbarNotAccurate=???????????????????????????????????????????????????????????????
 QueueToadlet.reason=??????
+QueueToadlet.remove=??????
+QueueToadlet.requestNavigation=????????????
 QueueToadlet.restart=??????
+QueueToadlet.siteUploadSucceeded=?????? freesite ${filename} (${files} 
?????????, ??????????????? ${size}) ????????????????????? Freenet ???. 
${link}?????????${/link}????????????????????????.
+QueueToadlet.siteUploadSucceededTitle=Freesite ????????????: ${filename}
 QueueToadlet.size=??????
 QueueToadlet.starting=?????????
 QueueToadlet.title=${nodeName}???????????????
 QueueToadlet.totalSize=????????????
 QueueToadlet.unknown=??????
+QueueToadlet.uploadProgressbarNotAccurate=????????????????????????????????????????????????????????????????????????
+QueueToadlet.uploadSucceeded=?????? ${filename} (?????? ${size}) 
????????????????????? Freenet ???. ???${link}?????????${/link} ????????????.
+QueueToadlet.uploadSucceededTitle=????????????: ${filename}
+QueueToadlet.warningUnsafeContent=?????????????????????
+QueueToadlet.warningUnsafeContentExplanation=???????????????????????????????????????
 Freenet ????????????????????????! 
???????????????????????????????????????????????????????????????!
+QueueToadlet.wipD=?????????: ?????? (${size})
+QueueToadlet.wipDU=?????????: ???????????? (${size})
+QueueToadlet.wipU=?????????: ?????? (${size})
+RequestStarterGroup.scheduler=????????????????????????????????????: hard 
(???????????????????????????) ?????? soft (????????????????????????????????????)
+RequestStarterGroup.schedulerCHKInserts=??????????????????(CHK ??????)
+RequestStarterGroup.schedulerCHKRequests=??????????????????(CHK ??????)
+RequestStarterGroup.schedulerLong=???????????????????????????????????????.
+RequestStarterGroup.schedulerSSKInserts=??????????????????(SSK ??????)
+RequestStarterGroup.schedulerSSKRequests=??????????????????(SSK ??????)
+RevocationKeyFoundUserAlert.text=??????????????????????????????????????????????????????????????????.
 ????????????????????????????????????????????????????????????! ??????, 
???????????????????????????????????????, 
?????????"?????????"????????????????????????. 
???????????????????????????????????????????????????????????????. 
?????????????????????????????????????????????. ???????????????: ${message}.
+RevocationKeyFoundUserAlert.title=????????????????????????????????????!
+SSL.enable=????????? SSL ??????????
+SSL.enableLong=????????? SSL ??????????
+SSL.keyPass=??????????????????
+SSL.keyPassLong=??????????????????
+SSL.keyStore=??????????????????????????????
+SSL.keyStoreLong=??????????????????????????????
+SSL.keyStorePass=????????????????????????
+SSL.keyStorePassLong=????????????????????????
+SSL.version=SSL ??????
+SSL.versionLong=SSL ??????, ??????????????? SSLv3 ?????? TLSv1 (???????????? 
SSLv3)
+ShortOption.parseError=?????????????????????????????????????????????: ${error}
+SimpleToadletServer.advancedMode=?????????????????????????
+SimpleToadletServer.advancedModeLong=????????????????????????????????????????????????????????????.
 ?????????????????????????????????.
+SimpleToadletServer.allowedFullAccess=??? FProxy 
??????????????????????????????(???????????????)
+SimpleToadletServer.allowedFullAccessLong=?????????????????????????????????(?????????????????????,
 ????????????)?????????. ??????: ??????????????? fproxy 
?????????????????????????????????!
+SimpleToadletServer.allowedHosts=??????????????? FProxy 
???????????????????????????????????????.
+SimpleToadletServer.allowedHostsLong=??????????????????????????????????????? 
CIDR ?????????????????????(?????? 192.168.0.0/24)?????????, ???????????????. 
??????, ??????????????????????????????????????????????????????????????????.
+SimpleToadletServer.bindTo=??????????????????
+SimpleToadletServer.bindToLong=?????????????????????????????????
+SimpleToadletServer.cannotChangePortOnTheFly=???????????????????????? FProxy 
??????????????????
+SimpleToadletServer.couldNotChangeBindTo=???????????? FProxy 
?????????????????????: ${error}.
 SimpleToadletServer.cssName=??????????????????
-StatisticsToadlet.activityInserts=??????: ?????? ${totalSenders} ????????????, 
${CHKhandlers} ???CHK?????????, ${SSKhandlers} ???SSK?????????
-StatisticsToadlet.activityRequests=??????: ?????? ${totalSenders} 
????????????, ${CHKhandlers} ???CHK?????????, ${SSKhandlers} ???SSK?????????
-StatisticsToadlet.allocMemory=Java?????????????????????: ${memory}
+SimpleToadletServer.cssNameLong=?????? Freenet ???????????????????????????
+SimpleToadletServer.cssOverride=???????????? CSS ???????????????(??????!)
+SimpleToadletServer.cssOverrideCantRead=????????????????????? CSS ?????????: 
${filename}
+SimpleToadletServer.cssOverrideLong=???????????????????????????????????? CSS 
????????????????????????. ??????: CSS ??????????????????, ????????????????????? 
CSS ????????????! ?????????????????????. (?????????????????? CSS ?????? devl at 
freenetproject ??????????????????????????????????????????????????? ;))
+SimpleToadletServer.cssOverrideNotInUploads=???????????????????????????: 
?????? ${filename} ?????????????????????????????????!
+SimpleToadletServer.doRobots=??? robots.txt ???????????????????
+SimpleToadletServer.doRobotsLong=???????????? /robots.txt ?????? google, 
????????????, ?????? wget ???????????????
+SimpleToadletServer.enableInlinePrefetch=?????????????????????????????????????
+SimpleToadletServer.enableInlinePrefetchLong=?????????????????????????????????????????????????????????,
 ??????????????????????????????. ??????????????????.
+SimpleToadletServer.enableJS=??? FProxy ?????? Javascript?
+SimpleToadletServer.enableJSLong=???????????? FProxy ?????? Javascript 
"????????????". ??????????????????????????????. ?????????, 
????????????????????????, freesite ??????????????? Javascript.
+SimpleToadletServer.enablePersistentConnections=?????????????????? HTTP 
??????? (?????????????????????)
+SimpleToadletServer.enablePersistentConnectionsLong=???????????????????????????,
 ????????????????????????????????????????????????????????? HTTP ??????, 
????????????????????????.
+SimpleToadletServer.enabled=???????????? FProxy?
+SimpleToadletServer.enabledLong=??????????????? FProxy ???????????? HTTP ??????
+SimpleToadletServer.illegalCSSName=CSS ?????????????????????????????????!
+SimpleToadletServer.panicButton=?????????????????????????
+SimpleToadletServer.panicButtonLong=?????????????????????'????????????', 
????????????????????????????????????????????????, ???????????????????????????.
+SimpleToadletServer.port=FProxy ?????????
+SimpleToadletServer.portLong=FProxy ??????????????? TCP ?????????
+SimpleToadletServer.ssl=?????? SSL?
+SimpleToadletServer.sslLong=????????? FProxy ????????? SSL
+StartupToadlet.entropyErrorContent=???????????????????????????... Freenet 
?????????????????????????????????.
+StartupToadlet.entropyErrorTitle=????????????!
+StartupToadlet.isStartingUp=?????????????????????, ?????????.
+StartupToadlet.title=Freenet ???????????????
+StaticToadlet.pathInvalidChars=????????? URI ??????????????????????????????.
+StaticToadlet.pathNotFound=????????????????????????.
+StaticToadlet.pathNotFoundTitle=??????????????????
+StatisticsToadlet.ackOnlyBytes=?????????????????????: ${total}
+StatisticsToadlet.activityInserts=??????: ?????? ${totalSenders} ????????????, 
${CHKhandlers} ??? CHK ?????????, ${SSKhandlers} ??? SSK ?????????
+StatisticsToadlet.activityRequests=??????: ?????? ${totalSenders} 
????????????, ${CHKhandlers} ??? CHK ?????????, ${SSKhandlers} ??? SSK ?????????
+StatisticsToadlet.adminBytes=???????????????: ${initial} ???????????????, 
${changedIP} ???????????????????????????, ${disconn} ???????????????, 
${routingStatus} ?????????????????????
+StatisticsToadlet.allocMemory=Java ?????????????????????: ${memory}
+StatisticsToadlet.announceBytes=????????????: ${total}
+StatisticsToadlet.authBytes=????????????: ?????? ${total}
 StatisticsToadlet.bandwidthTitle=??????
 StatisticsToadlet.cpus=?????????CPU??????: ${count}
+StatisticsToadlet.debuggingBytes=???????????????: ${netColoring} 
???????????????, ${ping} ??? ping, ${probe} ???????????????, ${routed} 
?????????????????????.
+StatisticsToadlet.fullTitle=${name} ???????????????
 StatisticsToadlet.getLogs=???????????????????????????
 StatisticsToadlet.inputRate=????????????: ?????? ${rate} (???????????? ${max})
-StatisticsToadlet.jeDumpButton=????????????JE??????
+StatisticsToadlet.insertOutput=????????????(???????????????): CHK ${chk} SSK 
${ssk}.
+StatisticsToadlet.javaVersion=Java ??????: ${version}
+StatisticsToadlet.jeDumpButton=?????? JE ??????
 StatisticsToadlet.jvmInfoTitle=JVM??????
 StatisticsToadlet.jvmVendor=JVM ???????????? ${vendor}
 StatisticsToadlet.jvmVersion=JVM??????: ${version}
-StatisticsToadlet.maxMemory=Java??????????????????: ${memory}
+StatisticsToadlet.maxMemory=Java ??????????????????: ${memory}
+StatisticsToadlet.noRequests=???????????????????????????????????????.
+StatisticsToadlet.nodeToNodeBytes=???????????????: ${total}
+StatisticsToadlet.offerReplys=????????????????????????: ${chk} ??? CHK, ${ssk} 
??? SSK.
+StatisticsToadlet.offeredKeyOutput=????????????: ???????????? ${total}, 
???????????? ${offered}
 StatisticsToadlet.osArch=????????????????????????: ${arch}
 StatisticsToadlet.osName=??????????????????: ${name}
 StatisticsToadlet.osVersion=??????????????????: ${version}
 StatisticsToadlet.outputRate=????????????: ?????? ${rate} (???????????? ${max})
 StatisticsToadlet.payloadOutput=????????????: ${total} (?????? ${rate}) 
(${percent}%)
 StatisticsToadlet.peerStatsTitle=????????????
-StatisticsToadlet.threadDumpButton=???????????????????????????
+StatisticsToadlet.priority=?????????
+StatisticsToadlet.requestOutput=????????????(???????????????): CHK ${chk} SSK 
${ssk}.
+StatisticsToadlet.resendBytes=???????????????: ${total}
+StatisticsToadlet.routingDisabled=??????????????????(??????????????????????????????,
 ????????????????????????????????????)
+StatisticsToadlet.routingDisabledShort=??????????????????
+StatisticsToadlet.running=?????????
+StatisticsToadlet.statisticGatheringTitle=????????????
+StatisticsToadlet.swapOutput=????????????: ${total}.
+StatisticsToadlet.threadDumpButton=?????????????????????
 StatisticsToadlet.threads=?????????????????????: ${running}/${max}
+StatisticsToadlet.threadsByPriority=??????????????????????????????
 StatisticsToadlet.totalInput=????????????: ${total} (?????? ${rate})
 StatisticsToadlet.totalOutput=????????????: ${total} (?????? ${rate})
-StatisticsToadlet.transferringRequests=????????????: ?????? ${senders}, ?????? 
${receivers}
-StatisticsToadlet.usedMemory=Java?????????????????????: ${memory}
+StatisticsToadlet.totalOverhead=?????????????????????: ?????? ${rate} 
(${percent}%).
+StatisticsToadlet.transferringRequests=??????????????????: ${senders} 
???????????????, ${receivers} ???????????????
+StatisticsToadlet.unaccountedBytes=????????????: ${total} (${percent}%)
+StatisticsToadlet.uomBytes=??????????????????: ${total}
+StatisticsToadlet.usedMemory=Java ?????????????????????: ${memory}
 StatisticsToadlet.versionTitle=??????????????????
+StatisticsToadlet.waiting=?????????
 SymlinkerToadlet.symlinks=ToadletServer??????????????????
+SymlinkerToadlet.symlinksLong=????????? "??????#??????" ??????????????????, 
???????????????????????????
+TestnetHandler.cannotEnableDisableOnTheFly=???????????????????????????????????????(testnet)??????;
 ????????????????????????????????????
+TestnetHandler.enable=????????????????????????(testnet)???????(??????!)
+TestnetHandler.enableLong=???????????????????????????(testnet)??????(??????!). 
?????????????????????????????????????????????????????????????????????, 
??????????????????????????????????????????.
+TestnetHandler.port=????????????(Testnet)????????????
+TestnetHandler.portLong=????????????(Testnet)??????????????????(-1 
?????????????????????????????? 1000)
 TextModeClientInterfaceServer.allowedHosts=??????????????????
+TextModeClientInterfaceServer.allowedHostsLong=??????????????????????????????????????????????????????????????????.
 ?????????????????????????????????: ????????????, ????????????????????????, 
????????? CIDR ?????????????????????(?????? 192.168.0.0/24).
 TextModeClientInterfaceServer.bindTo=??????????????????
 TextModeClientInterfaceServer.bindToLong=???????????????IP??????
 TextModeClientInterfaceServer.enableInputOutput=?????????stdout/stdin?
+TextModeClientInterfaceServer.enableInputOutputLong=??????????????????????????????????????????????????????????????????????
 (????????????????????????????????? telnet ??????????????????, 
???????????????????????? socket ????????????)
 TextModeClientInterfaceServer.enabled=??????????????????
 
TextModeClientInterfaceServer.enabledLong=???????????????????????????????????????
+TextModeClientInterfaceServer.ssl=?????? SSL?
+TextModeClientInterfaceServer.sslLong=????????????????????????????????????????????????
 SSL
 TextModeClientInterfaceServer.telnetPortNumber=???????????????
+TextModeClientInterfaceServer.telnetPortNumberLong=????????????????????????????????????
 TCP ?????????
+TimeSkewDetectedUserAlert.shortText=?????????????????????????????????????????????.
 Freenet ???????????????????????????!
+TimeSkewDetectedUserAlert.text=???????????????????????????????????????????????????.
 ???????????????. ??????????????????????????????, ????????????????????????. 
???????????????????????????????????????????????????, ??????????????????, 
????????????????????????.
+TimeSkewDetectedUserAlert.title=?????????????????????!
 Toadlet.cancel=??????
-TranslationToadlet.bracketRemoveOverride=(?????????????????????!)
+Toadlet.clickHere=?????????
+Toadlet.homepage=??????
+Toadlet.internalErrorPleaseReport=????????????: ?????????
+Toadlet.internalErrorTitle=????????????
+Toadlet.no=???
+Toadlet.nodeHomepage=????????????
+Toadlet.notSupportedTitle=?????????
+Toadlet.notSupportedWithClass=?????????????????????????????? Freenet 
(${class}) ?????????????????????.
+Toadlet.ok=???
+Toadlet.permRedirectWithReason=????????????: ${reason}
+Toadlet.returnToNodeHomepage=??????????????????
+Toadlet.returnToPrevPage=???????????????
+Toadlet.returnToQueuepage=??????????????????
+Toadlet.tempRedirectWithReason=????????????: ${reason}
+Toadlet.unauthorized=?????????????????????????????????.
+Toadlet.unauthorizedTitle=????????????
+Toadlet.yes=???
+ToadletContextImpl.cannotParseContentLength=????????????????????????: ${error}
+ToadletContextImpl.cannotParseContentLengthWithError=????????????????????????: 
${error}
+ToadletContextImpl.headersLineTooLong=?????????????????????????????????????????????
+ToadletContextImpl.methodNotAllowed=HTTP ???????????????
+ToadletContextImpl.noContentLengthInPOST=??? POST 
?????????????????????????????????
+ToadletContextImpl.noSuchToadlet=???????????????????????? Toadlet
+ToadletContextImpl.parseErrorWithError=????????????: ${error}
+ToadletContextImpl.uriParseErrorTitle=URI ????????????
+TranslationToadlet.bracketRemoveOverride=(????????????????????????!)
 TranslationToadlet.bracketTranslateIt=(???????????????????????????!)
 TranslationToadlet.bracketUpdateTranslation=(??????????????????)
 
TranslationToadlet.confirmRemoveOverride=????????????????????????????????????:(${key}
 - ${value})????
@@ -310,75 +1188,127 @@
 TranslationToadlet.currentTranslationLabel=????????????
 TranslationToadlet.downloadTranslationsFile=????????????????????????
 TranslationToadlet.hideAlreadyTranslated=??????????????????????????????
+TranslationToadlet.noCustomTranslations=?????????????????????.
 TranslationToadlet.originalVersionLabel=????????????(????????????)
 TranslationToadlet.reEdit=????????????????????????
 TranslationToadlet.remove=??????
+TranslationToadlet.removeOverrideTitle=?????????????????????
+TranslationToadlet.removeOverrideWarningTitle=????????????????????????????????????!
 TranslationToadlet.returnToTranslations=??????????????????
 TranslationToadlet.showEverything=????????????,??????????????????????????????
 TranslationToadlet.translationKeyLabel=????????????
 TranslationToadlet.translationUpdateTitle=????????????
 TranslationToadlet.translationUpdatedTitle=??????????????????!
 TranslationToadlet.updateTranslationCommand=??????????????????!
-UpdatedVersionAvailableUserAlert.armed=???????????????????????????????????????????????????Freenet?????????,??????????????????.
+UnknownContentTypeException.explanation=?????? Freenet ????????????????????? 
MIME ??????. ????????????, 
???????????????????????????????????????????????????????????????, 
????????????????????????. ?????????, 
???????????????????????????????????????????????????????????????, 
???????????????????????????????????????; ??????????????????????????????, 
?????????????????????????????????, 
?????????????????????????????????(?????????????????????????????????????????????,
 ?????????????????????????????????????????????). ?????????????????????, 
???????????????????????????????????????????????????, ?????????????????? script 
?????????????????????????????????????????????.
+UnknownContentTypeException.title=??????????????????????????????????????????: 
${type}
+UpdateDeployContext.cannotUpdateNoExtJar=????????? wrapper.conf 
??????????????? freenet-ext.jar (????????????????????? freenet.jar: 
${mainFilename})
+UpdateDeployContext.cannotUpdateNoJars=????????? wrapper.conf ????????? 
Freenet ????????? jar ???
+UpdateDeployContext.cannotUpdateNoMainJar=????????? wrapper.conf 
??????????????? freenet.jar (????????????????????? freenet-ext.jar: 
${extFilename})
+UpdateDeployContext.updateCatastrophe=??????????????????: 
????????????????????? ${old}, ???????????????????????? ${new} ????????? ${old}, 
??????*?????????????????????*! ???????????????????????? ${new} ????????? ${old} 
?????????????????????.
+UpdateDeployContext.updateFailedCannotDeleteOldConfig=????????????????????? 
${old}, ??????????????????????????????????????????. ??????????????????.
+UpdateDeployContext.updateFailedNonStandardConfig=?????????????????????????????????????????????????????????:
 ???????????? main=${main} ext=${ext} - ????????????????????????! 
?????????????????????????????????, ??????????????? wrapper.conf ??????.
+UpdatedVersionAvailableUserAlert.alsoDownloadedNewExtJar=???????????????????????????
 Freenet ????????????, ????????? ${version}
+UpdatedVersionAvailableUserAlert.armed=?????????????????????????????? Freenet 
????????????????????????,??????????????????.
+UpdatedVersionAvailableUserAlert.clickToUpdateASAP=??????????????????, 
???????????????????????????????????????.
 
UpdatedVersionAvailableUserAlert.clickToUpdateNow=????????????????????????????????????????????????.
-UpdatedVersionAvailableUserAlert.downloadedNewExtJar=???????????????????????????????????????Freenet????????????,?????????${version}.
-UpdatedVersionAvailableUserAlert.downloadedNewJar=???????????????????????????????????????Freenet??????,?????????${version}.
-UpdatedVersionAvailableUserAlert.fetchingNewNode=?????????????????????????????????????????????Freenet??????(????????????
 ${nodeVersion}).
-UpdatedVersionAvailableUserAlert.notLatest=??????????????????????????????????????????????????????.
-UpdatedVersionAvailableUserAlert.title=Freenet????????????????????????????????????
+UpdatedVersionAvailableUserAlert.downloadedNewExtJar=??????????????????????????????
 Freenet ????????????, ????????? ${version}.
+UpdatedVersionAvailableUserAlert.downloadedNewJar=??????????????????????????????
 Freenet ??????, ????????? ${version}.
+UpdatedVersionAvailableUserAlert.fetchingNewBoth=??????????????????????????? 
Freenet ?????? (??????????????? ${nodeVersion}, ????????????????????? 
${extVersion}).
+UpdatedVersionAvailableUserAlert.fetchingNewExt=??????????????????????????? 
Freenet ?????? (??? ${extVersion} ?????????????????? jar ???).
+UpdatedVersionAvailableUserAlert.fetchingNewNode=?????????????????????????????????
 Freenet ?????? (??????????????? ${nodeVersion}).
+UpdatedVersionAvailableUserAlert.finalCheck=????????????????????????????????????????????????????????????
 (??????: ${count}/${max}, ????????????????????????: ${time}).
+UpdatedVersionAvailableUserAlert.notLatest=???????????????????????????????????????????????????.
+UpdatedVersionAvailableUserAlert.shortArmed=??????????????????????????? 
Freenet ??????, ???????????????????????????.
+UpdatedVersionAvailableUserAlert.shortNotReadyNotArmed=???????????????????????????
 Freenet ??????, ???????????????????????????????????????.
+UpdatedVersionAvailableUserAlert.shortReadyNotArmed=??????????????????????????????
 Freenet ??????, ???????????????????????????????????????.
+UpdatedVersionAvailableUserAlert.title=???????????? Freenet ??????????????????
 UpdatedVersionAvailableUserAlert.updateASAPButton=????????????
-UpdatedVersionAvailableUserAlert.updateASAPQuestion=??????????????????????????????????????????????????????????????????????
+UpdatedVersionAvailableUserAlert.updateASAPQuestion=???????????????????????????????????????????????????,
 ??????????????????????
 UpdatedVersionAvailableUserAlert.updateNowButton=????????????!
 UserAlert.apply=??????
 UserAlert.hide=??????
 UserAlert.reset=??????
-UserAlertManager.criticalErrorCountLabel=????????????:
+UserAlertManager.alertsOnAlertsPage=| 
??????${link}????????????${/link}??????????????????.
+UserAlertManager.alertsTitle=???????????????
+UserAlertManager.clickForMore=???????????????????????????????????????????????????,
 ??????????????????.
+UserAlertManager.criticalErrorCountLabel=????????????:
+UserAlertManager.dumpEventsButton=?????????????????????
 UserAlertManager.errorCountLabel=??????:
 UserAlertManager.minorCountLabel=??????:
 UserAlertManager.totalLabel=??????:
 UserAlertManager.warningCountLabel=??????:
 UserAlertsToadlet.titleWithName=${name} ???????????????
-WelcomeToadlet.activityTitle=????????????
+WelcomeToadlet.activityTitle=????????????
 WelcomeToadlet.alertsSummary=??????????????????
 WelcomeToadlet.arkFetchCount=ARK?????????: ${total}
 WelcomeToadlet.confirmAddBookmarkSubTitle=??????????????????
-WelcomeToadlet.confirmExternalLinkTitle=?????????????????????
-WelcomeToadlet.confirmExternalLinkWithURL=??????????????????????????????????????????${url}????????????????????????
 Freenet 
?????????????????????????????????????????????????????????????????????????????????????????????
+WelcomeToadlet.confirmAddBookmarkTitle=????????????
+WelcomeToadlet.confirmAddBookmarkWithKey=???????????????????????? ${key} 
??????????????????, ???????????????????????????:
+WelcomeToadlet.confirmExternalLinkSubTitle=??????????????????
+WelcomeToadlet.confirmExternalLinkTitle=??????: ????????????
+WelcomeToadlet.confirmExternalLinkWithURL=??????????????????????????????????????????${url}???????????????????????????
 Freenet 
?????????????????????????????????????????????????????????????????????????????????????????????
+WelcomeToadlet.confirmFIN=?????????????????????????????? Frost ???????
+WelcomeToadlet.databaseStatsSubTitle=???????????????
+WelcomeToadlet.databaseStatsTitle=?????? JE ??????
 WelcomeToadlet.disabledAlert=????????????
 WelcomeToadlet.extVersion=Freenet-ext ????????????:${build} r${rev}
 WelcomeToadlet.extVersionWithRecommended=Freenet-ext ????????????:${build} 
(??????????????????${recbuild}) ????????????:${rev}
-WelcomeToadlet.fetch=???
-WelcomeToadlet.fetchKeyLabel=?????? Key
-WelcomeToadlet.finInsertSuccessWithKey=????????????????????????????????? 
${key} ???
+WelcomeToadlet.fetch=??????
+WelcomeToadlet.fetchKeyLabel=????????????
+WelcomeToadlet.finInsertSuccessWithKey=??????????????????????????? ${key}.
+WelcomeToadlet.finInsertedTitle=??????
+WelcomeToadlet.finTitle=?????? Frost ????????????
+WelcomeToadlet.fromHeader=??????
+WelcomeToadlet.goToExternalLink=?????????????????????
 WelcomeToadlet.homepageFullTitleWithName=${name} ??? Freenet FProxy ??????
 WelcomeToadlet.ieWarning=???????????????????????????Internet 
Explorer???????????????????????????????????????????????????
+WelcomeToadlet.ieWarningTitle=??????????????????!
 WelcomeToadlet.insertCount=??????: ${total}
-WelcomeToadlet.insertFailedTitle=????????????
-WelcomeToadlet.insertSucceededTitle=??????????????????
-WelcomeToadlet.insertedTitle=????????????
-WelcomeToadlet.keyInsertedSuccessfullyWithKeyAndName=?????????????????? key 
${link}${name}${/link}???
+WelcomeToadlet.insertFailedTitle=????????????
+WelcomeToadlet.insertFailedWithMessage=???????????????, ???????????????: 
${message}
+WelcomeToadlet.insertSucceededTitle=????????????
+WelcomeToadlet.insertedTitle=??????
+WelcomeToadlet.keyInsertedSuccessfullyWithKeyAndName=?????? 
${link}${name}${/link} ?????????????????????.
+WelcomeToadlet.keyRequestLabel=??????:
+WelcomeToadlet.messageHeader=??????
 WelcomeToadlet.nodeUpdateConfirm=????????????????????????Freenet??????????
 WelcomeToadlet.nodeUpdateConfirmTitle=??????????????????
+WelcomeToadlet.post=??????
 WelcomeToadlet.privateKeyHeader=????????????
 WelcomeToadlet.publicKeyHeader=????????????
-WelcomeToadlet.requestCount=??????: ${total}
+WelcomeToadlet.requestCount=??????: ${total}
 WelcomeToadlet.restart=??????
 WelcomeToadlet.restartConfirm=??????????????????????????????Freenet??????????
 WelcomeToadlet.restartConfirmTitle=????????????
 WelcomeToadlet.restartNode=????????????
-WelcomeToadlet.restarting=??????????????????????????????????????????,???????????????????????????????????????.???????????????Freenet.
-WelcomeToadlet.restartingTitle=???Freenet?????????????????????.
+WelcomeToadlet.restarting=???????????????????????????????????????, 
???????????????????????????????????????. ???????????????Freenet.
+WelcomeToadlet.restartingTitle=Freenet ?????????????????????.
 WelcomeToadlet.shutdown=??????
 WelcomeToadlet.shutdownConfirm=???????????????????????? Freenet ????????????
 WelcomeToadlet.shutdownConfirmTitle=????????????
+WelcomeToadlet.shutdownDone=Freenet ?????????????????????.
 WelcomeToadlet.shutdownNode=????????????
 WelcomeToadlet.splitfileErrorLabel=??????????????????
+WelcomeToadlet.startIndexHeader=???????????????
+WelcomeToadlet.subjectHeader=??????
+WelcomeToadlet.targetBoardHeader=???????????????
+WelcomeToadlet.testnetWarning=???????????????(testnet)???????????????. 
?????????????????????????????????!
 WelcomeToadlet.testnetWarningTitle=??????(????????????)??????
 WelcomeToadlet.thanks=???????????? Freenet.
-WelcomeToadlet.transferringRequestCount=????????????: ${total}
+WelcomeToadlet.threadDumpNotUsingWrapper=?????????????????????????????????, 
???????????????????????????????????????!
+WelcomeToadlet.threadDumpSubTitle=???????????????????????????
+WelcomeToadlet.threadDumpTitle=?????????????????????
+WelcomeToadlet.threadDumpWithFilename=???????????????????????????, 
??????????????? ${filename} ???????????????.
+WelcomeToadlet.transferringRequestCount=??????????????????: ${total}
 WelcomeToadlet.update=??????
 
WelcomeToadlet.updating=???Freenet??????????????????,?????????????????????????????????.???????????????????????????????????????????????????,???????????????????????????????????????.
 WelcomeToadlet.updatingTitle=???????????????
+WelcomeToadlet.uriWouldHaveBeen=URI ?????????: ${uri}
 WelcomeToadlet.version=Freenet ??????:${fullVersion} ????????????:${build} 
r${rev}
 WelcomeToadlet.versionHeader=?????????????????????
+WelcomeToadlet.writtenDatabaseStats=?????????????????????????????????????????????????????????????????????
+WrapperConfig.wrapper.java.maxmemory.long=Freenet ????????????????????????. 
?????????????????????????????????, Freenet ??????????????????????????????; 
??????????????????????????????????????????, ????????????????????????. 
?????????????????????????????? Freenet ??????????????????.
+WrapperConfig.wrapper.java.maxmemory.short=??????????????????(???????????????MiB)
+testing.test=??????$(test1)??????$(test2)??????
 End

Modified: branches/db4o/freenet/src/freenet/node/Announcer.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/Announcer.java       2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/Announcer.java       2008-08-07 
18:30:55 UTC (rev 21657)
@@ -110,7 +110,7 @@
                boolean announceNow = false;
                if(logMINOR)
                        Logger.minor(this, "Connecting some seednodes...");
-               Vector/*<SimpleFieldSet>*/ seeds = readSeednodes();
+               Vector/*<SimpleFieldSet>*/ seeds = 
Announcer.readSeednodes(node.nodeDir);
                long now = System.currentTimeMillis();
                synchronized(this) {
                        if(now - timeAddedSeeds < MIN_ADDED_SEEDS_INTERVAL) 
return;
@@ -212,10 +212,8 @@
                return count;
        }

-       private Vector readSeednodes() {
-               if(logMINOR)
-                       Logger.minor(this, "Reading seednodes");
-               File file = new File(node.nodeDir, "seednodes.fref");
+       public static Vector readSeednodes(File nodeDir) {
+               File file = new File(nodeDir, "seednodes.fref");
                Vector list = new Vector();
                FileInputStream fis = null;
                try {
@@ -316,9 +314,7 @@
                                                if(runningAnnouncements > 0) 
return;
                                        }
                                        if(enoughPeers()) {
-                                               Vector seeds = 
node.peers.getConnectedSeedServerPeersVector(null);
-                                               for(int i=0;i<seeds.size();i++) 
{
-                                                       SeedServerPeerNode pn = 
(SeedServerPeerNode) seeds.get(i);
+                                               for(SeedServerPeerNode pn : 
node.peers.getConnectedSeedServerPeersVector(null)) {
                                                        
node.peers.disconnect(pn, true, true);
                                                }
                                                // Re-check every minute. 
Something bad might happen (e.g. cpu starvation), causing us to have to reseed.
@@ -375,14 +371,14 @@
                                return;
                        }
                        // Now find a node to announce to
-                       Vector seeds = 
node.peers.getConnectedSeedServerPeersVector(announcedToIdentities);
+                       Vector<SeedServerPeerNode> seeds = 
node.peers.getConnectedSeedServerPeersVector(announcedToIdentities);
                        while(sentAnnouncements < WANT_ANNOUNCEMENTS) {
                                if(seeds.isEmpty()) {
                                        if(logMINOR)
                                                Logger.minor(this, "No more 
seednodes, announcedTo = "+announcedToIdentities.size());
                                        break;
                                }
-                               final SeedServerPeerNode seed = 
(SeedServerPeerNode) seeds.remove(node.random.nextInt(seeds.size()));
+                               final SeedServerPeerNode seed = 
seeds.remove(node.random.nextInt(seeds.size()));
                                InetAddress[] addrs = seed.getInetAddresses();
                                if(!newAnnouncedIPs(addrs)) {
                                        if(logMINOR)
@@ -424,18 +420,32 @@
                        announcedToIPs.add(addrs[i]);
        }

+       /**
+        * Have we already announced to this node?
+        * Return true if the node has new non-local addresses we haven't 
announced to.
+        * Return false if the node has non-local addresses we have announced 
to.
+        * Return true if the node has no non-local addresses.
+        * @param addrs
+        * @return
+        */
        private synchronized boolean newAnnouncedIPs(InetAddress[] addrs) {
+               boolean hasNonLocalAddresses = false;
                for(int i=0;i<addrs.length;i++) {
                        if(!IPUtil.isValidAddress(addrs[i], false))
                                continue;
+                       hasNonLocalAddresses = true;
                        if(!announcedToIPs.contains(addrs[i]))
                                return true;
                }
-               return false;
+               return !hasNonLocalAddresses;
        }

        public void sendAnnouncement(final SeedServerPeerNode seed) {
-               if(!node.isOpennetEnabled()) return;
+               if(!node.isOpennetEnabled()) {
+                       if(logMINOR)
+                               Logger.minor(this, "Not announcing to "+seed+" 
because opennet is disabled");
+                       return;
+               }
                System.out.println("Announcement to "+seed.userToString()+" 
starting...");
                if(logMINOR)
                        Logger.minor(this, "Announcement to 
"+seed.userToString()+" starting...");

Modified: branches/db4o/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/FNPPacketMangler.java        
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/FNPPacketMangler.java        
2008-08-07 18:30:55 UTC (rev 21657)
@@ -1,4 +1,3 @@
-
 /* This code is part of Freenet. It is distributed under the GNU General
  * Public License, version 2 (or at your option any later version). See
  * http://www.gnu.org/ for further details of the GPL. */
@@ -315,7 +314,7 @@
                        }
                }
                if(node.wantAnonAuth()) {
-                       if(tryProcessAuthAnon(buf, offset, length, peer, now)) 
return;
+                       if(tryProcessAuthAnon(buf, offset, length, peer)) 
return;
                }
                if(LOG_UNMATCHABLE_ERROR)
                        System.err.println("Unmatchable packet from "+peer+" on 
"+node.getDarknetPortNumber());
@@ -340,7 +339,12 @@
                int ivLength = pcfb.lengthIV();
                int digestLength = HASH_LENGTH;
                if(length < digestLength + ivLength + 4) {
-                       if(logMINOR) Logger.minor(this, "Too short: "+length+" 
should be at least "+(digestLength + ivLength + 4));
+                       if(logMINOR) {
+                               if(buf.length < length)
+                                       Logger.debug(this, "The packet is 
smaller than the decrypted size: it's probably the wrong tracker 
("+buf.length+'<'+length+')');
+                               else
+                                       Logger.minor(this, "Too short: 
"+length+" should be at least "+(digestLength + ivLength + 4));
+                       }
                        return false;
                }
                // IV at the beginning
@@ -396,7 +400,7 @@
         * @param now The time at which the packet was received
         * @return True if we handled a negotiation packet, false otherwise.
         */
-       private boolean tryProcessAuthAnon(byte[] buf, int offset, int length, 
Peer peer, long now) {
+       private boolean tryProcessAuthAnon(byte[] buf, int offset, int length, 
Peer peer) {
                BlockCipher authKey = crypto.getAnonSetupCipher();
                // Does the packet match IV E( H(data) data ) ?
                PCFBMode pcfb = PCFBMode.create(authKey);
@@ -593,8 +597,7 @@
                        processJFKMessage2(payload, 4, pn, replyTo, true, 
setupType);
                } else if(packetType == 3) {
                        // Phase 4
-                       if(!processJFKMessage4(payload, 4, pn, replyTo, false, 
true, setupType, true))
-                               processJFKMessage4(payload, 4, pn, replyTo, 
false, true, setupType, false);
+                       processJFKMessage4(payload, 4, pn, replyTo, false, 
true, setupType);
                } else {
                        Logger.error(this, "Invalid phase "+packetType+" for 
anonymous-initiator (we are the responder)");
                }
@@ -696,8 +699,7 @@
                                 * using the same keys as in the previous 
message.
                                 * The signature is non-message recovering
                                 */
-                               if(!processJFKMessage4(payload, 3, pn, replyTo, 
oldOpennetPeer, false, -1, true))
-                                       processJFKMessage4(payload, 3, pn, 
replyTo, oldOpennetPeer, false, -1, false);
+                               processJFKMessage4(payload, 3, pn, replyTo, 
oldOpennetPeer, false, -1);
                        }
                } else {
                        Logger.error(this, "Decrypted auth packet but unknown 
negotiation type "+negType+" from "+replyTo+" possibly from "+pn);
@@ -950,7 +952,7 @@
                // We don't except such a message;
                if(myNi == null) {
                        if(shouldLogErrorInHandshake(t1))
-                               Logger.normal(this, "We received an unexpected 
JFK(2) message from "+pn.getPeer());
+                               Logger.normal(this, "We received an unexpected 
JFK(2) message from "+pn.getPeer()+" (time since added: 
"+pn.timeSinceAddedOrRestarted()+" time last 
receive:"+pn.lastReceivedPacketTime()+')');
                        return;
                } else if(!Arrays.equals(myNi, nonceInitiator)){
                        if(logMINOR)
@@ -974,7 +976,7 @@
                }

                // At this point we know it's from the peer, so we can report a 
packet received.
-               pn.receivedPacket(true);
+               pn.receivedPacket(true, false);

                sendJFKMessage3(1, 2, 3, nonceInitiator, nonceResponder, 
hisExponential, authenticator, pn, replyTo, unknownInitiator, setupType);

@@ -1151,7 +1153,7 @@
                }

                // At this point we know it's from the peer, so we can report a 
packet received.
-               pn.receivedPacket(true);
+               pn.receivedPacket(true, false);

                // Send reply
                sendJFKMessage4(1, 2, 3, nonceInitiator, 
nonceResponder,initiatorExponential, responderExponential, 
@@ -1239,7 +1241,7 @@
         * @param pn The PeerNode we are talking to. Cannot be null as we are 
the initiator.
         * @param replyTo The Peer we are replying to.
         */
-       private boolean processJFKMessage4(byte[] payload, int inputOffset, 
PeerNode pn, Peer replyTo, boolean oldOpennetPeer, boolean unknownInitiator, 
int setupType, boolean bothNoderefs)
+       private boolean processJFKMessage4(byte[] payload, int inputOffset, 
PeerNode pn, Peer replyTo, boolean oldOpennetPeer, boolean unknownInitiator, 
int setupType)
        {
                final long t1 = System.currentTimeMillis();
                if(logMINOR) Logger.minor(this, "Got a JFK(4) message, 
processing it - "+pn.getPeer());
@@ -1253,26 +1255,15 @@
                BlockCipher c = null;
                try { c = new Rijndael(256, 256); } catch 
(UnsupportedCipherException e) {}

-               if(bothNoderefs && pn.jfkMyRef == null) {
-                       if(node.getUptime() < 60*1000) {
-                               Logger.normal(this, "Avoiding NPE: got JFK(4) 
but no pn.jfkMyRef on "+pn);
-                               return false;
-                       } else {
-                               Logger.error(this, "Got JFK(4) but no 
pn.jfkMyRef on "+pn);
-                               return false;
-                       }
-               }
                final int expectedLength =
                        HASH_LENGTH + // HMAC of the cyphertext
                        (c.getBlockSize() >> 3) + // IV
                        Node.SIGNATURE_PARAMETER_LENGTH * 2 + // the signature
-                       (bothNoderefs ? pn.jfkMyRef.length : 0) + // my 
reference
                        8+ // bootID
                        1; // znoderefR

                if(payload.length - inputOffset < expectedLength + 3) {
-                       if(!bothNoderefs)
-                               Logger.error(this, "Packet too short from 
"+pn.getPeer()+": "+payload.length+" after decryption in JFK(4), should be 
"+(expectedLength + 3));
+                       Logger.error(this, "Packet too short from 
"+pn.getPeer()+": "+payload.length+" after decryption in JFK(4), should be 
"+(expectedLength + 3));
                        return false;
                }
                byte[] jfkBuffer = pn.getJFKBuffer();
@@ -1317,11 +1308,11 @@
                byte[] data = new byte[decypheredPayload.length - 
decypheredPayloadOffset];
                System.arraycopy(decypheredPayload, decypheredPayloadOffset, 
data, 0, decypheredPayload.length - decypheredPayloadOffset);
                long bootID = Fields.bytesToLong(data);
-               if(data.length - (bothNoderefs ? pn.jfkMyRef.length : 0) - 8 < 
0) {
-                       Logger.error(this, "No space for hisRef: 
bothNoderefs="+bothNoderefs+" data.length="+data.length+" 
myRef.length="+(pn.jfkMyRef==null?0:pn.jfkMyRef.length)+" orig data length 
"+(payload.length-inputOffset));
+               if(data.length - 8 < 0) {
+                       Logger.error(this, "No space for hisRef: 
data.length="+data.length+" 
myRef.length="+(pn.jfkMyRef==null?0:pn.jfkMyRef.length)+" orig data length 
"+(payload.length-inputOffset));
                        return false;
                }
-               byte[] hisRef = new byte[data.length - (bothNoderefs ? 
pn.jfkMyRef.length : 0) - 8];
+               byte[] hisRef = new byte[data.length - 8];
                System.arraycopy(data, 8, hisRef, 0, hisRef.length);

                // verify the signature
@@ -1339,10 +1330,7 @@
                byte[] messageHash = SHA256.digest(locallyGeneratedText);
                if(!DSA.verify(pn.peerPubKey, remoteSignature, new 
NativeBigInteger(1, messageHash), false)) {
                        String error = "The signature verification has failed!! 
JFK(4) -"+pn.getPeer()+" message hash "+HexUtil.bytesToHex(messageHash)+" 
length "+locallyGeneratedText.length+" hisRef "+hisRef.length+" hash 
"+Fields.hashCode(hisRef)+" myRef "+pn.jfkMyRef.length+" hash 
"+Fields.hashCode(pn.jfkMyRef)+" boot ID "+bootID;
-                       if(bothNoderefs)
-                               Logger.normal(this, error);
-                       else
-                               Logger.error(this, error);
+                       Logger.error(this, error);
                        return false;
                }

@@ -1966,8 +1954,9 @@
                        tracker.destForgotPacket(realSeqNo);
                }

-               tracker.pn.receivedPacket(false); // Must keep the connection 
open, even if it's an ack packet only and on an incompatible connection - we 
may want to do a UOM transfer e.g.
-
+               tracker.pn.receivedPacket(false, true); // Must keep the 
connection open, even if it's an ack packet only and on an incompatible 
connection - we may want to do a UOM transfer e.g.
+//             System.err.println(tracker.pn.getIdentityString()+" : received 
packet");
+               
                // No sequence number == no messages

                if((seqNumber != -1) && tracker.alreadyReceived(seqNumber)) {
@@ -2598,6 +2587,7 @@
                // pn.getPeer() cannot be null
                try {
                        sendPacket(output, kt.pn.getPeer(), kt.pn, 
alreadyReportedBytes);
+//                     System.err.println(kt.pn.getIdentityString()+" : sent 
packet length "+output.length);
                } catch (LocalAddressException e) {
                        Logger.error(this, "Tried to send data packet to local 
address: "+kt.pn.getPeer()+" for "+kt.pn.allowLocalAddresses());
                }
@@ -2828,20 +2818,24 @@
         * @return True if we reset the transient key and therefore the 
authenticator cache.
         */
        private boolean maybeResetTransientKey() {
+               long now = System.currentTimeMillis();
+               boolean isCacheTooBig = true;
                synchronized (authenticatorCache) {
-                       long now = System.currentTimeMillis();
                        if(authenticatorCache.size() < 
AUTHENTICATOR_CACHE_SIZE) {
+                               isCacheTooBig = false;
                                if(now - timeLastReset < 
TRANSIENT_KEY_REKEYING_MIN_INTERVAL)
                                        return false;
                        }
+                       timeLastReset = now;
+
                        node.random.nextBytes(transientKey);

                        // reset the authenticator cache
                        authenticatorCache.clear();
-                       
-                       timeLastReset = now;
                }
-               node.getTicker().queueTimedJob(transientKeyRekeyer, 
TRANSIENT_KEY_REKEYING_MIN_INTERVAL);
+               if(logMINOR)
+                       Logger.minor(this, "Reset the JFK transitent key 
because "+(isCacheTooBig ? ("the cache's capacity is exeeded 
("+authenticatorCache.size()+')') : "it's time to rekey") + this);
+               node.getTicker().queueTimedJob(transientKeyRekeyer, 
"JFKmaybeResetTransitentKey "+now, TRANSIENT_KEY_REKEYING_MIN_INTERVAL, false);
                Logger.normal(this, "JFK's TransientKey has been changed and 
the message cache flushed.");
                return true;
        }

Modified: branches/db4o/freenet/src/freenet/node/KeyTracker.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/KeyTracker.java      2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/KeyTracker.java      2008-08-07 
18:30:55 UTC (rev 21657)
@@ -567,7 +567,7 @@
      * @throws UpdatableSortedLinkedListKilledException 
      */
     private void removeAckRequest(int seqNo) throws 
UpdatableSortedLinkedListKilledException {
-        QueuedAckRequest qr = 
(QueuedAckRequest)ackRequestQueue.removeByKey(new Integer(seqNo));
+        QueuedAckRequest qr = 
(QueuedAckRequest)ackRequestQueue.removeByKey(seqNo);
        if(qr != null) qr.onAcked();
        else
                Logger.normal(this, "Removing ack request twice? Null on 
"+seqNo+" from "+pn.getPeer()+" ("+TimeUtil.formatTime((int) 
pn.averagePingTime(), 2, true)+" ping avg)");
@@ -584,7 +584,7 @@
                if(resendData.length > Node.PACKET_SIZE)
                        pn.getThrottle().notifyOfPacketLost();
             synchronized(packetsToResend) {
-                packetsToResend.add(new Integer(seqNumber));
+                packetsToResend.add(seqNumber);
             }
             pn.node.ps.wakeUp();
         } else {

Modified: branches/db4o/freenet/src/freenet/node/LocationManager.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/LocationManager.java 2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/LocationManager.java 2008-08-07 
18:30:55 UTC (rev 21657)
@@ -9,8 +9,6 @@
 import java.security.MessageDigest;
 import java.text.DateFormat;
 import java.util.Date;
-import java.util.Enumeration;
-import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -113,7 +111,7 @@
     public synchronized double getLocation() {
         return loc;
     }
-
+    
     /**
      * @param l
      */
@@ -202,7 +200,7 @@
                                 }
                                 if(myFlag) {
                                     setLocation(node.random.nextDouble());
-                                    announceLocChange(true, true);
+                                    announceLocChange(true, true, true);
                                     node.writeNodeFile();
                                 }
                             } finally {
@@ -384,7 +382,7 @@
                 setLocation(hisLoc);
                 if(logMINOR) Logger.minor(this, "Swapped: "+myLoc+" <-> 
"+hisLoc+" - "+uid);
                 swaps++;
-                announceLocChange(false, false);
+                announceLocChange(true, false, false);
                 node.writeNodeFile();
             } else {
                if(logMINOR) Logger.minor(this, "Didn't swap: "+myLoc+" <-> 
"+hisLoc+" - "+uid);
@@ -396,7 +394,7 @@
             // Randomise our location every 2*SWAP_RESET swap attempts, 
whichever way it went.
             if(node.random.nextInt(SWAP_RESET) == 0) {
                 setLocation(node.random.nextDouble());
-                announceLocChange(true, false);
+                announceLocChange(true, true, false);
                 node.writeNodeFile();
             }

@@ -578,7 +576,7 @@
                     setLocation(hisLoc);
                     if(logMINOR) Logger.minor(this, "Swapped: "+myLoc+" <-> 
"+hisLoc+" - "+uid);
                     swaps++;
-                    announceLocChange(false, false);
+                    announceLocChange(true, false, false);
                     node.writeNodeFile();
                 } else {
                        if(logMINOR) Logger.minor(this, "Didn't swap: "+myLoc+" 
<-> "+hisLoc+" - "+uid);
@@ -590,7 +588,7 @@
                 // Randomise our location every 2*SWAP_RESET swap attempts, 
whichever way it went.
                 if(node.random.nextInt(SWAP_RESET) == 0) {
                     setLocation(node.random.nextDouble());
-                    announceLocChange(true, false);
+                    announceLocChange(true, true, false);
                     node.writeNodeFile();
                 }

@@ -608,10 +606,15 @@
     /**
      * Tell all connected peers that our location has changed
      */
-    private void announceLocChange(boolean randomReset, boolean 
fromDupLocation) {
-        Message msg = DMT.createFNPLocChangeNotification(getLocation());
+    protected void announceLocChange() {
+           announceLocChange(false, false, false);
+    }
+    
+    private void announceLocChange(boolean log, boolean randomReset, boolean 
fromDupLocation) {
+        Message msg = DMT.createFNPLocChangeNotificationNew(getLocation(), 
node.peers.getPeerLocationDoubles(true));
         node.peers.localBroadcast(msg, false, true, this);
-        recordLocChange(randomReset, fromDupLocation);
+       if(log)
+               recordLocChange(randomReset, fromDupLocation);
     }

     private void recordLocChange(final boolean randomReset, final boolean 
fromDupLocation) {

Modified: branches/db4o/freenet/src/freenet/node/LowLevelGetException.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/LowLevelGetException.java    
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/LowLevelGetException.java    
2008-08-07 18:30:55 UTC (rev 21657)
@@ -32,7 +32,7 @@
        /** Ran into a failure table */
        public static final int RECENTLY_FAILED = 10;

-       static final String getMessage(int reason) {
+       public static final String getMessage(int reason) {
                switch(reason) {
                case DECODE_FAILED:
                        return "Decode of data failed, probably was bogus at 
source";

Modified: branches/db4o/freenet/src/freenet/node/Node.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/Node.java    2008-08-07 16:48:54 UTC 
(rev 21656)
+++ branches/db4o/freenet/src/freenet/node/Node.java    2008-08-07 18:30:55 UTC 
(rev 21657)
@@ -1,6 +1,4 @@
-/*
- * Freenet 0.7 node.
- */
+/* Freenet 0.7 node. */
 package freenet.node;

 import java.io.BufferedReader;
@@ -50,6 +48,7 @@
 import freenet.config.PersistentConfig;
 import freenet.config.SubConfig;
 import freenet.crypt.DSAPublicKey;
+import freenet.crypt.DiffieHellman;
 import freenet.crypt.RandomSource;
 import freenet.crypt.SHA256;
 import freenet.crypt.Yarrow;
@@ -114,7 +113,6 @@
 import freenet.support.LRUQueue;
 import freenet.support.Logger;
 import freenet.support.OOMHandler;
-import freenet.support.OOMHook;
 import freenet.support.PooledExecutor;
 import freenet.support.ShortBuffer;
 import freenet.support.SimpleFieldSet;
@@ -128,6 +126,7 @@
 import freenet.support.io.FileUtil;
 import freenet.support.io.NativeThread;
 import freenet.support.transport.ip.HostnameSyntaxException;
+import java.io.FileFilter;

 /**
  * @author amphibian
@@ -205,7 +204,7 @@
        private static class L10nCallback implements StringCallback, 
EnumerableOptionCallback {

                public String get() {
-                       return L10n.getSelectedLanguage();
+                       return 
L10n.mapLanguageNameToLongName(L10n.getSelectedLanguage());
                }

                public void set(String val) throws InvalidConfigValueException {
@@ -222,7 +221,10 @@
                }

                public String[] getPossibleValues() {
-                       return L10n.AVAILABLE_LANGUAGES;
+                       String[] result = new 
String[L10n.AVAILABLE_LANGUAGES.length];
+                       for(int i=0; i<L10n.AVAILABLE_LANGUAGES.length; i++)
+                               result[i] = L10n.AVAILABLE_LANGUAGES[i][1];
+                       return result;
                }
        }

@@ -407,6 +409,7 @@

        private final NodeCryptoConfig opennetCryptoConfig;
        private OpennetManager opennet;
+       private volatile boolean isAllowedToConnectToSeednodes;
        private int maxOpennetPeers;
        private boolean acceptSeedConnections;
        private boolean passOpennetRefsThroughDarknet;
@@ -431,6 +434,8 @@
        final boolean enablePerNodeFailureTables;
        final boolean enableULPRDataPropagation;
        final boolean enableSwapping;
+       private volatile boolean publishOurPeersLocation;
+       private volatile boolean routeAccordingToOurPeersLocation;
        boolean enableSwapQueueing;
        boolean enablePacketCoalescing;
        public static final short DEFAULT_MAX_HTL = (short)10;
@@ -502,6 +507,8 @@
         */
        private static final int MIN_UPTIME_STORE_KEY = 40;

+       private volatile boolean isPRNGReady = false;
+       
        /**
         * Read all storable settings (identity etc) from the node file.
         * @param filename The name of the file to read from.
@@ -625,11 +632,13 @@
         * @param config The Config object for this node.
         * @param random The random number generator for this node. Passed in 
because we may want
         * to use a non-secure RNG for e.g. one-JVM live-code simulations. 
Should be a Yarrow in
-        * a production node.
+        * a production node. Yarrow will be used if that parameter is null
+        * @param weakRandom The fast random number generator the node will 
use. If null a MT
+        * instance will be used, seeded from the secure PRNG.
         * @param the loggingHandler
         * @throws NodeInitException If the node initialization fails.
         */
-        Node(PersistentConfig config, RandomSource random, 
LoggingConfigHandler lc, NodeStarter ns, Executor executor) throws 
NodeInitException {
+        Node(PersistentConfig config, RandomSource r, RandomSource weakRandom, 
LoggingConfigHandler lc, NodeStarter ns, Executor executor) throws 
NodeInitException {
                // Easy stuff
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                String tmp = "Initializing Node using Freenet Build 
#"+Version.buildNumber()+" r"+Version.cvsRevision+" and freenet-ext Build 
#"+NodeStarter.extBuildNumber+" r"+NodeStarter.extRevisionNumber+" with 
"+System.getProperty("java.vendor")+" JVM version 
"+System.getProperty("java.version")+" running on 
"+System.getProperty("os.arch")+' '+System.getProperty("os.name")+' 
'+System.getProperty("os.version");
@@ -641,16 +650,30 @@
                if(logConfigHandler != lc)
                        logConfigHandler=lc;
                startupTime = System.currentTimeMillis();
-               // Will be set up properly afterwards
-               L10n.setLanguage(L10n.FALLBACK_DEFAULT);
                SimpleFieldSet oldConfig = config.getSimpleFieldSet();
                // Setup node-specific configuration
                SubConfig nodeConfig = new SubConfig("node", config);
+               
                int sortOrder = 0;

+               // l10n stuffs
+               nodeConfig.register("l10n", 
Locale.getDefault().getLanguage().toLowerCase(), sortOrder++, false, true, 
+                               "Node.l10nLanguage",
+                               "Node.l10nLanguageLong",
+                               new L10nCallback());
+               
+               try {
+                       L10n.setLanguage(nodeConfig.getString("l10n"));
+               } catch (MissingResourceException e) {
+                       try {
+                               
L10n.setLanguage(nodeConfig.getOption("l10n").getDefault());
+                       } catch (MissingResourceException e1) {
+                               L10n.setLanguage(L10n.FALLBACK_DEFAULT);
+                       }
+               }
+               
                // FProxy config needs to be here too
                SubConfig fproxyConfig = new SubConfig("fproxy", config);
-
                try {
                        toadlets = new SimpleToadletServer(fproxyConfig, new 
ArrayBucketFactory(), executor);
                        fproxyConfig.finishedInitialization();
@@ -665,14 +688,55 @@
                        e4.printStackTrace();
                        throw new 
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_FPROXY, "Could not 
start FProxy: "+e4);
                }
-               
+
+               // Setup RNG if needed : DO NOT USE IT BEFORE THAT POINT!
+               if(r == null) {
+                       final NativeThread entropyGatheringThread = new 
NativeThread(new Runnable() {
+
+                               private void recurse(File f) {
+                                       if(isPRNGReady)
+                                               return;
+                                       File[] subDirs = f.listFiles(new 
FileFilter() {
+
+                                               public boolean accept(File 
pathname) {
+                                                       return 
pathname.exists() && pathname.canRead() && pathname.isDirectory();
+                                               }
+                                       });
+
+
+                                       // @see 
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5086412
+                                       if(subDirs != null) 
+                                               for(File currentDir : subDirs)
+                                                       recurse(currentDir);
+                               }
+
+                               public void run() {
+                                       for(File root : File.listRoots()) {
+                                               if(isPRNGReady)
+                                                       return;
+                                               recurse(root);
+                                       }
+                               }
+                       }, "Entropy Gathering Thread", 
NativeThread.MIN_PRIORITY, true);
+
+                       entropyGatheringThread.start();
+                       this.random = new Yarrow();
+                       DiffieHellman.init(random);
+                       
+               } else // if it's not null it's because we are running in the 
simulator
+                       this.random = r;
+               isPRNGReady = true;
+               toadlets.getStartupToadlet().setIsPRNGReady();
+               if(weakRandom == null) {
+                       byte buffer[] = new byte[16];
+                       random.nextBytes(buffer);
+                       this.fastWeakRandom = new MersenneTwister(buffer);
+               }else
+                       this.fastWeakRandom = weakRandom;
+
                nodeNameUserAlert = new MeaningfulNodeNameUserAlert(this);
                recentlyCompletedIDs = new LRUQueue();
                this.config = config;
-               this.random = random;
-               byte buffer[] = new byte[16];
-               random.nextBytes(buffer);
-               this.fastWeakRandom = new MersenneTwister(buffer);
                cachedPubKeys = new LRUHashtable();
                lm = new LocationManager(random, this);

@@ -939,6 +1003,30 @@
                });
                enableSwapping = nodeConfig.getBoolean("enableSwapping");

+               nodeConfig.register("publishOurPeersLocation", false, 
sortOrder++, true, false, "Node.publishOurPeersLocation", 
"Node.publishOurPeersLocationLong", new BooleanCallback() {
+
+                       public boolean get() {
+                               return publishOurPeersLocation;
+                       }
+
+                       public void set(boolean val) throws 
InvalidConfigValueException {
+                               publishOurPeersLocation = val;
+                       }
+               });
+               publishOurPeersLocation = 
nodeConfig.getBoolean("publishOurPeersLocation");
+               
+               nodeConfig.register("routeAccordingToOurPeersLocation", false, 
sortOrder++, true, false, "Node.routeAccordingToOurPeersLocation", 
"Node.routeAccordingToOurPeersLocationLong", new BooleanCallback() {
+
+                       public boolean get() {
+                               return routeAccordingToOurPeersLocation;
+                       }
+
+                       public void set(boolean val) throws 
InvalidConfigValueException {
+                               routeAccordingToOurPeersLocation = val;
+                       }
+               });
+               routeAccordingToOurPeersLocation = 
nodeConfig.getBoolean("routeAccordingToOurPeersLocation");
+               
                nodeConfig.register("enableSwapQueueing", true, sortOrder++, 
true, false, "Node.enableSwapQueueing", "Node.enableSwapQueueingLong", new 
BooleanCallback() {
                        public boolean get() {
                                return enableSwapQueueing;
@@ -1157,6 +1245,21 @@
                // Opennet

                final SubConfig opennetConfig = new SubConfig("node.opennet", 
config);
+               opennetConfig.register("connectToSeednodes", true, 0, true, 
false, "Node.withAnnouncement", "Node.withAnnouncementLong", new 
BooleanCallback() {
+                       public boolean get() {
+                               return isAllowedToConnectToSeednodes;
+                       }
+                       public void set(boolean val) throws 
InvalidConfigValueException {
+                               if(val == get()) return;
+                               synchronized(Node.this) {
+                                       if(opennet != null)
+                                               throw new 
InvalidConfigValueException("Can't change that setting on the fly when opennet 
is already active!");
+                                       else
+                                               isAllowedToConnectToSeednodes = 
val;
+                               }
+                       }
+               });
+               isAllowedToConnectToSeednodes = 
opennetConfig.getBoolean("connectToSeednodes");

                // Can be enabled on the fly
                opennetConfig.register("enabled", false, 0, false, true, 
"Node.opennetEnabled", "Node.opennetEnabledLong", new BooleanCallback() {
@@ -1171,7 +1274,7 @@
                                        if(val == (opennet != null)) return;
                                        if(val) {
                                                try {
-                                                       o = opennet = new 
OpennetManager(Node.this, opennetCryptoConfig, System.currentTimeMillis());
+                                                       o = opennet = new 
OpennetManager(Node.this, opennetCryptoConfig, System.currentTimeMillis(), 
isAllowedToConnectToSeednodes);
                                                } catch (NodeInitException e) {
                                                        opennet = null;
                                                        throw new 
InvalidConfigValueException(e.getMessage());
@@ -1185,8 +1288,7 @@
                                else o.stop(true);
                                
ipDetector.ipDetectorManager.notifyPortChange(getPublicInterfacePorts());
                        }
-               });
-               
+               });             
                boolean opennetEnabled = opennetConfig.getBoolean("enabled");

                opennetConfig.register("maxOpennetPeers", "20", 1, true, false, 
"Node.maxOpennetPeers",
@@ -1211,7 +1313,7 @@
                opennetCryptoConfig = new NodeCryptoConfig(opennetConfig, 2 /* 
0 = enabled */, true);

                if(opennetEnabled) {
-                       opennet = new OpennetManager(this, opennetCryptoConfig, 
System.currentTimeMillis());
+                       opennet = new OpennetManager(this, opennetCryptoConfig, 
System.currentTimeMillis(), isAllowedToConnectToSeednodes);
                        // Will be started later
                } else {
                        opennet = null;
@@ -1628,25 +1730,9 @@
                        this.storeEnvironment = null;
                }

-               // FIXME back compatibility
-               SimpleFieldSet oldThrottleFS = null;
-               File oldThrottle = new File("throttle.dat");
-               String oldThrottleName = 
nodeConfig.getRawOption("throttleFile");
-               if(oldThrottleName != null)
-                       oldThrottle = new File(oldThrottleName);
-               if(oldThrottle.exists() && (!new 
File("node-throttle.dat").exists()) && lastVersion < 1021) {
-                       // Migrate from old throttle file to new node- and 
client- throttle files
-                       try {
-                               oldThrottleFS = SimpleFieldSet.readFrom(new 
File("throttle.dat"), false, true);
-                       } catch (IOException e) {
-                               // Ignore
-                       }
-                       oldThrottle.delete();
-               }
+               nodeStats = new NodeStats(this, sortOrder, new 
SubConfig("node.load", config), obwLimit, ibwLimit, nodeDir);

-               nodeStats = new NodeStats(this, sortOrder, new 
SubConfig("node.load", config), oldThrottleFS, obwLimit, ibwLimit, nodeDir);
-               
-               clientCore = new NodeClientCore(this, config, nodeConfig, 
nodeDir, getDarknetPortNumber(), sortOrder, oldThrottleFS == null ? null : 
oldThrottleFS.subset("RequestStarters"), oldConfig, fproxyConfig, toadlets, db);
+               clientCore = new NodeClientCore(this, config, nodeConfig, 
nodeDir, getDarknetPortNumber(), sortOrder, oldConfig, fproxyConfig, toadlets, 
db);

                netid = new NetworkIDManager(this);

@@ -1663,23 +1749,7 @@
                });

                disableHangCheckers = 
nodeConfig.getBoolean("disableHangCheckers");
-               
-               // l10n stuffs
-               nodeConfig.register("l10n", 
Locale.getDefault().getLanguage().toLowerCase(), sortOrder++, false, true, 
-                               "Node.l10nLanguage",
-                               "Node.l10nLanguageLong",
-                               new L10nCallback());
-               
-               try {
-                       L10n.setLanguage(nodeConfig.getString("l10n"));
-               } catch (MissingResourceException e) {
-                       try {
-                               
L10n.setLanguage(nodeConfig.getOption("l10n").getDefault());
-                       } catch (MissingResourceException e1) {
-                               L10n.setLanguage(L10n.FALLBACK_DEFAULT);
-                       }
-               }
-               
+                               
                nodeConfig.finishedInitialization();
                writeNodeFile();

@@ -1814,6 +1884,12 @@

                if(logMINOR) Logger.minor(this, "JVM vendor: "+jvmVendor+", JVM 
version: "+jvmVersion+", OS name: "+osName+", OS version: "+osVersion);

+               if(jvmVersion.startsWith("1.4")) {
+                       System.err.println("Java 1.4 will not be supported for 
much longer, PLEASE UPGRADE!");
+                       nodeUpdater.disableThisSession();
+                       clientCore.alerts.register(new SimpleUserAlert(false, 
l10n("java14Title"), l10n("java14Text"), l10n("java14ShortText"), 
UserAlert.ERROR));
+               }
+               
                if(jvmVendor.startsWith("Sun ")) {
                        // Sun bugs

@@ -2713,6 +2789,8 @@
                synchronized(cachedPubKeys) {
                        DSAPublicKey key2 = (DSAPublicKey) cachedPubKeys.get(w);
                        if((key2 != null) && !key2.equals(key)) {
+                               // FIXME is this test really needed?
+                               // SHA-256 inside synchronized{} is a bad idea
                                MessageDigest md256 = SHA256.getMessageDigest();
                                try {
                                byte[] hashCheck = md256.digest(key.asBytes());
@@ -2885,6 +2963,10 @@
                return false;
        }

+       public synchronized boolean isOudated() {
+               return (buildOldAgeUserAlert.lastGoodVersion > 0);
+       }
+       
        /**
         * Handle a received node to node message
         */
@@ -3163,6 +3245,9 @@
        /** 
         * Connect this node to another node (for purposes of testing) 
         */
+       public void connectToSeednode(SeedServerTestPeerNode node) throws 
OpennetDisabledException, FSParseException, PeerParseException, 
ReferenceSignatureVerificationException {
+               peers.addPeer(node,false,false);
+       }
        public void connect(Node node) throws FSParseException, 
PeerParseException, ReferenceSignatureVerificationException {
                peers.connect(node.darknetCrypto.exportPublicFieldSet(), 
darknetCrypto.packetMangler);
        }
@@ -3220,6 +3305,11 @@
                return new OpennetPeerNode(fs, this, opennet.crypto, opennet, 
peers, false, opennet.crypto.packetMangler);
        }

+       public SeedServerTestPeerNode 
createNewSeedServerTestPeerNode(SimpleFieldSet fs) throws FSParseException, 
OpennetDisabledException, PeerParseException, 
ReferenceSignatureVerificationException {               
+               if(opennet == null) throw new OpennetDisabledException("Opennet 
is not currently enabled");
+               return new SeedServerTestPeerNode(fs, this, opennet.crypto, 
peers, true, opennet.crypto.packetMangler);
+       }
+       
        public OpennetPeerNode addNewOpennetNode(SimpleFieldSet fs) throws 
FSParseException, PeerParseException, ReferenceSignatureVerificationException {
                // FIXME: perhaps this should throw OpennetDisabledExcemption 
rather than returing false?
                if(opennet == null) return null;
@@ -3420,4 +3510,12 @@
        public void setDispatcherHook(NodeDispatcherCallback cb) {
                this.dispatcher.setHook(cb);
        }
-}
\ No newline at end of file
+       
+       public boolean shallWePublishOurPeersLocation() {
+               return publishOurPeersLocation;
+       }
+       
+       public boolean shallWeRouteAccordingToOurPeersLocation() {
+               return routeAccordingToOurPeersLocation;
+       }
+}

Modified: branches/db4o/freenet/src/freenet/node/NodeClientCore.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeClientCore.java  2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/NodeClientCore.java  2008-08-07 
18:30:55 UTC (rev 21657)
@@ -22,7 +22,6 @@
 import freenet.client.async.InsertCompressor;
 import freenet.client.async.SimpleHealingQueue;
 import freenet.client.async.USKManager;
-import freenet.client.async.USKManagerPersistent;
 import freenet.client.events.SimpleEventProducer;
 import freenet.clients.http.FProxyToadlet;
 import freenet.clients.http.SimpleToadletServer;
@@ -66,8 +65,8 @@
 import freenet.support.SimpleFieldSet;
 import freenet.support.api.BooleanCallback;
 import freenet.support.api.Bucket;
-import freenet.support.api.BucketFactory;
 import freenet.support.api.IntCallback;
+import freenet.support.api.BucketFactory;
 import freenet.support.api.StringArrCallback;
 import freenet.support.api.StringCallback;
 import freenet.support.io.FileUtil;
@@ -90,7 +89,6 @@
        private final HealingQueue healingQueue;
        /** Must be included as a hidden field in order for any dangerous HTTP 
operation to complete successfully. */
        public final String formPassword;
-
        File downloadDir;
        private File[] downloadAllowedDirs;
        private boolean includeDownloadDir;
@@ -102,13 +100,10 @@
        public final Node node;
        final NodeStats nodeStats;
        public final RandomSource random;
-       final File tempDir;
+       final File tempDir;     // Persistent temporary buckets
        public final FECQueue fecQueue;
-
-       // Persistent temporary buckets
        public final PersistentTempBucketFactory persistentTempBucketFactory;
        public final PersistentEncryptedTempBucketFactory 
persistentEncryptedTempBucketFactory;
-       
        public final UserAlertManager alerts;
        final TextModeClientInterfaceServer tmci;
        TextModeClientInterface directTMCI;
@@ -124,7 +119,7 @@
         * - We never have two copies of the same object in RAM, and more 
broadly, we don't
         *   need to worry about interactions between objects from different 
transactions.
         * - Only one weak-reference cache for the database.
-        * - No need to refresh live objects. 
+        * - No need to refresh live objects.
         * - Deactivation is simpler.
         * Note that the priorities are thread priorities, not request 
priorities.
         */
@@ -137,21 +132,18 @@

        public transient final ClientContext clientContext;

-       public static int maxBackgroundUSKFetchers;
-       
-       // Client stuff that needs to be configged - FIXME
+       public static int maxBackgroundUSKFetchers;     // Client stuff that 
needs to be configged - FIXME
        static final int MAX_ARCHIVE_HANDLERS = 200; // don't take up much 
RAM... FIXME
-       static final long MAX_CACHED_ARCHIVE_DATA = 32*1024*1024; // make a 
fixed fraction of the store by default? FIXME
-       static final long MAX_ARCHIVE_SIZE = 2*1024*1024; // ??? FIXME
-       static final long MAX_ARCHIVED_FILE_SIZE = 1024*1024; // arbitrary... 
FIXME
-       static final int MAX_CACHED_ELEMENTS = 256*1024; // equally arbitrary! 
FIXME hopefully we can cache many of these though
-       /** Each FEC item can take a fair amount of RAM, since it's fully 
activated with all the buckets, potentially 256 
+       static final long MAX_CACHED_ARCHIVE_DATA = 32 * 1024 * 1024; // make a 
fixed fraction of the store by default? FIXME
+       static final long MAX_ARCHIVE_SIZE = 2 * 1024 * 1024; // ??? FIXME
+       static final long MAX_ARCHIVED_FILE_SIZE = 1024 * 1024; // arbitrary... 
FIXME
+       static final int MAX_CACHED_ELEMENTS = 256 * 1024; // equally 
arbitrary! FIXME hopefully we can cache many of these though
+       /** Each FEC item can take a fair amount of RAM, since it's fully 
activated with all the buckets, potentially 256
         * of them, so only cache a small number of them */
        private static final int FEC_QUEUE_CACHE_SIZE = 20;
-       
        private UserAlert startingUpAlert;

-       NodeClientCore(Node node, Config config, SubConfig nodeConfig, File 
nodeDir, int portNumber, int sortOrder, SimpleFieldSet oldThrottleFS, 
SimpleFieldSet oldConfig, SubConfig fproxyConfig, SimpleToadletServer toadlets, 
ObjectContainer container) throws NodeInitException {
+       NodeClientCore(Node node, Config config, SubConfig nodeConfig, File 
nodeDir, int portNumber, int sortOrder, SimpleFieldSet oldConfig, SubConfig 
fproxyConfig, SimpleToadletServer toadlets, ObjectContainer container) throws 
NodeInitException {
                this.node = node;
                this.nodeStats = node.nodeStats;
                this.random = node.random;
@@ -159,74 +151,77 @@
                this.backgroundBlockEncoder = new BackgroundBlockEncoder();
                clientDatabaseExecutor = new 
PrioritizedSerialExecutor(NativeThread.NORM_PRIORITY, 
NativeThread.MAX_PRIORITY+1, NativeThread.NORM_PRIORITY, true);
                datastoreCheckerExecutor = new 
PrioritizedSerialExecutor(NativeThread.NORM_PRIORITY, 
RequestStarter.NUMBER_OF_PRIORITY_CLASSES, 0, false);
-               byte[] pwdBuf = new byte[16];
+               byte[] pwdBuf = new byte[16];
                random.nextBytes(pwdBuf);
                this.formPassword = Base64.encode(pwdBuf);
                alerts = new UserAlertManager(this);
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
-               
-               persister = new ConfigurablePersister(this, nodeConfig, 
"clientThrottleFile", "client-throttle.dat", sortOrder++, true, false, 
-                               "NodeClientCore.fileForClientStats", 
"NodeClientCore.fileForClientStatsLong", node.ps, nodeDir);
-               
+
+               persister = new ConfigurablePersister(this, nodeConfig, 
"clientThrottleFile", "client-throttle.dat", sortOrder++, true, false,
+                       "NodeClientCore.fileForClientStats", 
"NodeClientCore.fileForClientStatsLong", node.ps, nodeDir);
+
                SimpleFieldSet throttleFS = persister.read();
-               
-               if(throttleFS == null)
-                       throttleFS = oldThrottleFS;
+               if(logMINOR)
+                       Logger.minor(this, "Read throttleFS:\n" + throttleFS);

-               if(logMINOR) Logger.minor(this, "Read 
throttleFS:\n"+throttleFS);
-               
-               if(logMINOR) Logger.minor(this, "Serializing 
RequestStarterGroup from:\n"+throttleFS);
-               
+               if(logMINOR)
+                       Logger.minor(this, "Serializing RequestStarterGroup 
from:\n" + throttleFS);
+
                // Temp files
-               
-               nodeConfig.register("tempDir", new File(nodeDir, 
"temp-"+portNumber).toString(), sortOrder++, true, true, 
"NodeClientCore.tempDir", "NodeClientCore.tempDirLong", 
-                               new StringCallback() {
-                                       public String get() {
-                                               return tempDir.getPath();
-                                       }
-                                       public void set(String val) throws 
InvalidConfigValueException {
-                                               if(tempDir.equals(new 
File(val))) return;
-                                               // FIXME
-                                               throw new 
InvalidConfigValueException(l10n("movingTempDirOnTheFlyNotSupported"));
-                                       }
-               });
-               
+
+               nodeConfig.register("tempDir", new File(nodeDir, "temp-" + 
portNumber).toString(), sortOrder++, true, true, "NodeClientCore.tempDir", 
"NodeClientCore.tempDirLong",
+                       new StringCallback() {
+
+                               public String get() {
+                                       return tempDir.getPath();
+                               }
+
+                               public void set(String val) throws 
InvalidConfigValueException {
+                                       if(tempDir.equals(new File(val)))
+                                               return;
+                                       // FIXME
+                                       throw new 
InvalidConfigValueException(l10n("movingTempDirOnTheFlyNotSupported"));
+                               }
+                       });
+
                tempDir = new File(nodeConfig.getString("tempDir"));
                if(!((tempDir.exists() && tempDir.isDirectory()) || 
(tempDir.mkdir()))) {
                        String msg = "Could not find or create temporary 
directory";
                        throw new 
NodeInitException(NodeInitException.EXIT_BAD_TEMP_DIR, msg);
                }
-               
+
                try {
                        tempFilenameGenerator = new FilenameGenerator(random, 
true, tempDir, "temp-");
-               } catch (IOException e) {
+               } catch(IOException e) {
                        String msg = "Could not find or create temporary 
directory (filename generator)";
                        throw new 
NodeInitException(NodeInitException.EXIT_BAD_TEMP_DIR, msg);
                }
-
+               
                archiveManager = new ArchiveManager(MAX_ARCHIVE_HANDLERS, 
MAX_CACHED_ARCHIVE_DATA, MAX_ARCHIVE_SIZE, MAX_ARCHIVED_FILE_SIZE, 
MAX_CACHED_ELEMENTS, random, node.fastWeakRandom, tempFilenameGenerator);
                uskManager = new USKManager(this);
-               
+
                // Persistent temp files
-               nodeConfig.register("persistentTempDir", new File(nodeDir, 
"persistent-temp-"+portNumber).toString(), sortOrder++, true, false, 
"NodeClientCore.persistentTempDir", "NodeClientCore.persistentTempDirLong",
-                               new StringCallback() {
-                                       public String get() {
-                                               return 
persistentTempBucketFactory.getDir().toString();
-                                       }
-                                       public void set(String val) throws 
InvalidConfigValueException {
-                                               if(get().equals(val))
-                                                       return;
-                                               // FIXME
-                                               throw new 
InvalidConfigValueException("Moving persistent temp directory on the fly not 
supported at present");
-                                       }
-               });
+               nodeConfig.register("persistentTempDir", new File(nodeDir, 
"persistent-temp-" + portNumber).toString(), sortOrder++, true, false, 
"NodeClientCore.persistentTempDir", "NodeClientCore.persistentTempDirLong",
+                       new StringCallback() {
+
+                               public String get() {
+                                       return 
persistentTempBucketFactory.getDir().toString();
+                               }
+
+                               public void set(String val) throws 
InvalidConfigValueException {
+                                       if(get().equals(val))
+                                               return;
+                                       // FIXME
+                                       throw new 
InvalidConfigValueException("Moving persistent temp directory on the fly not 
supported at present");
+                               }
+                       });
                try {
                        File dir = new 
File(nodeConfig.getString("persistentTempDir"));
                        String prefix = "freenet-temp-";
                        persistentTempBucketFactory = 
PersistentTempBucketFactory.load(dir, prefix, random, node.fastWeakRandom, 
container, node.nodeDBHandle);
                        persistentTempBucketFactory.init(dir, prefix, random, 
node.fastWeakRandom);
                        persistentEncryptedTempBucketFactory = 
PersistentEncryptedTempBucketFactory.load(persistentTempBucketFactory, 
container);
-               } catch (IOException e2) {
+               } catch(IOException e2) {
                        String msg = "Could not find or create persistent 
temporary directory";
                        throw new 
NodeInitException(NodeInitException.EXIT_BAD_TEMP_DIR, msg);
                }
@@ -234,17 +229,17 @@
                tempBucketFactory = new 
PaddedEphemerallyEncryptedBucketFactory(new 
TempBucketFactory(tempFilenameGenerator), random, node.fastWeakRandom, 1024);

                healingQueue = new SimpleHealingQueue(
-                               new InsertContext(tempBucketFactory, 
tempBucketFactory, persistentTempBucketFactory, 
-                                               0, 2, 1, 0, 0, new 
SimpleEventProducer(), 
+                               new InsertContext(tempBucketFactory, 
tempBucketFactory, persistentTempBucketFactory,
+                                               0, 2, 1, 0, 0, new 
SimpleEventProducer(),
                                                
!Node.DONT_CACHE_LOCAL_REQUESTS), RequestStarter.PREFETCH_PRIORITY_CLASS, 512 
/* FIXME make configurable */);

                clientContext = new ClientContext(this);
                requestStarters = new RequestStarterGroup(node, this, 
portNumber, random, config, throttleFS, clientContext);
                clientContext.init(requestStarters);
                InsertCompressor.load(container, clientContext);
-               
+
                // Downloads directory
-               
+
                nodeConfig.register("downloadsDir", "downloads", sortOrder++, 
true, true, "NodeClientCore.downloadDir", "NodeClientCore.downloadDirLong", new 
StringCallback() {

                        public String get() {
@@ -255,123 +250,121 @@
                                if(downloadDir.equals(new File(val)))
                                        return;
                                File f = new File(val);
-                               if(!((f.exists() && f.isDirectory()) || 
(f.mkdir()))) {
+                               if(!((f.exists() && f.isDirectory()) || 
(f.mkdir())))
                                        // Relatively commonly used, despite 
being advanced (i.e. not something we want to show to newbies). So translate it.
                                        throw new 
InvalidConfigValueException(l10n("couldNotFindOrCreateDir"));
-                               }
                                downloadDir = new File(val);
                        }
-                       
                });
-               
+
                String val = nodeConfig.getString("downloadsDir");
                downloadDir = new File(val);
-               if(!((downloadDir.exists() && downloadDir.isDirectory()) || 
(downloadDir.mkdir()))) {
+               if(!((downloadDir.exists() && downloadDir.isDirectory()) || 
(downloadDir.mkdir())))
                        throw new 
NodeInitException(NodeInitException.EXIT_BAD_DOWNLOADS_DIR, "Could not find or 
create default downloads directory");
-               }

                // Downloads allowed, uploads allowed
-               
-               nodeConfig.register("downloadAllowedDirs", new String[] 
{"all"}, sortOrder++, true, true, "NodeClientCore.downloadAllowedDirs", 
-                               "NodeClientCore.downloadAllowedDirsLong",
-                               new StringArrCallback() {

-                                       public String[] get() {
-                                               
synchronized(NodeClientCore.this) {
-                                                       
if(downloadAllowedEverywhere) return new String[] { "all" };
-                                                       String[] dirs = new 
String[downloadAllowedDirs.length + (includeDownloadDir ? 1 : 0) ];
-                                                       for(int 
i=0;i<downloadAllowedDirs.length;i++)
-                                                               dirs[i] = 
downloadAllowedDirs[i].getPath();
-                                                       if(includeDownloadDir)
-                                                               
dirs[downloadAllowedDirs.length] = "downloads";
-                                                       return dirs;
-                                               }
-                                       }
+               nodeConfig.register("downloadAllowedDirs", new String[]{"all"}, 
sortOrder++, true, true, "NodeClientCore.downloadAllowedDirs",
+                       "NodeClientCore.downloadAllowedDirsLong",
+                       new StringArrCallback() {

-                                       public void set(String[] val) throws 
InvalidConfigValueException {
-                                               setDownloadAllowedDirs(val);
+                               public String[] get() {
+                                       synchronized(NodeClientCore.this) {
+                                               if(downloadAllowedEverywhere)
+                                                       return new 
String[]{"all"};
+                                               String[] dirs = new 
String[downloadAllowedDirs.length + (includeDownloadDir ? 1 : 0)];
+                                               for(int i = 0; i < 
downloadAllowedDirs.length; i++)
+                                                       dirs[i] = 
downloadAllowedDirs[i].getPath();
+                                               if(includeDownloadDir)
+                                                       
dirs[downloadAllowedDirs.length] = "downloads";
+                                               return dirs;
                                        }
-                       
-               });
+                               }
+
+                               public void set(String[] val) throws 
InvalidConfigValueException {
+                                       setDownloadAllowedDirs(val);
+                               }
+                       });
                
setDownloadAllowedDirs(nodeConfig.getStringArr("downloadAllowedDirs"));
-               
-               nodeConfig.register("uploadAllowedDirs", new String[] {"all"}, 
sortOrder++, true, true, "NodeClientCore.uploadAllowedDirs", 
-                               "NodeClientCore.uploadAllowedDirsLong",
-                               new StringArrCallback() {

-                                       public String[] get() {
-                                               
synchronized(NodeClientCore.this) {
-                                                       
if(uploadAllowedEverywhere) return new String[] { "all" };
-                                                       String[] dirs = new 
String[uploadAllowedDirs.length];
-                                                       for(int 
i=0;i<uploadAllowedDirs.length;i++)
-                                                               dirs[i] = 
uploadAllowedDirs[i].getPath();
-                                                       return dirs;
-                                               }
-                                       }
+               nodeConfig.register("uploadAllowedDirs", new String[]{"all"}, 
sortOrder++, true, true, "NodeClientCore.uploadAllowedDirs",
+                       "NodeClientCore.uploadAllowedDirsLong",
+                       new StringArrCallback() {

-                                       public void set(String[] val) throws 
InvalidConfigValueException {
-                                               setUploadAllowedDirs(val);
+                               public String[] get() {
+                                       synchronized(NodeClientCore.this) {
+                                               if(uploadAllowedEverywhere)
+                                                       return new 
String[]{"all"};
+                                               String[] dirs = new 
String[uploadAllowedDirs.length];
+                                               for(int i = 0; i < 
uploadAllowedDirs.length; i++)
+                                                       dirs[i] = 
uploadAllowedDirs[i].getPath();
+                                               return dirs;
                                        }
-                       
-               });
+                               }
+
+                               public void set(String[] val) throws 
InvalidConfigValueException {
+                                       setUploadAllowedDirs(val);
+                               }
+                       });
                
setUploadAllowedDirs(nodeConfig.getStringArr("uploadAllowedDirs"));
-               
+
                Logger.normal(this, "Initializing USK Manager");
                System.out.println("Initializing USK Manager");
                uskManager.init(container, clientContext);
-               
+
                nodeConfig.register("lazyResume", false, sortOrder++, true, 
false, "NodeClientCore.lazyResume",
-                               "NodeClientCore.lazyResumeLong", new 
BooleanCallback() {
+                       "NodeClientCore.lazyResumeLong", new BooleanCallback() {

-                                       public boolean get() {
-                                               return lazyResume;
-                                       }
+                       public boolean get() {
+                               return lazyResume;
+                       }

-                                       public void set(boolean val) throws 
InvalidConfigValueException {
-                                               
synchronized(NodeClientCore.this) {
-                                                       lazyResume = val;
-                                               }
-                                       }
-                                       
+                       public void set(boolean val) throws 
InvalidConfigValueException {
+                               synchronized(NodeClientCore.this) {
+                                       lazyResume = val;
+                               }
+                       }
                });
-               
+
                lazyResume = nodeConfig.getBoolean("lazyResume");
-               
+
                nodeConfig.register("maxBackgroundUSKFetchers", "64", 
sortOrder++, true, false, "NodeClientCore.maxUSKFetchers",
-                               "NodeClientCore.maxUSKFetchersLong", new 
IntCallback() {
-                                       public int get() {
-                                               return maxBackgroundUSKFetchers;
-                                       }
-                                       public void set(int uskFetch) throws 
InvalidConfigValueException {
-                                               if(uskFetch <= 0) throw new 
InvalidConfigValueException(l10n("maxUSKFetchersMustBeGreaterThanZero"));
-                                                       
maxBackgroundUSKFetchers = uskFetch;
-                                               }
-                                       }
-               );
-               
+                       "NodeClientCore.maxUSKFetchersLong", new IntCallback() {
+
+                       public int get() {
+                               return maxBackgroundUSKFetchers;
+                       }
+
+                       public void set(int uskFetch) throws 
InvalidConfigValueException {
+                               if(uskFetch <= 0)
+                                       throw new 
InvalidConfigValueException(l10n("maxUSKFetchersMustBeGreaterThanZero"));
+                               maxBackgroundUSKFetchers = uskFetch;
+                       }
+               });
+
                maxBackgroundUSKFetchers = 
nodeConfig.getInt("maxBackgroundUSKFetchers");
-               
-               
+
+
                // This is all part of construction, not of start().
                // Some plugins depend on it, so it needs to be *created* 
before they are started.
-               
+
                // TMCI
-               try{
+               try {
                        tmci = TextModeClientInterfaceServer.maybeCreate(node, 
this, config);
-               } catch (IOException e) {
+               } catch(IOException e) {
                        e.printStackTrace();
-                       throw new 
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_TMCI, "Could not start 
TMCI: "+e);
+                       throw new 
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_TMCI, "Could not start 
TMCI: " + e);
                }
-               
+
                // FCP (including persistent requests so needs to start before 
FProxy)
                try {
                        fcpServer = FCPServer.maybeCreate(node, this, 
node.config, container);
-               } catch (IOException e) {
-                       throw new 
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_FCP, "Could not start 
FCP: "+e);
-               } catch (InvalidConfigValueException e) {
-                       throw new 
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_FCP, "Could not start 
FCP: "+e);
+               } catch(IOException e) {
+                       throw new 
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_FCP, "Could not start 
FCP: " + e);
+               } catch(InvalidConfigValueException e) {
+                       throw new 
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_FCP, "Could not start 
FCP: " + e);
                }
-               
+
                // FProxy
                // FIXME this is a hack, the real way to do this is plugins
                this.alerts.register(startingUpAlert = new 
SimpleUserAlert(true, l10n("startingUpTitle"), l10n("startingUp"), 
l10n("startingUpShort"), UserAlert.MINOR));
@@ -388,7 +381,7 @@
        }

        private static String l10n(String key) {
-               return L10n.getString("NodeClientCore."+key);
+               return L10n.getString("NodeClientCore." + key);
        }

        protected synchronized void setDownloadAllowedDirs(String[] val) {
@@ -397,7 +390,7 @@
                includeDownloadDir = false;
                int i = 0;
                downloadAllowedDirs = new File[val.length];
-               for(i=0;i<downloadAllowedDirs.length;i++) {
+               for(i = 0; i < downloadAllowedDirs.length; i++) {
                        String s = val[i];
                        if(s.equals("downloads"))
                                includeDownloadDir = true;
@@ -418,7 +411,7 @@
                int i = 0;
                uploadAllowedEverywhere = false;
                uploadAllowedDirs = new File[val.length];
-               for(i=0;i<uploadAllowedDirs.length;i++) {
+               for(i = 0; i < uploadAllowedDirs.length; i++) {
                        String s = val[i];
                        if(s.equals("all"))
                                uploadAllowedEverywhere = true;
@@ -436,7 +429,7 @@
                backgroundBlockEncoder.setContext(clientContext);
                node.executor.execute(backgroundBlockEncoder, "Background block 
encoder");
                clientContext.jobRunner.queue(new DBJob() {
-
+                       
                        public void run(ObjectContainer container, 
ClientContext context) {
                                ArchiveManager.init(container, context, 
context.nodeDBHandle);
                        }
@@ -450,8 +443,9 @@
                        fcpServer.maybeStart();
                if(tmci != null)
                        tmci.start();
-               
+
                node.executor.execute(new PrioRunnable() {
+
                        public void run() {
                                Logger.normal(this, "Resuming persistent 
requests");
                                // Call it anyway; if we are not lazy, it won't 
have to start any requests
@@ -474,14 +468,13 @@
        public interface SimpleRequestSenderCompletionListener {

                public void completed(boolean success);
-               
        }
-       
+
        public void asyncGet(Key key, boolean cache, boolean offersOnly, final 
SimpleRequestSenderCompletionListener listener) {
                final long uid = random.nextLong();
                final boolean isSSK = key instanceof NodeSSK;
                if(!node.lockUID(uid, isSSK, false, false, true)) {
-                       Logger.error(this, "Could not lock UID just randomly 
generated: "+uid+" - probably indicates broken PRNG");
+                       Logger.error(this, "Could not lock UID just randomly 
generated: " + uid + " - probably indicates broken PRNG");
                        return;
                }
                asyncGet(key, cache, offersOnly, uid, new 
RequestSender.Listener() {
@@ -500,10 +493,9 @@
                                if(listener != null)
                                        listener.completed(status == 
RequestSender.SUCCESS);
                        }
-                       
                });
        }
-       
+
        /**
         * Start an asynchronous fetch of the key in question, which will 
complete to the datastore.
         * It will not decode the data because we don't provide a ClientKey. It 
will not return 
@@ -523,135 +515,132 @@
                                node.unlockUID(uid, false, false, false, false, 
true);
                        // Else it has started a request.
                        if(logMINOR)
-                               Logger.minor(this, "Started "+o+" for "+uid+" 
for "+key);
-               } catch (RuntimeException e) {
-                       Logger.error(this, "Caught error trying to start 
request: "+e, e);
+                               Logger.minor(this, "Started " + o + " for " + 
uid + " for " + key);
+               } catch(RuntimeException e) {
+                       Logger.error(this, "Caught error trying to start 
request: " + e, e);
                        node.unlockUID(uid, false, false, true, false, true);
-               } catch (Error e) {
-                       Logger.error(this, "Caught error trying to start 
request: "+e, e);
+               } catch(Error e) {
+                       Logger.error(this, "Caught error trying to start 
request: " + e, e);
                        node.unlockUID(uid, false, false, true, false, true);
                }
        }
-       
+
        public ClientKeyBlock realGetKey(ClientKey key, boolean localOnly, 
boolean cache, boolean ignoreStore) throws LowLevelGetException {
                if(key instanceof ClientCHK)
-                       return realGetCHK((ClientCHK)key, localOnly, cache, 
ignoreStore);
+                       return realGetCHK((ClientCHK) key, localOnly, cache, 
ignoreStore);
                else if(key instanceof ClientSSK)
-                       return realGetSSK((ClientSSK)key, localOnly, cache, 
ignoreStore);
+                       return realGetSSK((ClientSSK) key, localOnly, cache, 
ignoreStore);
                else
-                       throw new IllegalArgumentException("Not a CHK or SSK: 
"+key);
+                       throw new IllegalArgumentException("Not a CHK or SSK: " 
+ key);
        }
-       
+
        ClientCHKBlock realGetCHK(ClientCHK key, boolean localOnly, boolean 
cache, boolean ignoreStore) throws LowLevelGetException {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                long startTime = System.currentTimeMillis();
                long uid = random.nextLong();
                if(!node.lockUID(uid, false, false, false, true)) {
-                       Logger.error(this, "Could not lock UID just randomly 
generated: "+uid+" - probably indicates broken PRNG");
+                       Logger.error(this, "Could not lock UID just randomly 
generated: " + uid + " - probably indicates broken PRNG");
                        throw new 
LowLevelGetException(LowLevelGetException.INTERNAL_ERROR);
                }
                try {
-               Object o = node.makeRequestSender(key.getNodeCHK(), 
node.maxHTL(), uid, null, localOnly, cache, ignoreStore, false);
-               if(o instanceof CHKBlock) {
-                       try {
-                               return new ClientCHKBlock((CHKBlock)o, key);
-                       } catch (CHKVerifyException e) {
-                               Logger.error(this, "Does not verify: "+e, e);
-                               throw new 
LowLevelGetException(LowLevelGetException.DECODE_FAILED);
-                       }
-               }
-               if(o == null) {
-                       throw new 
LowLevelGetException(LowLevelGetException.DATA_NOT_FOUND_IN_STORE);
-               }
-               RequestSender rs = (RequestSender)o;
-               boolean rejectedOverload = false;
-               short waitStatus = 0;
-               while(true) {
-                       waitStatus = rs.waitUntilStatusChange(waitStatus);
-                       if((!rejectedOverload) && (waitStatus & 
RequestSender.WAIT_REJECTED_OVERLOAD) != 0) {
-                               // See below; inserts count both
-                               requestStarters.rejectedOverload(false, false);
-                               rejectedOverload = true;
-                       }
-
-                       int status = rs.getStatus();
-                       
-                       if(status == RequestSender.NOT_FINISHED) 
-                               continue;
-                       
-               if(status != RequestSender.TIMED_OUT && status != 
RequestSender.GENERATED_REJECTED_OVERLOAD && status != 
RequestSender.INTERNAL_ERROR) {
-                       if(logMINOR) Logger.minor(this, "CHK fetch cost 
"+rs.getTotalSentBytes()+ '/' +rs.getTotalReceivedBytes()+" bytes ("+status+ 
')');
-               
nodeStats.localChkFetchBytesSentAverage.report(rs.getTotalSentBytes());
-               
nodeStats.localChkFetchBytesReceivedAverage.report(rs.getTotalReceivedBytes());
-               if(status == RequestSender.SUCCESS) {
-                       // See comments above declaration of successful* : We 
don't report sent bytes here.
-                       
//nodeStats.successfulChkFetchBytesSentAverage.report(rs.getTotalSentBytes());
-                       
nodeStats.successfulChkFetchBytesReceivedAverage.report(rs.getTotalReceivedBytes());
-               }
-               }
-                       
-                       if((status == RequestSender.TIMED_OUT) ||
-                                       (status == 
RequestSender.GENERATED_REJECTED_OVERLOAD)) {
-                               if(!rejectedOverload) {
-                                       // See below
+                       Object o = node.makeRequestSender(key.getNodeCHK(), 
node.maxHTL(), uid, null, localOnly, cache, ignoreStore, false);
+                       if(o instanceof CHKBlock)
+                               try {
+                                       return new ClientCHKBlock((CHKBlock) o, 
key);
+                               } catch(CHKVerifyException e) {
+                                       Logger.error(this, "Does not verify: " 
+ e, e);
+                                       throw new 
LowLevelGetException(LowLevelGetException.DECODE_FAILED);
+                               }
+                       if(o == null)
+                               throw new 
LowLevelGetException(LowLevelGetException.DATA_NOT_FOUND_IN_STORE);
+                       RequestSender rs = (RequestSender) o;
+                       boolean rejectedOverload = false;
+                       short waitStatus = 0;
+                       while(true) {
+                               waitStatus = 
rs.waitUntilStatusChange(waitStatus);
+                               if((!rejectedOverload) && (waitStatus & 
RequestSender.WAIT_REJECTED_OVERLOAD) != 0) {
+                                       // See below; inserts count both
                                        requestStarters.rejectedOverload(false, 
false);
                                        rejectedOverload = true;
                                }
-                       } else {
-                               if(rs.hasForwarded() &&
+
+                               int status = rs.getStatus();
+
+                               if(status == RequestSender.NOT_FINISHED)
+                                       continue;
+
+                               if(status != RequestSender.TIMED_OUT && status 
!= RequestSender.GENERATED_REJECTED_OVERLOAD && status != 
RequestSender.INTERNAL_ERROR) {
+                                       if(logMINOR)
+                                               Logger.minor(this, "CHK fetch 
cost " + rs.getTotalSentBytes() + '/' + rs.getTotalReceivedBytes() + " bytes (" 
+ status + ')');
+                                       
nodeStats.localChkFetchBytesSentAverage.report(rs.getTotalSentBytes());
+                                       
nodeStats.localChkFetchBytesReceivedAverage.report(rs.getTotalReceivedBytes());
+                                       if(status == RequestSender.SUCCESS)
+                                               // See comments above 
declaration of successful* : We don't report sent bytes here.
+                                               
//nodeStats.successfulChkFetchBytesSentAverage.report(rs.getTotalSentBytes());
+                                               
nodeStats.successfulChkFetchBytesReceivedAverage.report(rs.getTotalReceivedBytes());
+                               }
+
+                               if((status == RequestSender.TIMED_OUT) ||
+                                       (status == 
RequestSender.GENERATED_REJECTED_OVERLOAD)) {
+                                       if(!rejectedOverload) {
+                                               // See below
+                                               
requestStarters.rejectedOverload(false, false);
+                                               rejectedOverload = true;
+                                       }
+                               } else
+                                       if(rs.hasForwarded() &&
                                                ((status == 
RequestSender.DATA_NOT_FOUND) ||
                                                (status == 
RequestSender.RECENTLY_FAILED) ||
                                                (status == 
RequestSender.SUCCESS) ||
                                                (status == 
RequestSender.ROUTE_NOT_FOUND) ||
                                                (status == 
RequestSender.VERIFY_FAILURE) ||
                                                (status == 
RequestSender.GET_OFFER_VERIFY_FAILURE))) {
-                                       long rtt = System.currentTimeMillis() - 
startTime;
-                                       if(!rejectedOverload)
-                                               
requestStarters.requestCompleted(false, false);
-                                       // Count towards RTT even if got a 
RejectedOverload - but not if timed out.
-                                       
requestStarters.chkRequestThrottle.successfulCompletion(rtt);
+                                               long rtt = 
System.currentTimeMillis() - startTime;
+                                               if(!rejectedOverload)
+                                                       
requestStarters.requestCompleted(false, false, key.getNodeKey());
+                                               // Count towards RTT even if 
got a RejectedOverload - but not if timed out.
+                                               
requestStarters.chkRequestThrottle.successfulCompletion(rtt);
+                                       }
+
+                               if(rs.getStatus() == RequestSender.SUCCESS)
+                                       try {
+                                               return new 
ClientCHKBlock(rs.getPRB().getBlock(), rs.getHeaders(), key, true);
+                                       } catch(CHKVerifyException e) {
+                                               Logger.error(this, "Does not 
verify: " + e, e);
+                                               throw new 
LowLevelGetException(LowLevelGetException.DECODE_FAILED);
+                                       } catch(AbortedException e) {
+                                               Logger.error(this, "Impossible: 
" + e, e);
+                                               throw new 
LowLevelGetException(LowLevelGetException.INTERNAL_ERROR);
+                                       }
+                               else {
+                                       int rStatus = rs.getStatus();
+                                       switch(rStatus) {
+                                               case RequestSender.NOT_FINISHED:
+                                                       Logger.error(this, "RS 
still running in getCHK!: " + rs);
+                                                       throw new 
LowLevelGetException(LowLevelGetException.INTERNAL_ERROR);
+                                               case 
RequestSender.DATA_NOT_FOUND:
+                                                       throw new 
LowLevelGetException(LowLevelGetException.DATA_NOT_FOUND);
+                                               case 
RequestSender.RECENTLY_FAILED:
+                                                       throw new 
LowLevelGetException(LowLevelGetException.RECENTLY_FAILED);
+                                               case 
RequestSender.ROUTE_NOT_FOUND:
+                                                       throw new 
LowLevelGetException(LowLevelGetException.ROUTE_NOT_FOUND);
+                                               case 
RequestSender.TRANSFER_FAILED:
+                                               case 
RequestSender.GET_OFFER_TRANSFER_FAILED:
+                                                       throw new 
LowLevelGetException(LowLevelGetException.TRANSFER_FAILED);
+                                               case 
RequestSender.VERIFY_FAILURE:
+                                               case 
RequestSender.GET_OFFER_VERIFY_FAILURE:
+                                                       throw new 
LowLevelGetException(LowLevelGetException.VERIFY_FAILED);
+                                               case 
RequestSender.GENERATED_REJECTED_OVERLOAD:
+                                               case RequestSender.TIMED_OUT:
+                                                       throw new 
LowLevelGetException(LowLevelGetException.REJECTED_OVERLOAD);
+                                               case 
RequestSender.INTERNAL_ERROR:
+                                                       throw new 
LowLevelGetException(LowLevelGetException.INTERNAL_ERROR);
+                                               default:
+                                                       Logger.error(this, 
"Unknown RequestSender code in getCHK: " + rStatus + " on " + rs);
+                                                       throw new 
LowLevelGetException(LowLevelGetException.INTERNAL_ERROR);
+                                       }
                                }
                        }
-                       
-                       if(rs.getStatus() == RequestSender.SUCCESS) {
-                               try {
-                                       return new 
ClientCHKBlock(rs.getPRB().getBlock(), rs.getHeaders(), key, true);
-                               } catch (CHKVerifyException e) {
-                                       Logger.error(this, "Does not verify: 
"+e, e);
-                                       throw new 
LowLevelGetException(LowLevelGetException.DECODE_FAILED);
-                               } catch (AbortedException e) {
-                                       Logger.error(this, "Impossible: "+e, e);
-                                       throw new 
LowLevelGetException(LowLevelGetException.INTERNAL_ERROR);
-                               }
-                       } else {
-                               int rStatus = rs.getStatus();
-                               switch(rStatus) {
-                               case RequestSender.NOT_FINISHED:
-                                       Logger.error(this, "RS still running in 
getCHK!: "+rs);
-                                       throw new 
LowLevelGetException(LowLevelGetException.INTERNAL_ERROR);
-                               case RequestSender.DATA_NOT_FOUND:
-                                       throw new 
LowLevelGetException(LowLevelGetException.DATA_NOT_FOUND);
-                               case RequestSender.RECENTLY_FAILED:
-                                       throw new 
LowLevelGetException(LowLevelGetException.RECENTLY_FAILED);
-                               case RequestSender.ROUTE_NOT_FOUND:
-                                       throw new 
LowLevelGetException(LowLevelGetException.ROUTE_NOT_FOUND);
-                               case RequestSender.TRANSFER_FAILED:
-                               case RequestSender.GET_OFFER_TRANSFER_FAILED:
-                                       throw new 
LowLevelGetException(LowLevelGetException.TRANSFER_FAILED);
-                               case RequestSender.VERIFY_FAILURE:
-                               case RequestSender.GET_OFFER_VERIFY_FAILURE:
-                                       throw new 
LowLevelGetException(LowLevelGetException.VERIFY_FAILED);
-                               case RequestSender.GENERATED_REJECTED_OVERLOAD:
-                               case RequestSender.TIMED_OUT:
-                                       throw new 
LowLevelGetException(LowLevelGetException.REJECTED_OVERLOAD);
-                               case RequestSender.INTERNAL_ERROR:
-                                       throw new 
LowLevelGetException(LowLevelGetException.INTERNAL_ERROR);
-                               default:
-                                       Logger.error(this, "Unknown 
RequestSender code in getCHK: "+rStatus+" on "+rs);
-                                       throw new 
LowLevelGetException(LowLevelGetException.INTERNAL_ERROR);
-                               }
-                       }
-               }
                } finally {
                        node.unlockUID(uid, false, false, true, false, true);
                }
@@ -662,111 +651,107 @@
                long startTime = System.currentTimeMillis();
                long uid = random.nextLong();
                if(!node.lockUID(uid, true, false, false, true)) {
-                       Logger.error(this, "Could not lock UID just randomly 
generated: "+uid+" - probably indicates broken PRNG");
+                       Logger.error(this, "Could not lock UID just randomly 
generated: " + uid + " - probably indicates broken PRNG");
                        throw new 
LowLevelGetException(LowLevelGetException.INTERNAL_ERROR);
                }
                try {
-               Object o = node.makeRequestSender(key.getNodeKey(), 
node.maxHTL(), uid, null, localOnly, cache, ignoreStore, false);
-               if(o instanceof SSKBlock) {
-                       try {
-                               SSKBlock block = (SSKBlock)o;
-                               key.setPublicKey(block.getPubKey());
-                               return ClientSSKBlock.construct(block, key);
-                       } catch (SSKVerifyException e) {
-                               Logger.error(this, "Does not verify: "+e, e);
-                               throw new 
LowLevelGetException(LowLevelGetException.DECODE_FAILED);
-                       }
-               }
-               if(o == null) {
-                       throw new 
LowLevelGetException(LowLevelGetException.DATA_NOT_FOUND_IN_STORE);
-               }
-               RequestSender rs = (RequestSender)o;
-               boolean rejectedOverload = false;
-               short waitStatus = 0;
-               while(true) {
-                       waitStatus = rs.waitUntilStatusChange(waitStatus);
-                       if((!rejectedOverload) && (waitStatus & 
RequestSender.WAIT_REJECTED_OVERLOAD) != 0) {
-                               requestStarters.rejectedOverload(true, false);
-                               rejectedOverload = true;
-                       }
-
-                       int status = rs.getStatus();
-                       
-                       if(status == RequestSender.NOT_FINISHED) 
-                               continue;
-
-               if(status != RequestSender.TIMED_OUT && status != 
RequestSender.GENERATED_REJECTED_OVERLOAD && status != 
RequestSender.INTERNAL_ERROR) {
-               if(logMINOR) Logger.minor(this, "SSK fetch cost 
"+rs.getTotalSentBytes()+ '/' +rs.getTotalReceivedBytes()+" bytes ("+status+ 
')');
-               
nodeStats.localSskFetchBytesSentAverage.report(rs.getTotalSentBytes());
-               
nodeStats.localSskFetchBytesReceivedAverage.report(rs.getTotalReceivedBytes());
-               if(status == RequestSender.SUCCESS) {
-                       // See comments above 
successfulSskFetchBytesSentAverage : we don't relay the data, so
-                       // reporting the sent bytes would be inaccurate.
-                       
//nodeStats.successfulSskFetchBytesSentAverage.report(rs.getTotalSentBytes());
-                       
nodeStats.successfulSskFetchBytesReceivedAverage.report(rs.getTotalReceivedBytes());
-               }
-               }
-                       
-                       if((status == RequestSender.TIMED_OUT) ||
-                                       (status == 
RequestSender.GENERATED_REJECTED_OVERLOAD)) {
-                               if(!rejectedOverload) {
+                       Object o = node.makeRequestSender(key.getNodeKey(), 
node.maxHTL(), uid, null, localOnly, cache, ignoreStore, false);
+                       if(o instanceof SSKBlock)
+                               try {
+                                       SSKBlock block = (SSKBlock) o;
+                                       key.setPublicKey(block.getPubKey());
+                                       return ClientSSKBlock.construct(block, 
key);
+                               } catch(SSKVerifyException e) {
+                                       Logger.error(this, "Does not verify: " 
+ e, e);
+                                       throw new 
LowLevelGetException(LowLevelGetException.DECODE_FAILED);
+                               }
+                       if(o == null)
+                               throw new 
LowLevelGetException(LowLevelGetException.DATA_NOT_FOUND_IN_STORE);
+                       RequestSender rs = (RequestSender) o;
+                       boolean rejectedOverload = false;
+                       short waitStatus = 0;
+                       while(true) {
+                               waitStatus = 
rs.waitUntilStatusChange(waitStatus);
+                               if((!rejectedOverload) && (waitStatus & 
RequestSender.WAIT_REJECTED_OVERLOAD) != 0) {
                                        requestStarters.rejectedOverload(true, 
false);
                                        rejectedOverload = true;
                                }
-                       } else {
-                               if(rs.hasForwarded() &&
+
+                               int status = rs.getStatus();
+
+                               if(status == RequestSender.NOT_FINISHED)
+                                       continue;
+
+                               if(status != RequestSender.TIMED_OUT && status 
!= RequestSender.GENERATED_REJECTED_OVERLOAD && status != 
RequestSender.INTERNAL_ERROR) {
+                                       if(logMINOR)
+                                               Logger.minor(this, "SSK fetch 
cost " + rs.getTotalSentBytes() + '/' + rs.getTotalReceivedBytes() + " bytes (" 
+ status + ')');
+                                       
nodeStats.localSskFetchBytesSentAverage.report(rs.getTotalSentBytes());
+                                       
nodeStats.localSskFetchBytesReceivedAverage.report(rs.getTotalReceivedBytes());
+                                       if(status == RequestSender.SUCCESS)
+                                               // See comments above 
successfulSskFetchBytesSentAverage : we don't relay the data, so
+                                               // reporting the sent bytes 
would be inaccurate.
+                                               
//nodeStats.successfulSskFetchBytesSentAverage.report(rs.getTotalSentBytes());
+                                               
nodeStats.successfulSskFetchBytesReceivedAverage.report(rs.getTotalReceivedBytes());
+                               }
+
+                               if((status == RequestSender.TIMED_OUT) ||
+                                       (status == 
RequestSender.GENERATED_REJECTED_OVERLOAD)) {
+                                       if(!rejectedOverload) {
+                                               
requestStarters.rejectedOverload(true, false);
+                                               rejectedOverload = true;
+                                       }
+                               } else
+                                       if(rs.hasForwarded() &&
                                                ((status == 
RequestSender.DATA_NOT_FOUND) ||
                                                (status == 
RequestSender.RECENTLY_FAILED) ||
                                                (status == 
RequestSender.SUCCESS) ||
                                                (status == 
RequestSender.ROUTE_NOT_FOUND) ||
                                                (status == 
RequestSender.VERIFY_FAILURE) ||
                                                (status == 
RequestSender.GET_OFFER_VERIFY_FAILURE))) {
-                                       long rtt = System.currentTimeMillis() - 
startTime;
-                                       
-                                       if(!rejectedOverload)
-                                               
requestStarters.requestCompleted(true, false);
-                                       // Count towards RTT even if got a 
RejectedOverload - but not if timed out.
-                                       
requestStarters.sskRequestThrottle.successfulCompletion(rtt);
-                               }
+                                               long rtt = 
System.currentTimeMillis() - startTime;
+
+                                               if(!rejectedOverload)
+                                                       
requestStarters.requestCompleted(true, false, key.getNodeKey());
+                                               // Count towards RTT even if 
got a RejectedOverload - but not if timed out.
+                                               
requestStarters.sskRequestThrottle.successfulCompletion(rtt);
+                                       }
+
+                               if(rs.getStatus() == RequestSender.SUCCESS)
+                                       try {
+                                               SSKBlock block = 
rs.getSSKBlock();
+                                               
key.setPublicKey(block.getPubKey());
+                                               return 
ClientSSKBlock.construct(block, key);
+                                       } catch(SSKVerifyException e) {
+                                               Logger.error(this, "Does not 
verify: " + e, e);
+                                               throw new 
LowLevelGetException(LowLevelGetException.DECODE_FAILED);
+                                       }
+                               else
+                                       switch(rs.getStatus()) {
+                                               case RequestSender.NOT_FINISHED:
+                                                       Logger.error(this, "RS 
still running in getCHK!: " + rs);
+                                                       throw new 
LowLevelGetException(LowLevelGetException.INTERNAL_ERROR);
+                                               case 
RequestSender.DATA_NOT_FOUND:
+                                                       throw new 
LowLevelGetException(LowLevelGetException.DATA_NOT_FOUND);
+                                               case 
RequestSender.RECENTLY_FAILED:
+                                                       throw new 
LowLevelGetException(LowLevelGetException.RECENTLY_FAILED);
+                                               case 
RequestSender.ROUTE_NOT_FOUND:
+                                                       throw new 
LowLevelGetException(LowLevelGetException.ROUTE_NOT_FOUND);
+                                               case 
RequestSender.TRANSFER_FAILED:
+                                               case 
RequestSender.GET_OFFER_TRANSFER_FAILED:
+                                                       Logger.error(this, 
"WTF? Transfer failed on an SSK? on " + uid);
+                                                       throw new 
LowLevelGetException(LowLevelGetException.TRANSFER_FAILED);
+                                               case 
RequestSender.VERIFY_FAILURE:
+                                               case 
RequestSender.GET_OFFER_VERIFY_FAILURE:
+                                                       throw new 
LowLevelGetException(LowLevelGetException.VERIFY_FAILED);
+                                               case 
RequestSender.GENERATED_REJECTED_OVERLOAD:
+                                               case RequestSender.TIMED_OUT:
+                                                       throw new 
LowLevelGetException(LowLevelGetException.REJECTED_OVERLOAD);
+                                               case 
RequestSender.INTERNAL_ERROR:
+                                               default:
+                                                       Logger.error(this, 
"Unknown RequestSender code in getCHK: " + rs.getStatus() + " on " + rs);
+                                                       throw new 
LowLevelGetException(LowLevelGetException.INTERNAL_ERROR);
+                                       }
                        }
-                       
-                       if(rs.getStatus() == RequestSender.SUCCESS) {
-                               try {
-                                       SSKBlock block = rs.getSSKBlock();
-                                       key.setPublicKey(block.getPubKey());
-                                       return ClientSSKBlock.construct(block, 
key);
-                               } catch (SSKVerifyException e) {
-                                       Logger.error(this, "Does not verify: 
"+e, e);
-                                       throw new 
LowLevelGetException(LowLevelGetException.DECODE_FAILED);
-                               }
-                       } else {
-                               switch(rs.getStatus()) {
-                               case RequestSender.NOT_FINISHED:
-                                       Logger.error(this, "RS still running in 
getCHK!: "+rs);
-                                       throw new 
LowLevelGetException(LowLevelGetException.INTERNAL_ERROR);
-                               case RequestSender.DATA_NOT_FOUND:
-                                       throw new 
LowLevelGetException(LowLevelGetException.DATA_NOT_FOUND);
-                               case RequestSender.RECENTLY_FAILED:
-                                       throw new 
LowLevelGetException(LowLevelGetException.RECENTLY_FAILED);
-                               case RequestSender.ROUTE_NOT_FOUND:
-                                       throw new 
LowLevelGetException(LowLevelGetException.ROUTE_NOT_FOUND);
-                               case RequestSender.TRANSFER_FAILED:
-                               case RequestSender.GET_OFFER_TRANSFER_FAILED:
-                                       Logger.error(this, "WTF? Transfer 
failed on an SSK? on "+uid);
-                                       throw new 
LowLevelGetException(LowLevelGetException.TRANSFER_FAILED);
-                               case RequestSender.VERIFY_FAILURE:
-                               case RequestSender.GET_OFFER_VERIFY_FAILURE:
-                                       throw new 
LowLevelGetException(LowLevelGetException.VERIFY_FAILED);
-                               case RequestSender.GENERATED_REJECTED_OVERLOAD:
-                               case RequestSender.TIMED_OUT:
-                                       throw new 
LowLevelGetException(LowLevelGetException.REJECTED_OVERLOAD);
-                               case RequestSender.INTERNAL_ERROR:
-                               default:
-                                       Logger.error(this, "Unknown 
RequestSender code in getCHK: "+rs.getStatus()+" on "+rs);
-                                       throw new 
LowLevelGetException(LowLevelGetException.INTERNAL_ERROR);
-                               }
-                       }
-               }
                } finally {
                        node.unlockUID(uid, true, false, true, false, true);
                }
@@ -774,13 +759,13 @@

        public void realPut(KeyBlock block, boolean cache) throws 
LowLevelPutException {
                if(block instanceof CHKBlock)
-                       realPutCHK((CHKBlock)block, cache);
+                       realPutCHK((CHKBlock) block, cache);
                else if(block instanceof SSKBlock)
-                       realPutSSK((SSKBlock)block, cache);
+                       realPutSSK((SSKBlock) block, cache);
                else
-                       throw new IllegalArgumentException("Unknown put type 
"+block.getClass());
+                       throw new IllegalArgumentException("Unknown put type " 
+ block.getClass());
        }
-       
+
        public void realPutCHK(CHKBlock block, boolean cache) throws 
LowLevelPutException {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                byte[] data = block.getData();
@@ -789,113 +774,110 @@
                CHKInsertSender is;
                long uid = random.nextLong();
                if(!node.lockUID(uid, false, true, false, true)) {
-                       Logger.error(this, "Could not lock UID just randomly 
generated: "+uid+" - probably indicates broken PRNG");
+                       Logger.error(this, "Could not lock UID just randomly 
generated: " + uid + " - probably indicates broken PRNG");
                        throw new 
LowLevelPutException(LowLevelPutException.INTERNAL_ERROR);
                }
                try {
-               long startTime = System.currentTimeMillis();
-               if(cache) {
-                       node.store(block);
-               }
-               is = node.makeInsertSender((NodeCHK)block.getKey(), 
+                       long startTime = System.currentTimeMillis();
+                       if(cache)
+                               node.store(block);
+                       is = node.makeInsertSender((NodeCHK) block.getKey(),
                                node.maxHTL(), uid, null, headers, prb, false, 
cache);
-               boolean hasReceivedRejectedOverload = false;
-               // Wait for status
-               while(true) {
-                       synchronized(is) {
-                               if(is.getStatus() == 
CHKInsertSender.NOT_FINISHED) {
+                       boolean hasReceivedRejectedOverload = false;
+                       // Wait for status
+                       while(true) {
+                               synchronized(is) {
+                                       if(is.getStatus() == 
CHKInsertSender.NOT_FINISHED)
+                                               try {
+                                                       is.wait(5 * 1000);
+                                               } catch(InterruptedException e) 
{
+                                                       // Ignore
+                                               }
+                                       if(is.getStatus() != 
CHKInsertSender.NOT_FINISHED)
+                                               break;
+                               }
+                               if((!hasReceivedRejectedOverload) && 
is.receivedRejectedOverload()) {
+                                       hasReceivedRejectedOverload = true;
+                                       requestStarters.rejectedOverload(false, 
true);
+                               }
+                       }
+
+                       // Wait for completion
+                       while(true) {
+                               synchronized(is) {
+                                       if(is.completed())
+                                               break;
                                        try {
-                                               is.wait(5*1000);
-                                       } catch (InterruptedException e) {
-                                               // Ignore
+                                               is.wait(10 * 1000);
+                                       } catch(InterruptedException e) {
+                                               // Go around again
                                        }
                                }
-                               if(is.getStatus() != 
CHKInsertSender.NOT_FINISHED) break;
+                               if(is.anyTransfersFailed() && 
(!hasReceivedRejectedOverload)) {
+                                       hasReceivedRejectedOverload = true; // 
not strictly true but same effect
+                                       requestStarters.rejectedOverload(false, 
true);
+                               }
                        }
-                       if((!hasReceivedRejectedOverload) && 
is.receivedRejectedOverload()) {
-                               hasReceivedRejectedOverload = true;
-                               requestStarters.rejectedOverload(false, true);
+
+                       if(logMINOR)
+                               Logger.minor(this, "Completed " + uid + " 
overload=" + hasReceivedRejectedOverload + ' ' + is.getStatusString());
+
+                       // Finished?
+                       if(!hasReceivedRejectedOverload)
+                               // Is it ours? Did we send a request?
+                               if(is.sentRequest() && (is.uid == uid) && 
((is.getStatus() == CHKInsertSender.ROUTE_NOT_FOUND) || (is.getStatus() == 
CHKInsertSender.SUCCESS))) {
+                                       // It worked!
+                                       long endTime = 
System.currentTimeMillis();
+                                       long len = endTime - startTime;
+
+                                       // RejectedOverload requests count 
towards RTT (timed out ones don't).
+                                       
requestStarters.chkInsertThrottle.successfulCompletion(len);
+                                       requestStarters.requestCompleted(false, 
true, block.getKey());
+                               }
+
+                       // Get status explicitly, *after* completed(), so that 
it will be RECEIVE_FAILED if the receive failed.
+                       int status = is.getStatus();
+                       if(status != CHKInsertSender.TIMED_OUT && status != 
CHKInsertSender.GENERATED_REJECTED_OVERLOAD && status != 
CHKInsertSender.INTERNAL_ERROR && status != 
CHKInsertSender.ROUTE_REALLY_NOT_FOUND) {
+                               int sent = is.getTotalSentBytes();
+                               int received = is.getTotalReceivedBytes();
+                               if(logMINOR)
+                                       Logger.minor(this, "Local CHK insert 
cost " + sent + '/' + received + " bytes (" + status + ')');
+                               
nodeStats.localChkInsertBytesSentAverage.report(sent);
+                               
nodeStats.localChkInsertBytesReceivedAverage.report(received);
+                               if(status == CHKInsertSender.SUCCESS)
+                                       // Only report Sent bytes because we 
did not receive the data.
+                                       
nodeStats.successfulChkInsertBytesSentAverage.report(sent);
                        }
-               }
-               
-               // Wait for completion
-               while(true) {
-                       synchronized(is) {
-                               if(is.completed()) break;
-                               try {
-                                       is.wait(10*1000);
-                               } catch (InterruptedException e) {
-                                       // Go around again
+
+                       if(status == CHKInsertSender.SUCCESS) {
+                               Logger.normal(this, "Succeeded inserting " + 
block);
+                               return;
+                       } else {
+                               String msg = "Failed inserting " + block + " : 
" + is.getStatusString();
+                               if(status == CHKInsertSender.ROUTE_NOT_FOUND)
+                                       msg += " - this is normal on small 
networks; the data will still be propagated, but it can't find the 20+ nodes 
needed for full success";
+                               if(is.getStatus() != 
CHKInsertSender.ROUTE_NOT_FOUND)
+                                       Logger.error(this, msg);
+                               else
+                                       Logger.normal(this, msg);
+                               switch(is.getStatus()) {
+                                       case CHKInsertSender.NOT_FINISHED:
+                                               Logger.error(this, "IS still 
running in putCHK!: " + is);
+                                               throw new 
LowLevelPutException(LowLevelPutException.INTERNAL_ERROR);
+                                       case 
CHKInsertSender.GENERATED_REJECTED_OVERLOAD:
+                                       case CHKInsertSender.TIMED_OUT:
+                                               throw new 
LowLevelPutException(LowLevelPutException.REJECTED_OVERLOAD);
+                                       case CHKInsertSender.ROUTE_NOT_FOUND:
+                                               throw new 
LowLevelPutException(LowLevelPutException.ROUTE_NOT_FOUND);
+                                       case 
CHKInsertSender.ROUTE_REALLY_NOT_FOUND:
+                                               throw new 
LowLevelPutException(LowLevelPutException.ROUTE_REALLY_NOT_FOUND);
+                                       case CHKInsertSender.INTERNAL_ERROR:
+                                               throw new 
LowLevelPutException(LowLevelPutException.INTERNAL_ERROR);
+                                       default:
+                                               Logger.error(this, "Unknown 
CHKInsertSender code in putCHK: " + is.getStatus() + " on " + is);
+                                               throw new 
LowLevelPutException(LowLevelPutException.INTERNAL_ERROR);
                                }
                        }
-                       if(is.anyTransfersFailed() && 
(!hasReceivedRejectedOverload)) {
-                               hasReceivedRejectedOverload = true; // not 
strictly true but same effect
-                               requestStarters.rejectedOverload(false, true);
-                       }
-               }
-               
-               if(logMINOR) Logger.minor(this, "Completed "+uid+" 
overload="+hasReceivedRejectedOverload+ ' ' +is.getStatusString());
-               
-               // Finished?
-               if(!hasReceivedRejectedOverload) {
-                       // Is it ours? Did we send a request?
-                       if(is.sentRequest() && (is.uid == uid) && 
((is.getStatus() == CHKInsertSender.ROUTE_NOT_FOUND) 
-                                       || (is.getStatus() == 
CHKInsertSender.SUCCESS))) {
-                               // It worked!
-                               long endTime = System.currentTimeMillis();
-                               long len = endTime - startTime;
-                               
-                               // RejectedOverload requests count towards RTT 
(timed out ones don't).
-                               
requestStarters.chkInsertThrottle.successfulCompletion(len);
-                               requestStarters.requestCompleted(false, true);
-                       }
-               }
-               
-               // Get status explicitly, *after* completed(), so that it will 
be RECEIVE_FAILED if the receive failed.
-               int status = is.getStatus();
-        if(status != CHKInsertSender.TIMED_OUT && status != 
CHKInsertSender.GENERATED_REJECTED_OVERLOAD && status != 
CHKInsertSender.INTERNAL_ERROR
-                       && status != CHKInsertSender.ROUTE_REALLY_NOT_FOUND) {
-               int sent = is.getTotalSentBytes();
-               int received = is.getTotalReceivedBytes();
-               if(logMINOR) Logger.minor(this, "Local CHK insert cost "+sent+ 
'/' +received+" bytes ("+status+ ')');
-               nodeStats.localChkInsertBytesSentAverage.report(sent);
-               nodeStats.localChkInsertBytesReceivedAverage.report(received);
-               if(status == CHKInsertSender.SUCCESS) {
-                       // Only report Sent bytes because we did not receive 
the data.
-                       
nodeStats.successfulChkInsertBytesSentAverage.report(sent);
-                       
//nodeStats.successfulChkInsertBytesReceivedAverage.report(received);
-               }
-        }
-        
-               if(status == CHKInsertSender.SUCCESS) {
-                       Logger.normal(this, "Succeeded inserting "+block);
-                       return;
-               } else {
-                       String msg = "Failed inserting "+block+" : 
"+is.getStatusString();
-                       if(status == CHKInsertSender.ROUTE_NOT_FOUND)
-                               msg += " - this is normal on small networks; 
the data will still be propagated, but it can't find the 20+ nodes needed for 
full success";
-                       if(is.getStatus() != CHKInsertSender.ROUTE_NOT_FOUND)
-                               Logger.error(this, msg);
-                       else
-                               Logger.normal(this, msg);
-                       switch(is.getStatus()) {
-                       case CHKInsertSender.NOT_FINISHED:
-                               Logger.error(this, "IS still running in 
putCHK!: "+is);
-                               throw new 
LowLevelPutException(LowLevelPutException.INTERNAL_ERROR);
-                       case CHKInsertSender.GENERATED_REJECTED_OVERLOAD:
-                       case CHKInsertSender.TIMED_OUT:
-                               throw new 
LowLevelPutException(LowLevelPutException.REJECTED_OVERLOAD);
-                       case CHKInsertSender.ROUTE_NOT_FOUND:
-                               throw new 
LowLevelPutException(LowLevelPutException.ROUTE_NOT_FOUND);
-                       case CHKInsertSender.ROUTE_REALLY_NOT_FOUND:
-                               throw new 
LowLevelPutException(LowLevelPutException.ROUTE_REALLY_NOT_FOUND);
-                       case CHKInsertSender.INTERNAL_ERROR:
-                               throw new 
LowLevelPutException(LowLevelPutException.INTERNAL_ERROR);
-                       default:
-                               Logger.error(this, "Unknown CHKInsertSender 
code in putCHK: "+is.getStatus()+" on "+is);
-                               throw new 
LowLevelPutException(LowLevelPutException.INTERNAL_ERROR);
-                       }
-               }
                } finally {
                        node.unlockUID(uid, false, true, true, false, true);
                }
@@ -906,125 +888,122 @@
                SSKInsertSender is;
                long uid = random.nextLong();
                if(!node.lockUID(uid, true, true, false, true)) {
-                       Logger.error(this, "Could not lock UID just randomly 
generated: "+uid+" - probably indicates broken PRNG");
+                       Logger.error(this, "Could not lock UID just randomly 
generated: " + uid + " - probably indicates broken PRNG");
                        throw new 
LowLevelPutException(LowLevelPutException.INTERNAL_ERROR);
                }
                try {
-               long startTime = System.currentTimeMillis();
-               SSKBlock altBlock = (SSKBlock) node.fetch(block.getKey(), 
false);
-               if(altBlock != null && !altBlock.equals(block)) throw new 
LowLevelPutException(LowLevelPutException.COLLISION);
-               is = node.makeInsertSender(block, 
+                       long startTime = System.currentTimeMillis();
+                       SSKBlock altBlock = (SSKBlock) 
node.fetch(block.getKey(), false);
+                       if(altBlock != null && !altBlock.equals(block))
+                               throw new 
LowLevelPutException(LowLevelPutException.COLLISION);
+                       is = node.makeInsertSender(block,
                                node.maxHTL(), uid, null, false, cache);
-               boolean hasReceivedRejectedOverload = false;
-               // Wait for status
-               while(true) {
-                       synchronized(is) {
-                               if(is.getStatus() == 
SSKInsertSender.NOT_FINISHED) {
+                       boolean hasReceivedRejectedOverload = false;
+                       // Wait for status
+                       while(true) {
+                               synchronized(is) {
+                                       if(is.getStatus() == 
SSKInsertSender.NOT_FINISHED)
+                                               try {
+                                                       is.wait(5 * 1000);
+                                               } catch(InterruptedException e) 
{
+                                                       // Ignore
+                                               }
+                                       if(is.getStatus() != 
SSKInsertSender.NOT_FINISHED)
+                                               break;
+                               }
+                               if((!hasReceivedRejectedOverload) && 
is.receivedRejectedOverload()) {
+                                       hasReceivedRejectedOverload = true;
+                                       requestStarters.rejectedOverload(true, 
true);
+                               }
+                       }
+
+                       // Wait for completion
+                       while(true) {
+                               synchronized(is) {
+                                       if(is.getStatus() != 
SSKInsertSender.NOT_FINISHED)
+                                               break;
                                        try {
-                                               is.wait(5*1000);
-                                       } catch (InterruptedException e) {
-                                               // Ignore
+                                               is.wait(10 * 1000);
+                                       } catch(InterruptedException e) {
+                                               // Go around again
                                        }
                                }
-                               if(is.getStatus() != 
SSKInsertSender.NOT_FINISHED) break;
                        }
-                       if((!hasReceivedRejectedOverload) && 
is.receivedRejectedOverload()) {
-                               hasReceivedRejectedOverload = true;
-                               requestStarters.rejectedOverload(true, true);
-                       }
-               }
-               
-               // Wait for completion
-               while(true) {
-                       synchronized(is) {
-                               if(is.getStatus() != 
SSKInsertSender.NOT_FINISHED) break;
-                               try {
-                                       is.wait(10*1000);
-                               } catch (InterruptedException e) {
-                                       // Go around again
+
+                       if(logMINOR)
+                               Logger.minor(this, "Completed " + uid + " 
overload=" + hasReceivedRejectedOverload + ' ' + is.getStatusString());
+
+                       // Finished?
+                       if(!hasReceivedRejectedOverload)
+                               // Is it ours? Did we send a request?
+                               if(is.sentRequest() && (is.uid == uid) && 
((is.getStatus() == SSKInsertSender.ROUTE_NOT_FOUND) || (is.getStatus() == 
SSKInsertSender.SUCCESS))) {
+                                       // It worked!
+                                       long endTime = 
System.currentTimeMillis();
+                                       long rtt = endTime - startTime;
+                                       requestStarters.requestCompleted(true, 
true, block.getKey());
+                                       
requestStarters.sskInsertThrottle.successfulCompletion(rtt);
                                }
-                       }
-               }
-               
-               if(logMINOR) Logger.minor(this, "Completed "+uid+" 
overload="+hasReceivedRejectedOverload+ ' ' +is.getStatusString());
-               
-               // Finished?
-               if(!hasReceivedRejectedOverload) {
-                       // Is it ours? Did we send a request?
-                       if(is.sentRequest() && (is.uid == uid) && 
((is.getStatus() == SSKInsertSender.ROUTE_NOT_FOUND) 
-                                       || (is.getStatus() == 
SSKInsertSender.SUCCESS))) {
-                               // It worked!
-                               long endTime = System.currentTimeMillis();
-                               long rtt = endTime - startTime;
-                               requestStarters.requestCompleted(true, true);
-                               
requestStarters.sskInsertThrottle.successfulCompletion(rtt);
-                       }
-               }

-               int status = is.getStatus();
-               
-        if(status != CHKInsertSender.TIMED_OUT && status != 
CHKInsertSender.GENERATED_REJECTED_OVERLOAD && status != 
CHKInsertSender.INTERNAL_ERROR
-                       && status != CHKInsertSender.ROUTE_REALLY_NOT_FOUND) {
-               int sent = is.getTotalSentBytes();
-               int received = is.getTotalReceivedBytes();
-               if(logMINOR) Logger.minor(this, "Local SSK insert cost "+sent+ 
'/' +received+" bytes ("+status+ ')');
-               nodeStats.localSskInsertBytesSentAverage.report(sent);
-               nodeStats.localSskInsertBytesReceivedAverage.report(received);
-               if(status == SSKInsertSender.SUCCESS) {
-                       // Only report Sent bytes as we haven't received 
anything.
-                       
nodeStats.successfulSskInsertBytesSentAverage.report(sent);
-                       
//nodeStats.successfulSskInsertBytesReceivedAverage.report(received);
-               }
-        }
-        
-               if(is.hasCollided()) {
-                       // Store it locally so it can be fetched immediately, 
and overwrites any locally inserted.
-                       try {
-                               node.storeInsert(is.getBlock());
-                       } catch (KeyCollisionException e) {
-                               // Impossible
+                       int status = is.getStatus();
+
+                       if(status != CHKInsertSender.TIMED_OUT && status != 
CHKInsertSender.GENERATED_REJECTED_OVERLOAD && status != 
CHKInsertSender.INTERNAL_ERROR && status != 
CHKInsertSender.ROUTE_REALLY_NOT_FOUND) {
+                               int sent = is.getTotalSentBytes();
+                               int received = is.getTotalReceivedBytes();
+                               if(logMINOR)
+                                       Logger.minor(this, "Local SSK insert 
cost " + sent + '/' + received + " bytes (" + status + ')');
+                               
nodeStats.localSskInsertBytesSentAverage.report(sent);
+                               
nodeStats.localSskInsertBytesReceivedAverage.report(received);
+                               if(status == SSKInsertSender.SUCCESS)
+                                       // Only report Sent bytes as we haven't 
received anything.
+                                       
nodeStats.successfulSskInsertBytesSentAverage.report(sent);
                        }
-                       throw new 
LowLevelPutException(LowLevelPutException.COLLISION);
-               } else {
-                       if(cache) {
+
+                       if(is.hasCollided()) {
+                               // Store it locally so it can be fetched 
immediately, and overwrites any locally inserted.
                                try {
-                                       node.storeInsert(block);
-                               } catch (KeyCollisionException e) {
-                                       throw new 
LowLevelPutException(LowLevelPutException.COLLISION);
+                                       node.storeInsert(is.getBlock());
+                               } catch(KeyCollisionException e) {
+                                       // Impossible
                                }
-                       }
-               }
+                               throw new 
LowLevelPutException(LowLevelPutException.COLLISION);
+                       } else
+                               if(cache)
+                                       try {
+                                               node.storeInsert(block);
+                                       } catch(KeyCollisionException e) {
+                                               throw new 
LowLevelPutException(LowLevelPutException.COLLISION);
+                                       }

-               
-               if(status == SSKInsertSender.SUCCESS) {
-                       Logger.normal(this, "Succeeded inserting "+block);
-                       return;
-               } else {
-                       String msg = "Failed inserting "+block+" : 
"+is.getStatusString();
-                       if(status == CHKInsertSender.ROUTE_NOT_FOUND)
-                               msg += " - this is normal on small networks; 
the data will still be propagated, but it can't find the 20+ nodes needed for 
full success";
-                       if(is.getStatus() != SSKInsertSender.ROUTE_NOT_FOUND)
-                               Logger.error(this, msg);
-                       else
-                               Logger.normal(this, msg);
-                       switch(is.getStatus()) {
-                       case SSKInsertSender.NOT_FINISHED:
-                               Logger.error(this, "IS still running in 
putCHK!: "+is);
-                               throw new 
LowLevelPutException(LowLevelPutException.INTERNAL_ERROR);
-                       case SSKInsertSender.GENERATED_REJECTED_OVERLOAD:
-                       case SSKInsertSender.TIMED_OUT:
-                               throw new 
LowLevelPutException(LowLevelPutException.REJECTED_OVERLOAD);
-                       case SSKInsertSender.ROUTE_NOT_FOUND:
-                               throw new 
LowLevelPutException(LowLevelPutException.ROUTE_NOT_FOUND);
-                       case SSKInsertSender.ROUTE_REALLY_NOT_FOUND:
-                               throw new 
LowLevelPutException(LowLevelPutException.ROUTE_REALLY_NOT_FOUND);
-                       case SSKInsertSender.INTERNAL_ERROR:
-                               throw new 
LowLevelPutException(LowLevelPutException.INTERNAL_ERROR);
-                       default:
-                               Logger.error(this, "Unknown CHKInsertSender 
code in putSSK: "+is.getStatus()+" on "+is);
-                               throw new 
LowLevelPutException(LowLevelPutException.INTERNAL_ERROR);
+
+                       if(status == SSKInsertSender.SUCCESS) {
+                               Logger.normal(this, "Succeeded inserting " + 
block);
+                               return;
+                       } else {
+                               String msg = "Failed inserting " + block + " : 
" + is.getStatusString();
+                               if(status == CHKInsertSender.ROUTE_NOT_FOUND)
+                                       msg += " - this is normal on small 
networks; the data will still be propagated, but it can't find the 20+ nodes 
needed for full success";
+                               if(is.getStatus() != 
SSKInsertSender.ROUTE_NOT_FOUND)
+                                       Logger.error(this, msg);
+                               else
+                                       Logger.normal(this, msg);
+                               switch(is.getStatus()) {
+                                       case SSKInsertSender.NOT_FINISHED:
+                                               Logger.error(this, "IS still 
running in putCHK!: " + is);
+                                               throw new 
LowLevelPutException(LowLevelPutException.INTERNAL_ERROR);
+                                       case 
SSKInsertSender.GENERATED_REJECTED_OVERLOAD:
+                                       case SSKInsertSender.TIMED_OUT:
+                                               throw new 
LowLevelPutException(LowLevelPutException.REJECTED_OVERLOAD);
+                                       case SSKInsertSender.ROUTE_NOT_FOUND:
+                                               throw new 
LowLevelPutException(LowLevelPutException.ROUTE_NOT_FOUND);
+                                       case 
SSKInsertSender.ROUTE_REALLY_NOT_FOUND:
+                                               throw new 
LowLevelPutException(LowLevelPutException.ROUTE_REALLY_NOT_FOUND);
+                                       case SSKInsertSender.INTERNAL_ERROR:
+                                               throw new 
LowLevelPutException(LowLevelPutException.INTERNAL_ERROR);
+                                       default:
+                                               Logger.error(this, "Unknown 
CHKInsertSender code in putSSK: " + is.getStatus() + " on " + is);
+                                               throw new 
LowLevelPutException(LowLevelPutException.INTERNAL_ERROR);
+                               }
                        }
-               }
                } finally {
                        node.unlockUID(uid, true, true, true, false, true);
                }
@@ -1033,11 +1012,11 @@
        public HighLevelSimpleClient makeClient(short prioClass) {
                return makeClient(prioClass, false);
        }
-       
+
        public HighLevelSimpleClient makeClient(short prioClass, boolean 
forceDontIgnoreTooManyPathComponents) {
                return new HighLevelSimpleClientImpl(this, tempBucketFactory, 
random, !Node.DONT_CACHE_LOCAL_REQUESTS, prioClass, 
forceDontIgnoreTooManyPathComponents);
        }
-       
+
        public FCPServer getFCPServer() {
                return fcpServer;
        }
@@ -1049,8 +1028,8 @@
        public SimpleToadletServer getToadletContainer() {
                return toadletContainer;
        }
-       
-       public TextModeClientInterfaceServer getTextModeClientInterface(){
+
+       public TextModeClientInterfaceServer getTextModeClientInterface() {
                return tmci;
        }

@@ -1061,7 +1040,7 @@
        public TextModeClientInterface getDirectTMCI() {
                return directTMCI;
        }
-       
+
        public void setDirectTMCI(TextModeClientInterface i) {
                this.directTMCI = i;
        }
@@ -1076,7 +1055,8 @@

        public void queueRandomReinsert(KeyBlock block) {
                SimpleSendableInsert ssi = new SimpleSendableInsert(this, 
block, RequestStarter.MAXIMUM_PRIORITY_CLASS);
-               if(logMINOR) Logger.minor(this, "Queueing random reinsert for 
"+block+" : "+ssi);
+               if(logMINOR)
+                       Logger.minor(this, "Queueing random reinsert for " + 
block + " : " + ssi);
                ssi.schedule();
        }

@@ -1084,7 +1064,7 @@
                Logger.normal(this, "Trying to write config to disk", new 
Exception("debug"));
                node.config.store();
        }
-       
+
        public boolean isTestnetEnabled() {
                return node.isTestnetEnabled();
        }
@@ -1104,33 +1084,38 @@
        }

        public FilterCallback createFilterCallback(URI uri, FoundURICallback 
cb) {
-               if(logMINOR) Logger.minor(this, "Creating filter callback: 
"+uri+", "+cb);
+               if(logMINOR)
+                       Logger.minor(this, "Creating filter callback: " + uri + 
", " + cb);
                return new GenericReadFilterCallback(uri, cb);
        }
-       
+
        public int maxBackgroundUSKFetchers() {
                return maxBackgroundUSKFetchers;
        }
-       
+
        public boolean lazyResume() {
                return lazyResume;
        }
-       
+
        public boolean allowDownloadTo(File filename) {
-               if(downloadAllowedEverywhere) return true;
-               if(includeDownloadDir) {
-                       if(FileUtil.isParent(downloadDir, filename)) return 
true;
+               if(downloadAllowedEverywhere)
+                       return true;
+               if(includeDownloadDir)
+                       if(FileUtil.isParent(downloadDir, filename))
+                               return true;
+               for(int i = 0; i < downloadAllowedDirs.length; i++) {
+                       if(FileUtil.isParent(downloadAllowedDirs[i], filename))
+                               return true;
                }
-               for(int i=0;i<downloadAllowedDirs.length;i++) {
-                       if(FileUtil.isParent(downloadAllowedDirs[i], filename)) 
return true;
-               }
                return false;
        }

        public boolean allowUploadFrom(File filename) {
-               if(uploadAllowedEverywhere) return true;
-               for(int i=0;i<uploadAllowedDirs.length;i++) {
-                       if(FileUtil.isParent(uploadAllowedDirs[i], filename)) 
return true;
+               if(uploadAllowedEverywhere)
+                       return true;
+               for(int i = 0; i < uploadAllowedDirs.length; i++) {
+                       if(FileUtil.isParent(uploadAllowedDirs[i], filename))
+                               return true;
                }
                return false;
        }
@@ -1138,11 +1123,11 @@
        public SimpleFieldSet persistThrottlesToFieldSet() {
                return requestStarters.persistToFieldSet();
        }
-       
+
        public Ticker getTicker() {
                return node.ps;
        }
-       
+
        public Executor getExecutor() {
                return node.executor;
        }
@@ -1150,7 +1135,7 @@
        public File getPersistentTempDir() {
                return persistentTempBucketFactory.getDir();
        }
-       
+
        public File getTempDir() {
                return tempDir;
        }
@@ -1163,17 +1148,13 @@
         * If the client layer wants it, or force is enabled, queue it. */
        public void maybeQueueOfferedKey(Key key, boolean force) {
                ClientRequestScheduler sched =
-                       key instanceof NodeSSK ?
-                                       requestStarters.sskFetchScheduler :
-                                               
requestStarters.chkFetchScheduler;
+                       key instanceof NodeSSK ? 
requestStarters.sskFetchScheduler : requestStarters.chkFetchScheduler;
                sched.maybeQueueOfferedKey(key, force);
        }

        public void dequeueOfferedKey(Key key) {
                ClientRequestScheduler sched =
-                       key instanceof NodeSSK ?
-                                       requestStarters.sskFetchScheduler :
-                                               
requestStarters.chkFetchScheduler;
+                       key instanceof NodeSSK ? 
requestStarters.sskFetchScheduler : requestStarters.chkFetchScheduler;
                sched.dequeueOfferedKey(key);
        }

@@ -1184,7 +1165,7 @@
        public long countTransientQueuedRequests() {
                return requestStarters.countTransientQueuedRequests();
        }
-
+       
        public void queue(final DBJob job, int priority, boolean checkDupes) {
                if(checkDupes)
                        this.clientDatabaseExecutor.executeNoDupes(new 
DBJobWrapper(job), priority, ""+job);
@@ -1249,7 +1230,7 @@
                                }
                                if(killed) {
                                        node.db.rollback();
-                               }                               
+                               }
                        }
                }

@@ -1264,19 +1245,19 @@
                }

        }
-
+       
        public boolean onDatabaseThread() {
                return clientDatabaseExecutor.onThread();
        }
-
+       
        public int getQueueSize(int priority) {
                return clientDatabaseExecutor.getQueueSize(priority);
        }
-
+       
        public void handleLowMemory() throws Exception {
                // Ignore
        }
-
+       
        public void handleOutOfMemory() throws Exception {
                synchronized(this) {
                        killedDatabase = true;

Modified: branches/db4o/freenet/src/freenet/node/NodeCrypto.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeCrypto.java      2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/NodeCrypto.java      2008-08-07 
18:30:55 UTC (rev 21657)
@@ -36,6 +36,7 @@
 import freenet.keys.InsertableClientSSK;
 import freenet.support.Base64;
 import freenet.support.Fields;
+import freenet.support.HexUtil;
 import freenet.support.IllegalBase64Exception;
 import freenet.support.Logger;
 import freenet.support.SimpleFieldSet;
@@ -369,8 +370,16 @@
                }
        }

+       public static boolean DISABLE_GROUP_STRIP = false;
+       
        private byte[] myCompressedRef(boolean setup, boolean heavySetup, 
boolean forARK) {
                SimpleFieldSet fs = exportPublicFieldSet(setup, heavySetup, 
forARK);
+               // TODO: we should change that to ((setup || heavySetup) && 
!forARK) when all the nodes have the new code
+               boolean shouldStripGroup = heavySetup && 
Global.DSAgroupBigA.equals(cryptoGroup);
+               if(DISABLE_GROUP_STRIP) shouldStripGroup = false;
+               if(shouldStripGroup)
+                       fs.removeSubset("dsaGroup");
+               
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                DeflaterOutputStream gis;
                gis = new DeflaterOutputStream(baos);
@@ -384,9 +393,19 @@
                }

                byte[] buf = baos.toByteArray();
-               byte[] obuf = new byte[buf.length + 1];
-               obuf[0] = 1;
-               System.arraycopy(buf, 0, obuf, 1, buf.length);
+               if(buf.length >= 4096)
+                       throw new IllegalStateException("We are attempting to 
send a "+buf.length+" bytes big reference!");
+               byte[] obuf = new byte[buf.length + 1 + (shouldStripGroup ? 1 : 
0)];
+               int offset = 0;
+               if(shouldStripGroup) {
+                       obuf[offset++] = 0x3; // compressed noderef - group
+                       int dsaGroupIndex = Global.GROUP_INDEX_BIG_A;
+                       if(logMINOR)
+                               Logger.minor(this, "We are stripping the group 
from the reference as it's a known group (groupIndex="+dsaGroupIndex+')');
+                       obuf[offset++] = (byte)(dsaGroupIndex & 0xff);
+               } else
+                       obuf[offset++] = 0x01; // compressed noderef
+               System.arraycopy(buf, 0, obuf, offset, buf.length);
                if(logMINOR) 
                        Logger.minor(this, 
"myCompressedRef("+setup+","+heavySetup+") returning "+obuf.length+" bytes");
                return obuf;

Modified: branches/db4o/freenet/src/freenet/node/NodeDispatcher.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeDispatcher.java  2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/NodeDispatcher.java  2008-08-07 
18:30:55 UTC (rev 21657)
@@ -98,15 +98,6 @@
                                if(logMINOR) Logger.minor(this, "Lost 
connection replying to "+m);
                        }
                        return true;
-               }else if(spec == DMT.FNPLinkPing) {
-                       long id = m.getLong(DMT.PING_SEQNO);
-                       Message msg = DMT.createFNPLinkPong(id);
-                       try {
-                               source.sendAsync(msg, null, 0, pingCounter);
-                       } catch (NotConnectedException e) {
-                               // Ignore
-                       }
-                       return true;
                } else if (spec == DMT.FNPStoreSecret) {
                        return node.netid.handleStoreSecret(m);
                } else if(spec == DMT.FNPSecretPing) {
@@ -155,7 +146,30 @@
                } else if(source.isRealConnection() && spec == 
DMT.FNPLocChangeNotification) {
                        double newLoc = m.getDouble(DMT.LOCATION);
                        source.updateLocation(newLoc);
+                       // TODO: remove dead code when 
FNPLocChangeNotificationNew is mandatory
+                       if(source.getVersionNumber() > 1153)
+                               Logger.error(this, "We received a 
FNPLocChangeNotification from a recent build: that should *not* happen! 
("+source.toString()+')');
                        return true;
+               } else if(source.isRealConnection() && spec == 
DMT.FNPLocChangeNotificationNew) {
+                       double newLoc = m.getDouble(DMT.LOCATION);
+                       ShortBuffer buffer = ((ShortBuffer) 
m.getObject(DMT.PEER_LOCATIONS));
+                       double[] locs = Fields.bytesToDoubles(buffer.getData());
+                       
+                       /**
+                        * Do *NOT* remove the sanity check below! 
+                        * @see 
http://archives.freenetproject.org/message/20080718.144240.359e16d3.en.html
+                        */
+                       if((OpennetManager.MAX_PEERS_FOR_SCALING < locs.length) 
&& (source.isOpennet())) {
+                               Logger.error(this, "We received "+locs.length+ 
" locations from "+source.toString()+"! That should *NOT* happen!");
+                               source.forceDisconnect(true);
+                               return true;
+                       } else {
+                               // We are on darknet and we trust our peers OR 
we are on opennet
+                               // and the amount of locations sent to us seems 
reasonable
+                               source.updateLocation(newLoc, locs);
+                       }
+                       
+                       return true;
                }

                if(!source.isRoutable()) return false;
@@ -368,6 +382,7 @@
                        // failure table even though we didn't accept any of 
them.
                        return true;
                }
+               
nodeStats.reportIncomingRequestLocation(key.toNormalizedDouble());
                //if(!node.lockUID(id)) return false;
                RequestHandler rh = new RequestHandler(m, source, id, node, 
htl, key);
                node.executor.execute(rh, "RequestHandler for UID "+id+" on 
"+node.getDarknetPortNumber());

Modified: branches/db4o/freenet/src/freenet/node/NodeIPDetector.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeIPDetector.java  2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/NodeIPDetector.java  2008-08-07 
18:30:55 UTC (rev 21657)
@@ -232,7 +232,7 @@
                                while(it.hasNext()) {
                                        FreenetInetAddress cur = 
(FreenetInetAddress) (it.next());
                                        int curPop = ((Integer) 
(countsByPeer.get(cur))).intValue();
-                                       Logger.normal(this, "Detected peer: 
"+cur+" popularity "+curPop);
+                                       Logger.minor(this, "Detected peer: 
"+cur+" popularity "+curPop);
                                        if(curPop >= bestPopularity) {
                                                secondBestPopularity = 
bestPopularity;
                                                bestPopularity = curPop;
@@ -243,14 +243,14 @@
                                if(best != null) {
                                        if((bestPopularity > 1) || 
(detectedAddrs.length == 0)) {
                                                if(!addresses.contains(best)) {
-                                                       Logger.normal(this, 
"Adding best peer "+best+" ("+bestPopularity+ ')');
+                                                       Logger.minor(this, 
"Adding best peer "+best+" ("+bestPopularity+ ')');
                                                        addresses.add(best);
                                                        
if(best.isRealInternetAddress(false, false, false))
                                                                addedValidIP = 
true;
                                                }
                                                if((secondBest != null) && 
(secondBestPopularity > 1)) {
                                                        
if(!addresses.contains(secondBest)) {
-                                                               
Logger.normal(this, "Adding second best peer "+secondBest+" ("+secondBest+ ')');
+                                                               
Logger.minor(this, "Adding second best peer "+secondBest+" ("+secondBest+ ')');
                                                                
addresses.add(secondBest);
                                                                
if(secondBest.isRealInternetAddress(false, false, false))
                                                                        
addedValidIP = true;

Modified: branches/db4o/freenet/src/freenet/node/NodeStarter.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeStarter.java     2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/NodeStarter.java     2008-08-07 
18:30:55 UTC (rev 21657)
@@ -23,105 +23,96 @@
 import freenet.support.SimpleFieldSet;
 import freenet.support.LoggerHook.InvalidThresholdException;
 import freenet.support.io.NativeThread;
-       

 /**
- * 
- * @author nextgens
- *     
- *     A class to tie the wrapper and the node (needed for self-restarting 
support)
+ *  @author nextgens
  *
+ *  A class to tie the wrapper and the node (needed for self-restarting 
support)
  */
-public class NodeStarter implements WrapperListener
-{
-    private Node node;
+public class NodeStarter implements WrapperListener {
+
+       private Node node;
        private static LoggingConfigHandler logConfigHandler;
        public final static int RECOMMENDED_EXT_BUILD_NUMBER = 20;
-       
        /*
        (File.separatorChar == '\\') &&
        
(System.getProperty("os.arch").toLowerCase().matches("(i?[x0-9]86_64|amd64)")) 
? 6 : 2;
-       */
+        */
        public static int extBuildNumber;
        public static String extRevisionNumber;
        private FreenetFilePersistentConfig cfg;

-    /*---------------------------------------------------------------
-     * Constructors
-     *-------------------------------------------------------------*/
-    private NodeStarter(){}
-    
-    public NodeStarter get(){
-       return this;
-    }
+       /*---------------------------------------------------------------
+        * Constructors
+        *-------------------------------------------------------------*/
+       private NodeStarter() {
+       }

-    /*---------------------------------------------------------------
-     * WrapperListener Methods
-     *-------------------------------------------------------------*/
-    /**
-     * The start method is called when the WrapperManager is signaled by the 
-     * native wrapper code that it can start its application.  This
-     * method call is expected to return, so a new thread should be launched
-     * if necessary.
-     *
-     * @param args List of arguments used to initialize the application.
-     *
-     * @return Any error code if the application should exit on completion
-     *         of the start method.  If there were no problems then this
-     *         method should return null.
-     */
-    public Integer start( String[] args )
-    {
-       if(args.length>1) {
-               System.out.println("Usage: $ java freenet.node.Node 
<configFile>");
-               return new Integer(-1);
-       }
-       
-       getExtBuild();
-       
-       File configFilename;
-       if(args.length == 0) {
-               System.out.println("Using default config filename freenet.ini");
-               configFilename = new File("freenet.ini");
-       } else
-               configFilename = new File(args[0]);
-       
-       // set Java's DNS cache not to cache forever, since many people
-       // use dyndns hostnames
-       java.security.Security.setProperty("networkaddress.cache.ttl" , "0");
-       java.security.Security.setProperty("networkaddress.cache.negative.ttl" 
, "0");
-       
-       try{
-               cfg = 
FreenetFilePersistentConfig.constructFreenetFilePersistentConfig(configFilename);
 
-       }catch(IOException e){
-               System.out.println("Error : "+e);
-               e.printStackTrace();
-               return new Integer(-1);
-       }
-       
-       // First, set up logging. It is global, and may be shared between 
several nodes.
-       SubConfig loggingConfig = new SubConfig("logger", cfg);
-       
-       PooledExecutor executor = new PooledExecutor();
-       
-       try {
-               logConfigHandler = new LoggingConfigHandler(loggingConfig, 
executor);
-       } catch (InvalidConfigValueException e) {
-               System.err.println("Error: could not set up logging: 
"+e.getMessage());
-               e.printStackTrace();
-               return new Integer(-2);
-       }
+       public NodeStarter get() {
+               return this;
+       }

-       executor.start();
-       
-       // Prevent timeouts for a while. The DiffieHellman init for example 
could take some time on a very slow system.
-       WrapperManager.signalStarting(500000);
-       
-       // Setup RNG
-       RandomSource random = new Yarrow();
-       
-       DiffieHellman.init(random);
-        
+       /*---------------------------------------------------------------
+        * WrapperListener Methods
+        *-------------------------------------------------------------*/
+       /**
+        * The start method is called when the WrapperManager is signaled by 
the 
+        *      native wrapper code that it can start its application.  This
+        *      method call is expected to return, so a new thread should be 
launched
+        *      if necessary.
+        *
+        * @param args List of arguments used to initialize the application.
+        *
+        * @return Any error code if the application should exit on completion
+        *         of the start method.  If there were no problems then this
+        *         method should return null.
+        */
+       public Integer start(String[] args) {
+               if(args.length > 1) {
+                       System.out.println("Usage: $ java freenet.node.Node 
<configFile>");
+                       return new Integer(-1);
+               }
+
+               getExtBuild();
+
+               File configFilename;
+               if(args.length == 0) {
+                       System.out.println("Using default config filename 
freenet.ini");
+                       configFilename = new File("freenet.ini");
+               } else
+                       configFilename = new File(args[0]);
+
+               // set Java's DNS cache not to cache forever, since many people
+               // use dyndns hostnames
+               java.security.Security.setProperty("networkaddress.cache.ttl", 
"0");
+               
java.security.Security.setProperty("networkaddress.cache.negative.ttl", "0");
+
+               try {
+                       cfg = 
FreenetFilePersistentConfig.constructFreenetFilePersistentConfig(configFilename);
+               } catch(IOException e) {
+                       System.out.println("Error : " + e);
+                       e.printStackTrace();
+                       return new Integer(-1);
+               }
+
+               // First, set up logging. It is global, and may be shared 
between several nodes.
+               SubConfig loggingConfig = new SubConfig("logger", cfg);
+
+               PooledExecutor executor = new PooledExecutor();
+
+               try {
+                       logConfigHandler = new 
LoggingConfigHandler(loggingConfig, executor);
+               } catch(InvalidConfigValueException e) {
+                       System.err.println("Error: could not set up logging: " 
+ e.getMessage());
+                       e.printStackTrace();
+                       return new Integer(-2);
+               }
+
+               executor.start();
+
+               // Prevent timeouts for a while. The DiffieHellman init for 
example could take some time on a very slow system.
+               WrapperManager.signalStarting(500000);
+
                // Thread to keep the node up.
                // JVM deadlocks losing a lock when two threads of different 
types (daemon|app)
                // are contended for the same lock. So make USM daemon, and use 
useless to keep the JVM
@@ -129,53 +120,55 @@
                // 
http://forum.java.sun.com/thread.jspa?threadID=343023&messageID=2942637 - last 
message
                Runnable useless =
                        new Runnable() {
-                       public void run() {
-                               while(true)
-                                       try {
-                                               Thread.sleep(60*60*1000);
-                                       } catch (InterruptedException e) {
-                                               // Ignore
-                                       } catch (Throwable t) {
+
+                               public void run() {
+                                       while(true) {
                                                try {
-                                                       Logger.error(this, 
"Caught "+t, t);
-                                               } catch (Throwable t1) {
+                                                       Thread.sleep(60 * 60 * 
1000);
+                                               } catch(InterruptedException e) 
{
                                                        // Ignore
+                                               } catch(Throwable t) {
+                                                       try {
+                                                               
Logger.error(this, "Caught " + t, t);
+                                                       } catch(Throwable t1) {
+                                                               // Ignore
+                                                       }
                                                }
                                        }
-                       }
-               };
+                               }
+                       };
                NativeThread plug = new NativeThread(useless, "Plug", 
NativeThread.MAX_PRIORITY, false);
                // Not daemon, but doesn't do anything.
                // Keeps the JVM alive.
                // DO NOT do anything in the plug thread, if you do you risk 
the EvilJVMBug.
                plug.setDaemon(false);
                plug.start();
-               
+
                // Initialize SSL
-       SubConfig sslConfig = new SubConfig("ssl", cfg);
-       SSL.init(sslConfig);
-               
-       try {
-               node = new Node(cfg, random, logConfigHandler,this, executor);
-               node.start(false);
-               System.out.println("Node initialization completed.");
-       } catch (NodeInitException e) {
-               System.err.println("Failed to load node: "+e.getMessage());
-               e.printStackTrace();
-               System.exit(e.exitCode);
-       }
-       
+               SubConfig sslConfig = new SubConfig("ssl", cfg);
+               SSL.init(sslConfig);
+
+               try {
+                       node = new Node(cfg, null, null, logConfigHandler, 
this, executor);
+                       node.start(false);
+                       System.out.println("Node initialization completed.");
+               } catch(NodeInitException e) {
+                       System.err.println("Failed to load node: " + 
e.getMessage());
+                       e.printStackTrace();
+                       System.exit(e.exitCode);
+               }
+
                return null;
-    }
+       }

-    private void getExtBuild() {
-       try{
-               extBuildNumber = ExtVersion.buildNumber;
+       private void getExtBuild() {
+               try {
+                       extBuildNumber = ExtVersion.buildNumber;
                        extRevisionNumber = ExtVersion.cvsRevision;
-                       String builtWithMessage = "freenet.jar built with 
freenet-ext.jar Build #"+extBuildNumber+" r"+extRevisionNumber;
+                       String builtWithMessage = "freenet.jar built with 
freenet-ext.jar Build #" + extBuildNumber + " r" + extRevisionNumber;
                        Logger.normal(this, builtWithMessage);
                        System.out.println(builtWithMessage);
-               extBuildNumber = ExtVersion.buildNumber();
+                       extBuildNumber = ExtVersion.buildNumber();
                        if(extBuildNumber == -42) {
                                extBuildNumber = ExtVersion.extBuildNumber();
                                extRevisionNumber = 
ExtVersion.extRevisionNumber();
@@ -192,145 +185,142 @@
                                System.err.println(revisionMessage);
                                extRevisionNumber = "INVALID";
                        }
-       }catch(Throwable t){     
-               // Compatibility code ... will be removed
-               Logger.error(this, "Unable to get the version of your 
freenet-ext file : it's probably corrupted!");
-               System.err.println("Unable to get the version of your 
freenet-ext file : it's probably corrupted!");
-               System.err.println(t.getMessage());
-               extRevisionNumber = "INVALID";
-               extBuildNumber = -1;
-       }
+               } catch(Throwable t) {
+                       // Compatibility code ... will be removed
+                       Logger.error(this, "Unable to get the version of your 
freenet-ext file : it's probably corrupted!");
+                       System.err.println("Unable to get the version of your 
freenet-ext file : it's probably corrupted!");
+                       System.err.println(t.getMessage());
+                       extRevisionNumber = "INVALID";
+                       extBuildNumber = -1;
+               }
        }

        /**
-     * Called when the application is shutting down.  The Wrapper assumes that
-     *  this method will return fairly quickly.  If the shutdown code code
-     *  could potentially take a long time, then 
WrapperManager.signalStopping()
-     *  should be called to extend the timeout period.  If for some reason,
-     *  the stop method can not return, then it must call
-     *  WrapperManager.stopped() to avoid warning messages from the Wrapper.
-     *
-     * @param exitCode The suggested exit code that will be returned to the OS
-     *                 when the JVM exits.
-     *
-     * @return The exit code to actually return to the OS.  In most cases, this
-     *         should just be the value of exitCode, however the user code has
-     *         the option of changing the exit code if there are any problems
-     *         during shutdown.
-     */
-    public int stop( int exitCode )
-    {
-       System.err.println("Shutting down with exit code "+exitCode);
-       node.park();
-       // see #354
-       WrapperManager.signalStopping(120000);
-        
-        return exitCode;
-    }
-    
-    public void restart(){
-       WrapperManager.restart();
-    }
-    
-    /**
-     * Called whenever the native wrapper code traps a system control signal
-     *  against the Java process.  It is up to the callback to take any actions
-     *  necessary.  Possible values are: WrapperManager.WRAPPER_CTRL_C_EVENT, 
-     *    WRAPPER_CTRL_CLOSE_EVENT, WRAPPER_CTRL_LOGOFF_EVENT, or 
-     *    WRAPPER_CTRL_SHUTDOWN_EVENT
-     *
-     * @param event The system control signal.
-     */
-    public void controlEvent( int event )
-    {
-        if (WrapperManager.isControlledByNativeWrapper()) {
-            // The Wrapper will take care of this event
-        } else {
-            // We are not being controlled by the Wrapper, so
-            //  handle the event ourselves.
-            if ((event == WrapperManager.WRAPPER_CTRL_C_EVENT) ||
-                (event == WrapperManager.WRAPPER_CTRL_CLOSE_EVENT) ||
-                (event == WrapperManager.WRAPPER_CTRL_SHUTDOWN_EVENT)){
-                WrapperManager.stop(0);
-            }
-        }
-    }
-    
-    /*---------------------------------------------------------------
-     * Main Method
-     *-------------------------------------------------------------*/
-    public static void main( String[] args )
-    {
-        // Start the application.  If the JVM was launched from the native
-        //  Wrapper then the application will wait for the native Wrapper to
-        //  call the application's start method.  Otherwise the start method
-        //  will be called immediately.
-        WrapperManager.start( new NodeStarter(), args );
-    }
+        * Called when the application is shutting down.  The Wrapper assumes 
that
+        *  this method will return fairly quickly.  If the shutdown code code
+        *  could potentially take a long time, then 
WrapperManager.signalStopping()
+        *  should be called to extend the timeout period.  If for some reason,
+        *  the stop method can not return, then it must call
+        *  WrapperManager.stopped() to avoid warning messages from the Wrapper.
+        *
+        * @param exitCode The suggested exit code that will be returned to the 
OS
+        *                 when the JVM exits.
+        *
+        * @return The exit code to actually return to the OS.  In most cases, 
this
+        *         should just be the value of exitCode, however the user code 
has
+        *         the option of changing the exit code if there are any 
problems
+        *         during shutdown.
+        */
+       public int stop(int exitCode) {
+               System.err.println("Shutting down with exit code " + exitCode);
+               node.park();
+               // see #354
+               WrapperManager.signalStopping(120000);

-    /**
-     * VM-specific init.
-     * Not Node-specific; many nodes may be created later.
-     * @param testName The name of the test instance.
-     */
+               return exitCode;
+       }
+
+       public void restart() {
+               WrapperManager.restart();
+       }
+
+       /**
+        * Called whenever the native wrapper code traps a system control signal
+        *  against the Java process.  It is up to the callback to take any 
actions
+        *  necessary.  Possible values are: 
WrapperManager.WRAPPER_CTRL_C_EVENT, 
+        *    WRAPPER_CTRL_CLOSE_EVENT, WRAPPER_CTRL_LOGOFF_EVENT, or 
+        *    WRAPPER_CTRL_SHUTDOWN_EVENT
+        *
+        * @param event The system control signal.
+        */
+       public void controlEvent(int event) {
+               if(WrapperManager.isControlledByNativeWrapper()) {
+                       // The Wrapper will take care of this event
+               } else
+                       // We are not being controlled by the Wrapper, so
+                       //  handle the event ourselves.
+                       if((event == WrapperManager.WRAPPER_CTRL_C_EVENT) ||
+                               (event == 
WrapperManager.WRAPPER_CTRL_CLOSE_EVENT) ||
+                               (event == 
WrapperManager.WRAPPER_CTRL_SHUTDOWN_EVENT))
+                               WrapperManager.stop(0);
+       }
+
+       /*---------------------------------------------------------------
+        * Main Method
+        *-------------------------------------------------------------*/
+       public static void main(String[] args) {
+               // Start the application.  If the JVM was launched from the 
native
+               //  Wrapper then the application will wait for the native 
Wrapper to
+               //  call the application's start method.  Otherwise the start 
method
+               //  will be called immediately.
+               WrapperManager.start(new NodeStarter(), args);
+       }
+
+       /**
+        * VM-specific init.
+        * Not Node-specific; many nodes may be created later.
+        * @param testName The name of the test instance.
+        */
        public static RandomSource globalTestInit(String testName, boolean 
enablePlug, int logThreshold, String details) throws InvalidThresholdException {
-               
+
                File dir = new File(testName);
                if((!dir.mkdir()) && ((!dir.exists()) || (!dir.isDirectory()))) 
{
                        System.err.println("Cannot create directory for test");
                        System.exit(NodeInitException.EXIT_TEST_ERROR);
                }
-               
-        Logger.setupStdoutLogging(logThreshold, details);
-               
-       // set Java's DNS cache not to cache forever, since many people
-       // use dyndns hostnames
-       java.security.Security.setProperty("networkaddress.cache.ttl" , "0");
-       java.security.Security.setProperty("networkaddress.cache.negative.ttl" 
, "0");
-               
-       // Setup RNG
-       RandomSource random = new Yarrow();
-       
-       DiffieHellman.init(random);
-        
-       if(enablePlug) {
-       
-               // Thread to keep the node up.
-               // JVM deadlocks losing a lock when two threads of different 
types (daemon|app)
-               // are contended for the same lock. So make USM daemon, and use 
useless to keep the JVM
-               // up.
-               // 
http://forum.java.sun.com/thread.jspa?threadID=343023&messageID=2942637 - last 
message
-               Runnable useless =
-                       new Runnable() {
-                       public void run() {
-                               while(true)
-                                       try {
-                                               Thread.sleep(60*60*1000);
-                                       } catch (InterruptedException e) {
-                                               // Ignore
-                                       } catch (Throwable t) {
-                                               try {
-                                                       Logger.error(this, 
"Caught "+t, t);
-                                               } catch (Throwable t1) {
-                                                       // Ignore
+
+               Logger.setupStdoutLogging(logThreshold, details);
+
+               // set Java's DNS cache not to cache forever, since many people
+               // use dyndns hostnames
+               java.security.Security.setProperty("networkaddress.cache.ttl", 
"0");
+               
java.security.Security.setProperty("networkaddress.cache.negative.ttl", "0");
+
+               // Setup RNG
+               RandomSource random = new Yarrow();
+
+               DiffieHellman.init(random);
+
+               if(enablePlug) {
+
+                       // Thread to keep the node up.
+                       // JVM deadlocks losing a lock when two threads of 
different types (daemon|app)
+                       // are contended for the same lock. So make USM daemon, 
and use useless to keep the JVM
+                       // up.
+                       // 
http://forum.java.sun.com/thread.jspa?threadID=343023&messageID=2942637 - last 
message
+                       Runnable useless =
+                               new Runnable() {
+
+                                       public void run() {
+                                               while(true) {
+                                                       try {
+                                                               Thread.sleep(60 
* 60 * 1000);
+                                                       } 
catch(InterruptedException e) {
+                                                               // Ignore
+                                                       } catch(Throwable t) {
+                                                               try {
+                                                                       
Logger.error(this, "Caught " + t, t);
+                                                               } 
catch(Throwable t1) {
+                                                                       // 
Ignore
+                                                               }
+                                                       }
                                                }
                                        }
-                       }
-               };
-               Thread plug = new Thread(useless, "Plug");
-               // Not daemon, but doesn't do anything.
-               // Keeps the JVM alive.
-               // DO NOT do anything in the plug thread, if you do you risk 
the EvilJVMBug.
-               plug.setDaemon(false);
-               plug.start();
-       }
-       
-       FNPPacketMangler.LOG_UNMATCHABLE_ERROR = true;
-       DNSRequester.DISABLE = true;
-               
+                               };
+                       Thread plug = new Thread(useless, "Plug");
+                       // Not daemon, but doesn't do anything.
+                       // Keeps the JVM alive.
+                       // DO NOT do anything in the plug thread, if you do you 
risk the EvilJVMBug.
+                       plug.setDaemon(false);
+                       plug.start();
+               }
+
+               FNPPacketMangler.LOG_UNMATCHABLE_ERROR = true;
+               DNSRequester.DISABLE = true;
+
                return random;
        }
-       
+
        /**
         * Create a test node.
         * @param port The node port number. Each test node must have a 
different port
@@ -341,21 +331,21 @@
         * @throws NodeInitException If the node cannot start up for some 
reason, most
         * likely a config problem.
         */
-       public static Node createTestNode(int port, String testName, boolean 
doClient, 
-                       boolean doSwapping, boolean disableProbabilisticHTLs, 
short maxHTL,
-                       int dropProb, RandomSource random, Executor executor, 
int threadLimit, 
-                       long storeSize, boolean ramStore, boolean 
enableSwapping, boolean enableARKs, 
-                       boolean enableULPRs, boolean 
enablePerNodeFailureTables, 
-                       boolean enableSwapQueueing, boolean 
enablePacketCoalescing, 
-                       int outputBandwidthLimit) throws NodeInitException {
-               
+       public static Node createTestNode(int port, int opennetPort, String 
testName, boolean doClient,
+               boolean doSwapping, boolean disableProbabilisticHTLs, short 
maxHTL,
+               int dropProb, RandomSource random, Executor executor, int 
threadLimit,
+               long storeSize, boolean ramStore, boolean enableSwapping, 
boolean enableARKs,
+               boolean enableULPRs, boolean enablePerNodeFailureTables,
+               boolean enableSwapQueueing, boolean enablePacketCoalescing,
+               int outputBandwidthLimit, boolean enableFOAF, boolean 
connectToSeednodes) throws NodeInitException {
+
                File baseDir = new File(testName);
                File portDir = new File(baseDir, Integer.toString(port));
                if((!portDir.mkdir()) && ((!portDir.exists()) || 
(!portDir.isDirectory()))) {
                        System.err.println("Cannot create directory for test");
                        System.exit(NodeInitException.EXIT_TEST_ERROR);
                }
-               
+
                // Set up config for testing
                SimpleFieldSet configFS = new SimpleFieldSet(false); // only 
happens once in entire simulation
                if(outputBandwidthLimit > 0) {
@@ -364,7 +354,7 @@
                } else {
                        // Even with throttleLocalTraffic=false, requests still 
count in NodeStats.
                        // So set outputBandwidthLimit to something insanely 
high.
-                       configFS.put("node.outputBandwidthLimit", 16*1024*1024);
+                       configFS.put("node.outputBandwidthLimit", 16 * 1024 * 
1024);
                        configFS.put("node.throttleLocalTraffic", false);
                }
                configFS.put("node.listenPort", port);
@@ -385,7 +375,7 @@
                configFS.put("node.includeLocalAddressesInNoderefs", true);
                configFS.put("node.enableARKs", false);
                configFS.put("node.load.threadLimit", threadLimit);
-               if(ramStore) 
+               if(ramStore)
                        configFS.putSingle("node.storeType", "ram");
                configFS.put("storeSize", storeSize);
                configFS.put("node.disableHangCheckers", true);
@@ -395,14 +385,22 @@
                configFS.put("node.enableULPRDataPropagation", enableULPRs);
                configFS.put("node.enablePerNodeFailureTables", 
enablePerNodeFailureTables);
                configFS.put("node.enablePacketCoalescing", 
enablePacketCoalescing);
+               configFS.put("node.publishOurPeersLocation", enableFOAF);
+               configFS.put("node.routeAccordingToOurPeersLocation", 
enableFOAF);
+               configFS.put("node.opennet.enabled", opennetPort > 0);
+               configFS.put("node.opennet.listenPort", opennetPort);
+               configFS.put("node.opennet.alwaysAllowLocalAddresses", true);
+               configFS.put("node.opennet.oneConnectionPerIP", false);
+               configFS.put("node.opennet.assumeNATed", true);
+               configFS.put("node.opennet.connectToSeednodes", 
connectToSeednodes);

                PersistentConfig config = new PersistentConfig(configFS);
-               
-               Node node=new Node(config, random, null, null, executor);
-               
+
+               Node node = new Node(config, random, random, null, null, 
executor);
+
                //All testing environments connect the nodes as they want, even 
if the old setup is restored, it is not desired.
                node.peers.removeAllPeers();
-               
+
                return node;
-       }
+       }       
 }

Modified: branches/db4o/freenet/src/freenet/node/NodeStats.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/NodeStats.java       2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/NodeStats.java       2008-08-07 
18:30:55 UTC (rev 21657)
@@ -53,6 +53,14 @@
         * block send time.
         */
        public static final int MAX_INTERREQUEST_TIME = 10*1000;
+       /** Locations of incoming requests */
+       private final int[] incomingRequestsByLoc = new int[10];
+       private int incomingRequestsAccounted = 0;
+       /** Locations of outgoing requests */
+       private final int[] outgoingLocalRequestByLoc = new int[10];
+       private int outgoingLocalRequestsAccounted = 0;
+       private final int[] outgoingRequestByLoc = new int[10];
+       private int outgoingRequestsAccounted = 0;

        private final Node node;
        private MemoryChecker myMemoryChecker;
@@ -178,7 +186,7 @@
        /** PeerManagerUserAlert stats update interval (milliseconds) */
        private static final long peerManagerUserAlertStatsUpdateInterval = 
1000;  // 1 second

-       NodeStats(Node node, int sortOrder, SubConfig statsConfig, 
SimpleFieldSet oldThrottleFS, int obwLimit, int ibwLimit, File nodeDir) throws 
NodeInitException {
+       NodeStats(Node node, int sortOrder, SubConfig statsConfig, int 
obwLimit, int ibwLimit, File nodeDir) throws NodeInitException {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                this.node = node;
                this.peers = node.peers;
@@ -269,10 +277,6 @@
                                "NodeStat.statsPersister", 
"NodeStat.statsPersisterLong", node.ps, nodeDir);

                SimpleFieldSet throttleFS = persister.read();
-               
-               if(throttleFS == null)
-                       throttleFS = oldThrottleFS;
-
                if(logMINOR) Logger.minor(this, "Read 
throttleFS:\n"+throttleFS);

                // Guesstimates. Hopefully well over the reality.
@@ -1673,4 +1677,60 @@
                if(logMINOR) Logger.minor(this, "Successful receives: 
"+blockTransferPSuccess.currentValue()+" 
count="+blockTransferPSuccess.countReports());
        }

+       public void reportIncomingRequestLocation(double loc) {
+               assert((loc > 0) && (loc < 1.0));
+               
+               synchronized(incomingRequestsByLoc) {
+                       
incomingRequestsByLoc[(int)Math.floor(loc*incomingRequestsByLoc.length)]++;
+                       incomingRequestsAccounted++;
+               }
+       }
+       
+       public int[] getIncomingRequestLocation(int[] retval) {
+               int[] result = new int[incomingRequestsByLoc.length];
+               synchronized(incomingRequestsByLoc) {
+                       System.arraycopy(incomingRequestsByLoc, 0, result, 0, 
incomingRequestsByLoc.length);
+                       retval[0] = incomingRequestsAccounted;
+               }
+               
+               return result;
+       }
+       
+       public void reportOutgoingLocalRequestLocation(double loc) {
+               assert((loc > 0) && (loc < 1.0));
+               
+               synchronized(outgoingLocalRequestByLoc) {
+                       
outgoingLocalRequestByLoc[(int)Math.floor(loc*outgoingLocalRequestByLoc.length)]++;
+                       outgoingLocalRequestsAccounted++;
+               }
+       }
+       
+       public int[] getOutgoingLocalRequestLocation(int[] retval) {
+               int[] result = new int[outgoingLocalRequestByLoc.length];
+               synchronized(outgoingLocalRequestByLoc) {
+                       System.arraycopy(outgoingLocalRequestByLoc, 0, result, 
0, outgoingLocalRequestByLoc.length);
+                       retval[0] = outgoingLocalRequestsAccounted;
+               }
+               
+               return result;
+       }
+       
+       public void reportOutgoingRequestLocation(double loc) {
+               assert((loc > 0) && (loc < 1.0));
+               
+               synchronized(outgoingRequestByLoc) {
+                       
outgoingRequestByLoc[(int)Math.floor(loc*outgoingRequestByLoc.length)]++;
+                       outgoingRequestsAccounted++;
+               }
+       }
+       
+       public int[] getOutgoingRequestLocation(int[] retval) {
+               int[] result = new int[outgoingRequestByLoc.length];
+               synchronized(outgoingRequestByLoc) {
+                       System.arraycopy(outgoingRequestByLoc, 0, result, 0, 
outgoingRequestByLoc.length);
+                       retval[0] = outgoingRequestsAccounted;
+               }
+               
+               return result;
+       }
 }

Modified: branches/db4o/freenet/src/freenet/node/OpennetManager.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/OpennetManager.java  2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/OpennetManager.java  2008-08-07 
18:30:55 UTC (rev 21657)
@@ -65,46 +65,46 @@

        /** Only drop a connection after at least this many successful requests 
*/
        // FIXME should be a function of # opennet peers? max # opennet peers? 
...
-       static final int MIN_SUCCESS_BETWEEN_DROP_CONNS = 10;
+       public static final int MIN_SUCCESS_BETWEEN_DROP_CONNS = 10;
        /** Chance of resetting path folding (for plausible deniability) is 1 
in this number. */
-       static final int RESET_PATH_FOLDING_PROB = 20;
+       public static final int RESET_PATH_FOLDING_PROB = 20;
        /** Don't re-add a node until it's been up and disconnected for at 
least this long */
-       static final int DONT_READD_TIME = 60*1000;
+       public static final int DONT_READD_TIME = 60*1000;
        /** Don't drop a node until it's at least this old */
-       static final int DROP_MIN_AGE = 300*1000;
+       public static final int DROP_MIN_AGE = 300*1000;
        /** Don't drop a node until this long after startup */
-       static final int DROP_STARTUP_DELAY = 120*1000;
+       public static final int DROP_STARTUP_DELAY = 120*1000;
        /** Don't drop a node until this long after losing connection to it.
         * This should be long enough to cover a typical reboot, but not so 
long as to result in a lot
         * of disconnected nodes in the Strangers list. */
-       static final int DROP_DISCONNECT_DELAY = 10*60*1000;
+       public static final int DROP_DISCONNECT_DELAY = 10*60*1000;
        /** But if it has disconnected more than once in this period, allow it 
to be dropped anyway */
-       static final int DROP_DISCONNECT_DELAY_COOLDOWN = 60*60*1000;
+       public static final int DROP_DISCONNECT_DELAY_COOLDOWN = 60*60*1000;
        /** Every DROP_CONNECTED_TIME, we may drop a peer even though it is 
connected */
-       static final int DROP_CONNECTED_TIME = 10*60*1000;
+       public static final int DROP_CONNECTED_TIME = 10*60*1000;
        /** Minimum time between offers, if we have maximum peers. Less than 
the above limits,
         * since an offer may not be accepted. */
-       static final int MIN_TIME_BETWEEN_OFFERS = 30*1000;
+       public static final int MIN_TIME_BETWEEN_OFFERS = 30*1000;
        private static boolean logMINOR;

        /** How big to pad opennet noderefs to? If they are bigger than this 
then we won't send them. */
-       static final int PADDED_NODEREF_SIZE = 3072;
+       public static final int PADDED_NODEREF_SIZE = 3072;
        /** Allow for future expansion. However at any given time all noderefs 
should be PADDED_NODEREF_SIZE */
-       static final int MAX_OPENNET_NODEREF_LENGTH = 32768;
+       public static final int MAX_OPENNET_NODEREF_LENGTH = 32768;

        /** Enable scaling of peers with bandwidth? */
-       static final boolean ENABLE_PEERS_PER_KB_OUTPUT = false;
+       public static final boolean ENABLE_PEERS_PER_KB_OUTPUT = false;
        /** Target bandwidth usage - above this, we use MAX_PEERS_FOR_SCALING */
-       static final int TARGET_BANDWIDTH_USAGE = 20*1024; // 20 peers at 
20K/sec.
+       public static final int TARGET_BANDWIDTH_USAGE = 20*1024; // 20 peers 
at 20K/sec.
        /** Minimum number of peers */
-       static final int MIN_PEERS_FOR_SCALING = 10;
+       public static final int MIN_PEERS_FOR_SCALING = 10;
        /** Maximum number of peers */
-       static final int MAX_PEERS_FOR_SCALING = 20;
+       public static final int MAX_PEERS_FOR_SCALING = 20;


        private final long creationTime;

-       public OpennetManager(Node node, NodeCryptoConfig opennetConfig, long 
startupTime) throws NodeInitException {
+       public OpennetManager(Node node, NodeCryptoConfig opennetConfig, long 
startupTime, boolean enableAnnouncement) throws NodeInitException {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                this.creationTime = System.currentTimeMillis();
                this.node = node;
@@ -154,7 +154,7 @@
                writeFile(nodeFile, backupNodeFile);
                // Read old peers
                node.peers.tryReadPeers(new File(node.nodeDir, 
"openpeers-old-"+crypto.portNumber).toString(), crypto, this, true, true);
-               announcer = new Announcer(this);
+               announcer = (enableAnnouncement ? new Announcer(this) : null);
                if(logMINOR) {
                        Logger.minor(this, "My full compressed ref: 
"+crypto.myCompressedFullRef().length);
                        Logger.minor(this, "My full setup ref: 
"+crypto.myCompressedSetupRef().length);
@@ -223,14 +223,16 @@

        public void start() {
                crypto.start(node.disableHangCheckers);
-               announcer.start();
+               if(announcer!= null)
+                       announcer.start();
        }

        /**
         * Called when opennet is disabled
         */
        public void stop(boolean purge) {
-               announcer.stop();
+               if(announcer != null)
+                       announcer.stop();
                crypto.stop();
                if(purge)
                        node.peers.removeOpennetPeers();

Modified: branches/db4o/freenet/src/freenet/node/PeerManager.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/PeerManager.java     2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/PeerManager.java     2008-08-07 
18:30:55 UTC (rev 21657)
@@ -48,24 +48,17 @@
  * - Each peer's Location.
  */
 public class PeerManager {
-    
+
        private static boolean logMINOR;
-       
-    /** Our Node */
-    final Node node;
-    
-    /** All the peers we want to connect to */
-    PeerNode[] myPeers;
-    
-    /** All the peers we are actually connected to */
-    PeerNode[] connectedPeers;
-    
-    private String darkFilename;
-    private String openFilename;
-
-    private PeerManagerUserAlert ua;
-    
-       // Peers stuff
+       /** Our Node */
+       final Node node;
+       /** All the peers we want to connect to */
+       PeerNode[] myPeers;
+       /** All the peers we are actually connected to */
+       PeerNode[] connectedPeers;
+       private String darkFilename;
+       private String openFilename;
+       private PeerManagerUserAlert ua;        // Peers stuff
        /** age of oldest never connected peer (milliseconds) */
        private long oldestNeverConnectedPeerAge;
        /** Next time to update oldestNeverConnectedPeerAge */
@@ -86,6 +79,9 @@
        private long nextRoutableConnectionStatsUpdateTime = -1;
        /** routableConnectionStats update interval (milliseconds) */
        private static final long routableConnectionStatsUpdateInterval = 7 * 
1000;  // 7 seconds
+       /** number of samples we have to do stats on peer-selection */
+       private long numberOfSelectionSamples = 0;
+       
        public static final int PEER_NODE_STATUS_CONNECTED = 1;
        public static final int PEER_NODE_STATUS_ROUTING_BACKED_OFF = 2;
        public static final int PEER_NODE_STATUS_TOO_NEW = 3;
@@ -100,141 +96,135 @@
        public static final int PEER_NODE_STATUS_CONN_ERROR = 12;
        public static final int PEER_NODE_STATUS_DISCONNECTING = 13;
        public static final int PEER_NODE_STATUS_ROUTING_DISABLED = 14;
-       
-    /**
-     * Create a PeerManager by reading a list of peers from
-     * a file.
-     * @param node
-     * @param filename
-     */
-    public PeerManager(Node node) {
-        Logger.normal(this, "Creating PeerManager");
-        logMINOR = Logger.shouldLog(Logger.MINOR, this);
+
+       /**
+        * Create a PeerManager by reading a list of peers from
+        * a file.
+        * @param node
+        * @param filename
+        */
+       public PeerManager(Node node) {
+               Logger.normal(this, "Creating PeerManager");
+               logMINOR = Logger.shouldLog(Logger.MINOR, this);
                peerNodeStatuses = new HashMap();
                peerNodeStatusesDarknet = new HashMap();
                peerNodeRoutingBackoffReasons = new HashMap();
-        System.out.println("Creating PeerManager");
-        myPeers = new PeerNode[0];
-        connectedPeers = new PeerNode[0];
-        this.node = node;
-    }
+               System.out.println("Creating PeerManager");
+               myPeers = new PeerNode[0];
+               connectedPeers = new PeerNode[0];
+               this.node = node;
+       }

-    /**
-     * Attempt to read a file full of noderefs. Try the file as named first, 
then the .bak if it is empty or
-     * otherwise doesn't work.
-     * @param filename The filename to read from. If this doesn't work, we try 
the .bak file.
-     * @param crypto The cryptographic identity which these nodes are 
connected to.
-     * @param opennet The opennet manager for the nodes. Only needed (for 
constructing the nodes) if isOpennet.
-     * @param isOpennet Whether the file contains opennet peers.
-     * @param oldOpennetPeers If true, don't add the nodes to the routing 
table, pass them to the opennet
-     * manager as "old peers" i.e. inactive nodes which may try to reconnect.
-     */
-    void tryReadPeers(String filename, NodeCrypto crypto, OpennetManager 
opennet, boolean isOpennet, boolean oldOpennetPeers) {
-       synchronized(writePeersSync) {
-               if(!oldOpennetPeers) {
-                       if(isOpennet) {
-                               openFilename = filename;
-                       } else {
-                               darkFilename = filename;
-                       }
-               }
-       }
-       OutgoingPacketMangler mangler = crypto.packetMangler;
-        File peersFile = new File(filename);
-        File backupFile = new File(filename+".bak");
-        // Try to read the node list from disk
-       if(peersFile.exists()) {
-               if(readPeers(peersFile, mangler, crypto, opennet, 
oldOpennetPeers)) {
-                   String msg;
-                   if(oldOpennetPeers) {
-                       msg = "Read "+opennet.countOldOpennetPeers()+" 
old-opennet-peers from "+peersFile;
-                   } else if(isOpennet) {
-                           msg = "Read "+getOpennetPeers().length+" opennet 
peers from "+peersFile;
-                               } else {
-                           msg = "Read "+getDarknetPeers().length+" darknet 
peers from "+peersFile;
-                               }
-                       Logger.normal(this, msg);
-                       System.out.println(msg);
-                       return;
-               }
-               }
-       // Try the backup
-       if(backupFile.exists()) {
-               if(readPeers(backupFile, mangler, crypto, opennet, 
oldOpennetPeers)) {
-                   String msg;
-                   if(oldOpennetPeers) {
-                       msg = "Read "+opennet.countOldOpennetPeers()+" 
old-opennet-peers from "+peersFile;
-                   } else if(isOpennet) {
-                           msg = "Read "+getOpennetPeers().length+" opennet 
peers from "+peersFile;
-                               } else {
-                           msg = "Read "+getDarknetPeers().length+" darknet 
peers from "+peersFile;
-                               }
-                       Logger.normal(this, msg);
-                       System.out.println(msg);
-               } else {
-                       Logger.error(this, "No (readable) peers file with peers 
in it found");
-                       System.err.println("No (readable) peers file with peers 
in it found");
-               }
-       }               
+       /**
+        * Attempt to read a file full of noderefs. Try the file as named 
first, then the .bak if it is empty or
+        * otherwise doesn't work.
+        * @param filename The filename to read from. If this doesn't work, we 
try the .bak file.
+        * @param crypto The cryptographic identity which these nodes are 
connected to.
+        * @param opennet The opennet manager for the nodes. Only needed (for 
constructing the nodes) if isOpennet.
+        * @param isOpennet Whether the file contains opennet peers.
+        * @param oldOpennetPeers If true, don't add the nodes to the routing 
table, pass them to the opennet
+        * manager as "old peers" i.e. inactive nodes which may try to 
reconnect.
+        */
+       void tryReadPeers(String filename, NodeCrypto crypto, OpennetManager 
opennet, boolean isOpennet, boolean oldOpennetPeers) {
+               synchronized(writePeersSync) {
+                       if(!oldOpennetPeers)
+                               if(isOpennet)
+                                       openFilename = filename;
+                               else
+                                       darkFilename = filename;
+               }
+               OutgoingPacketMangler mangler = crypto.packetMangler;
+               File peersFile = new File(filename);
+               File backupFile = new File(filename + ".bak");
+               // Try to read the node list from disk
+               if(peersFile.exists())
+                       if(readPeers(peersFile, mangler, crypto, opennet, 
oldOpennetPeers)) {
+                               String msg;
+                               if(oldOpennetPeers)
+                                       msg = "Read " + 
opennet.countOldOpennetPeers() + " old-opennet-peers from " + peersFile;
+                               else if(isOpennet)
+                                       msg = "Read " + 
getOpennetPeers().length + " opennet peers from " + peersFile;
+                               else
+                                       msg = "Read " + 
getDarknetPeers().length + " darknet peers from " + peersFile;
+                               Logger.normal(this, msg);
+                               System.out.println(msg);
+                               return;
+                       }
+               // Try the backup
+               if(backupFile.exists())
+                       if(readPeers(backupFile, mangler, crypto, opennet, 
oldOpennetPeers)) {
+                               String msg;
+                               if(oldOpennetPeers)
+                                       msg = "Read " + 
opennet.countOldOpennetPeers() + " old-opennet-peers from " + peersFile;
+                               else if(isOpennet)
+                                       msg = "Read " + 
getOpennetPeers().length + " opennet peers from " + peersFile;
+                               else
+                                       msg = "Read " + 
getDarknetPeers().length + " darknet peers from " + peersFile;
+                               Logger.normal(this, msg);
+                               System.out.println(msg);
+                       } else {
+                               Logger.error(this, "No (readable) peers file 
with peers in it found");
+                               System.err.println("No (readable) peers file 
with peers in it found");
+                       }
        }

        private boolean readPeers(File peersFile, OutgoingPacketMangler 
mangler, NodeCrypto crypto, OpennetManager opennet, boolean oldOpennetPeers) {
-       boolean gotSome = false;
-       FileInputStream fis;
+               boolean gotSome = false;
+               FileInputStream fis;
                try {
                        fis = new FileInputStream(peersFile);
-               } catch (FileNotFoundException e4) {
-                       Logger.normal(this, "Peers file not found: "+peersFile);
+               } catch(FileNotFoundException e4) {
+                       Logger.normal(this, "Peers file not found: " + 
peersFile);
                        return false;
                }
-        InputStreamReader ris;
+               InputStreamReader ris;
                try {
                        ris = new InputStreamReader(fis, "UTF-8");
-               } catch (UnsupportedEncodingException e4) {
+               } catch(UnsupportedEncodingException e4) {
                        throw new Error("Impossible: JVM doesn't support UTF-8: 
" + e4, e4);
                }
-        BufferedReader br = new BufferedReader(ris);
-        try { // FIXME: no better way?
-            while(true) {
-                // Read a single NodePeer
-                SimpleFieldSet fs;
-                fs = new SimpleFieldSet(br, false, true);
-                PeerNode pn;
-                try {
-                    pn = PeerNode.create(fs, node, crypto, opennet, this, 
true, mangler);
-                } catch (FSParseException e2) {
-                    Logger.error(this, "Could not parse peer: "+e2+ '\n' 
+fs.toString(),e2);
-                    continue;
-                } catch (PeerParseException e2) {
-                    Logger.error(this, "Could not parse peer: "+e2+ '\n' 
+fs.toString(),e2);
-                    continue;
-                } catch (ReferenceSignatureVerificationException e2) {
-                       Logger.error(this, "Could not parse peer: "+e2+ '\n' 
+fs.toString(),e2);
-                    continue;
+               BufferedReader br = new BufferedReader(ris);
+               try { // FIXME: no better way?
+                       while(true) {
+                               // Read a single NodePeer
+                               SimpleFieldSet fs;
+                               fs = new SimpleFieldSet(br, false, true);
+                               PeerNode pn;
+                               try {
+                                       pn = PeerNode.create(fs, node, crypto, 
opennet, this, true, mangler);
+                               } catch(FSParseException e2) {
+                                       Logger.error(this, "Could not parse 
peer: " + e2 + '\n' + fs.toString(), e2);
+                                       continue;
+                               } catch(PeerParseException e2) {
+                                       Logger.error(this, "Could not parse 
peer: " + e2 + '\n' + fs.toString(), e2);
+                                       continue;
+                               } catch(ReferenceSignatureVerificationException 
e2) {
+                                       Logger.error(this, "Could not parse 
peer: " + e2 + '\n' + fs.toString(), e2);
+                                       continue;
                                }
-                if(oldOpennetPeers)
-                       opennet.addOldOpennetNode(pn);
-                else
-                       addPeer(pn, true, false);
-                gotSome = true;
-            }
-        } catch (EOFException e) {
-            // End of file, fine
-        } catch (IOException e1) {
-            Logger.error(this, "Could not read peers file: "+e1, e1);
-        }
-        try {
-               br.close();
-        } catch (IOException e3) {
-               Logger.error(this, "Ignoring "+e3+" caught reading "+peersFile, 
e3);
-        }
-        return gotSome;
+                               if(oldOpennetPeers)
+                                       opennet.addOldOpennetNode(pn);
+                               else
+                                       addPeer(pn, true, false);
+                               gotSome = true;
+                       }
+               } catch(EOFException e) {
+                       // End of file, fine
+               } catch(IOException e1) {
+                       Logger.error(this, "Could not read peers file: " + e1, 
e1);
+               }
+               try {
+                       br.close();
+               } catch(IOException e3) {
+                       Logger.error(this, "Ignoring " + e3 + " caught reading 
" + peersFile, e3);
+               }
+               return gotSome;
        }

        public boolean addPeer(PeerNode pn) {
                return addPeer(pn, false, false);
        }
-       
+
        /**
         * Add a peer.
         * @param pn The node to add to the routing table.
@@ -245,14 +235,14 @@
         * an opennet peer when opennet was disabled.
         */
        boolean addPeer(PeerNode pn, boolean ignoreOpennet, boolean reactivate) 
{
-               assert(pn != null);
+               assert (pn != null);
                if(reactivate)
                        pn.forceCancelDisconnecting();
-               synchronized (this) {
-                       for (int i = 0; i < myPeers.length; i++) {
-                               if (myPeers[i].equals(pn)) {
+               synchronized(this) {
+                       for(int i = 0; i < myPeers.length; i++) {
+                               if(myPeers[i].equals(pn)) {
                                        if(logMINOR)
-                                               Logger.minor(this, "Can't add 
peer "+pn+" because already have "+myPeers[i], new Exception("debug"));
+                                               Logger.minor(this, "Can't add 
peer " + pn + " because already have " + myPeers[i], new Exception("debug"));
                                        return false;
                                }
                        }
@@ -268,100 +258,103 @@
                updatePMUserAlert();
                if((!ignoreOpennet) && pn instanceof OpennetPeerNode) {
                        OpennetManager opennet = node.getOpennet();
-                       if(opennet != null) {
+                       if(opennet != null)
                                opennet.forceAddPeer(pn, true);
-                       } else {
-                               Logger.error(this, "Adding opennet peer when no 
opennet enabled!!!: "+pn+" - removing...");
+                       else {
+                               Logger.error(this, "Adding opennet peer when no 
opennet enabled!!!: " + pn + " - removing...");
                                removePeer(pn);
                                return false;
                        }
                }
-               
+
                return true;
        }
-    
+
        synchronized boolean havePeer(PeerNode pn) {
-               for(int i=0;i<myPeers.length;i++) {
-                       if(myPeers[i] == pn) return true;
+               for(int i = 0; i < myPeers.length; i++) {
+                       if(myPeers[i] == pn)
+                               return true;
                }
                return false;
        }
-       
-    private boolean removePeer(PeerNode pn) {
-       if(logMINOR)
-               Logger.minor(this, "Removing "+pn);
+
+       private boolean removePeer(PeerNode pn) {
+               if(logMINOR)
+                       Logger.minor(this, "Removing " + pn);
                boolean isInPeers = false;
-       synchronized(this) {
-               for(int i=0;i<myPeers.length;i++) {
-                       if(myPeers[i] == pn) isInPeers=true;
-               }
-               if(pn instanceof DarknetPeerNode)
-                       ((DarknetPeerNode)pn).removeExtraPeerDataDir();
-               if(isInPeers) {
-                
-                       int peerNodeStatus = pn.getPeerNodeStatus();
-                       if(pn.recordStatus())
-                               removePeerNodeStatus( peerNodeStatus, pn, 
!isInPeers );
-                       String peerNodePreviousRoutingBackoffReason = 
pn.getPreviousBackoffReason();
-                       if(peerNodePreviousRoutingBackoffReason != null) {
-                               
removePeerNodeRoutingBackoffReason(peerNodePreviousRoutingBackoffReason, pn);
-                       }
-                       
-                       // removing from connectedPeers
-                       ArrayList a = new ArrayList();
-                       for(int i=0;i<myPeers.length;i++) {
-                               if((myPeers[i]!=pn) && myPeers[i].isConnected() 
&& myPeers[i].isRealConnection())
-                                       a.add(myPeers[i]);
-                       }
-                       
-                       PeerNode[] newConnectedPeers = new PeerNode[a.size()];
-                       newConnectedPeers = (PeerNode[]) 
a.toArray(newConnectedPeers);
-                       connectedPeers = newConnectedPeers;
-                       
-                       // removing from myPeers
-                       PeerNode[] newMyPeers = new PeerNode[myPeers.length-1];
-                       int positionInNewArray = 0;
-                       for(int i=0;i<myPeers.length;i++) {
-                               if(myPeers[i]!=pn){
-                                       newMyPeers[positionInNewArray] = 
myPeers[i];
-                                       positionInNewArray++;
-                               }
-                       }
-                       myPeers = newMyPeers;
-                       
-                       Logger.normal(this, "Removed "+pn);
-               }
-       }
-       pn.onRemove();
-       if(isInPeers)
-               updatePMUserAlert();
-        return true;
-    }
-       
+               synchronized(this) {
+                       for(int i = 0; i < myPeers.length; i++) {
+                               if(myPeers[i] == pn)
+                                       isInPeers = true;
+                       }
+                       if(pn instanceof DarknetPeerNode)
+                               ((DarknetPeerNode) pn).removeExtraPeerDataDir();
+                       if(isInPeers) {
+
+                               int peerNodeStatus = pn.getPeerNodeStatus();
+                               if(pn.recordStatus())
+                                       removePeerNodeStatus(peerNodeStatus, 
pn, !isInPeers);
+                               String peerNodePreviousRoutingBackoffReason = 
pn.getPreviousBackoffReason();
+                               if(peerNodePreviousRoutingBackoffReason != null)
+                                       
removePeerNodeRoutingBackoffReason(peerNodePreviousRoutingBackoffReason, pn);
+
+                               // removing from connectedPeers
+                               ArrayList a = new ArrayList();
+                               for(int i = 0; i < myPeers.length; i++) {
+                                       if((myPeers[i] != pn) && 
myPeers[i].isConnected() && myPeers[i].isRealConnection())
+                                               a.add(myPeers[i]);
+                               }
+
+                               PeerNode[] newConnectedPeers = new 
PeerNode[a.size()];
+                               newConnectedPeers = (PeerNode[]) 
a.toArray(newConnectedPeers);
+                               connectedPeers = newConnectedPeers;
+
+                               // removing from myPeers
+                               PeerNode[] newMyPeers = new 
PeerNode[myPeers.length - 1];
+                               int positionInNewArray = 0;
+                               for(int i = 0; i < myPeers.length; i++) {
+                                       if(myPeers[i] != pn) {
+                                               newMyPeers[positionInNewArray] 
= myPeers[i];
+                                               positionInNewArray++;
+                                       }
+                               }
+                               myPeers = newMyPeers;
+
+                               Logger.normal(this, "Removed " + pn);
+                       }
+               }
+               pn.onRemove();
+               if(isInPeers)
+                       updatePMUserAlert();
+               return true;
+       }
+
        public boolean removeAllPeers() {
                Logger.normal(this, "removeAllPeers!");
                PeerNode[] oldPeers;
-               synchronized (this) {
+               synchronized(this) {
                        oldPeers = myPeers;
                        myPeers = new PeerNode[0];
                        connectedPeers = new PeerNode[0];
                }
-               for (int i=0; i<oldPeers.length; i++)
+               for(int i = 0; i < oldPeers.length; i++)
                        oldPeers[i].onRemove();
                return true;
-       }       
-       
+       }
+
        public boolean disconnected(PeerNode pn) {
                synchronized(this) {
                        boolean isInPeers = false;
-                       for(int i=0;i<connectedPeers.length;i++) {
-                               if(connectedPeers[i] == pn) isInPeers=true;
+                       for(int i = 0; i < connectedPeers.length; i++) {
+                               if(connectedPeers[i] == pn)
+                                       isInPeers = true;
                        }
-                       if(!isInPeers) return false;
+                       if(!isInPeers)
+                               return false;
                        // removing from connectedPeers
                        ArrayList a = new ArrayList();
-                       for(int i=0;i<myPeers.length;i++) {
-                               if((myPeers[i]!=pn) && myPeers[i].isRoutable())
+                       for(int i = 0; i < myPeers.length; i++) {
+                               if((myPeers[i] != pn) && 
myPeers[i].isRoutable())
                                        a.add(myPeers[i]);
                        }
                        PeerNode[] newConnectedPeers = new PeerNode[a.size()];
@@ -369,55 +362,61 @@
                        connectedPeers = newConnectedPeers;
                }
                updatePMUserAlert();
+               node.lm.announceLocChange();
                return true;
        }
-       
        long timeFirstAnyConnections = 0;
-       
+
        public long getTimeFirstAnyConnections() {
                return timeFirstAnyConnections;
        }
-       
-    public void addConnectedPeer(PeerNode pn) {
-       logMINOR = Logger.shouldLog(Logger.MINOR, this);
-       if(!pn.isRealConnection()) {
-               if(logMINOR) Logger.minor(this, "Not a real connection: "+pn);
-               return;
-       }
-       if(!pn.isConnected()) {
-               if(logMINOR) Logger.minor(this, "Not connected: "+pn);
-               return;
-       }
-       long now = System.currentTimeMillis();
-       synchronized(this) {
-       if(timeFirstAnyConnections == 0) timeFirstAnyConnections = now;
-        for(int i=0;i<connectedPeers.length;i++) {
-            if(connectedPeers[i] == pn) {
-               if(logMINOR) Logger.minor(this, "Already connected: "+pn);
-                return;
-            }
-        }
-        boolean inMyPeers = false;
-        for(int i=0;i<myPeers.length;i++) {
-            if(myPeers[i] == pn) {
-                inMyPeers = true;
-                break;
-            }
-        }
-        if(!inMyPeers) {
-            Logger.error(this, "Connecting to "+pn+" but not in peers!");
-            addPeer(pn);
-        }
-        if(logMINOR) Logger.minor(this, "Connecting: "+pn);
-        PeerNode[] newConnectedPeers = new PeerNode[connectedPeers.length+1];
-        System.arraycopy(connectedPeers, 0, newConnectedPeers, 0, 
connectedPeers.length);
-        newConnectedPeers[connectedPeers.length] = pn;
-        connectedPeers = newConnectedPeers;
-        if(logMINOR) Logger.minor(this, "Connected peers: 
"+connectedPeers.length);
-       }
-        updatePMUserAlert();
-    }
-    
+
+       public void addConnectedPeer(PeerNode pn) {
+               logMINOR = Logger.shouldLog(Logger.MINOR, this);
+               if(!pn.isRealConnection()) {
+                       if(logMINOR)
+                               Logger.minor(this, "Not a real connection: " + 
pn);
+                       return;
+               }
+               if(!pn.isConnected()) {
+                       if(logMINOR)
+                               Logger.minor(this, "Not connected: " + pn);
+                       return;
+               }
+               long now = System.currentTimeMillis();
+               synchronized(this) {
+                       if(timeFirstAnyConnections == 0)
+                               timeFirstAnyConnections = now;
+                       for(int i = 0; i < connectedPeers.length; i++) {
+                               if(connectedPeers[i] == pn) {
+                                       if(logMINOR)
+                                               Logger.minor(this, "Already 
connected: " + pn);
+                                       return;
+                               }
+                       }
+                       boolean inMyPeers = false;
+                       for(int i = 0; i < myPeers.length; i++) {
+                               if(myPeers[i] == pn) {
+                                       inMyPeers = true;
+                                       break;
+                               }
+                       }
+                       if(!inMyPeers) {
+                               Logger.error(this, "Connecting to " + pn + " 
but not in peers!");
+                               addPeer(pn);
+                       }
+                       if(logMINOR)
+                               Logger.minor(this, "Connecting: " + pn);
+                       PeerNode[] newConnectedPeers = new 
PeerNode[connectedPeers.length + 1];
+                       System.arraycopy(connectedPeers, 0, newConnectedPeers, 
0, connectedPeers.length);
+                       newConnectedPeers[connectedPeers.length] = pn;
+                       connectedPeers = newConnectedPeers;
+                       if(logMINOR)
+                               Logger.minor(this, "Connected peers: " + 
connectedPeers.length);
+               }
+               updatePMUserAlert();
+               node.lm.announceLocChange();
+       }
 //    NodePeer route(double targetLocation, RoutingContext ctx) {
 //        double minDist = 1.1;
 //        NodePeer best = null;
@@ -438,83 +437,93 @@
 //        return route(target.getValue(), ctx);
 //    }
 //
-    /**
-     * Find the node with the given Peer address.
-     */
-    public PeerNode getByPeer(Peer peer) {
-        for(int i=0;i<myPeers.length;i++) {
-               if(!myPeers[i].isRealConnection())
-                       continue;
-            if(peer.equals(myPeers[i].getPeer()))
-                return myPeers[i];
-        }
-        return null;
-    }
+       /**
+        * Find the node with the given Peer address.
+        */
+       public PeerNode getByPeer(Peer peer) {
+               for(int i = 0; i < myPeers.length; i++) {
+                       if(!myPeers[i].isRealConnection())
+                               continue;
+                       if(peer.equals(myPeers[i].getPeer()))
+                               return myPeers[i];
+               }
+               return null;
+       }

-    /**
-     * Connect to a node provided the fieldset representing it.
-     */
-    public void connect(SimpleFieldSet noderef, OutgoingPacketMangler mangler) 
throws FSParseException, PeerParseException, 
ReferenceSignatureVerificationException {
-        PeerNode pn = node.createNewDarknetNode(noderef);
-        for(int i=0;i<myPeers.length;i++) {
-            if(Arrays.equals(myPeers[i].identity, pn.identity)) return;
-        }
-        addPeer(pn);
-    }
-       
-    /**
-     * Disconnect from a specified node
-     */
-    public void disconnect(final PeerNode pn, boolean sendDisconnectMessage, 
final boolean waitForAck) {
-       if(logMINOR) Logger.minor(this, "Disconnecting "+pn.shortToString());
-       synchronized(this) {
-               if(!havePeer(pn)) return;
-       }
-       pn.notifyDisconnecting();
-       if(sendDisconnectMessage) {
-               Message msg = DMT.createFNPDisconnect(true, false, -1, new 
ShortBuffer(new byte[0]));
-                       try {
+       /**
+        * Connect to a node provided the fieldset representing it.
+        */
+       public void connect(SimpleFieldSet noderef, OutgoingPacketMangler 
mangler) throws FSParseException, PeerParseException, 
ReferenceSignatureVerificationException {
+               PeerNode pn = node.createNewDarknetNode(noderef);
+               for(int i = 0; i < myPeers.length; i++) {
+                       if(Arrays.equals(myPeers[i].identity, pn.identity))
+                               return;
+               }
+               addPeer(pn);
+       }
+
+       /**
+        * Disconnect from a specified node
+        */
+       public void disconnect(final PeerNode pn, boolean 
sendDisconnectMessage, final boolean waitForAck) {
+               if(logMINOR)
+                       Logger.minor(this, "Disconnecting " + 
pn.shortToString());
+               synchronized(this) {
+                       if(!havePeer(pn))
+                               return;
+               }
+               pn.notifyDisconnecting();
+               if(sendDisconnectMessage) {
+                       Message msg = DMT.createFNPDisconnect(true, false, -1, 
new ShortBuffer(new byte[0]));
+                       try {
                                pn.sendAsync(msg, new AsyncMessageCallback() {
+
                                        boolean done = false;
+
                                        public void acknowledged() {
                                                done();
                                        }
+
                                        public void disconnected() {
                                                done();
                                        }
+
                                        public void fatalError() {
                                                done();
                                        }
+
                                        public void sent() {
-                                               if(!waitForAck) done();
+                                               if(!waitForAck)
+                                                       done();
                                        }
+
                                        void done() {
                                                synchronized(this) {
-                                                       if(done) return;
+                                                       if(done)
+                                                               return;
                                                        done = true;
                                                }
-                                       if(removePeer(pn))
-                                               writePeers();
+                                               if(removePeer(pn))
+                                                       writePeers();
                                        }
                                }, 0, ctrDisconn);
-                       } catch (NotConnectedException e) {
-                       if(pn.isDisconnecting() && removePeer(pn))
-                               writePeers();
-                       return;
+                       } catch(NotConnectedException e) {
+                               if(pn.isDisconnecting() && removePeer(pn))
+                                       writePeers();
+                               return;
                        }
-                       node.getTicker().queueTimedJob(new Runnable() {
-                               public void run() {
-                               if(pn.isDisconnecting() && removePeer(pn))
-                                       writePeers();
-                               }
-                       }, Node.MAX_PEER_INACTIVITY);
-       } else {
-               if(removePeer(pn))
-                       writePeers();
-       }
-    }
+                       node.getTicker().queueTimedJob(new Runnable() {

-    final ByteCounter ctrDisconn = new ByteCounter() {
+                               public void run() {
+                                       if(pn.isDisconnecting() && 
removePeer(pn))
+                                               writePeers();
+                               }
+                       }, Node.MAX_PEER_INACTIVITY);
+               } else
+                       if(removePeer(pn))
+                               writePeers();
+       }
+       final ByteCounter ctrDisconn = new ByteCounter() {

                public void receivedBytes(int x) {
                        node.nodeStats.disconnBytesReceived(x);
@@ -527,248 +536,278 @@
                public void sentPayload(int x) {
                        // Ignore
                }
-       
-    };
-    
-    protected static class LocationUIDPair implements Comparable {
-       double location;
-       long uid;
-       
-       LocationUIDPair(PeerNode pn) {
-               location = pn.getLocation();
-               uid = pn.swapIdentifier;
-       }
+       };

+       protected static class LocationUIDPair implements Comparable {
+
+               double location;
+               long uid;
+
+               LocationUIDPair(PeerNode pn) {
+                       location = pn.getLocation();
+                       uid = pn.swapIdentifier;
+               }
+
                public int compareTo(Object arg0) {
                        // Compare purely on location, so result is the same as 
getPeerLocationDoubles()
                        LocationUIDPair p = (LocationUIDPair) arg0;
-                       if(p.location > location) return 1;
-                       if(p.location < location) return -1;
+                       if(p.location > location)
+                               return 1;
+                       if(p.location < location)
+                               return -1;
                        return 0;
                }
-    }
-    
-    /**
-     * @return An array of the current locations (as doubles) of all
-     * our connected peers.
-     */
-    public double[] getPeerLocationDoubles() {
-        double[] locs;
-        PeerNode[] conns;
-        synchronized (this) {
+       }
+
+       /**
+        * @return An array of the current locations (as doubles) of all
+        * our connected peers or double[0] if 
Node.shallWePublishOurPeersLocation() is false
+        */
+       public double[] getPeerLocationDoubles(boolean pruneBackedOffPeers) {
+               double[] locs;
+               if(!node.shallWePublishOurPeersLocation())
+                       return new double[0];
+               PeerNode[] conns;
+               synchronized(this) {
                        conns = connectedPeers;
                }
-        locs = new double[conns.length];
-        int x = 0;
-        for(int i=0;i<conns.length;i++) {
-            if(conns[i].isRoutable())
-                locs[x++] = conns[i].getLocation();
-        }
-        // Wipe out any information contained in the order
-        java.util.Arrays.sort(locs, 0, x);
-        if(x != locs.length) {
-            double[] newLocs = new double[x];
-            System.arraycopy(locs, 0, newLocs, 0, x);
-            return newLocs;
-        } else return locs;
-    }
+               locs = new double[conns.length];
+               int x = 0;
+               for(int i = 0; i < conns.length; i++) {
+                       if(conns[i].isRoutable()) {
+                               if(!pruneBackedOffPeers || 
!conns[i].shouldBeExcludedFromPeerList()) {
+                                       locs[x++] = conns[i].getLocation();
+                               }
+                       }
+               }
+               // Wipe out any information contained in the order
+               java.util.Arrays.sort(locs, 0, x);
+               if(x != locs.length) {
+                       double[] newLocs = new double[x];
+                       System.arraycopy(locs, 0, newLocs, 0, x);
+                       return newLocs;
+               } else
+                       return locs;
+       }

-    /** Just like getPeerLocationDoubles, except it also
-     * returns the UID for each node. */
-    public LocationUIDPair[] getPeerLocationsAndUIDs() {
-        PeerNode[] conns;
-        LocationUIDPair[] locPairs;
-        synchronized (this) {
+       /** Just like getPeerLocationDoubles, except it also
+        * returns the UID for each node. */
+       public LocationUIDPair[] getPeerLocationsAndUIDs() {
+               PeerNode[] conns;
+               LocationUIDPair[] locPairs;
+               synchronized(this) {
                        conns = myPeers;
                }
-        locPairs = new LocationUIDPair[conns.length];
-        int x = 0;
-        for(int i=0;i<conns.length;i++) {
-            if(conns[i].isRoutable())
-               locPairs[x++] = new LocationUIDPair(conns[i]);
-        }
-        // Sort it
-        Arrays.sort(locPairs, 0, x);
-        if(x != locPairs.length) {
-            LocationUIDPair[] newLocs = new LocationUIDPair[x];
-            System.arraycopy(locPairs, 0, newLocs, 0, x);
-            return newLocs;
-        } else return locPairs;
-    }
+               locPairs = new LocationUIDPair[conns.length];
+               int x = 0;
+               for(int i = 0; i < conns.length; i++) {
+                       if(conns[i].isRoutable())
+                               locPairs[x++] = new LocationUIDPair(conns[i]);
+               }
+               // Sort it
+               Arrays.sort(locPairs, 0, x);
+               if(x != locPairs.length) {
+                       LocationUIDPair[] newLocs = new LocationUIDPair[x];
+                       System.arraycopy(locPairs, 0, newLocs, 0, x);
+                       return newLocs;
+               } else
+                       return locPairs;
+       }

        public PeerNode getRandomPeerInSwappingNetworkOf(PeerNode exclude) {
-               if (exclude==null || exclude.networkGroup==null || 
NetworkIDManager.disableSwapSegregation)
+               if(exclude == null || exclude.networkGroup == null || 
NetworkIDManager.disableSwapSegregation)
                        return getRandomPeer(exclude);
-               synchronized (this) {
-                       if(connectedPeers.length == 0) return null;
-                       for(int i=0;i<5;i++) {
+               synchronized(this) {
+                       if(connectedPeers.length == 0)
+                               return null;
+                       for(int i = 0; i < 5; i++) {
                                PeerNode pn = 
connectedPeers[node.random.nextInt(connectedPeers.length)];
-                               if(pn == exclude) continue;
-                               if (node.netid.inSeparateNetworks(pn, exclude)) 
continue;
-                               if(pn.isRoutable()) return pn;
+                               if(pn == exclude)
+                                       continue;
+                               if(node.netid.inSeparateNetworks(pn, exclude))
+                                       continue;
+                               if(pn.isRoutable())
+                                       return pn;
                        }
                        //could not easily find a good random one... filter the 
ones which are acceptable
-                       ArrayList l=new ArrayList();
-                       for (int i=0; i<connectedPeers.length; i++) {
-                               PeerNode pn=connectedPeers[i];
-                               if(pn == exclude) continue;
-                               if (node.netid.inSeparateNetworks(pn, exclude)) 
continue;
-                               if(!pn.isRoutable()) continue;
+                       ArrayList l = new ArrayList();
+                       for(int i = 0; i < connectedPeers.length; i++) {
+                               PeerNode pn = connectedPeers[i];
+                               if(pn == exclude)
+                                       continue;
+                               if(node.netid.inSeparateNetworks(pn, exclude))
+                                       continue;
+                               if(!pn.isRoutable())
+                                       continue;
                                l.add(pn);
                        }
                        //Are there any acceptable peers?
-                       if (l.size() == 0)
+                       if(l.size() == 0)
                                return null;
-                       return (PeerNode)l.get(node.random.nextInt(l.size()));
+                       return (PeerNode) l.get(node.random.nextInt(l.size()));
                }
        }
-       
-    /**
-     * @return A random routable connected peer.
-     * FIXME: should this take performance into account?
-     * DO NOT remove the "synchronized". See below for why.
-     */
-    public synchronized PeerNode getRandomPeer(PeerNode exclude) {
-        if(connectedPeers.length == 0) return null;
-        for(int i=0;i<5;i++) {
-            PeerNode pn = 
connectedPeers[node.random.nextInt(connectedPeers.length)];
-            if(pn == exclude) continue;
-            if(pn.isRoutable()) return pn;
-        }
-        // None of them worked
-        // Move the un-connected ones out
-        // This is safe as they will add themselves when they
-        // reconnect, and they can't do it yet as we are synchronized.
-        Vector v = new Vector(connectedPeers.length);
-        logMINOR = Logger.shouldLog(Logger.MINOR, this);
-        for(int i=0;i<myPeers.length;i++) {
-            PeerNode pn = myPeers[i];
-            if(pn == exclude) continue;
-            if(pn.isRoutable()) {
-                v.add(pn);
-            } else {
-               if(logMINOR) Logger.minor(this, "Excluding "+pn+" because is 
disconnected");
-            }
-        }
-        int lengthWithoutExcluded = v.size();
-        if((exclude != null) && exclude.isRoutable())
-            v.add(exclude);
-        PeerNode[] newConnectedPeers = new PeerNode[v.size()];
-        newConnectedPeers = (PeerNode[]) v.toArray(newConnectedPeers);
-        if(logMINOR) Logger.minor(this, "Connected peers (in getRandomPeer): 
"+newConnectedPeers.length+" was "+connectedPeers.length);
-        connectedPeers = newConnectedPeers;
-        if(lengthWithoutExcluded == 0) return null;
-        return connectedPeers[node.random.nextInt(lengthWithoutExcluded)];
-    }

-    /**
-     * Asynchronously send this message to every connected peer.
-     */
-    public void localBroadcast(Message msg, boolean ignoreRoutability, boolean 
onlyRealConnections, ByteCounter ctr) {
-        PeerNode[] peers;
-        synchronized (this) {
-               // myPeers not connectedPeers as connectedPeers only contains
-               // ROUTABLE peers, and we may want to send to non-routable peers
+       /**
+        * @return A random routable connected peer.
+        * FIXME: should this take performance into account?
+        * DO NOT remove the "synchronized". See below for why.
+        */
+       public synchronized PeerNode getRandomPeer(PeerNode exclude) {
+               if(connectedPeers.length == 0)
+                       return null;
+               for(int i = 0; i < 5; i++) {
+                       PeerNode pn = 
connectedPeers[node.random.nextInt(connectedPeers.length)];
+                       if(pn == exclude)
+                               continue;
+                       if(pn.isRoutable())
+                               return pn;
+               }
+               // None of them worked
+               // Move the un-connected ones out
+               // This is safe as they will add themselves when they
+               // reconnect, and they can't do it yet as we are synchronized.
+               Vector v = new Vector(connectedPeers.length);
+               logMINOR = Logger.shouldLog(Logger.MINOR, this);
+               for(int i = 0; i < myPeers.length; i++) {
+                       PeerNode pn = myPeers[i];
+                       if(pn == exclude)
+                               continue;
+                       if(pn.isRoutable())
+                               v.add(pn);
+                       else
+                               if(logMINOR)
+                                       Logger.minor(this, "Excluding " + pn + 
" because is disconnected");
+               }
+               int lengthWithoutExcluded = v.size();
+               if((exclude != null) && exclude.isRoutable())
+                       v.add(exclude);
+               PeerNode[] newConnectedPeers = new PeerNode[v.size()];
+               newConnectedPeers = (PeerNode[]) v.toArray(newConnectedPeers);
+               if(logMINOR)
+                       Logger.minor(this, "Connected peers (in getRandomPeer): 
" + newConnectedPeers.length + " was " + connectedPeers.length);
+               connectedPeers = newConnectedPeers;
+               if(lengthWithoutExcluded == 0)
+                       return null;
+               return 
connectedPeers[node.random.nextInt(lengthWithoutExcluded)];
+       }
+
+       /**
+        * Asynchronously send this message to every connected peer.
+        */
+       public void localBroadcast(Message msg, boolean ignoreRoutability, 
boolean onlyRealConnections, ByteCounter ctr) {
+               PeerNode[] peers;
+               synchronized(this) {
+                       // myPeers not connectedPeers as connectedPeers only 
contains
+                       // ROUTABLE peers, and we may want to send to 
non-routable peers
                        peers = myPeers;
                }
-        for(int i=0;i<peers.length;i++) {
-               if(ignoreRoutability) {
-                       if(!peers[i].isConnected()) continue;
-               } else {
-                       if(!peers[i].isRoutable()) continue;
-               }
-               if(onlyRealConnections && !peers[i].isRealConnection()) 
continue;
-               try {
-                peers[i].sendAsync(msg, null, 0, ctr);
-            } catch (NotConnectedException e) {
-                // Ignore
-            }
-        }
-    }
+               for(int i = 0; i < peers.length; i++) {
+                       if(ignoreRoutability) {
+                               if(!peers[i].isConnected())
+                                       continue;
+                       } else
+                               if(!peers[i].isRoutable())
+                                       continue;
+                       if(onlyRealConnections && !peers[i].isRealConnection())
+                               continue;
+                       try {
+                               peers[i].sendAsync(msg, null, 0, ctr);
+                       } catch(NotConnectedException e) {
+                               // Ignore
+                       }
+               }
+       }

        /**
         * Asynchronously send a differential node reference to every 
isConnected() peer.
         */
        public void locallyBroadcastDiffNodeRef(SimpleFieldSet fs, boolean 
toDarknetOnly, boolean toOpennetOnly) {
                PeerNode[] peers;
-               synchronized (this) {
+               synchronized(this) {
                        // myPeers not connectedPeers as connectedPeers only 
contains
                        // ROUTABLE peers and we want to also send to 
non-routable peers
                        peers = myPeers;
                }
-               for(int i=0;i<peers.length;i++) {
-                       if(!peers[i].isConnected()) continue;
-                       if(toDarknetOnly && !peers[i].isDarknet()) continue;
-                       if(toOpennetOnly && !peers[i].isOpennet()) continue;
+               for(int i = 0; i < peers.length; i++) {
+                       if(!peers[i].isConnected())
+                               continue;
+                       if(toDarknetOnly && !peers[i].isDarknet())
+                               continue;
+                       if(toOpennetOnly && !peers[i].isOpennet())
+                               continue;
                        peers[i].sendNodeToNodeMessage(fs, 
Node.N2N_MESSAGE_TYPE_DIFFNODEREF, false, 0, false);
                }
        }

-    public PeerNode getRandomPeer() {
-        return getRandomPeer(null);
-    }
+       public PeerNode getRandomPeer() {
+               return getRandomPeer(null);
+       }

-    public double closestPeerLocation(double loc, double ignoreLoc, int 
minUptimePercent) {
-        PeerNode[] peers;
-        synchronized (this) {
-               peers = connectedPeers;
+       public double closestPeerLocation(double loc, double ignoreLoc, int 
minUptimePercent) {
+               PeerNode[] peers;
+               synchronized(this) {
+                       peers = connectedPeers;
                }
-        double bestDiff = 1.0;
-        double bestLoc = Double.MAX_VALUE;
-        boolean foundOne = false;
-        for(int i=0;i<peers.length;i++) {
-            PeerNode p = peers[i];
-            if(!p.isRoutable()) continue;
-            if(p.isRoutingBackedOff()) continue;
-            if(p.getUptime() < minUptimePercent) continue;
-            double peerloc = p.getLocation();
-            if(Math.abs(peerloc - ignoreLoc) < Double.MIN_VALUE*2)
-               continue;
-            double diff = Location.distance(peerloc, loc);
-            if(diff < bestDiff) {
-               foundOne = true;
-                bestDiff = diff;
-                bestLoc = peerloc;
-            }
-        }
-        if(!foundOne) {
-            for(int i=0;i<peers.length;i++) {
-                PeerNode p = peers[i];
-                if(!p.isRoutable()) continue;
-                if(p.getUptime() < minUptimePercent) continue;
-                // Ignore backoff state
-                double peerloc = p.getLocation();
-                if(Math.abs(peerloc - ignoreLoc) < Double.MIN_VALUE*2)
-                       continue;
-                double diff = Location.distance(peerloc, loc);
-                if(diff < bestDiff) {
-                       foundOne = true;
-                    bestDiff = diff;
-                    bestLoc = peerloc;
-                }
-            }
-        }
-        return bestLoc;
-    }
+               double bestDiff = 1.0;
+               double bestLoc = Double.MAX_VALUE;
+               boolean foundOne = false;
+               for(int i = 0; i < peers.length; i++) {
+                       PeerNode p = peers[i];
+                       if(!p.isRoutable())
+                               continue;
+                       if(p.isRoutingBackedOff())
+                               continue;
+                       if(p.getUptime() < minUptimePercent)
+                               continue;
+                       double peerloc = p.getLocation();
+                       if(Math.abs(peerloc - ignoreLoc) < Double.MIN_VALUE * 2)
+                               continue;
+                       double diff = Location.distance(peerloc, loc);
+                       if(diff < bestDiff) {
+                               foundOne = true;
+                               bestDiff = diff;
+                               bestLoc = peerloc;
+                       }
+               }
+               if(!foundOne)
+                       for(int i = 0; i < peers.length; i++) {
+                               PeerNode p = peers[i];
+                               if(!p.isRoutable())
+                                       continue;
+                               if(p.getUptime() < minUptimePercent)
+                                       continue;
+                               // Ignore backoff state
+                               double peerloc = p.getLocation();
+                               if(Math.abs(peerloc - ignoreLoc) < 
Double.MIN_VALUE * 2)
+                                       continue;
+                               double diff = Location.distance(peerloc, loc);
+                               if(diff < bestDiff) {
+                                       foundOne = true;
+                                       bestDiff = diff;
+                                       bestLoc = peerloc;
+                               }
+                       }
+               return bestLoc;
+       }

-    public boolean isCloserLocation(double loc, int minUptimePercent) {
-       double nodeLoc = node.lm.getLocation();
-       double nodeDist = Location.distance(nodeLoc, loc);
-       double closest = closestPeerLocation(loc, nodeLoc, minUptimePercent);
-       if(closest > 1.0) {
-               // No peers found
-               return false;
-       }
-       double closestDist = Location.distance(closest, loc);
-       return closestDist < nodeDist;
-    }
-    
-    public PeerNode closerPeer(PeerNode pn, Set routedTo, Set notIgnored, 
double loc, boolean ignoreSelf, boolean calculateMisrouting, int minVersion, 
Vector addUnpickedLocsTo, Key key) {
-       return closerPeer(pn, routedTo, notIgnored, loc, ignoreSelf, 
calculateMisrouting, minVersion, addUnpickedLocsTo, 2.0, key);
-    }
+       public boolean isCloserLocation(double loc, int minUptimePercent) {
+               double nodeLoc = node.lm.getLocation();
+               double nodeDist = Location.distance(nodeLoc, loc);
+               double closest = closestPeerLocation(loc, nodeLoc, 
minUptimePercent);
+               if(closest > 1.0)
+                       // No peers found
+                       return false;
+               double closestDist = Location.distance(closest, loc);
+               return closestDist < nodeDist;
+       }

+       public PeerNode closerPeer(PeerNode pn, Set routedTo, Set notIgnored, 
double loc, boolean ignoreSelf, boolean calculateMisrouting, int minVersion, 
Vector addUnpickedLocsTo, Key key) {
+               return closerPeer(pn, routedTo, notIgnored, loc, ignoreSelf, 
calculateMisrouting, minVersion, addUnpickedLocsTo, 2.0, key);
+       }
+
        /**
-     * Find the peer, if any, which is closer to the target location than we 
are, and is not included in the provided set.
+        * Find the peer, if any, which is closer to the target location than 
we are, and is not included in the provided set.
         * If ignoreSelf==false, and we are closer to the target than any 
peers, this function returns null.
         * This function returns two values, the closest such peer which is 
backed off, and the same which is not backed off.
         * It is possible for either to be null independant of the other, 
'closest' is the closer of the two in either case, and
@@ -778,315 +817,345 @@
         * @param maxDistance If a node is further away from the target than 
this distance, ignore it.
         * @param key The original key, if we have it, and if we want to 
consult with the FailureTable
         * to avoid routing to nodes which have recently failed for the same 
key.
-     */
-    public PeerNode closerPeer(PeerNode pn, Set routedTo, Set notIgnored, 
double target, boolean ignoreSelf, boolean calculateMisrouting, int minVersion, 
Vector addUnpickedLocsTo, double maxDistance, Key key) {
-        PeerNode[] peers;  
-        synchronized (this) {
+        */
+       public PeerNode closerPeer(PeerNode pn, Set routedTo, Set notIgnored, 
double target, boolean ignoreSelf, boolean calculateMisrouting, int minVersion, 
Vector addUnpickedLocsTo, double maxDistance, Key key) {
+               PeerNode[] peers;
+               synchronized(this) {
                        peers = connectedPeers;
                }
-        if(!node.enablePerNodeFailureTables) key = null;
-        if(logMINOR) Logger.minor(this, "Choosing closest peer: 
connectedPeers="+peers.length);
-        double maxDiff = Double.MAX_VALUE;
-        if(!ignoreSelf)
-            maxDiff = Location.distance(node.lm.getLocation(), target);
-        
-        /**
-         * Routing order:
-         * - Non-timed-out non-backed-off peers, in order of closeness to the 
target.
-         * - Timed-out, non-backed-off peers, least recently timed out first.
-         * - Non-timed-out backed-off peers, in order of closeness to the 
target.
-         * - Timed out, backed-off peers, least recently timed out first.
-         * - 
-         */
-        
+               if(!node.enablePerNodeFailureTables)
+                       key = null;
+               if(logMINOR)
+                       Logger.minor(this, "Choosing closest peer: 
connectedPeers=" + peers.length);
+               double maxDiff = Double.MAX_VALUE;
+               if(!ignoreSelf)
+                       maxDiff = Location.distance(node.lm.getLocation(), 
target);
+
+               /**
+                * Routing order:
+                * - Non-timed-out non-backed-off peers, in order of closeness 
to the target.
+                * - Timed-out, non-backed-off peers, least recently timed out 
first.
+                * - Non-timed-out backed-off peers, in order of closeness to 
the target.
+                * - Timed out, backed-off peers, least recently timed out 
first.
+                * - 
+                */
                PeerNode closest = null;
                double closestDistance = Double.MAX_VALUE;
-               
+
                PeerNode closestBackedOff = null;
                double closestBackedOffDistance = Double.MAX_VALUE;
-               
+
                PeerNode closestNotBackedOff = null;
                double closestNotBackedOffDistance = Double.MAX_VALUE;
-               
+
                PeerNode leastRecentlyTimedOut = null;
                long timeLeastRecentlyTimedOut = Long.MAX_VALUE;
-               
+
                PeerNode leastRecentlyTimedOutBackedOff = null;
                long timeLeastRecentlyTimedOutBackedOff = Long.MAX_VALUE;
-               
+
                TimedOutNodesList entry = null;
-               
-               if(key != null) {
+
+               if(key != null)
                        entry = node.failureTable.getTimedOutNodesList(key);
-               }
-               
+
                long now = System.currentTimeMillis();
                int count = 0;
-        for(int i=0;i<peers.length;i++) {
-            PeerNode p = peers[i];
-            if(routedTo.contains(p)) {
-               if(logMINOR) Logger.minor(this, "Skipping (already routed to): 
"+p.getPeer());
-               continue;
-            }
-            if(p == pn) {
-               if(logMINOR) Logger.minor(this, "Skipping (req came from): 
"+p.getPeer());
-               continue;
-            }
-            if(!p.isRoutable()) {
-               if(logMINOR) Logger.minor(this, "Skipping (not connected): 
"+p.getPeer());
-               continue;
-            }
-            if(minVersion > 0 && 
Version.getArbitraryBuildNumber(p.getVersion(), -1) < minVersion) {
-               if(logMINOR) Logger.minor(this, "Skipping old version: 
"+p.getPeer());
-               continue;
-            }
-            long timeout = -1;
-            if(entry != null)
-               timeout = entry.getTimeoutTime(p);
-            boolean timedOut = timeout > now;
+               for(int i = 0; i < peers.length; i++) {
+                       PeerNode p = peers[i];
+                       if(routedTo.contains(p)) {
+                               if(logMINOR)
+                                       Logger.minor(this, "Skipping (already 
routed to): " + p.getPeer());
+                               continue;
+                       }
+                       if(p == pn) {
+                               if(logMINOR)
+                                       Logger.minor(this, "Skipping (req came 
from): " + p.getPeer());
+                               continue;
+                       }
+                       if(!p.isRoutable()) {
+                               if(logMINOR)
+                                       Logger.minor(this, "Skipping (not 
connected): " + p.getPeer());
+                               continue;
+                       }
+                       if(minVersion > 0 && 
Version.getArbitraryBuildNumber(p.getVersion(), -1) < minVersion) {
+                               if(logMINOR)
+                                       Logger.minor(this, "Skipping old 
version: " + p.getPeer());
+                               continue;
+                       }
+                       long timeout = -1;
+                       if(entry != null)
+                               timeout = entry.getTimeoutTime(p);
+                       boolean timedOut = timeout > now;
                        //To help avoid odd race conditions, get the location 
only once and use it for all calculations.
                        double loc = p.getLocation();
-            double diff = Location.distance(loc, target);
-            if(diff > maxDistance) continue;
+                       double diff = Location.distance(loc, target);
+                       
+                       double[] peersLocation = p.getPeersLocation();
+                       if((node.shallWeRouteAccordingToOurPeersLocation()) && 
(peersLocation != null)) {
+                               for(double l : peersLocation) {
+                                       double newDiff = Location.distance(l, 
target);
+                                       if(newDiff < diff) {
+                                               loc = l;
+                                               diff = newDiff;
+                                       }
+                               }
+                               if(logMINOR)
+                                       Logger.minor(this, "The peer "+p+" has 
published his peer's locations and the closest we have found to the target is 
"+diff+" away.");
+                       }
+                       
+                       if(diff > maxDistance)
+                               continue;
                        if((!ignoreSelf) && (diff > maxDiff)) {
-               if(logMINOR) Logger.minor(this, "Ignoring, further than self 
>maxDiff="+maxDiff);
-               continue;
-            }
+                               if(logMINOR)
+                                       Logger.minor(this, "Ignoring, further 
than self >maxDiff=" + maxDiff);
+                               continue;
+                       }
                        count++;
-            if(logMINOR) Logger.minor(this, "p.loc="+loc+", target="+target+", 
d="+Location.distance(loc, target)+" usedD="+diff+" timedOut="+timedOut+" for 
"+p.getPeer());
-                       boolean chosen=false;
-            if(diff < closestDistance) {
-               closestDistance = diff;
-                closest = p;
-                               chosen=true;
-                if(logMINOR) Logger.minor(this, "New best: "+diff+" ("+loc+" 
for "+p.getPeer());
-            }
-                       boolean backedOff=p.isRoutingBackedOff();
+                       if(logMINOR)
+                               Logger.minor(this, "p.loc=" + loc + ", target=" 
+ target + ", d=" + Location.distance(loc, target) + " usedD=" + diff + " 
timedOut=" + timedOut + " for " + p.getPeer());
+                       boolean chosen = false;
+                       if(diff < closestDistance) {
+                               closestDistance = diff;
+                               closest = p;
+                               chosen = true;
+                               if(logMINOR)
+                                       Logger.minor(this, "New best: " + diff 
+ " (" + loc + " for " + p.getPeer());
+                       }
+                       boolean backedOff = p.isRoutingBackedOff();
                        if(backedOff && (diff < closestBackedOffDistance) && 
!timedOut) {
-               closestBackedOffDistance = diff;
-                closestBackedOff = p;
-                               chosen=true;
-                if(logMINOR) Logger.minor(this, "New best-backed-off: "+diff+" 
("+loc+" for "+p.getPeer());
-            }
+                               closestBackedOffDistance = diff;
+                               closestBackedOff = p;
+                               chosen = true;
+                               if(logMINOR)
+                                       Logger.minor(this, "New 
best-backed-off: " + diff + " (" + loc + " for " + p.getPeer());
+                       }
                        if(!backedOff && (diff < closestNotBackedOffDistance) 
&& !timedOut) {
-               closestNotBackedOffDistance = diff;
-                closestNotBackedOff = p;
-                               chosen=true;
-                if(logMINOR) Logger.minor(this, "New best-not-backed-off: 
"+diff+" ("+loc+" for "+p.getPeer());
-            }
-                       if(timedOut) {
+                               closestNotBackedOffDistance = diff;
+                               closestNotBackedOff = p;
+                               chosen = true;
+                               if(logMINOR)
+                                       Logger.minor(this, "New 
best-not-backed-off: " + diff + " (" + loc + " for " + p.getPeer());
+                       }
+                       if(timedOut)
                                if(!backedOff) {
                                        if(timeout < timeLeastRecentlyTimedOut) 
{
                                                timeLeastRecentlyTimedOut = 
timeout;
                                                leastRecentlyTimedOut = p;
                                        }
-                               } else {
+                               } else
                                        if(timeout < 
timeLeastRecentlyTimedOutBackedOff) {
                                                
timeLeastRecentlyTimedOutBackedOff = timeout;
                                                leastRecentlyTimedOutBackedOff 
= p;
                                        }
-                               }
+                       if(addUnpickedLocsTo != null && !chosen) {
+                               Double d = new Double(loc);
+                               // Here we can directly compare double's 
because they aren't processed in any way, and are finite and (probably) nonzero.
+                               if(!addUnpickedLocsTo.contains(d))
+                                       addUnpickedLocsTo.add(d);
                        }
-               if(addUnpickedLocsTo != null && !chosen) {
-                       Double d = new Double(loc);
-                       // Here we can directly compare double's because they 
aren't processed in any way, and are finite and (probably) nonzero.
-                       if(!addUnpickedLocsTo.contains(d))
-                               addUnpickedLocsTo.add(d);
-               }
-        }
-               
+               }
+
                PeerNode best = closestNotBackedOff;
-               
-               if (best==null) {
+
+               if(best == null) {
                        if(leastRecentlyTimedOut != null) {
                                // FIXME downgrade to DEBUG
                                best = leastRecentlyTimedOut;
-                               if(logMINOR) Logger.minor(this, "Using least 
recently failed in-timeout-period peer for key: "+best.shortToString()+" for 
"+key);
+                               if(logMINOR)
+                                       Logger.minor(this, "Using least 
recently failed in-timeout-period peer for key: " + best.shortToString() + " 
for " + key);
                        } else if(closestBackedOff != null) {
                                best = closestBackedOff;
-                               if(logMINOR) Logger.minor(this, "Using best 
backed-off peer for key: "+best.shortToString());
+                               if(logMINOR)
+                                       Logger.minor(this, "Using best 
backed-off peer for key: " + best.shortToString());
                        } else if(leastRecentlyTimedOutBackedOff != null) {
                                best = leastRecentlyTimedOutBackedOff;
-                               if(logMINOR) Logger.minor(this, "Using least 
recently failed in-timeout-period backed-off peer for key: 
"+best.shortToString()+" for "+key);
+                               if(logMINOR)
+                                       Logger.minor(this, "Using least 
recently failed in-timeout-period backed-off peer for key: " + 
best.shortToString() + " for " + key);
                        }
                }
-               
-               //racy... getLocation() could have changed
-       if (calculateMisrouting) {
-               if (best != null) {
-                       
node.nodeStats.routingMissDistance.report(Location.distance(best, 
closest.getLocation()));
-                       int numberOfConnected = 
getPeerNodeStatusSize(PEER_NODE_STATUS_CONNECTED, false);
-                       int numberOfRoutingBackedOff = 
getPeerNodeStatusSize(PEER_NODE_STATUS_ROUTING_BACKED_OFF, false);
-                       if (numberOfRoutingBackedOff + numberOfConnected > 0 ) {
-                               node.nodeStats.backedOffPercent.report((double) 
numberOfRoutingBackedOff / (double) (numberOfRoutingBackedOff + 
numberOfConnected));
-                       }
+
+               // DO NOT PUT A ELSE HERE: we need to re-check the value!
+               if(best != null) {
+                       //racy... getLocation() could have changed
+                       if(calculateMisrouting) {
+                               
node.nodeStats.routingMissDistance.report(Location.distance(best, 
closest.getLocation()));
+                               int numberOfConnected = 
getPeerNodeStatusSize(PEER_NODE_STATUS_CONNECTED, false);
+                               int numberOfRoutingBackedOff = 
getPeerNodeStatusSize(PEER_NODE_STATUS_ROUTING_BACKED_OFF, false);
+                               if(numberOfRoutingBackedOff + numberOfConnected 
> 0)
+                                       
node.nodeStats.backedOffPercent.report((double) numberOfRoutingBackedOff / 
(double) (numberOfRoutingBackedOff + numberOfConnected));
                        }
-       }
-               
-               //racy... getLocation() could have changed
-               if (best!=null && addUnpickedLocsTo!=null) {
-                       //Add the location which we did not pick, if it exists.
-                       if (closestNotBackedOff!=null && closestBackedOff!=null)
-                               addUnpickedLocsTo.add(new 
Double(closestBackedOff.getLocation()));
+
+                       //racy... getLocation() could have changed
+                       if(addUnpickedLocsTo != null)
+                               //Add the location which we did not pick, if it 
exists.
+                               if(closestNotBackedOff != null && 
closestBackedOff != null)
+                                       addUnpickedLocsTo.add(new 
Double(closestBackedOff.getLocation()));
+
+                       //TODO: synchronize! ; store the stats here instead of 
into PeerNode?
+                       best.incrementNumberOfSelections();
+                       numberOfSelectionSamples++;
                }

-        return best;
-    }
+               return best;
+       }

-    /**
-     * @return Some status information
-     */
-    public String getStatus() {
-        StringBuffer sb = new StringBuffer();
-        PeerNode[] peers;
-        synchronized (this) {
-            peers = myPeers;                   
+       /**
+        * @return Some status information
+        */
+       public String getStatus() {
+               StringBuffer sb = new StringBuffer();
+               PeerNode[] peers;
+               synchronized(this) {
+                       peers = myPeers;
                }
-        String[] status = new String[peers.length];
-        for(int i=0;i<peers.length;i++) {
-            PeerNode pn = peers[i];
-            status[i] = pn.getStatus(true).toString();
-           Version.seenVersion(pn.getVersion());
-        }
-        Arrays.sort(status);
-        for(int i=0;i<status.length;i++) {
-            sb.append(status[i]);
-            sb.append('\n');
-        }
-        return sb.toString();
-    }
+               String[] status = new String[peers.length];
+               for(int i = 0; i < peers.length; i++) {
+                       PeerNode pn = peers[i];
+                       status[i] = pn.getStatus(true).toString();
+               }
+               Arrays.sort(status);
+               for(int i = 0; i < status.length; i++) {
+                       sb.append(status[i]);
+                       sb.append('\n');
+               }
+               return sb.toString();
+       }

-    /**
-     * @return TMCI peer list
-     */
-    public String getTMCIPeerList() {
-        StringBuffer sb = new StringBuffer();
-        PeerNode[] peers;
-        synchronized (this) {
+       /**
+        * @return TMCI peer list
+        */
+       public String getTMCIPeerList() {
+               StringBuffer sb = new StringBuffer();
+               PeerNode[] peers;
+               synchronized(this) {
                        peers = myPeers;
                }
-        String[] peerList = new String[peers.length];
-        for(int i=0;i<peers.length;i++) {
-            PeerNode pn = peers[i];
-            peerList[i] = pn.getTMCIPeerInfo();
-        }
-        Arrays.sort(peerList);
-        for(int i=0;i<peerList.length;i++) {
-            sb.append(peerList[i]);
-            sb.append('\n');
-        }
-        return sb.toString();
-    }
+               String[] peerList = new String[peers.length];
+               for(int i = 0; i < peers.length; i++) {
+                       PeerNode pn = peers[i];
+                       peerList[i] = pn.getTMCIPeerInfo();
+               }
+               Arrays.sort(peerList);
+               for(int i = 0; i < peerList.length; i++) {
+                       sb.append(peerList[i]);
+                       sb.append('\n');
+               }
+               return sb.toString();
+       }

-    public String getFreevizOutput() {
-        StringBuffer sb = new StringBuffer();
-        PeerNode[] peers;
-        synchronized (this) {
+       public String getFreevizOutput() {
+               StringBuffer sb = new StringBuffer();
+               PeerNode[] peers;
+               synchronized(this) {
                        peers = myPeers;
                }
-        String[] identity = new String[peers.length];
-        for(int i=0;i<peers.length;i++) {
-            PeerNode pn = peers[i];
-            identity[i] = pn.getFreevizOutput();
-        }
-        Arrays.sort(identity);
-        for(int i=0;i<identity.length;i++) {
-            sb.append(identity[i]);
-            sb.append('\n');
-        }
-        return sb.toString();
-    }
+               String[] identity = new String[peers.length];
+               for(int i = 0; i < peers.length; i++) {
+                       PeerNode pn = peers[i];
+                       identity[i] = pn.getFreevizOutput();
+               }
+               Arrays.sort(identity);
+               for(int i = 0; i < identity.length; i++) {
+                       sb.append(identity[i]);
+                       sb.append('\n');
+               }
+               return sb.toString();
+       }
+       private final Object writePeersSync = new Object();

-    private final Object writePeersSync = new Object();
-    
-    void writePeers() {
-       node.ps.queueTimedJob(new Runnable() {
+       void writePeers() {
+               node.ps.queueTimedJob(new Runnable() {
+
                        public void run() {
                                writePeersInner();
                        }
-       }, 0);
-    }
+               }, 0);
+       }

-    private void writePeersInner() {
-                   synchronized(writePeersSync) {
-                           if(darkFilename != null)
-                                   writePeersInner(darkFilename, 
getDarknetPeers());
-                           OpennetManager om = node.getOpennet();
-                           if(om != null) {
-                                   if(openFilename != null)
-                                           writePeersInner(openFilename, 
getOpennetPeers());
-                                   writePeersInner(om.getOldPeersFilename(), 
om.getOldPeers());
-                           }
-                   }
-    }
-    
-    /**
-     * Write the peers file to disk
-     */
-    private void writePeersInner(String filename, PeerNode[] peers) {
-        synchronized (writePeersSync) {
-            FileOutputStream fos = null;
-            String f = filename + ".bak";
-            try {
-                fos = new FileOutputStream(f);
-            } catch (FileNotFoundException e2) {
-                Logger.error(this, "Cannot write peers to disk: Cannot create "
-                        + f + " - " + e2, e2);
-               Closer.close(fos);
-                return;
-            }
-            OutputStreamWriter w = null;
+       private void writePeersInner() {
+               synchronized(writePeersSync) {
+                       if(darkFilename != null)
+                               writePeersInner(darkFilename, 
getDarknetPeers());
+                       OpennetManager om = node.getOpennet();
+                       if(om != null) {
+                               if(openFilename != null)
+                                       writePeersInner(openFilename, 
getOpennetPeers());
+                               writePeersInner(om.getOldPeersFilename(), 
om.getOldPeers());
+                       }
+               }
+       }
+
+       /**
+        * Write the peers file to disk
+        */
+       private void writePeersInner(String filename, PeerNode[] peers) {
+               synchronized(writePeersSync) {
+                       FileOutputStream fos = null;
+                       String f = filename + ".bak";
                        try {
+                               fos = new FileOutputStream(f);
+                       } catch(FileNotFoundException e2) {
+                               Logger.error(this, "Cannot write peers to disk: 
Cannot create " + f + " - " + e2, e2);
+                               Closer.close(fos);
+                               return;
+                       }
+                       OutputStreamWriter w = null;
+                       try {
                                w = new OutputStreamWriter(fos, "UTF-8");
-                       } catch (UnsupportedEncodingException e2) {
+                       } catch(UnsupportedEncodingException e2) {
                                Closer.close(w);
                                throw new Error("Impossible: JVM doesn't 
support UTF-8: " + e2, e2);
                        }
-            BufferedWriter bw = new BufferedWriter(w);
-            try {
-               boolean succeeded = writePeers(bw, peers);
-                bw.close(); bw = null;
-                if(!succeeded) return;
-               
-               File fnam = new File(filename);
-               FileUtil.renameTo(new File(f), fnam);
-            } catch (IOException e) {
-               try {
-                       fos.close();
-               } catch (IOException e1) {
-                       Logger.error(this, "Cannot close peers file: "+e, e);
-               }
-                Logger.error(this, "Cannot write file: " + e, e);
-                return; // don't overwrite old file!
-            } finally {
-                   Closer.close(bw);
-                   Closer.close(fos);
-           }
-        }
-    }
+                       BufferedWriter bw = new BufferedWriter(w);
+                       try {
+                               boolean succeeded = writePeers(bw, peers);
+                               bw.close();
+                               bw = null;
+                               if(!succeeded)
+                                       return;

-    public boolean writePeers(Writer bw) {
-       if(!writePeers(bw, getDarknetPeers())) return false;
-       if(!writePeers(bw, getOpennetPeers())) return false;
-       return true;
-    }
-    
+                               File fnam = new File(filename);
+                               FileUtil.renameTo(new File(f), fnam);
+                       } catch(IOException e) {
+                               try {
+                                       fos.close();
+                               } catch(IOException e1) {
+                                       Logger.error(this, "Cannot close peers 
file: " + e, e);
+                               }
+                               Logger.error(this, "Cannot write file: " + e, 
e);
+                               return; // don't overwrite old file!
+                       } finally {
+                               Closer.close(bw);
+                               Closer.close(fos);
+                       }
+               }
+       }
+
+       public boolean writePeers(Writer bw) {
+               if(!writePeers(bw, getDarknetPeers()))
+                       return false;
+               if(!writePeers(bw, getOpennetPeers()))
+                       return false;
+               return true;
+       }
+
        public boolean writePeers(Writer bw, PeerNode[] peers) {
-        for (int i = 0; i < peers.length; i++) {
-            try {
-                peers[i].write(bw);
-                bw.flush();
-            } catch (IOException e) {
-                try {
-                    bw.close();
-                } catch (IOException e1) {
-                    Logger.error(this, "Cannot close file!: " + e1, e1);
-                }
-                Logger.error(this, "Cannot write peers to disk: " + e, e);
-                return false;
-            }
-        }
-        return true;
+               for(int i = 0; i < peers.length; i++) {
+                       try {
+                               peers[i].write(bw);
+                               bw.flush();
+                       } catch(IOException e) {
+                               try {
+                                       bw.close();
+                               } catch(IOException e1) {
+                                       Logger.error(this, "Cannot close file!: 
" + e1, e1);
+                               }
+                               Logger.error(this, "Cannot write peers to disk: 
" + e, e);
+                               return false;
+                       }
+               }
+               return true;
        }

        /**
@@ -1094,7 +1163,8 @@
         * Also run the node's onConnectedPeers() method if applicable
         */
        public void updatePMUserAlert() {
-               if(ua == null) return;
+               if(ua == null)
+                       return;
                int peers, darknetPeers, opennetPeers;
                synchronized(this) {
                        darknetPeers = this.getDarknetPeers().length;
@@ -1102,7 +1172,7 @@
                        peers = darknetPeers + opennetPeers; // Seednodes don't 
count.
                }
                OpennetManager om = node.getOpennet();
-               
+
                boolean opennetDefinitelyPortForwarded;
                boolean opennetEnabled;
                boolean opennetAssumeNAT;
@@ -1140,11 +1210,12 @@

        public boolean anyConnectedPeers() {
                PeerNode[] conns;
-               synchronized (this) {
+               synchronized(this) {
                        conns = connectedPeers;
                }
-               for(int i=0;i<conns.length;i++) {
-                       if(conns[i].isRoutable()) return true;
+               for(int i = 0; i < conns.length; i++) {
+                       if(conns[i].isRoutable())
+                               return true;
                }
                return false;
        }
@@ -1154,10 +1225,10 @@
         */
        public void readExtraPeerData() {
                DarknetPeerNode[] peers = getDarknetPeers();
-               for (int i = 0; i < peers.length; i++) {
+               for(int i = 0; i < peers.length; i++) {
                        try {
                                peers[i].readExtraPeerData();
-                       } catch (Exception e) {
+                       } catch(Exception e) {
                                Logger.error(this, "Got exception while reading 
extra peer data", e);
                        }
                }
@@ -1167,136 +1238,133 @@
        }

        public void start() {
-        ua = new PeerManagerUserAlert(node.nodeStats);
-        updatePMUserAlert();
+               ua = new PeerManagerUserAlert(node.nodeStats);
+               updatePMUserAlert();
                node.clientCore.alerts.register(ua);
        }
-       
+
        public int countNonBackedOffPeers() {
                PeerNode[] peers;
                synchronized(this) {
                        peers = connectedPeers; // even if myPeers peers are 
connected they won't be routed to
                }
                int countNoBackoff = 0;
-               for(int i=0;i<peers.length;i++) {
-                       if(peers[i].isRoutable()) {
-                               if(!peers[i].isRoutingBackedOff()) 
countNoBackoff++;
-                       }
+               for(int i = 0; i < peers.length; i++) {
+                       if(peers[i].isRoutable())
+                               if(!peers[i].isRoutingBackedOff())
+                                       countNoBackoff++;
                }
                return countNoBackoff;
        }
-       
        // Stats stuff
-       
        /**
         * Update oldestNeverConnectedPeerAge if the timer has expired
         */
        public void maybeUpdateOldestNeverConnectedPeerAge(long now) {
                synchronized(this) {
-                       if(now <= nextOldestNeverConnectedPeerAgeUpdateTime) 
return;
+                       if(now <= nextOldestNeverConnectedPeerAgeUpdateTime)
+                               return;
                        nextOldestNeverConnectedPeerAgeUpdateTime = now + 
oldestNeverConnectedPeerAgeUpdateInterval;
                }
                oldestNeverConnectedPeerAge = 0;
                PeerNode[] peerList = myPeers;
-               for(int i=0;i<peerList.length;i++) {
+               for(int i = 0; i < peerList.length; i++) {
                        PeerNode pn = peerList[i];
-                       if(pn.getPeerNodeStatus() == 
PEER_NODE_STATUS_NEVER_CONNECTED) {
-                               if((now - pn.getPeerAddedTime()) > 
oldestNeverConnectedPeerAge) {
+                       if(pn.getPeerNodeStatus() == 
PEER_NODE_STATUS_NEVER_CONNECTED)
+                               if((now - pn.getPeerAddedTime()) > 
oldestNeverConnectedPeerAge)
                                        oldestNeverConnectedPeerAge = now - 
pn.getPeerAddedTime();
-                               }
-                       }
                }
                if(oldestNeverConnectedPeerAge > 0 && logMINOR)
-                       Logger.minor(this, "Oldest never connected peer is 
"+oldestNeverConnectedPeerAge+"ms old");
+                       Logger.minor(this, "Oldest never connected peer is " + 
oldestNeverConnectedPeerAge + "ms old");
                nextOldestNeverConnectedPeerAgeUpdateTime = now + 
oldestNeverConnectedPeerAgeUpdateInterval;
        }

        public long getOldestNeverConnectedPeerAge() {
-         return oldestNeverConnectedPeerAge;
+               return oldestNeverConnectedPeerAge;
        }

        /**
         * Log the current PeerNode status summary if the timer has expired
         */
        public void maybeLogPeerNodeStatusSummary(long now) {
-         if(now > nextPeerNodeStatusLogTime) {
-               if((now - nextPeerNodeStatusLogTime) > (10*1000) && 
nextPeerNodeStatusLogTime > 0)
-                 Logger.error(this,"maybeLogPeerNodeStatusSummary() not called 
for more than 10 seconds ("+(now - nextPeerNodeStatusLogTime)+").  PacketSender 
getting bogged down or something?");
-               
-               int numberOfConnected = 0;
-               int numberOfRoutingBackedOff = 0;
-               int numberOfTooNew = 0;
-               int numberOfTooOld = 0;
-               int numberOfDisconnected = 0;
-               int numberOfNeverConnected = 0;
-               int numberOfDisabled = 0;
-               int numberOfListenOnly = 0;
-               int numberOfListening = 0;
-               int numberOfBursting = 0;
-               int numberOfClockProblem = 0;
-               int numberOfConnError = 0;
-               int numberOfDisconnecting = 0;
-               int numberOfRoutingDisabled = 0;
-               
-               PeerNodeStatus[] pns = getPeerNodeStatuses(true);
-               
-               for(int i=0; i<pns.length; i++){
-                       if(pns[i] == null) {
-                               Logger.error(this, 
"getPeerNodeStatuses(true)["+i+"] == null!");
-                               continue;
+               if(now > nextPeerNodeStatusLogTime) {
+                       if((now - nextPeerNodeStatusLogTime) > (10 * 1000) && 
nextPeerNodeStatusLogTime > 0)
+                               Logger.error(this, 
"maybeLogPeerNodeStatusSummary() not called for more than 10 seconds (" + (now 
- nextPeerNodeStatusLogTime) + ").  PacketSender getting bogged down or 
something?");
+
+                       int numberOfConnected = 0;
+                       int numberOfRoutingBackedOff = 0;
+                       int numberOfTooNew = 0;
+                       int numberOfTooOld = 0;
+                       int numberOfDisconnected = 0;
+                       int numberOfNeverConnected = 0;
+                       int numberOfDisabled = 0;
+                       int numberOfListenOnly = 0;
+                       int numberOfListening = 0;
+                       int numberOfBursting = 0;
+                       int numberOfClockProblem = 0;
+                       int numberOfConnError = 0;
+                       int numberOfDisconnecting = 0;
+                       int numberOfRoutingDisabled = 0;
+
+                       PeerNodeStatus[] pns = getPeerNodeStatuses(true);
+
+                       for(int i = 0; i < pns.length; i++) {
+                               if(pns[i] == null) {
+                                       Logger.error(this, 
"getPeerNodeStatuses(true)[" + i + "] == null!");
+                                       continue;
+                               }
+                               switch(pns[i].getStatusValue()) {
+                                       case PEER_NODE_STATUS_CONNECTED:
+                                               numberOfConnected++;
+                                               break;
+                                       case 
PEER_NODE_STATUS_ROUTING_BACKED_OFF:
+                                               numberOfRoutingBackedOff++;
+                                               break;
+                                       case PEER_NODE_STATUS_TOO_NEW:
+                                               numberOfTooNew++;
+                                               break;
+                                       case PEER_NODE_STATUS_TOO_OLD:
+                                               numberOfTooOld++;
+                                               break;
+                                       case PEER_NODE_STATUS_DISCONNECTED:
+                                               numberOfDisconnected++;
+                                               break;
+                                       case PEER_NODE_STATUS_NEVER_CONNECTED:
+                                               numberOfNeverConnected++;
+                                               break;
+                                       case PEER_NODE_STATUS_DISABLED:
+                                               numberOfDisabled++;
+                                               break;
+                                       case PEER_NODE_STATUS_LISTEN_ONLY:
+                                               numberOfListenOnly++;
+                                               break;
+                                       case PEER_NODE_STATUS_LISTENING:
+                                               numberOfListening++;
+                                               break;
+                                       case PEER_NODE_STATUS_BURSTING:
+                                               numberOfBursting++;
+                                               break;
+                                       case PEER_NODE_STATUS_CLOCK_PROBLEM:
+                                               numberOfClockProblem++;
+                                               break;
+                                       case PEER_NODE_STATUS_CONN_ERROR:
+                                               numberOfConnError++;
+                                               break;
+                                       case PEER_NODE_STATUS_DISCONNECTING:
+                                               numberOfDisconnecting++;
+                                               break;
+                                       case PEER_NODE_STATUS_ROUTING_DISABLED:
+                                               numberOfRoutingDisabled++;
+                                               break;
+                                       default:
+                                               Logger.error(this, "Unknown 
peer status value : " + pns[i].getStatusValue());
+                                               break;
+                               }
                        }
-                       switch (pns[i].getStatusValue()) {
-                       case PEER_NODE_STATUS_CONNECTED:
-                               numberOfConnected++;
-                               break;
-                       case PEER_NODE_STATUS_ROUTING_BACKED_OFF:
-                               numberOfRoutingBackedOff++;
-                               break;
-                       case PEER_NODE_STATUS_TOO_NEW:
-                               numberOfTooNew++;
-                               break;
-                       case PEER_NODE_STATUS_TOO_OLD:
-                               numberOfTooOld++;
-                               break;
-                       case PEER_NODE_STATUS_DISCONNECTED:
-                               numberOfDisconnected++;
-                               break;
-                       case PEER_NODE_STATUS_NEVER_CONNECTED:
-                               numberOfNeverConnected++;
-                               break;
-                       case PEER_NODE_STATUS_DISABLED:
-                               numberOfDisabled++;
-                               break;
-                       case PEER_NODE_STATUS_LISTEN_ONLY:
-                               numberOfListenOnly++;
-                               break;
-                       case PEER_NODE_STATUS_LISTENING:
-                               numberOfListening++;
-                               break;
-                       case PEER_NODE_STATUS_BURSTING:
-                               numberOfBursting++;
-                               break;
-                       case PEER_NODE_STATUS_CLOCK_PROBLEM:
-                               numberOfClockProblem++;
-                               break;
-                       case PEER_NODE_STATUS_CONN_ERROR:
-                               numberOfConnError++;
-                               break;
-                       case PEER_NODE_STATUS_DISCONNECTING:
-                               numberOfDisconnecting++;
-                               break;
-                       case PEER_NODE_STATUS_ROUTING_DISABLED:
-                               numberOfRoutingDisabled++;
-                               break;
-                       default:
-                               Logger.error(this, "Unknown peer status value : 
"+pns[i].getStatusValue());
-                               break;
-                       }
+                       Logger.normal(this, "Connected: " + numberOfConnected + 
"  Routing Backed Off: " + numberOfRoutingBackedOff + "  Too New: " + 
numberOfTooNew + "  Too Old: " + numberOfTooOld + "  Disconnected: " + 
numberOfDisconnected + "  Never Connected: " + numberOfNeverConnected + "  
Disabled: " + numberOfDisabled + "  Bursting: " + numberOfBursting + "  
Listening: " + numberOfListening + "  Listen Only: " + numberOfListenOnly + "  
Clock Problem: " + numberOfClockProblem + "  Connection Problem: " + 
numberOfConnError + "  Disconnecting: " + numberOfDisconnecting);
+                       nextPeerNodeStatusLogTime = now + 
peerNodeStatusLogInterval;
+                       node.displayClockProblemUserAlert(numberOfClockProblem 
> 2);
                }
-               Logger.normal(this, "Connected: "+numberOfConnected+"  Routing 
Backed Off: "+numberOfRoutingBackedOff+"  Too New: "+numberOfTooNew+"  Too Old: 
"+numberOfTooOld+"  Disconnected: "+numberOfDisconnected+"  Never Connected: 
"+numberOfNeverConnected+"  Disabled: "+numberOfDisabled+"  Bursting: 
"+numberOfBursting+"  Listening: "+numberOfListening+"  Listen Only: 
"+numberOfListenOnly+"  Clock Problem: "+numberOfClockProblem+"  Connection 
Problem: "+numberOfConnError+"  Disconnecting: "+numberOfDisconnecting);
-               nextPeerNodeStatusLogTime = now + peerNodeStatusLogInterval;
-               node.displayClockProblemUserAlert(numberOfClockProblem > 2);
-               }
        }

        /**
@@ -1315,14 +1383,15 @@
                        if(statuses.containsKey(peerNodeStatus)) {
                                statusSet = (HashSet) 
statuses.get(peerNodeStatus);
                                if(statusSet.contains(peerNode)) {
-                                       if(!noLog) Logger.error(this, 
"addPeerNodeStatus(): node already in peerNodeStatuses: "+peerNode+" status 
"+PeerNode.getPeerNodeStatusString(peerNodeStatus.intValue()));
+                                       if(!noLog)
+                                               Logger.error(this, 
"addPeerNodeStatus(): node already in peerNodeStatuses: " + peerNode + " status 
" + PeerNode.getPeerNodeStatusString(peerNodeStatus.intValue()));
                                        return;
                                }
                                statuses.remove(peerNodeStatus);
-                       } else {
+                       } else
                                statusSet = new HashSet();
-                       }
-                       if(logMINOR) Logger.minor(this, "addPeerNodeStatus(): 
adding PeerNode for '"+peerNode.getIdentityString()+"' with status 
'"+PeerNode.getPeerNodeStatusString(peerNodeStatus.intValue())+"'");
+                       if(logMINOR)
+                               Logger.minor(this, "addPeerNodeStatus(): adding 
PeerNode for '" + peerNode.getIdentityString() + "' with status '" + 
PeerNode.getPeerNodeStatusString(peerNodeStatus.intValue()) + "'");
                        statusSet.add(peerNode);
                        statuses.put(peerNodeStatus, statusSet);
                }
@@ -1337,11 +1406,10 @@
                HashSet statusSet = null;
                HashMap statuses = darknet ? peerNodeStatusesDarknet : 
this.peerNodeStatuses;
                synchronized(statuses) {
-                       if(statuses.containsKey(peerNodeStatus)) {
+                       if(statuses.containsKey(peerNodeStatus))
                                statusSet = (HashSet) 
statuses.get(peerNodeStatus);
-                       } else {
+                       else
                                statusSet = new HashSet();
-                       }
                        return statusSet.size();
                }
        }
@@ -1364,18 +1432,17 @@
                                statusSet = (HashSet) 
statuses.get(peerNodeStatus);
                                if(!statusSet.contains(peerNode)) {
                                        if(!noLog)
-                                               Logger.error(this, 
"removePeerNodeStatus(): identity '"+peerNode.getIdentityString()+" for 
"+peerNode.shortToString()+"' not in peerNodeStatuses with status 
'"+PeerNode.getPeerNodeStatusString(peerNodeStatus.intValue())+"'", new 
Exception("debug"));
+                                               Logger.error(this, 
"removePeerNodeStatus(): identity '" + peerNode.getIdentityString() + " for " + 
peerNode.shortToString() + "' not in peerNodeStatuses with status '" + 
PeerNode.getPeerNodeStatusString(peerNodeStatus.intValue()) + "'", new 
Exception("debug"));
                                        return;
                                }
                                if(statuses.isEmpty())
                                        statuses.remove(peerNodeStatus);
-                       } else {
+                       } else
                                statusSet = new HashSet();
-                       }
-                       if(logMINOR) Logger.minor(this, 
"removePeerNodeStatus(): removing PeerNode for 
'"+peerNode.getIdentityString()+"' with status 
'"+PeerNode.getPeerNodeStatusString(peerNodeStatus.intValue())+"'");
-                       if(statusSet.contains(peerNode)) {
+                       if(logMINOR)
+                               Logger.minor(this, "removePeerNodeStatus(): 
removing PeerNode for '" + peerNode.getIdentityString() + "' with status '" + 
PeerNode.getPeerNodeStatusString(peerNodeStatus.intValue()) + "'");
+                       if(statusSet.contains(peerNode))
                                statusSet.remove(peerNode);
-                       }
                }
        }

@@ -1388,31 +1455,31 @@
                        
if(peerNodeRoutingBackoffReasons.containsKey(peerNodeRoutingBackoffReason)) {
                                reasonSet = (HashSet) 
peerNodeRoutingBackoffReasons.get(peerNodeRoutingBackoffReason);
                                if(reasonSet.contains(peerNode)) {
-                                       Logger.error(this, 
"addPeerNodeRoutingBackoffReason(): identity '"+peerNode.getIdentityString()+"' 
already in peerNodeRoutingBackoffReasons as "+peerNode.getPeer()+" with status 
code "+peerNodeRoutingBackoffReason);
+                                       Logger.error(this, 
"addPeerNodeRoutingBackoffReason(): identity '" + peerNode.getIdentityString() 
+ "' already in peerNodeRoutingBackoffReasons as " + peerNode.getPeer() + " 
with status code " + peerNodeRoutingBackoffReason);
                                        return;
                                }
                                
peerNodeRoutingBackoffReasons.remove(peerNodeRoutingBackoffReason);
-                       } else {
+                       } else
                                reasonSet = new HashSet();
-                       }
-                       if(logMINOR) Logger.minor(this, 
"addPeerNodeRoutingBackoffReason(): adding PeerNode for 
'"+peerNode.getIdentityString()+"' with status code 
"+peerNodeRoutingBackoffReason);
+                       if(logMINOR)
+                               Logger.minor(this, 
"addPeerNodeRoutingBackoffReason(): adding PeerNode for '" + 
peerNode.getIdentityString() + "' with status code " + 
peerNodeRoutingBackoffReason);
                        reasonSet.add(peerNode);
                        
peerNodeRoutingBackoffReasons.put(peerNodeRoutingBackoffReason, reasonSet);
                }
        }
-       
+
        /**
         * What are the currently tracked PeerNode routing backoff reasons?
         */
-       public String [] getPeerNodeRoutingBackoffReasons() {
-               String [] reasonStrings;
+       public String[] getPeerNodeRoutingBackoffReasons() {
+               String[] reasonStrings;
                synchronized(peerNodeRoutingBackoffReasons) {
-                       reasonStrings = (String []) 
peerNodeRoutingBackoffReasons.keySet().toArray(new 
String[peerNodeRoutingBackoffReasons.size()]);
+                       reasonStrings = (String[]) 
peerNodeRoutingBackoffReasons.keySet().toArray(new 
String[peerNodeRoutingBackoffReasons.size()]);
                }
                Arrays.sort(reasonStrings);
                return reasonStrings;
        }
-       
+
        /**
         * How many PeerNodes have a particular routing backoff reason?
         */
@@ -1422,9 +1489,8 @@
                        
if(peerNodeRoutingBackoffReasons.containsKey(peerNodeRoutingBackoffReason)) {
                                reasonSet = (HashSet) 
peerNodeRoutingBackoffReasons.get(peerNodeRoutingBackoffReason);
                                return reasonSet.size();
-                       } else {
+                       } else
                                return 0;
-                       }
                }
        }

@@ -1437,48 +1503,46 @@
                        
if(peerNodeRoutingBackoffReasons.containsKey(peerNodeRoutingBackoffReason)) {
                                reasonSet = (HashSet) 
peerNodeRoutingBackoffReasons.get(peerNodeRoutingBackoffReason);
                                if(!reasonSet.contains(peerNode)) {
-                                       Logger.error(this, 
"removePeerNodeRoutingBackoffReason(): identity 
'"+peerNode.getIdentityString()+"' not in peerNodeRoutingBackoffReasons with 
status code "+peerNodeRoutingBackoffReason, new Exception("debug"));
+                                       Logger.error(this, 
"removePeerNodeRoutingBackoffReason(): identity '" + 
peerNode.getIdentityString() + "' not in peerNodeRoutingBackoffReasons with 
status code " + peerNodeRoutingBackoffReason, new Exception("debug"));
                                        return;
                                }
                                
peerNodeRoutingBackoffReasons.remove(peerNodeRoutingBackoffReason);
-                       } else {
+                       } else
                                reasonSet = new HashSet();
-                       }
-                       if(logMINOR) Logger.minor(this, 
"removePeerNodeRoutingBackoffReason(): removing PeerNode for 
'"+peerNode.getIdentityString()+"' with status code 
"+peerNodeRoutingBackoffReason);
-                       if(reasonSet.contains(peerNode)) {
+                       if(logMINOR)
+                               Logger.minor(this, 
"removePeerNodeRoutingBackoffReason(): removing PeerNode for '" + 
peerNode.getIdentityString() + "' with status code " + 
peerNodeRoutingBackoffReason);
+                       if(reasonSet.contains(peerNode))
                                reasonSet.remove(peerNode);
-                       }
-                       if(reasonSet.size() > 0) {
+                       if(reasonSet.size() > 0)
                                
peerNodeRoutingBackoffReasons.put(peerNodeRoutingBackoffReason, reasonSet);
-                       }
                }
        }

        public PeerNodeStatus[] getPeerNodeStatuses(boolean noHeavy) {
-        PeerNode[] peers;
-        synchronized (this) {
+               PeerNode[] peers;
+               synchronized(this) {
                        peers = myPeers;
                }
                PeerNodeStatus[] _peerNodeStatuses = new 
PeerNodeStatus[peers.length];
-               for (int peerIndex = 0, peerCount = peers.length; peerIndex < 
peerCount; peerIndex++) {
+               for(int peerIndex = 0, peerCount = peers.length; peerIndex < 
peerCount; peerIndex++) {
                        _peerNodeStatuses[peerIndex] = 
peers[peerIndex].getStatus(noHeavy);
                }
                return _peerNodeStatuses;
        }

        public DarknetPeerNodeStatus[] getDarknetPeerNodeStatuses(boolean 
noHeavy) {
-        DarknetPeerNode[] peers = getDarknetPeers();
+               DarknetPeerNode[] peers = getDarknetPeers();
                DarknetPeerNodeStatus[] _peerNodeStatuses = new 
DarknetPeerNodeStatus[peers.length];
-               for (int peerIndex = 0, peerCount = peers.length; peerIndex < 
peerCount; peerIndex++) {
+               for(int peerIndex = 0, peerCount = peers.length; peerIndex < 
peerCount; peerIndex++) {
                        _peerNodeStatuses[peerIndex] = (DarknetPeerNodeStatus) 
peers[peerIndex].getStatus(noHeavy);
                }
                return _peerNodeStatuses;
        }

        public OpennetPeerNodeStatus[] getOpennetPeerNodeStatuses(boolean 
noHeavy) {
-        OpennetPeerNode[] peers = getOpennetPeers();
+               OpennetPeerNode[] peers = getOpennetPeers();
                OpennetPeerNodeStatus[] _peerNodeStatuses = new 
OpennetPeerNodeStatus[peers.length];
-               for (int peerIndex = 0, peerCount = peers.length; peerIndex < 
peerCount; peerIndex++) {
+               for(int peerIndex = 0, peerCount = peers.length; peerIndex < 
peerCount; peerIndex++) {
                        _peerNodeStatuses[peerIndex] = (OpennetPeerNodeStatus) 
peers[peerIndex].getStatus(noHeavy);
                }
                return _peerNodeStatuses;
@@ -1489,16 +1553,17 @@
         */
        public void maybeUpdatePeerNodeRoutableConnectionStats(long now) {
                synchronized(this) {
-                       if(now <= nextRoutableConnectionStatsUpdateTime) return;
+                       if(now <= nextRoutableConnectionStatsUpdateTime)
+                               return;
                        nextRoutableConnectionStatsUpdateTime = now + 
routableConnectionStatsUpdateInterval;
                }
-               if(-1 != nextRoutableConnectionStatsUpdateTime) {
+               if(-1 != nextRoutableConnectionStatsUpdateTime) {
                        PeerNode[] peerList = myPeers;
-                       for(int i=0;i<peerList.length;i++) {
+                       for(int i = 0; i < peerList.length; i++) {
                                PeerNode pn = peerList[i];
                                pn.checkRoutableConnectionStatus();
                        }
-               }
+               }
        }

        /**
@@ -1512,38 +1577,38 @@
                }
                // FIXME optimise! Maybe maintain as a separate list?
                Vector v = new Vector(myPeers.length);
-               for(int i=0;i<peers.length;i++) {
+               for(int i = 0; i < peers.length; i++) {
                        if(peers[i] instanceof DarknetPeerNode)
                                v.add(peers[i]);
                }
-               return (DarknetPeerNode[])v.toArray(new 
DarknetPeerNode[v.size()]);
+               return (DarknetPeerNode[]) v.toArray(new 
DarknetPeerNode[v.size()]);
        }

-       public Vector getConnectedSeedServerPeersVector(HashSet exclude) {
+       public Vector<SeedServerPeerNode> 
getConnectedSeedServerPeersVector(HashSet exclude) {
                PeerNode[] peers;
                synchronized(this) {
                        peers = myPeers;
                }
                // FIXME optimise! Maybe maintain as a separate list?
-               Vector v = new Vector(myPeers.length);
-               for(int i=0;i<peers.length;i++) {
+               Vector<SeedServerPeerNode> v = new 
Vector<SeedServerPeerNode>(myPeers.length);
+               for(int i = 0; i < peers.length; i++) {
                        if(peers[i] instanceof SeedServerPeerNode) {
                                if(exclude != null && 
exclude.contains(peers[i].getIdentity())) {
                                        if(logMINOR)
-                                               Logger.minor(this, "Not 
including in getConnectedSeedServerPeersVector() as in exclude set: 
"+peers[i].userToString());
+                                               Logger.minor(this, "Not 
including in getConnectedSeedServerPeersVector() as in exclude set: " + 
peers[i].userToString());
                                        continue;
                                }
                                if(!peers[i].isConnected()) {
                                        if(logMINOR)
-                                               Logger.minor(this, "Not 
including in getConnectedSeedServerPeersVector() as disconnected: 
"+peers[i].userToString());
+                                               Logger.minor(this, "Not 
including in getConnectedSeedServerPeersVector() as disconnected: " + 
peers[i].userToString());
                                        continue;
                                }
-                               v.add(peers[i]);
+                               v.add((SeedServerPeerNode)peers[i]);
                        }
                }
                return v;
        }
-       
+
        public Vector getSeedServerPeersVector() {
                PeerNode[] peers;
                synchronized(this) {
@@ -1551,14 +1616,13 @@
                }
                // FIXME optimise! Maybe maintain as a separate list?
                Vector v = new Vector(myPeers.length);
-               for(int i=0;i<peers.length;i++) {
-                       if(peers[i] instanceof SeedServerPeerNode) {
+               for(int i = 0; i < peers.length; i++) {
+                       if(peers[i] instanceof SeedServerPeerNode)
                                v.add(peers[i]);
-                       }
                }
                return v;
        }
-       
+
        /**
         * Get the opennet peers list.
         */
@@ -1569,11 +1633,11 @@
                }
                // FIXME optimise! Maybe maintain as a separate list?
                Vector v = new Vector(myPeers.length);
-               for(int i=0;i<peers.length;i++) {
+               for(int i = 0; i < peers.length; i++) {
                        if(peers[i] instanceof OpennetPeerNode)
                                v.add(peers[i]);
                }
-               return (OpennetPeerNode[])v.toArray(new 
OpennetPeerNode[v.size()]);
+               return (OpennetPeerNode[]) v.toArray(new 
OpennetPeerNode[v.size()]);
        }

        public boolean anyConnectedPeerHasAddress(FreenetInetAddress addr, 
PeerNode pn) {
@@ -1581,12 +1645,16 @@
                synchronized(this) {
                        peers = myPeers;
                }
-               for(int i=0;i<peers.length;i++) {
-                       if(peers[i] == pn) continue;
-                       if(!peers[i].isConnected()) continue;
-                       if(!peers[i].isRealConnection()) continue; // Ignore 
non-searchable peers i.e. bootstrapping peers
+               for(int i = 0; i < peers.length; i++) {
+                       if(peers[i] == pn)
+                               continue;
+                       if(!peers[i].isConnected())
+                               continue;
+                       if(!peers[i].isRealConnection())
+                               continue; // Ignore non-searchable peers i.e. 
bootstrapping peers
                        // If getPeer() is null then presumably !isConnected().
-                       if(peers[i].getPeer().getFreenetAddress().equals(addr)) 
return true;
+                       if(peers[i].getPeer().getFreenetAddress().equals(addr))
+                               return true;
                }
                return false;
        }
@@ -1595,11 +1663,13 @@
                synchronized(this) {
                        Vector keep = new Vector();
                        Vector conn = new Vector();
-                       for(int i=0;i<myPeers.length;i++) {
+                       for(int i = 0; i < myPeers.length; i++) {
                                PeerNode pn = myPeers[i];
-                               if(pn instanceof OpennetPeerNode) continue;
+                               if(pn instanceof OpennetPeerNode)
+                                       continue;
                                keep.add(pn);
-                               if(pn.isConnected()) conn.add(pn);
+                               if(pn.isConnected())
+                                       conn.add(pn);
                        }
                        myPeers = (PeerNode[]) keep.toArray(new 
PeerNode[keep.size()]);
                        connectedPeers = (PeerNode[]) keep.toArray(new 
PeerNode[conn.size()]);
@@ -1608,78 +1678,98 @@
        }

        public PeerNode containsPeer(PeerNode pn) {
-               PeerNode[] peers = pn.isOpennet() ? 
((PeerNode[])getOpennetPeers()) : ((PeerNode[])getDarknetPeers());
-               
-               for(int i=0;i<peers.length;i++)
-                       if(Arrays.equals(pn.getIdentity(), 
peers[i].getIdentity())) return peers[i];
-               
+               PeerNode[] peers = pn.isOpennet() ? ((PeerNode[]) 
getOpennetPeers()) : ((PeerNode[]) getDarknetPeers());
+
+               for(int i = 0; i < peers.length; i++)
+                       if(Arrays.equals(pn.getIdentity(), 
peers[i].getIdentity()))
+                               return peers[i];
+
                return null;
        }

        public int quickCountConnectedPeers() {
                PeerNode[] conns = connectedPeers;
-               if(conns == null) return 0;
+               if(conns == null)
+                       return 0;
                return connectedPeers.length;
        }

        public int countConnectedDarknetPeers() {
                int count = 0;
                PeerNode[] peers = myPeers;
-               for(int i=0;i<peers.length;i++) {
-                       if(peers[i] == null) continue;
-                       if(!(peers[i] instanceof DarknetPeerNode)) continue;
-                       if(peers[i].isOpennet()) continue;
-                       if(!peers[i].isRoutable()) continue;
+               for(int i = 0; i < peers.length; i++) {
+                       if(peers[i] == null)
+                               continue;
+                       if(!(peers[i] instanceof DarknetPeerNode))
+                               continue;
+                       if(peers[i].isOpennet())
+                               continue;
+                       if(!peers[i].isRoutable())
+                               continue;
                        count++;
                }
                return count;
        }
-       
+
        public int countConnectedPeers() {
                int count = 0;
                PeerNode[] peers = myPeers;
-               for(int i=0;i<peers.length;i++) {
-                       if(peers[i] == null) continue;
-                       if(!peers[i].isRoutable()) continue;
+               for(int i = 0; i < peers.length; i++) {
+                       if(peers[i] == null)
+                               continue;
+                       if(!peers[i].isRoutable())
+                               continue;
                        count++;
                }
                return count;
        }
-       
+
        public int countAlmostConnectedDarknetPeers() {
                int count = 0;
                PeerNode[] peers = myPeers;
-               for(int i=0;i<peers.length;i++) {
-                       if(peers[i] == null) continue;
-                       if(!(peers[i] instanceof DarknetPeerNode)) continue;
-                       if(peers[i].isOpennet()) continue;
-                       if(!peers[i].isConnected()) continue;
+               for(int i = 0; i < peers.length; i++) {
+                       if(peers[i] == null)
+                               continue;
+                       if(!(peers[i] instanceof DarknetPeerNode))
+                               continue;
+                       if(peers[i].isOpennet())
+                               continue;
+                       if(!peers[i].isConnected())
+                               continue;
                        count++;
                }
                return count;
        }
-       
+
        public int countCompatibleDarknetPeers() {
                int count = 0;
                PeerNode[] peers = myPeers;
-               for(int i=0;i<peers.length;i++) {
-                       if(peers[i] == null) continue;
-                       if(!(peers[i] instanceof DarknetPeerNode)) continue;
-                       if(peers[i].isOpennet()) continue;
-                       if(!peers[i].isConnected()) continue;
-                       if(!peers[i].isRoutingCompatible()) continue;
+               for(int i = 0; i < peers.length; i++) {
+                       if(peers[i] == null)
+                               continue;
+                       if(!(peers[i] instanceof DarknetPeerNode))
+                               continue;
+                       if(peers[i].isOpennet())
+                               continue;
+                       if(!peers[i].isConnected())
+                               continue;
+                       if(!peers[i].isRoutingCompatible())
+                               continue;
                        count++;
                }
                return count;
        }
-       
+
        public int countConnectedOpennetPeers() {
                int count = 0;
                PeerNode[] peers = connectedPeers;
-               for(int i=0;i<peers.length;i++) {
-                       if(peers[i] == null) continue;
-                       if(!(peers[i] instanceof OpennetPeerNode)) continue;
-                       if(!peers[i].isRoutable()) continue;
+               for(int i = 0; i < peers.length; i++) {
+                       if(peers[i] == null)
+                               continue;
+                       if(!(peers[i] instanceof OpennetPeerNode))
+                               continue;
+                       if(!peers[i].isRoutable())
+                               continue;
                        count++;
                }
                return count;
@@ -1691,33 +1781,50 @@
        public int countValidPeers() {
                PeerNode[] peers = myPeers;
                int count = 0;
-               for(int i=0;i<peers.length;i++) {
-                       if(!peers[i].isRealConnection()) continue;
-                       if(peers[i].isDisabled()) continue;
+               for(int i = 0; i < peers.length; i++) {
+                       if(!peers[i].isRealConnection())
+                               continue;
+                       if(peers[i].isDisabled())
+                               continue;
                        count++;
                }
                return count;
        }
+       
+       public int countSeednodes() {
+               int count = 0;
+               for(PeerNode peer : myPeers) {
+                       if(peer instanceof SeedServerPeerNode || 
+                                       peer instanceof SeedClientPeerNode)
+                               count++;
+               }
+               return count;
+       }

        public int countBackedOffPeers() {
                PeerNode[] peers = myPeers;
                int count = 0;
-               for(int i=0;i<peers.length;i++) {
-                       if(!peers[i].isRealConnection()) continue;
-                       if(peers[i].isDisabled()) continue;
+               for(int i = 0; i < peers.length; i++) {
+                       if(!peers[i].isRealConnection())
+                               continue;
+                       if(peers[i].isDisabled())
+                               continue;
                        if(peers[i].isRoutingBackedOff())
                                count++;
                }
                return count;
        }
-       
+
        public PeerNode getByIdentity(byte[] identity) {
                PeerNode[] peers = myPeers;
-               for(int i=0;i<peers.length;i++) {
+               for(int i = 0; i < peers.length; i++) {
                        if(Arrays.equals(peers[i].getIdentity(), identity))
                                return peers[i];
                }
                return null;
        }
-
+       
+       public long getNumberOfSelectionSamples() {
+               return numberOfSelectionSamples;
+       }
 }

Modified: branches/db4o/freenet/src/freenet/node/PeerNode.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/PeerNode.java        2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/PeerNode.java        2008-08-07 
18:30:55 UTC (rev 21657)
@@ -74,6 +74,7 @@
 import freenet.support.math.TimeDecayingRunningAverage;
 import freenet.support.transport.ip.HostnameSyntaxException;
 import freenet.support.transport.ip.IPUtil;
+import java.util.Collection;

 /**
  * @author amphibian
@@ -142,12 +143,17 @@
        private long timeLastSentPacket;
        /** When did we last receive a packet? */
        private long timeLastReceivedPacket;
+       /** When did we last receive a non-auth packet? */
+       private long timeLastReceivedDataPacket;
        /** When was isConnected() last true? */
        private long timeLastConnected;
        /** When was isRoutingCompatible() last true? */
        private long timeLastRoutable;
        /** Time added or restarted (reset on startup unlike peerAddedTime) */
        private long timeAddedOrRestarted;
+       /** Number of time that peer has been selected by the routing algorithm 
*/
+       private long numberOfSelections = 0;
+       
        /** Are we connected? If not, we need to start trying to
        * handshake.
        */
@@ -169,6 +175,8 @@
        private static final int MAX_HANDSHAKE_COUNT = 2;
        /** Current location in the keyspace, or -1 if it is unknown */
        private double currentLocation;
+       /** Current locations of our peer's peers */
+       private double[] currentPeersLocation;
        /** Time the location was set */
        private long locSetTime;
        /** Node identity; for now a block of data, in future a
@@ -323,6 +331,12 @@
        protected NodeCrypto crypto;

        /**
+        * Some alchemy we use in PeerNode.shouldBeExcludedFromPeerList()
+        */
+       public static final int BLACK_MAGIC_BACKOFF_PRUNING_TIME = 5 * 60 * 
1000;
+       public static final double BLACK_MAGIC_BACKOFF_PRUNING_PERCENTAGE = 0.9;
+       
+       /**
         * For FNP link setup:
         *  The initiator has to ensure that nonces send back by the
         *  responder in message2 match what was chosen in message 1
@@ -373,8 +387,15 @@
                        throw new FSParseException("Invalid version "+version+" 
: "+e2);
                }
                String locationString = fs.get("location");
+               String[] peerLocationsString = fs.getAll("peersLocation");
                try {
                        currentLocation = Location.getLocation(locationString);
+                       if(peerLocationsString != null) {
+                               double[] peerLocations = new 
double[peerLocationsString.length];
+                               for(int i = 0; i < peerLocationsString.length; 
i++)
+                                       peerLocations[i] = 
Location.getLocation(peerLocationsString[i]);
+                               currentPeersLocation = peerLocations;
+                       }
                        locSetTime = System.currentTimeMillis();
                } catch(FSParseException e) {
                        // Wait for them to send us an FNPLocChangeNotification
@@ -901,6 +922,22 @@
        public synchronized double getLocation() {
                return currentLocation;
        }
+       
+       public boolean shouldBeExcludedFromPeerList() {
+               long now = System.currentTimeMillis();
+               synchronized(this) {
+                       if(BLACK_MAGIC_BACKOFF_PRUNING_PERCENTAGE < 
backedOffPercent.currentValue())
+                               return true;
+                       else if(BLACK_MAGIC_BACKOFF_PRUNING_TIME + now < 
getRoutingBackedOffUntil())
+                               return true;
+                       else
+                               return false;
+               }
+       }
+       
+       public synchronized  double[] getPeersLocation() {
+               return currentPeersLocation;
+       }

        public synchronized long getLocSetTime() {
                return locSetTime;
@@ -1070,6 +1107,10 @@
        public synchronized long lastReceivedPacketTime() {
                return timeLastReceivedPacket;
        }
+       
+       public synchronized long lastReceivedDataPacketTime() {
+               return timeLastReceivedDataPacket;
+       }

        public synchronized long timeLastConnected() {
                return timeLastConnected;
@@ -1136,7 +1177,7 @@
        */
        public boolean disconnected(boolean dumpMessageQueue, boolean 
dumpTrackers) {
                final long now = System.currentTimeMillis();
-               Logger.normal(this, "Disconnected " + this);
+               Logger.normal(this, "Disconnected " + this, new 
Exception("debug"));
                node.usm.onDisconnect(this);
                node.failureTable.onDisconnect(this);
                node.peers.disconnected(this);
@@ -1460,7 +1501,7 @@
        */
        public boolean ping(int pingID) throws NotConnectedException {
                Message ping = DMT.createFNPPing(pingID);
-               node.usm.send(this, ping, null);
+               node.usm.send(this, ping, node.dispatcher.pingCounter);
                Message msg;
                try {
                        msg = 
node.usm.waitFor(MessageFilter.create().setTimeout(2000).setType(DMT.FNPPong).setField(DMT.PING_SEQNO,
 pingID), null);
@@ -1569,11 +1610,12 @@

        /**
        * Update the Location to a new value.
+       * @deprecated
        */
        public void updateLocation(double newLoc) {
                logMINOR = Logger.shouldLog(Logger.MINOR, PeerNode.class);
                if(newLoc < 0.0 || newLoc > 1.0) {
-                       Logger.error(this, "Invalid location update for " + 
this, new Exception("error"));
+                       Logger.error(this, "Invalid location update for " + 
this+ " ("+newLoc+')', new Exception("error"));
                        // Ignore it
                        return;
                }
@@ -1583,7 +1625,34 @@
                }
                node.peers.writePeers();
        }
+       
+       public void updateLocation(double newLoc, double[] newLocs) {
+               logMINOR = Logger.shouldLog(Logger.MINOR, PeerNode.class);
+               
+               if(newLoc < 0.0 || newLoc > 1.0) {
+                       Logger.error(this, "Invalid location update for " + 
this+ " ("+newLoc+')', new Exception("error"));
+                       // Ignore it
+                       return;
+               }
+               
+               for(double currentLoc : newLocs) {
+                       if(currentLoc < 0.0 || currentLoc > 1.0) {
+                               Logger.error(this, "Invalid location update for 
" + this + " ("+currentLoc+')', new Exception("error"));
+                               // Ignore it
+                               return;
+                       }
+               }

+               Arrays.sort(newLocs);
+               
+               synchronized(this) {
+                       currentLocation = newLoc;
+                       currentPeersLocation = newLocs;
+                       locSetTime = System.currentTimeMillis();
+               }
+               node.peers.writePeers();
+       }
+
        /**
        * Should we reject a swap request?
        */
@@ -1702,8 +1771,9 @@
        * @throws NotConnectedException 
        * @param dontLog If true, don't log an error or throw an exception if 
we are not connected. This
        * can be used in handshaking when the connection hasn't been verified 
yet.
+       * @param dataPacket If this is a real packet, as opposed to a handshake 
packet.
        */
-       void receivedPacket(boolean dontLog) {
+       void receivedPacket(boolean dontLog, boolean dataPacket) {
                synchronized(this) {
                        if((!isConnected) && (!dontLog)) {
                                // Don't log if we are disconnecting, because 
receiving packets during disconnecting is normal.
@@ -1722,6 +1792,8 @@
                long now = System.currentTimeMillis();
                synchronized(this) {
                        timeLastReceivedPacket = now;
+                       if(dataPacket)
+                               timeLastReceivedDataPacket = now;
                }
        }

@@ -1853,6 +1925,7 @@
                                        messagesTellDisconnected = 
(MessageItem[]) messagesToSendNow.toArray(new 
MessageItem[messagesToSendNow.size()]);
                                        messagesToSendNow.clear();
                                }
+                               this.offeredMainJarVersion = 0;
                        } // else it's a rekey
                        if(unverified) {
                                if(unverifiedTracker != null) {
@@ -1912,7 +1985,7 @@
                        " old: " + previousTracker + " unverified: " + 
unverifiedTracker + " bootID: " + thisBootID + " for " + shortToString());

                // Received a packet
-               receivedPacket(unverified);
+               receivedPacket(unverified, false);

                setPeerNodeStatus(now);

@@ -2036,7 +2109,9 @@
        * Send any high level messages that need to be sent on connect.
        */
        protected void sendInitialMessages() {
-               Message locMsg = 
DMT.createFNPLocChangeNotification(node.lm.getLocation());
+               Message locMsg = ((getVersionNumber() > 1153) ?
+                       
DMT.createFNPLocChangeNotificationNew(node.lm.getLocation(), 
node.peers.getPeerLocationDoubles(true)) :
+                       
DMT.createFNPLocChangeNotification(node.lm.getLocation()));
                Message ipMsg = DMT.createFNPDetectedIPAddress(detectedPeer);
                Message timeMsg = DMT.createFNPTime(System.currentTimeMillis());
                Message packetsMsg = createSentPacketsMessage();
@@ -2184,42 +2259,36 @@
                int firstByte = data[offset];
                offset++;
                length--;
-               if((firstByte & 2) == 2) {
-                       int groupIndex = Fields.bytesToInt(data, offset);
-                       offset += 4;
-                       length -= 4;
+               if((firstByte & 0x2) == 2) {
+                       int groupIndex = (data[offset] & 0xff);
+                       offset++;
+                       length--;
                        group = Global.getGroup(groupIndex);
                        if(group == null) throw new FSParseException("Unknown 
group number "+groupIndex);
+                       if(logMINOR)
+                               Logger.minor(PeerNode.class, "DSAGroup set to 
"+group.fingerprintToString()+ " using the group-index "+groupIndex);
                }
                // Is it compressed?
                if((firstByte & 1) == 1) {
-                       // Gzipped
-                       Inflater i = new Inflater();
-                       i.setInput(data, offset, length);
-                       byte[] output = new byte[4096];
-                       int outputPointer = 0;
-                       while(true) {
-                               try {
-                                       int x = i.inflate(output, 
outputPointer, output.length - outputPointer);
-                                       if(x == output.length - outputPointer) {
-                                               // More to decompress!
-                                               byte[] newOutput = new 
byte[output.length * 2];
-                                               System.arraycopy(output, 0, 
newOutput, 0, output.length);
-                                               continue;
-                                       } else {
-                                               // Finished
-                                               data = output;
-                                               offset = 0;
-                                               length = outputPointer + x;
-                                               break;
-                                       }
-                               } catch(DataFormatException e) {
-                                       throw new FSParseException("Invalid 
compressed data");
-                               }
+                       try {
+                               // Gzipped
+                               Inflater i = new Inflater();
+                               i.setInput(data, offset, length);
+                               // We shouldn't ever need a 4096 bytes long ref!
+                               byte[] output = new byte[4096];
+                               length = i.inflate(output, 0, output.length);
+                               // Finished
+                               data = output;
+                               offset = 0;
+                               if(logMINOR)
+                                       Logger.minor(PeerNode.class, "We have 
decompressed a "+length+" bytes big reference.");
+                       } catch(DataFormatException e) {
+                               throw new FSParseException("Invalid compressed 
data");
                        }
                }
                if(logMINOR)
-                       Logger.minor(PeerNode.class, "Reference: " + new 
String(data, offset, length) + '(' + length + ')');
+                       Logger.minor(PeerNode.class, "Reference: " + 
HexUtil.bytesToHex(data, offset, length) + '(' + length + ')');
+
                // Now decode it
                ByteArrayInputStream bais = new ByteArrayInputStream(data, 
offset, length);
                InputStreamReader isr;
@@ -2231,8 +2300,11 @@
                BufferedReader br = new BufferedReader(isr);
                try {
                        SimpleFieldSet fs = new SimpleFieldSet(br, false, true);
-                       if(group != null)
-                               fs.putAllOverwrite(group.asFieldSet());
+                       if(group != null) {
+                               SimpleFieldSet sfs = new SimpleFieldSet(true);
+                               sfs.put("dsaGroup", group.asFieldSet());
+                               fs.putAllOverwrite(sfs);
+                       }
                        return fs;
                } catch(IOException e) {
                        FSParseException ex = new FSParseException("Impossible: 
" + e);
@@ -2522,6 +2594,8 @@
                        fs.putSingle("hadRoutableConnectionCount", 
Long.toString(hadRoutableConnectionCount));
                if(routableConnectionCheckCount > 0)
                        fs.putSingle("routableConnectionCheckCount", 
Long.toString(routableConnectionCheckCount));
+               if(currentPeersLocation != null)
+                       fs.put("peersLocation", currentPeersLocation);
                return fs;
        }

@@ -3915,4 +3989,22 @@
        public short getUptime() {
                return (short)(((int)uptime) & 0xFF);
        }
+       
+       public long getNumberOfSelections() {
+               return numberOfSelections;
+       }
+       
+       public void incrementNumberOfSelections() {
+               numberOfSelections++;
+       }
+
+       private long offeredMainJarVersion;
+       
+       public void setMainJarOfferedVersion(long mainJarVersion) {
+               offeredMainJarVersion = mainJarVersion;
+       }
+       
+       public long getMainJarOfferedVersion() {
+               return offeredMainJarVersion;
+       }
 }

Modified: branches/db4o/freenet/src/freenet/node/PeerNodeStatus.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/PeerNodeStatus.java  2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/PeerNodeStatus.java  2008-08-07 
18:30:55 UTC (rev 21657)
@@ -30,6 +30,7 @@
        private final String statusCSSName;

        private final double location;
+       private final double[] peersLocation;

        private final String version;

@@ -92,6 +93,8 @@
        private final long resendBytesSent;

        private final int reportedUptimePercentage;
+       
+       private final long numberOfSelections;

        PeerNodeStatus(PeerNode peerNode, boolean noHeavy) {
                if(Logger.shouldLog(Logger.MINOR, this)) {
@@ -105,10 +108,12 @@
                        peerAddress = p.getFreenetAddress().toString();
                        peerPort = p.getPort();
                }
+               this.numberOfSelections = peerNode.getNumberOfSelections();
                this.statusValue = peerNode.getPeerNodeStatus();
                this.statusName = peerNode.getPeerNodeStatusString();
                this.statusCSSName = peerNode.getPeerNodeStatusCSSClassName();
                this.location = peerNode.getLocation();
+               this.peersLocation = peerNode.getPeersLocation();
                this.version = peerNode.getVersion();
                this.simpleVersion = peerNode.getSimpleVersion();
                this.routingBackoffLength = peerNode.getRoutingBackoffLength();
@@ -248,6 +253,10 @@
                return location;
        }

+       public double[] getPeersLocation() {
+               return peersLocation;
+       }
+       
        /**
         * @return the peerAddress
         */
@@ -387,5 +396,8 @@
        public int getReportedUptimePercentage() {
                return reportedUptimePercentage;
        }
-       
+
+       public long getNumberOfSelections() {
+               return numberOfSelections;
+       }
 }

Modified: branches/db4o/freenet/src/freenet/node/Persister.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/Persister.java       2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/Persister.java       2008-08-07 
18:30:55 UTC (rev 21657)
@@ -85,7 +85,8 @@
                        } catch (FileNotFoundException e1) {
                                // Ignore
                        } catch (IOException e1) {
-                               Logger.error(this, "Could not read 
"+persistTarget+" ("+e+") and could not read "+persistTemp+" either ("+e1+ ')');
+                               if(persistTarget.length() > 0 || 
persistTemp.length() > 0)
+                                       Logger.error(this, "Could not read 
"+persistTarget+" ("+e+") and could not read "+persistTemp+" either ("+e1+ ')');
                        }
                }
                return throttleFS;

Modified: branches/db4o/freenet/src/freenet/node/ProbeCallback.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/ProbeCallback.java   2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/ProbeCallback.java   2008-08-07 
18:30:55 UTC (rev 21657)
@@ -10,7 +10,8 @@

        void onTrace(long uid, double target, double nearest, double best, 
short htl, short counter, double location, long nodeUID, double[] peerLocs, 
long[] peerUIDs, double[] locsNotVisited, short forkCount, short linearCount, 
String reason, long prevUID);

-       /** Got a RejectedOverload passed down from some upstream node. Note 
that not all probe request
+       /**
+        * Got a RejectedOverload passed down from some upstream node. Note 
that not all probe request
         * implementations may generate these.
         */
        void onRejectOverload();

Modified: branches/db4o/freenet/src/freenet/node/RequestHandler.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/RequestHandler.java  2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/RequestHandler.java  2008-08-07 
18:30:55 UTC (rev 21657)
@@ -33,184 +33,187 @@
 public class RequestHandler implements PrioRunnable, ByteCounter, 
RequestSender.Listener {

        private static boolean logMINOR;
-    final Message req;
-    final Node node;
-    final long uid;
-    private short htl;
-    final PeerNode source;
-    private boolean needsPubKey;
-    final Key key;
-    private boolean finalTransferFailed = false;
-    /** The RequestSender, if any */
-    private RequestSender rs;
-    private int status = RequestSender.NOT_FINISHED;
-       private boolean appliedByteCounts=false;
+       final Message req;
+       final Node node;
+       final long uid;
+       private short htl;
+       final PeerNode source;
+       private boolean needsPubKey;
+       final Key key;
+       private boolean finalTransferFailed = false;
+       /** The RequestSender, if any */
+       private RequestSender rs;
+       private int status = RequestSender.NOT_FINISHED;
+       private boolean appliedByteCounts = false;
        private boolean sentRejectedOverload = false;
        private long searchStartTime;
        private long responseDeadline;
-       private BlockTransmitter bt;    
-       
-    public String toString() {
-        return super.toString()+" for "+uid;
-    }
-    
-    public RequestHandler(Message m, PeerNode source, long id, Node n, short 
htl, Key key) {
-        req = m;
-        node = n;
-        uid = id;
-        this.source = source;
-        this.htl = htl;
-        if(htl <= 0) htl = 1;
-        this.key = key;
-        if(key instanceof NodeSSK)
-               needsPubKey = m.getBoolean(DMT.NEED_PUB_KEY);
-        logMINOR = Logger.shouldLog(Logger.MINOR, this);
-        receivedBytes(m.receivedByteCount());
-    }
+       private BlockTransmitter bt;

-    public void run() {
-           freenet.support.Logger.OSThread.logPID(this);
-        try {
-               realRun();
-                       //The last thing that realRun() does is register as a 
request-sender listener, so any exception here is the end.
-        } catch (NotConnectedException e) {
-               Logger.normal(this, "requestor gone, could not start request 
handler wait");
+       public String toString() {
+               return super.toString() + " for " + uid;
+       }
+
+       public RequestHandler(Message m, PeerNode source, long id, Node n, 
short htl, Key key) {
+               req = m;
+               node = n;
+               uid = id;
+               this.source = source;
+               this.htl = htl;
+               if(htl <= 0)
+                       htl = 1;
+               this.key = key;
+               if(key instanceof NodeSSK)
+                       needsPubKey = m.getBoolean(DMT.NEED_PUB_KEY);
+               logMINOR = Logger.shouldLog(Logger.MINOR, this);
+               receivedBytes(m.receivedByteCount());
+       }
+
+       public void run() {
+               freenet.support.Logger.OSThread.logPID(this);
+               try {
+                       realRun();
+               //The last thing that realRun() does is register as a 
request-sender listener, so any exception here is the end.
+               } catch(NotConnectedException e) {
+                       Logger.normal(this, "requestor gone, could not start 
request handler wait");
                        node.removeTransferringRequestHandler(uid);
-            node.unlockUID(uid, key instanceof NodeSSK, false, false, false, 
false);
-        } catch (Throwable t) {
-            Logger.error(this, "Caught "+t, t);
+                       node.unlockUID(uid, key instanceof NodeSSK, false, 
false, false, false);
+               } catch(Throwable t) {
+                       Logger.error(this, "Caught " + t, t);
                        node.removeTransferringRequestHandler(uid);
-            node.unlockUID(uid, key instanceof NodeSSK, false, false, false, 
false);
-        }
-    }
-    
+                       node.unlockUID(uid, key instanceof NodeSSK, false, 
false, false, false);
+               }
+       }
        private Exception previousApplyByteCountCall;
-       
-    private void applyByteCounts() {
-       if(disconnected) {
-               Logger.normal(this, "Not applying byte counts as request source 
disconnected during receive");
-               return;
-       }
-               if (appliedByteCounts) {
+
+       private void applyByteCounts() {
+               if(disconnected) {
+                       Logger.normal(this, "Not applying byte counts as 
request source disconnected during receive");
+                       return;
+               }
+               if(appliedByteCounts) {
                        Logger.error(this, "applyByteCounts already called", 
new Exception("error"));
                        Logger.error(this, "first called here", 
previousApplyByteCountCall);
                        return;
                }
-               previousApplyByteCountCall=new Exception("first call to 
applyByteCounts");
-               appliedByteCounts=true;
-        if((!finalTransferFailed) && rs != null && status != 
RequestSender.TIMED_OUT && status != RequestSender.GENERATED_REJECTED_OVERLOAD 
-           && status != RequestSender.INTERNAL_ERROR) {
-               int sent, rcvd;
-               synchronized(bytesSync) {
-                       sent = sentBytes;
-                       rcvd = receivedBytes;
-               }
-               sent += rs.getTotalSentBytes();
-               rcvd += rs.getTotalReceivedBytes();
-               if(key instanceof NodeSSK) {
-                       if(logMINOR) Logger.minor(this, "Remote SSK fetch cost 
"+sent+ '/' +rcvd+" bytes ("+status+ ')');
-                       
node.nodeStats.remoteSskFetchBytesSentAverage.report(sent);
-                       
node.nodeStats.remoteSskFetchBytesReceivedAverage.report(rcvd);
-                       if(status == RequestSender.SUCCESS) {
-                               // Can report both parts, because we had both a 
Handler and a Sender
-                               
node.nodeStats.successfulSskFetchBytesSentAverage.report(sent);
-                               
node.nodeStats.successfulSskFetchBytesReceivedAverage.report(rcvd);
-                       }
-               } else {
-                       if(logMINOR) Logger.minor(this, "Remote CHK fetch cost 
"+sent+ '/' +rcvd+" bytes ("+status+ ')');
-                       
node.nodeStats.remoteChkFetchBytesSentAverage.report(sent);
-                       
node.nodeStats.remoteChkFetchBytesReceivedAverage.report(rcvd);
-                       if(status == RequestSender.SUCCESS) {
-                               // Can report both parts, because we had both a 
Handler and a Sender
-                               
node.nodeStats.successfulChkFetchBytesSentAverage.report(sent);
-                               
node.nodeStats.successfulChkFetchBytesReceivedAverage.report(rcvd);
-                       }
-               }
-        }
-    }
+               previousApplyByteCountCall = new Exception("first call to 
applyByteCounts");
+               appliedByteCounts = true;
+               if((!finalTransferFailed) && rs != null && status != 
RequestSender.TIMED_OUT && status != RequestSender.GENERATED_REJECTED_OVERLOAD 
&& status != RequestSender.INTERNAL_ERROR) {
+                       int sent, rcvd;
+                       synchronized(bytesSync) {
+                               sent = sentBytes;
+                               rcvd = receivedBytes;
+                       }
+                       sent += rs.getTotalSentBytes();
+                       rcvd += rs.getTotalReceivedBytes();
+                       if(key instanceof NodeSSK) {
+                               if(logMINOR)
+                                       Logger.minor(this, "Remote SSK fetch 
cost " + sent + '/' + rcvd + " bytes (" + status + ')');
+                               
node.nodeStats.remoteSskFetchBytesSentAverage.report(sent);
+                               
node.nodeStats.remoteSskFetchBytesReceivedAverage.report(rcvd);
+                               if(status == RequestSender.SUCCESS) {
+                                       // Can report both parts, because we 
had both a Handler and a Sender
+                                       
node.nodeStats.successfulSskFetchBytesSentAverage.report(sent);
+                                       
node.nodeStats.successfulSskFetchBytesReceivedAverage.report(rcvd);
+                               }
+                       } else {
+                               if(logMINOR)
+                                       Logger.minor(this, "Remote CHK fetch 
cost " + sent + '/' + rcvd + " bytes (" + status + ')');
+                               
node.nodeStats.remoteChkFetchBytesSentAverage.report(sent);
+                               
node.nodeStats.remoteChkFetchBytesReceivedAverage.report(rcvd);
+                               if(status == RequestSender.SUCCESS) {
+                                       // Can report both parts, because we 
had both a Handler and a Sender
+                                       
node.nodeStats.successfulChkFetchBytesSentAverage.report(sent);
+                                       
node.nodeStats.successfulChkFetchBytesReceivedAverage.report(rcvd);
+                               }
+                       }
+               }
+       }

-    private void realRun() throws NotConnectedException {
-        if(logMINOR) Logger.minor(this, "Handling a request: "+uid);
-        
-        Message accepted = DMT.createFNPAccepted(uid);
-        source.sendAsync(accepted, null, 0, this);
-        
-        Object o = node.makeRequestSender(key, htl, uid, source, false, true, 
false, false);
-        if(o instanceof KeyBlock) {
-               returnLocalData((KeyBlock)o);
-            return;
-        }
-        
-        if(o == null) { // ran out of htl?
-            Message dnf = DMT.createFNPDataNotFound(uid);
-            status = RequestSender.DATA_NOT_FOUND; // for byte logging
-            node.failureTable.onFinalFailure(key, null, htl, 
FailureTable.REJECT_TIME, source);
-            sendTerminal(dnf);
-            return;
-        } else {
-               long queueTime = source.getProbableSendQueueTime();
-            synchronized(this) {
-               rs = (RequestSender) o;
-                //If we cannot respond before this time, the 'source' node has 
already fatally timed out (and we need not return packets which will not be 
claimed)
-                       searchStartTime = System.currentTimeMillis();
-                       responseDeadline = searchStartTime + 
RequestSender.FETCH_TIMEOUT + queueTime;
-            }
-            rs.addListener(this);
-        }
+       private void realRun() throws NotConnectedException {
+               if(logMINOR)
+                       Logger.minor(this, "Handling a request: " + uid);
+
+               Message accepted = DMT.createFNPAccepted(uid);
+               source.sendAsync(accepted, null, 0, this);
+
+               Object o = node.makeRequestSender(key, htl, uid, source, false, 
true, false, false);
+               if(o instanceof KeyBlock) {
+                       returnLocalData((KeyBlock) o);
+                       return;
+               }
+
+               if(o == null) { // ran out of htl?
+                       Message dnf = DMT.createFNPDataNotFound(uid);
+                       status = RequestSender.DATA_NOT_FOUND; // for byte 
logging
+                       node.failureTable.onFinalFailure(key, null, htl, 
FailureTable.REJECT_TIME, source);
+                       sendTerminal(dnf);
+                       return;
+               } else {
+                       long queueTime = source.getProbableSendQueueTime();
+                       synchronized(this) {
+                               rs = (RequestSender) o;
+                               //If we cannot respond before this time, the 
'source' node has already fatally timed out (and we need not return packets 
which will not be claimed)
+                               searchStartTime = System.currentTimeMillis();
+                               responseDeadline = searchStartTime + 
RequestSender.FETCH_TIMEOUT + queueTime;
+                       }
+                       rs.addListener(this);
+               }
        }
-               
+
        public void onReceivedRejectOverload() {
                try {
-            if(!sentRejectedOverload) {
-               // Forward RejectedOverload
+                       if(!sentRejectedOverload) {
+                               // Forward RejectedOverload
                                //Note: This message is only decernable from 
the terminal messages by the IS_LOCAL flag being false. (!IS_LOCAL)->!Terminal
-               Message msg = DMT.createFNPRejectedOverload(uid, false);
-               source.sendAsync(msg, null, 0, this);
+                               Message msg = 
DMT.createFNPRejectedOverload(uid, false);
+                               source.sendAsync(msg, null, 0, this);
                                //If the status changes (e.g. to SUCCESS), 
there is little need to send yet another reject overload.
-                               sentRejectedOverload=true;
-            }
-               } catch (NotConnectedException e) {
+                               sentRejectedOverload = true;
+                       }
+               } catch(NotConnectedException e) {
                        Logger.normal(this, "requestor is gone, can't forward 
reject overload");
                }
        }
-       
        private boolean disconnected = false;
-       
+
        public void onCHKTransferBegins() {
                try {
-               // Is a CHK.
-                Message df = DMT.createFNPCHKDataFound(uid, rs.getHeaders());
-                source.sendAsync(df, null, 0, this);
-                
-                PartiallyReceivedBlock prb = rs.getPRB();
-               bt =
-                   new BlockTransmitter(node.usm, source, uid, prb, this);
-               node.addTransferringRequestHandler(uid);
+                       // Is a CHK.
+                       Message df = DMT.createFNPCHKDataFound(uid, 
rs.getHeaders());
+                       source.sendAsync(df, null, 0, this);
+
+                       PartiallyReceivedBlock prb = rs.getPRB();
+                       bt =
+                               new BlockTransmitter(node.usm, source, uid, 
prb, this);
+                       node.addTransferringRequestHandler(uid);
                        bt.sendAsync(node.executor);
-               } catch (NotConnectedException e) {
+               } catch(NotConnectedException e) {
                        synchronized(this) {
                                disconnected = true;
                        }
                        Logger.normal(this, "requestor is gone, can't begin CHK 
transfer");
                }
        }
-       
+
        private void waitAndFinishCHKTransferOffThread() {
                node.executor.execute(new Runnable() {
+
                        public void run() {
                                try {
                                        waitAndFinishCHKTransfer();
-                               } catch (NotConnectedException e) {
+                               } catch(NotConnectedException e) {
                                        //for byte logging, since the block is 
the 'terminal' message.
                                        applyByteCounts();
                                        unregisterRequestHandlerWithNode();
                                }
                        }
-               }, "Finish CHK transfer for "+key);
+               }, "Finish CHK transfer for " + key);
        }
-       
+
        private void waitAndFinishCHKTransfer() throws NotConnectedException {
-               if (logMINOR) Logger.minor(this, "Waiting for CHK transfer to 
finish");
+               if(logMINOR)
+                       Logger.minor(this, "Waiting for CHK transfer to 
finish");
                if(bt.getAsyncExitStatus()) {
                        status = rs.getStatus();
                        // Successful CHK transfer, maybe path fold
@@ -223,120 +226,115 @@
                        unregisterRequestHandlerWithNode();
                }
        }
-       
+
        public void onRequestSenderFinished(int status) {
                long now = System.currentTimeMillis();
-               this.status=status;
-               
+               this.status = status;
+
                boolean tooLate;
                synchronized(this) {
                        tooLate = responseDeadline > 0 && now > 
responseDeadline;
                }
-               
-               if (tooLate) {
+
+               if(tooLate) {
                        // Offer the data if there is any.
                        node.failureTable.onFinalFailure(key, null, htl, -1, 
source);
                        PeerNode routedLast = rs == null ? null : 
rs.routedLast();
                        // A certain number of these are normal.
-                       Logger.normal(this, "requestsender took too long to 
respond to requestor ("+TimeUtil.formatTime((now - searchStartTime), 2, 
true)+"/"+(rs == null ? "null" : rs.getStatusString())+") routed to 
"+(routedLast == null ? "null" : routedLast.shortToString())); 
+                       Logger.normal(this, "requestsender took too long to 
respond to requestor (" + TimeUtil.formatTime((now - searchStartTime), 2, true) 
+ "/" + (rs == null ? "null" : rs.getStatusString()) + ") routed to " + 
(routedLast == null ? "null" : routedLast.shortToString()));
                        applyByteCounts();
                        unregisterRequestHandlerWithNode();
                        return;
                }
-       
+
                if(status == RequestSender.NOT_FINISHED)
                        Logger.error(this, "onFinished() but not finished?");
-            
+
                try {
-            switch(status) {
-               case RequestSender.NOT_FINISHED:
-               case RequestSender.DATA_NOT_FOUND:
-                    Message dnf = DMT.createFNPDataNotFound(uid);
-                       sendTerminal(dnf);
-                       return;
-               case RequestSender.RECENTLY_FAILED:
-                       Message rf = DMT.createFNPRecentlyFailed(uid, 
rs.getRecentlyFailedTimeLeft());
-                       sendTerminal(rf);
-                       return;
-               case RequestSender.GENERATED_REJECTED_OVERLOAD:
-               case RequestSender.TIMED_OUT:
-               case RequestSender.INTERNAL_ERROR:
-                       // Locally generated.
-                   // Propagate back to source who needs to reduce send rate
+                       switch(status) {
+                               case RequestSender.NOT_FINISHED:
+                               case RequestSender.DATA_NOT_FOUND:
+                                       Message dnf = 
DMT.createFNPDataNotFound(uid);
+                                       sendTerminal(dnf);
+                                       return;
+                               case RequestSender.RECENTLY_FAILED:
+                                       Message rf = 
DMT.createFNPRecentlyFailed(uid, rs.getRecentlyFailedTimeLeft());
+                                       sendTerminal(rf);
+                                       return;
+                               case RequestSender.GENERATED_REJECTED_OVERLOAD:
+                               case RequestSender.TIMED_OUT:
+                               case RequestSender.INTERNAL_ERROR:
+                                       // Locally generated.
+                                       // Propagate back to source who needs 
to reduce send rate
                                        ///@bug: we may not want to translate 
fatal timeouts into non-fatal timeouts.
-                   Message reject = DMT.createFNPRejectedOverload(uid, true);
-                       sendTerminal(reject);
-                       return;
-               case RequestSender.ROUTE_NOT_FOUND:
-                   // Tell source
-                   Message rnf = DMT.createFNPRouteNotFound(uid, rs.getHTL());
-                       sendTerminal(rnf);
-                       return;
-               case RequestSender.SUCCESS:
-                       if(key instanceof NodeSSK) {
-                               sendSSK(rs.getHeaders(), rs.getSSKData(), 
needsPubKey, ((NodeSSK)rs.getSSKBlock().getKey()).getPubKey());
-                       } else {
-                               if(bt == null && !disconnected) {
-                                       // Bug! This is impossible!
-                                       Logger.error(this, "Status is SUCCESS 
but we never started a transfer on "+uid);
-                                       // Obviously this node is confused, 
send a terminal reject to make sure the requestor is not waiting forever.
-                           reject = DMT.createFNPRejectedOverload(uid, true);
-                               sendTerminal(reject);
-                               } else if(!disconnected) {
-                                       waitAndFinishCHKTransferOffThread();
-                               }
-                       }
+                                       Message reject = 
DMT.createFNPRejectedOverload(uid, true);
+                                       sendTerminal(reject);
                                        return;
-               case RequestSender.VERIFY_FAILURE:
-               case RequestSender.GET_OFFER_VERIFY_FAILURE:
-                       if(key instanceof NodeCHK) {
+                               case RequestSender.ROUTE_NOT_FOUND:
+                                       // Tell source
+                                       Message rnf = 
DMT.createFNPRouteNotFound(uid, rs.getHTL());
+                                       sendTerminal(rnf);
+                                       return;
+                               case RequestSender.SUCCESS:
+                                       if(key instanceof NodeSSK)
+                                               sendSSK(rs.getHeaders(), 
rs.getSSKData(), needsPubKey, ((NodeSSK) 
rs.getSSKBlock().getKey()).getPubKey());
+                                       else
                                                if(bt == null && !disconnected) 
{
-                                       // Bug! This is impossible!
-                                       Logger.error(this, "Status is 
VERIFY_FAILURE but we never started a transfer on "+uid);
+                                                       // Bug! This is 
impossible!
+                                                       Logger.error(this, 
"Status is SUCCESS but we never started a transfer on " + uid);
                                                        // Obviously this node 
is confused, send a terminal reject to make sure the requestor is not waiting 
forever.
-                           reject = DMT.createFNPRejectedOverload(uid, true);
-                               sendTerminal(reject);
-                               } else if(!disconnected) {
+                                                       reject = 
DMT.createFNPRejectedOverload(uid, true);
+                                                       sendTerminal(reject);
+                                               } else if(!disconnected)
+                                                       
waitAndFinishCHKTransferOffThread();
+                                       return;
+                               case RequestSender.VERIFY_FAILURE:
+                               case RequestSender.GET_OFFER_VERIFY_FAILURE:
+                                       if(key instanceof NodeCHK) {
+                                               if(bt == null && !disconnected) 
{
+                                                       // Bug! This is 
impossible!
+                                                       Logger.error(this, 
"Status is VERIFY_FAILURE but we never started a transfer on " + uid);
+                                                       // Obviously this node 
is confused, send a terminal reject to make sure the requestor is not waiting 
forever.
+                                                       reject = 
DMT.createFNPRejectedOverload(uid, true);
+                                                       sendTerminal(reject);
+                                               } else if(!disconnected)
                                                        //Verify fails after 
receive() is complete, so we might as well propagate it...
-                                       waitAndFinishCHKTransferOffThread();
-                               }
+                                                       
waitAndFinishCHKTransferOffThread();
                                                return;
-                       }
-                   reject = DMT.createFNPRejectedOverload(uid, true);
-                       sendTerminal(reject);
-                       return;
-               case RequestSender.TRANSFER_FAILED:
-               case RequestSender.GET_OFFER_TRANSFER_FAILED:
-                       if(key instanceof NodeCHK) {
-                               if(bt == null && !disconnected) {
-                                       // Bug! This is impossible!
-                                       Logger.error(this, "Status is 
TRANSFER_FAILED but we never started a transfer on "+uid);
+                                       }
+                                       reject = 
DMT.createFNPRejectedOverload(uid, true);
+                                       sendTerminal(reject);
+                                       return;
+                               case RequestSender.TRANSFER_FAILED:
+                               case RequestSender.GET_OFFER_TRANSFER_FAILED:
+                                       if(key instanceof NodeCHK) {
+                                               if(bt == null && !disconnected) 
{
+                                                       // Bug! This is 
impossible!
+                                                       Logger.error(this, 
"Status is TRANSFER_FAILED but we never started a transfer on " + uid);
                                                        // Obviously this node 
is confused, send a terminal reject to make sure the requestor is not waiting 
forever.
-                           reject = DMT.createFNPRejectedOverload(uid, true);
-                               sendTerminal(reject);
-                               } else if(!disconnected) {
-                                       waitAndFinishCHKTransferOffThread();
-                               }
+                                                       reject = 
DMT.createFNPRejectedOverload(uid, true);
+                                                       sendTerminal(reject);
+                                               } else if(!disconnected)
+                                                       
waitAndFinishCHKTransferOffThread();
                                                return;
-                       }
-                       Logger.error(this, "finish(TRANSFER_FAILED) should not 
be called on SSK?!?!", new Exception("error"));
-                       return;
-               default:
-                       // Treat as internal error
-                   reject = DMT.createFNPRejectedOverload(uid, true);
-                       sendTerminal(reject);
-                   throw new IllegalStateException("Unknown status code 
"+status);
-            }
-               } catch (NotConnectedException e) {
+                                       }
+                                       Logger.error(this, 
"finish(TRANSFER_FAILED) should not be called on SSK?!?!", new 
Exception("error"));
+                                       return;
+                               default:
+                                       // Treat as internal error
+                                       reject = 
DMT.createFNPRejectedOverload(uid, true);
+                                       sendTerminal(reject);
+                                       throw new 
IllegalStateException("Unknown status code " + status);
+                       }
+               } catch(NotConnectedException e) {
                        Logger.normal(this, "requestor is gone, can't send 
terminal message");
                        applyByteCounts();
                        unregisterRequestHandlerWithNode();
                }
        }
-
        public static boolean SEND_OLD_FORMAT_SSK = false;
-       
-    private void sendSSK(byte[] headers, final byte[] data, boolean 
needsPubKey2, DSAPublicKey pubKey) throws NotConnectedException {
+
+       private void sendSSK(byte[] headers, final byte[] data, boolean 
needsPubKey2, DSAPublicKey pubKey) throws NotConnectedException {
                // SUCCESS requires that BOTH the pubkey AND the data/headers 
have been received.
                // The pubKey will have been set on the SSK key, and the 
SSKBlock will have been constructed.
                Message headersMsg = DMT.createFNPSSKDataFoundHeaders(uid, 
headers);
@@ -350,22 +348,21 @@

                        public void run() {
                                try {
-                                       source.sendThrottledMessage(dataMsg, 
data.length, RequestHandler.this, 60*1000, true);
+                                       source.sendThrottledMessage(dataMsg, 
data.length, RequestHandler.this, 60 * 1000, true);
                                        applyByteCounts();
-                               } catch (NotConnectedException e) {
+                               } catch(NotConnectedException e) {
                                        // Okay
-                               } catch (WaitedTooLongException e) {
+                               } catch(WaitedTooLongException e) {
                                        // Grrrr
-                                       Logger.error(this, "Waited too long to 
send SSK data on "+RequestHandler.this+" because of bwlimiting");
-                               } catch (SyncSendWaitedTooLongException e) {
-                                       Logger.error(this, "Waited too long to 
send SSK data on "+RequestHandler.this+" because of peer");
+                                       Logger.error(this, "Waited too long to 
send SSK data on " + RequestHandler.this + " because of bwlimiting");
+                               } catch(SyncSendWaitedTooLongException e) {
+                                       Logger.error(this, "Waited too long to 
send SSK data on " + RequestHandler.this + " because of peer");
                                } finally {
                                        unregisterRequestHandlerWithNode();
                                }
                        }
-                       
-               }, "Send throttled SSK data for "+RequestHandler.this);
-               
+               }, "Send throttled SSK data for " + RequestHandler.this);
+
                if(SEND_OLD_FORMAT_SSK) {
                        Message df = DMT.createFNPSSKDataFound(uid, headers, 
data);
                        source.sendAsync(df, null, 0, this);
@@ -378,19 +375,19 @@
                }
        }

-    static void sendSSK(byte[] headers, byte[] data, boolean needsPubKey, 
DSAPublicKey pubKey, final PeerNode source, long uid, ByteCounter ctr) throws 
NotConnectedException, WaitedTooLongException {
+       static void sendSSK(byte[] headers, byte[] data, boolean needsPubKey, 
DSAPublicKey pubKey, final PeerNode source, long uid, ByteCounter ctr) throws 
NotConnectedException, WaitedTooLongException {
                // SUCCESS requires that BOTH the pubkey AND the data/headers 
have been received.
                // The pubKey will have been set on the SSK key, and the 
SSKBlock will have been constructed.
                Message headersMsg = DMT.createFNPSSKDataFoundHeaders(uid, 
headers);
                source.sendAsync(headersMsg, null, 0, ctr);
                final Message dataMsg = DMT.createFNPSSKDataFoundData(uid, 
data);
                try {
-                       source.sendThrottledMessage(dataMsg, data.length, ctr, 
60*1000, false);
-               } catch (SyncSendWaitedTooLongException e) {
+                       source.sendThrottledMessage(dataMsg, data.length, ctr, 
60 * 1000, false);
+               } catch(SyncSendWaitedTooLongException e) {
                        // Impossible
                        throw new Error(e);
                }
-               
+
                if(SEND_OLD_FORMAT_SSK) {
                        Message df = DMT.createFNPSSKDataFound(uid, headers, 
data);
                        source.sendAsync(df, null, 0, ctr);
@@ -401,248 +398,244 @@
                        Message pk = DMT.createFNPSSKPubKey(uid, pubKey);
                        source.sendAsync(pk, null, 0, ctr);
                }
-    }
-    
+       }
+
        /**
-     * Return data from the datastore.
-     * @param block The block we found in the datastore.
-     * @throws NotConnectedException If we lose the connected to the request 
source.
-     */
-    private void returnLocalData(KeyBlock block) throws NotConnectedException {
-        if(key instanceof NodeSSK) {
-                       sendSSK(block.getRawHeaders(), block.getRawData(), 
needsPubKey, ((SSKBlock)block).getPubKey());
-            status = RequestSender.SUCCESS; // for byte logging
-        } else if(block instanceof CHKBlock) {
-               Message df = DMT.createFNPCHKDataFound(uid, 
block.getRawHeaders());
-               PartiallyReceivedBlock prb =
-                       new PartiallyReceivedBlock(Node.PACKETS_IN_BLOCK, 
Node.PACKET_SIZE, block.getRawData());
-               BlockTransmitter bt =
-                       new BlockTransmitter(node.usm, source, uid, prb, this);
-               node.addTransferringRequestHandler(uid);
+        * Return data from the datastore.
+        * @param block The block we found in the datastore.
+        * @throws NotConnectedException If we lose the connected to the 
request source.
+        */
+       private void returnLocalData(KeyBlock block) throws 
NotConnectedException {
+               if(key instanceof NodeSSK) {
+                       sendSSK(block.getRawHeaders(), block.getRawData(), 
needsPubKey, ((SSKBlock) block).getPubKey());
+                       status = RequestSender.SUCCESS; // for byte logging
+               } else if(block instanceof CHKBlock) {
+                       Message df = DMT.createFNPCHKDataFound(uid, 
block.getRawHeaders());
+                       PartiallyReceivedBlock prb =
+                               new 
PartiallyReceivedBlock(Node.PACKETS_IN_BLOCK, Node.PACKET_SIZE, 
block.getRawData());
+                       BlockTransmitter bt =
+                               new BlockTransmitter(node.usm, source, uid, 
prb, this);
+                       node.addTransferringRequestHandler(uid);
                        source.sendAsync(df, null, 0, this);
-               if(bt.send(node.executor)) {
-                // for byte logging
-                       status = RequestSender.SUCCESS;
-                       // We've fetched it from our datastore, so there won't 
be a downstream noderef.
-                       // But we want to send at least an 
FNPOpennetCompletedAck, otherwise the request source
-                       // may have to timeout waiting for one. That will be 
the terminal message.
-                               finishOpennetNoRelay();
+                       if(bt.send(node.executor)) {
+                               // for byte logging
+                               status = RequestSender.SUCCESS;
+                               // We've fetched it from our datastore, so 
there won't be a downstream noderef.
+                               // But we want to send at least an 
FNPOpennetCompletedAck, otherwise the request source
+                               // may have to timeout waiting for one. That 
will be the terminal message.
+                               finishOpennetNoRelay();
                        } else {
-                //also for byte logging, since the block is the 'terminal' 
message.
-                applyByteCounts();
+                               //also for byte logging, since the block is the 
'terminal' message.
+                               applyByteCounts();
                                unregisterRequestHandlerWithNode();
-               }
-        } else throw new IllegalStateException();
+                       }
+               } else
+                       throw new IllegalStateException();
        }

        private void unregisterRequestHandlerWithNode() {
                node.removeTransferringRequestHandler(uid);
                node.unlockUID(uid, key instanceof NodeSSK, false, false, 
false, false);
        }
-       
+
        /**
-     * Sends the 'final' packet of a request in such a way that the thread can 
be freed (made non-runnable/exit)
-     * and the byte counter will still be accurate.
-     */
-    private void sendTerminal(Message msg) throws NotConnectedException {
-       if(logMINOR)
-               Logger.minor(this, "sendTerminal("+msg+")", new 
Exception("debug"));
-        if (sendTerminalCalled)
-            throw new IllegalStateException("sendTerminal should only be 
called once");
-        else
-            sendTerminalCalled=true;
-        
-        source.sendAsync(msg, new TerminalMessageByteCountCollector(), 0, 
this);
-    }
-    
-    boolean sendTerminalCalled=false;
-    
-    /**
-     * Note well! These functions are not executed on the RequestHandler 
thread.
-     */
-    private class TerminalMessageByteCountCollector implements 
AsyncMessageCallback {
-        
-       private boolean completed = false;
-       
+        * Sends the 'final' packet of a request in such a way that the thread 
can be freed (made non-runnable/exit)
+        * and the byte counter will still be accurate.
+        */
+       private void sendTerminal(Message msg) throws NotConnectedException {
+               if(logMINOR)
+                       Logger.minor(this, "sendTerminal(" + msg + ")", new 
Exception("debug"));
+               if(sendTerminalCalled)
+                       throw new IllegalStateException("sendTerminal should 
only be called once");
+               else
+                       sendTerminalCalled = true;
+
+               source.sendAsync(msg, new TerminalMessageByteCountCollector(), 
0, this);
+       }
+       boolean sendTerminalCalled = false;
+
+       /**
+        * Note well! These functions are not executed on the RequestHandler 
thread.
+        */
+       private class TerminalMessageByteCountCollector implements 
AsyncMessageCallback {
+
+               private boolean completed = false;
+
                public void acknowledged() {
-            //terminalMessage ack'd by remote peer
+                       //terminalMessage ack'd by remote peer
                        complete();
                }
-        
+
                public void disconnected() {
-            Logger.minor(this, "Peer disconnected before terminal message sent 
for "+RequestHandler.this);
-            complete();
+                       Logger.minor(this, "Peer disconnected before terminal 
message sent for " + RequestHandler.this);
+                       complete();
                }
-        
+
                public void fatalError() {
                        Logger.error(this, "Error sending terminal message?! 
for " + RequestHandler.this);
                        complete();
                }
-        
+
                public void sent() {
                        complete();
-        }
-               
+               }
+
                private void complete() {
                        synchronized(this) {
-                               if(completed) return;
+                               if(completed)
+                                       return;
                                completed = true;
                        }
-            //For byte counting, this relies on the fact that the callback 
will only be excuted once.
+                       //For byte counting, this relies on the fact that the 
callback will only be excuted once.
                        applyByteCounts();
                        unregisterRequestHandlerWithNode();
                }
        }
-    
-    /**
-     * Either send an ack, indicating we've finished and aren't interested in 
opennet, 
-     * or wait for a noderef and relay it and wait for a response and relay 
that,
-     * or send our own noderef and wait for a response and add that.
-     */
+
+       /**
+        * Either send an ack, indicating we've finished and aren't interested 
in opennet, 
+        * or wait for a noderef and relay it and wait for a response and relay 
that,
+        * or send our own noderef and wait for a response and add that.
+        */
        private void finishOpennetChecked() throws NotConnectedException {
                OpennetManager om = node.getOpennet();
                if(om != null &&
-                               (node.passOpennetRefsThroughDarknet() || 
source.isOpennet()) &&
-                  finishOpennetInner(om)) {
+                       (node.passOpennetRefsThroughDarknet() || 
source.isOpennet()) &&
+                       finishOpennetInner(om)) {
                        applyByteCounts();
                        unregisterRequestHandlerWithNode();
                        return;
                }
-               
+
                Message msg = DMT.createFNPOpennetCompletedAck(uid);
                sendTerminal(msg);
        }
-       
+
        /**
         * There is no noderef to pass downstream. If we want a connection, 
send our 
         * noderef and wait for a reply, otherwise just send an ack.
         */
        private void finishOpennetNoRelay() throws NotConnectedException {
                OpennetManager om = node.getOpennet();
-               
+
                if(om != null && (source.isOpennet() || 
node.passOpennetRefsThroughDarknet()) &&
-                  finishOpennetNoRelayInner(om)) {
+                       finishOpennetNoRelayInner(om)) {
                        applyByteCounts();
                        unregisterRequestHandlerWithNode();
                        return;
                }
-               
+
                // Otherwise just ack it.
                Message msg = DMT.createFNPOpennetCompletedAck(uid);
                sendTerminal(msg);
        }
-       
+
        private boolean finishOpennetInner(OpennetManager om) {
                byte[] noderef = rs.waitForOpennetNoderef();
-               if(noderef == null) {
+               if(noderef == null)
                        return finishOpennetNoRelayInner(om);
-               }
-               
-               if(node.random.nextInt(OpennetManager.RESET_PATH_FOLDING_PROB) 
== 0) {
+
+               if(node.random.nextInt(OpennetManager.RESET_PATH_FOLDING_PROB) 
== 0)
                        return finishOpennetNoRelayInner(om);
-               }
-               
-       finishOpennetRelay(noderef, om);
-       return true;
-    }

+               finishOpennetRelay(noderef, om);
+               return true;
+       }
+
        /**
         * Send our noderef to the request source, wait for a reply, if we get 
one add it. Called when either the request
         * wasn't routed, or the node it was routed to didn't return a noderef.
         * @return True if success, or lost connection; false if we need to 
send an ack.
         */
-    private boolean finishOpennetNoRelayInner(OpennetManager om) {
-       if(logMINOR)
-               Logger.minor(this, "Finishing opennet: sending own reference");
-               if(!om.wantPeer(null, false)) return false; // Don't want a 
reference
-               
+       private boolean finishOpennetNoRelayInner(OpennetManager om) {
+               if(logMINOR)
+                       Logger.minor(this, "Finishing opennet: sending own 
reference");
+               if(!om.wantPeer(null, false))
+                       return false; // Don't want a reference
+
                try {
                        om.sendOpennetRef(false, uid, source, 
om.crypto.myCompressedFullRef(), this);
-               } catch (NotConnectedException e) {
-                       Logger.normal(this, "Can't send opennet ref because 
node disconnected on "+this);
+               } catch(NotConnectedException e) {
+                       Logger.normal(this, "Can't send opennet ref because 
node disconnected on " + this);
                        // Oh well...
                        return true;
                }
-               
+
                // Wait for response
-               
-               byte[] noderef = 
-                       om.waitForOpennetNoderef(true, source, uid, this);
-               
+
+               byte[] noderef = om.waitForOpennetNoderef(true, source, uid, 
this);
+
                if(noderef == null)
                        return false;
-               
+
                SimpleFieldSet ref = om.validateNoderef(noderef, 0, 
noderef.length, source, false);
-               
-               if(ref == null) 
+
+               if(ref == null)
                        return false;
-               
-           try {
-                       if(node.addNewOpennetNode(ref) == null) {
-                               Logger.normal(this, "Asked for opennet ref but 
didn't want it for "+this+" :\n"+ref);
-                       } else {
-                               Logger.normal(this, "Added opennet noderef in 
"+this);
-                       }
-               } catch (FSParseException e) {
-                       Logger.error(this, "Could not parse opennet noderef for 
"+this+" from "+source, e);
-               } catch (PeerParseException e) {
-                       Logger.error(this, "Could not parse opennet noderef for 
"+this+" from "+source, e);
-               } catch (ReferenceSignatureVerificationException e) {
-                       Logger.error(this, "Bad signature on opennet noderef 
for "+this+" from "+source+" : "+e, e);
+
+               try {
+                       if(node.addNewOpennetNode(ref) == null)
+                               Logger.normal(this, "Asked for opennet ref but 
didn't want it for " + this + " :\n" + ref);
+                       else
+                               Logger.normal(this, "Added opennet noderef in " 
+ this);
+               } catch(FSParseException e) {
+                       Logger.error(this, "Could not parse opennet noderef for 
" + this + " from " + source, e);
+               } catch(PeerParseException e) {
+                       Logger.error(this, "Could not parse opennet noderef for 
" + this + " from " + source, e);
+               } catch(ReferenceSignatureVerificationException e) {
+                       Logger.error(this, "Bad signature on opennet noderef 
for " + this + " from " + source + " : " + e, e);
                }
                return true;
-    }    
+       }

-    /**
-     * Called when the node we routed the request to returned a valid noderef, 
and we don't want it.
-     * So we relay it downstream to somebody who does, and wait to relay the 
response back upstream.
-     * @param noderef
-     * @param om
-     */
+       /**
+        * Called when the node we routed the request to returned a valid 
noderef, and we don't want it.
+        * So we relay it downstream to somebody who does, and wait to relay 
the response back upstream.
+        * @param noderef
+        * @param om
+        */
        private void finishOpennetRelay(byte[] noderef, OpennetManager om) {
-       if(logMINOR)
-               Logger.minor(this, "Finishing opennet: relaying reference from 
"+rs.successFrom());
+               if(logMINOR)
+                       Logger.minor(this, "Finishing opennet: relaying 
reference from " + rs.successFrom());
                // Send it back to the handler, then wait for the ConnectReply
                PeerNode dataSource = rs.successFrom();
-               
+
                try {
                        om.sendOpennetRef(false, uid, source, noderef, this);
-               } catch (NotConnectedException e) {
+               } catch(NotConnectedException e) {
                        // Lost contact with request source, nothing we can do
                        return;
                }
-               
+
                // Now wait for reply from the request source.
-               
+
                byte[] newNoderef = om.waitForOpennetNoderef(true, source, uid, 
this);
-               
-               if(newNoderef == null) {
+
+               if(newNoderef == null)
                        // Already sent a ref, no way to tell upstream that we 
didn't receive one. :(
                        return;
-               }
-               
+
                // Send it forward to the data source, if it is valid.
-               
-               if(om.validateNoderef(newNoderef, 0, newNoderef.length, source, 
false) != null) {
+
+               if(om.validateNoderef(newNoderef, 0, newNoderef.length, source, 
false) != null)
                        try {
                                om.sendOpennetRef(true, uid, dataSource, 
newNoderef, this);
-                       } catch (NotConnectedException e) {
+                       } catch(NotConnectedException e) {
                                // How sad
                                return;
                        }
-               }
        }
-
        private int sentBytes;
        private int receivedBytes;
        private volatile Object bytesSync = new Object();
-       
+
        public void sentBytes(int x) {
                synchronized(bytesSync) {
                        sentBytes += x;
                }
                node.nodeStats.requestSentBytes(key instanceof NodeSSK, x);
-               if(logMINOR) Logger.minor(this, "sentBytes("+x+") on "+this);
+               if(logMINOR)
+                       Logger.minor(this, "sentBytes(" + x + ") on " + this);
        }

        public void receivedBytes(int x) {
@@ -660,11 +653,11 @@
                 */
                node.sentPayload(x);
                node.nodeStats.requestSentBytes(key instanceof NodeSSK, -x);
-               if(logMINOR) Logger.minor(this, "sentPayload("+x+") on "+this);
+               if(logMINOR)
+                       Logger.minor(this, "sentPayload(" + x + ") on " + this);
        }

        public int getPriority() {
                return NativeThread.HIGH_PRIORITY;
        }
-    
 }

Modified: branches/db4o/freenet/src/freenet/node/RequestScheduler.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/RequestScheduler.java        
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/RequestScheduler.java        
2008-08-07 18:30:55 UTC (rev 21657)
@@ -13,7 +13,8 @@

 public interface RequestScheduler {

-       /** Tell the scheduler that a request from a specific RandomGrabArray 
succeeded.
+       /**
+        * Tell the scheduler that a request from a specific RandomGrabArray 
succeeded.
         * Definition of "succeeded" will vary, but the point is most 
schedulers will run another
         * request from the parentGrabArray in the near future on the theory 
that if one works,
         * another may also work. Also, delete the ChosenRequest if it is 
persistent. 

Modified: branches/db4o/freenet/src/freenet/node/RequestStarter.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/RequestStarter.java  2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/RequestStarter.java  2008-08-07 
18:30:55 UTC (rev 21657)
@@ -106,7 +106,7 @@
                while(true) {
                        // Allow 5 minutes before we start killing requests due 
to not connecting.
                        OpennetManager om;
-                       if(core.node.peers.countConnectedPeers() == 0 && (om = 
core.node.getOpennet()) != null &&
+                       if(core.node.peers.countConnectedPeers() < 3 && (om = 
core.node.getOpennet()) != null &&
                                        System.currentTimeMillis() - 
om.getCreationTime() < 5*60*1000) {
                                try {
                                        synchronized(this) {
@@ -270,6 +270,9 @@
                public void run() {
                        try {
                    freenet.support.Logger.OSThread.logPID(this);
+                   // FIXME ? key is not known for inserts here
+                   if (key != null)
+                       
stats.reportOutgoingLocalRequestLocation(key.toNormalizedDouble());
                    if(!req.send(core, sched)) {
                                if(!((!req.isPersistent()) && 
req.request.isCancelled(null)))
                                        Logger.error(this, "run() not able to 
send a request on "+req);

Modified: branches/db4o/freenet/src/freenet/node/RequestStarterGroup.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/RequestStarterGroup.java     
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/RequestStarterGroup.java     
2008-08-07 18:30:55 UTC (rev 21657)
@@ -8,6 +8,7 @@
 import freenet.config.Config;
 import freenet.config.SubConfig;
 import freenet.crypt.RandomSource;
+import freenet.keys.Key;
 import freenet.support.Logger;
 import freenet.support.SimpleFieldSet;
 import freenet.support.TimeUtil;
@@ -35,9 +36,10 @@
        public final ClientRequestScheduler sskFetchScheduler;
        public final ClientRequestScheduler sskPutScheduler;

+       private final NodeStats stats;
        RequestStarterGroup(Node node, NodeClientCore core, int portNumber, 
RandomSource random, Config config, SimpleFieldSet fs, ClientContext ctx) {
                SubConfig schedulerConfig = new SubConfig("node.scheduler", 
config);
-               NodeStats stats = core.nodeStats;
+               this.stats = core.nodeStats;

                throttleWindow = new ThrottleWindowManager(2.0, fs == null ? 
null : fs.subset("ThrottleWindow"), node);
                throttleWindowCHK = new ThrottleWindowManager(2.0, fs == null ? 
null : fs.subset("ThrottleWindowCHK"), node);
@@ -140,10 +142,11 @@
                return sskInsertThrottle;
        }

-       public void requestCompleted(boolean isSSK, boolean isInsert) {
+       public void requestCompleted(boolean isSSK, boolean isInsert, Key key) {
                throttleWindow.requestCompleted();
                (isSSK ? throttleWindowSSK : 
throttleWindowCHK).requestCompleted();
                (isInsert ? throttleWindowInsert : 
throttleWindowRequest).requestCompleted();
+               stats.reportOutgoingRequestLocation(key.toNormalizedDouble());
        }

        public void rejectedOverload(boolean isSSK, boolean isInsert) {

Modified: 
branches/db4o/freenet/src/freenet/node/ResettingHTLProbeRequestSender.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/ResettingHTLProbeRequestSender.java  
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/ResettingHTLProbeRequestSender.java  
2008-08-07 18:30:55 UTC (rev 21657)
@@ -122,15 +122,10 @@
                 return;
             }

-            double nextValue=next.getLocation();
-                       
             if(logMINOR) Logger.minor(this, "Routing request to "+next);
             nodesRoutedTo.add(next);

-            if(Location.distance(target, nextValue, true) > 
Location.distance(target, nearestLoc, true)) {
-                htl = node.decrementHTL((hasForwarded ? next : source), htl);
-                if(logMINOR) Logger.minor(this, "Backtracking: 
target="+target+" next="+nextValue+" closest="+nearestLoc+" so htl="+htl);
-            }
+           htl = node.decrementHTL((hasForwarded ? next : source), htl);

             Message req = createDataRequest();


Modified: branches/db4o/freenet/src/freenet/node/SeedClientPeerNode.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/SeedClientPeerNode.java      
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/SeedClientPeerNode.java      
2008-08-07 18:30:55 UTC (rev 21657)
@@ -92,8 +92,14 @@
                if(!isConnected()) {
                        // SeedClientPeerNode's always start off unverified.
                        // If it doesn't manage to connect in 60 seconds, dump 
it.
-                       if(System.currentTimeMillis() - 
lastReceivedPacketTime() > 60*1000)
+                       // However, we don't want to be dumped *before* we 
connect,
+                       // so we need to check that first.
+                       // Synchronize to avoid messy races.
+                       synchronized(this) {
+                               if(timeLastConnectionCompleted() > 0 &&
+                                               System.currentTimeMillis() - 
lastReceivedPacketTime() > 60*1000)
                                return true;
+                       }
                }
                return false;
        }

Copied: branches/db4o/freenet/src/freenet/node/SeedServerTestPeerNode.java 
(from rev 21652, trunk/freenet/src/freenet/node/SeedServerTestPeerNode.java)
===================================================================
--- branches/db4o/freenet/src/freenet/node/SeedServerTestPeerNode.java          
                (rev 0)
+++ branches/db4o/freenet/src/freenet/node/SeedServerTestPeerNode.java  
2008-08-07 18:30:55 UTC (rev 21657)
@@ -0,0 +1,75 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.node;
+
+import freenet.io.comm.PeerParseException;
+import freenet.io.comm.ReferenceSignatureVerificationException;
+import freenet.support.SimpleFieldSet;
+
+/**
+ *
+ * @author nextgens
+ */
+public class SeedServerTestPeerNode extends SeedServerPeerNode {
+
+       public SeedServerTestPeerNode(SimpleFieldSet fs, Node node2, NodeCrypto 
crypto, PeerManager peers, boolean fromLocal, OutgoingPacketMangler mangler) 
throws FSParseException, PeerParseException, 
ReferenceSignatureVerificationException {
+               super(fs, node2, crypto, peers, fromLocal, mangler);
+       }
+       
+       public SimpleFieldSet exportFieldSet() {
+               SimpleFieldSet sfs = super.exportFieldSet();
+               sfs.putOverwrite("opennet", "true");
+               return sfs;
+       }
+
+       public boolean shouldDisconnectAndRemoveNow() {
+               return false;
+       }
+       
+       protected void sendInitialMessages() {}
+       
+       public enum FATE {
+               // Never connected
+               NEVER_CONNECTED,
+               // Connected but no packets received yet
+               CONNECTED_NO_PACKETS_RECEIVED,
+               // Connected but TOO_OLD
+               CONNECTED_TOO_OLD,
+               // Connected and received packets
+               CONNECTED_SUCCESS,
+               // Connected but timed out after no packets received
+               CONNECTED_TIMEOUT_NO_PACKETS_RECEIVED,
+               // Connected but then disconnected for no known reason
+               CONNECTED_DISCONNECTED_UNKNOWN
+       }
+       
+       public void onRemove() {
+               long lastReceivedDataPacketTime = lastReceivedDataPacketTime();
+               if(lastReceivedDataPacketTime <= 0 && 
timeLastConnectionCompleted() > 0)
+                       System.err.println(this.getIdentityString()+" : 
REMOVED: TIMEOUT: NO PACKETS RECEIVED AFTER SUCCESSFUL CONNECTION SETUP");
+               else if(timeLastConnectionCompleted() <= 0)
+                       System.err.println(this.getIdentityString()+" : 
REMOVED: NEVER CONNECTED");
+               else
+                       System.err.println(this.getIdentityString()+" : 
REMOVED: UNKNOWN CAUSE");
+               super.onRemove();
+       }
+       
+       public FATE getFate() {
+               long lastReceivedDataPacketTime = lastReceivedDataPacketTime();
+               if(isConnected()) {
+                       if(lastReceivedDataPacketTime <= 0)
+                               return FATE.CONNECTED_NO_PACKETS_RECEIVED;
+                       else if(this.isUnroutableOlderVersion())
+                               return FATE.CONNECTED_TOO_OLD;
+                       else
+                               return FATE.CONNECTED_SUCCESS;
+               }
+               long lastConnectionTime = timeLastConnectionCompleted();
+               if(lastConnectionTime <= 0)
+                       return FATE.NEVER_CONNECTED;
+               if(lastReceivedDataPacketTime <= 0)
+                       return FATE.CONNECTED_TIMEOUT_NO_PACKETS_RECEIVED;
+               return FATE.CONNECTED_DISCONNECTED_UNKNOWN;
+       }
+}

Modified: branches/db4o/freenet/src/freenet/node/TextModeClientInterface.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/TextModeClientInterface.java 
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/TextModeClientInterface.java 
2008-08-07 18:30:55 UTC (rev 21657)
@@ -899,14 +899,24 @@
                } else {
                        probeAll(Fields.parseInt(uline, 
NodeDispatcher.PROBE_TYPE_RESETTING_HTL));
                }
-        } else if(uline.startsWith("PLUGLOAD:")) {
-               if (line.substring("PLUGLOAD:".length()).trim().equals("?")) {
-                       outsb.append("  PLUGLOAD: pluginName         - Load 
official plugin from freenetproject.org\r\n");
-                       outsb.append("  PLUGLOAD: file://<filename>  - Load 
plugin from file\r\n");
-                       outsb.append("  PLUGLOAD: http://...         - Load 
plugin from online file\r\n");
+        } else if(uline.startsWith("PLUGLOAD")) {
+               if(uline.startsWith("PLUGLOAD:O:")) {
+                       String name = 
line.substring("PLUGLOAD:O:".length()).trim();
+                       n.pluginManager.startPluginOfficial(name, true);
+               } else if(uline.startsWith("PLUGLOAD:F:")) {
+                       String name = 
line.substring("PLUGLOAD:F:".length()).trim();
+                       n.pluginManager.startPluginFile(name, true);
+               } else if(uline.startsWith("PLUGLOAD:U:")) {
+                       String name = 
line.substring("PLUGLOAD:U:".length()).trim();
+                       n.pluginManager.startPluginURL(name, true);
+               } else if(uline.startsWith("PLUGLOAD:K:")) {
+                       String name = 
line.substring("PLUGLOAD:K:".length()).trim();
+                       n.pluginManager.startPluginFreenet(name, true);
                } else {
-                       String name = 
line.substring("PLUGLOAD:".length()).trim();
-                       n.pluginManager.startPlugin(name, true);
+                       outsb.append("  PLUGLOAD:O: pluginName         - Load 
official plugin from freenetproject.org\r\n");
+                       outsb.append("  PLUGLOAD:F: file://<filename>  - Load 
plugin from file\r\n");
+                       outsb.append("  PLUGLOAD:U: http://...         - Load 
plugin from online file\r\n");
+                       outsb.append("  PLUGLOAD:K: freenet key        - Load 
plugin from freenet uri\r\n");
                }
         } else if(uline.startsWith("PLUGLIST")) {
                outsb.append(n.pluginManager.dumpPlugins());

Modified: branches/db4o/freenet/src/freenet/node/UptimeEstimator.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/UptimeEstimator.java 2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/UptimeEstimator.java 2008-08-07 
18:30:55 UTC (rev 21657)
@@ -15,11 +15,13 @@
 import freenet.support.Fields;
 import freenet.support.Logger;
 import freenet.support.io.Closer;
+import java.text.DecimalFormat;

 /**
  * A class to estimate the node's average uptime. Every 5 minutes (with a 
fixed offset), we write
  * an integer (the number of minutes since the epoch) to the end of a file. We 
rotate it when it
  * gets huge. We read it to figure out how many of the 5 minute slots in the 
last X period are occupied.
+ *
  * @author toad
  */
 public class UptimeEstimator implements Runnable {
@@ -45,6 +47,8 @@

        /** We write to disk every 5 minutes. The offset is derived from the 
node's identity. */
        private long timeOffset;
+       
+       private final DecimalFormat fix1p2 = new DecimalFormat("0.00");

        public UptimeEstimator(File nodeDir, Ticker ticker, byte[] bs) {
                this.ticker = ticker;
@@ -63,7 +67,7 @@
                readData(prevFile, base);
                readData(logFile, base);
                schedule(System.currentTimeMillis());
-               System.err.println("Created uptime estimator, time offset is 
"+timeOffset+" uptime at startup is "+getUptime());
+               System.out.println("Created uptime estimator, time offset is 
"+timeOffset+" uptime at startup is "+fix1p2.format(getUptime())+'%');
        }

        private void readData(File file, int base) {

Modified: branches/db4o/freenet/src/freenet/node/Version.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/Version.java 2008-08-07 16:48:54 UTC 
(rev 21656)
+++ branches/db4o/freenet/src/freenet/node/Version.java 2008-08-07 18:30:55 UTC 
(rev 21657)
@@ -24,17 +24,17 @@
        public static final String protocolVersion = "1.0";

        /** The build number of the current revision */
-       private static final int buildNumber = 1154;
+       private static final int buildNumber = 1155;

        /** Oldest build of Fred we will talk to */
-       private static final int oldLastGoodBuild = 1145;
-       private static final int newLastGoodBuild = 1153;
+       private static final int oldLastGoodBuild = 1154;
+       private static final int newLastGoodBuild = 1155;
        static final long transitionTime;

        static {
                final Calendar _cal = 
Calendar.getInstance(TimeZone.getTimeZone("GMT"));
                // year, month - 1 (or constant), day, hour, minute, second
-               _cal.set( 2008, Calendar.MAY, 8, 0, 0, 0 );
+               _cal.set( 2008, Calendar.AUGUST, 13, 0, 0, 0 );
                transitionTime = _cal.getTimeInMillis();
        }


Modified: branches/db4o/freenet/src/freenet/node/fcp/ClientGet.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/ClientGet.java   2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/fcp/ClientGet.java   2008-08-07 
18:30:55 UTC (rev 21657)
@@ -283,7 +283,7 @@
                                                binaryBlob ? returnBucket : 
null);

                if(finished && succeeded)
-                               allDataPending = new 
AllDataMessage(returnBucket, identifier, global, startupTime, completionTime);
+                       allDataPending = new AllDataMessage(returnBucket, 
identifier, global, startupTime, completionTime);
        }

        /**

Modified: branches/db4o/freenet/src/freenet/node/fcp/ClientPut.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/ClientPut.java   2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/fcp/ClientPut.java   2008-08-07 
18:30:55 UTC (rev 21657)
@@ -10,6 +10,7 @@
 import java.io.UnsupportedEncodingException;
 import java.net.MalformedURLException;
 import java.security.MessageDigest;
+import java.util.Arrays;

 import freenet.client.ClientMetadata;
 import freenet.client.DefaultMIMETypes;
@@ -34,8 +35,6 @@
 import freenet.support.io.FileBucket;
 import freenet.support.io.SerializableToFieldSetBucketUtil;

-import java.util.Arrays;
-
 import com.db4o.ObjectContainer;

 public class ClientPut extends ClientPutBase {
@@ -182,6 +181,9 @@
                if(mimeType == null && origFilename != null) {
                        mimeType = 
DefaultMIMETypes.guessMIMEType(origFilename.getName(), true);
                }
+               if ((mimeType == null) && (targetFilename != null)) {
+                       mimeType = 
DefaultMIMETypes.guessMIMEType(targetFilename, true);
+               }
                if(mimeType == null) {
                        mimeType = DefaultMIMETypes.guessMIMEType(identifier, 
true);
                }

Modified: branches/db4o/freenet/src/freenet/node/fcp/ClientPutBase.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/ClientPutBase.java       
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/fcp/ClientPutBase.java       
2008-08-07 18:30:55 UTC (rev 21657)
@@ -284,7 +284,7 @@
        private void trySendGeneratedURIMessage(FCPConnectionOutputHandler 
handler, ObjectContainer container) {
                FCPMessage msg;
                synchronized(this) {
-                       msg = new URIGeneratedMessage(generatedURI, identifier);
+                       msg = new URIGeneratedMessage(generatedURI, identifier, 
client.isGlobalQueue);
                }
                if(handler != null)
                        handler.queue(msg);

Modified: branches/db4o/freenet/src/freenet/node/fcp/ClientRequest.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/ClientRequest.java       
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/fcp/ClientRequest.java       
2008-08-07 18:30:55 UTC (rev 21657)
@@ -4,20 +4,20 @@
 import java.io.BufferedWriter;
 import java.io.IOException;
 import java.net.MalformedURLException;
-
-import com.db4o.ObjectContainer;
-
-import freenet.client.async.ClientContext;
 import freenet.client.async.ClientRequester;
-import freenet.client.async.DBJob;
 import freenet.keys.FreenetURI;
 import freenet.support.Fields;
 import freenet.support.Logger;
 import freenet.support.SimpleFieldSet;
 import freenet.support.api.Bucket;
-import freenet.support.io.NativeThread;
 import freenet.support.io.SerializableToFieldSetBucket;

+import com.db4o.ObjectContainer;
+
+import freenet.client.async.ClientContext;
+import freenet.client.async.DBJob;
+import freenet.support.io.NativeThread;
+
 /**
  * A request process carried out by the node for an FCP client.
  * Examples: ClientGet, ClientPut, MultiGet.

Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java        
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPConnectionHandler.java        
2008-08-07 18:30:55 UTC (rev 21657)
@@ -533,7 +533,7 @@
                if(read && (readFile != null) && readFile.canWrite()){ 
                        // We don't want to attempt to write before: in case an 
IOException is raised, we want to inform the
                        // client somehow that the node can't write there... 
And setting readFile to null means we won't inform
-                       // it on the status (as if it hasn't requested us to do 
the test).
+                       // it on the status (as if it hadn't requested us to do 
the test).
                        FileOutputStream fos = null;
                        BufferedOutputStream bos = null;
                        try {
@@ -541,7 +541,6 @@
                                bos = new BufferedOutputStream(fos);
                                bos.write(result.readContent.getBytes("UTF-8"));
                                bos.flush();
-                               bos.close();
                        } catch (IOException e) {
                                Logger.error(this, "Got a IOE while creating 
the file (" + readFile.toString() + " ! " + e.getMessage());
                        } finally {

Modified: branches/db4o/freenet/src/freenet/node/fcp/PersistentGet.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/PersistentGet.java       
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/fcp/PersistentGet.java       
2008-08-07 18:30:55 UTC (rev 21657)
@@ -60,6 +60,8 @@
                fs.putSingle("URI", uri.toString(false, false));
                fs.put("Verbosity", verbosity);
                fs.putSingle("ReturnType", 
ClientGetMessage.returnTypeString(returnType));
+               fs.putSingle("Persistence", 
ClientRequest.persistenceTypeString(persistenceType));
+               // FIXME PersistenceType is backward compatibility cruft, 
everything else uses Persistence
                fs.putSingle("PersistenceType", 
ClientRequest.persistenceTypeString(persistenceType));
                if(returnType == ClientGetMessage.RETURN_TYPE_DISK) {
                        fs.putSingle("Filename", targetFile.getAbsolutePath());

Modified: branches/db4o/freenet/src/freenet/node/fcp/SubscribeUSKMessage.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/SubscribeUSKMessage.java 
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/fcp/SubscribeUSKMessage.java 
2008-08-07 18:30:55 UTC (rev 21657)
@@ -14,8 +14,9 @@
 import freenet.support.SimpleFieldSet;

 /**
- * Sent by a client to subscribe to a USK. The client will then be notified 
whenever a new latest version of
- * the USK is available. There is a flag for whether the node should actively 
probe for the USK.
+ * Sent by a client to subscribe to a USK. The client will then be notified by 
a SubscribedUSKMessage that his
+ * request has been taken into account and whenever a new latest version of 
the USK is available.
+ * There is a flag for whether the node should actively probe for the USK.
  * 
  * SubscribeUSK
  * URI=USK at 
60I8H8HinpgZSOuTSD66AVlIFAy-xsppFr0YCzCar7c,NzdivUGCGOdlgngOGRbbKDNfSCnjI0FXjHLzJM4xkJ4,AQABAAE/index/4
@@ -62,6 +63,9 @@
        public void run(FCPConnectionHandler handler, Node node)
                        throws MessageInvalidException {
                new SubscribeUSK(this, node.clientCore, handler);
+               
+               SubscribedUSKMessage reply = new SubscribedUSKMessage(this);
+               handler.outputHandler.queue(reply);
        }

        public void removeFrom(ObjectContainer container) {

Copied: branches/db4o/freenet/src/freenet/node/fcp/SubscribedUSKMessage.java 
(from rev 21652, trunk/freenet/src/freenet/node/fcp/SubscribedUSKMessage.java)
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/SubscribedUSKMessage.java        
                        (rev 0)
+++ branches/db4o/freenet/src/freenet/node/fcp/SubscribedUSKMessage.java        
2008-08-07 18:30:55 UTC (rev 21657)
@@ -0,0 +1,53 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.node.fcp;
+
+import com.db4o.ObjectContainer;
+
+import freenet.node.Node;
+import freenet.support.SimpleFieldSet;
+
+/**
+ * Sent by the node back to the client after it receives a SubscribeUSK 
message.
+ * 
+ * SubscribedUSK
+ * URI=USK at 
60I8H8HinpgZSOuTSD66AVlIFAy-xsppFr0YCzCar7c,NzdivUGCGOdlgngOGRbbKDNfSCnjI0FXjHLzJM4xkJ4,AQABAAE/index/4
+ * DontPoll=true // meaning passively subscribe, don't cause the node to 
actively probe for it
+ * Identifier=identifier
+ * End
+ * 
+ * @author Florent Daigni&egrave;re &lt;nextgens at freenetproject.org&gt;
+ */
+public class SubscribedUSKMessage extends FCPMessage {
+       public static final String name = "SubscribedUSK";
+       
+       public final SubscribeUSKMessage message;
+       
+       SubscribedUSKMessage(SubscribeUSKMessage m) {
+               this.message = m;
+       }
+       
+       public SimpleFieldSet getFieldSet() {
+               SimpleFieldSet sfs = new SimpleFieldSet(true);
+               sfs.putSingle("Identifier", message.identifier);
+               sfs.putSingle("URI", message.key.getURI().toString());
+               sfs.put("DontPoll", message.dontPoll);
+               
+               return sfs;
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       public void run(FCPConnectionHandler handler, Node node) throws 
MessageInvalidException {
+               throw new 
MessageInvalidException(ProtocolErrorMessage.INVALID_MESSAGE, name + " goes 
from server to client not the other way around", name, false);
+       }
+
+       @Override
+       public void removeFrom(ObjectContainer container) {
+               message.removeFrom(container);
+               container.delete(this);
+       }
+}
\ No newline at end of file

Modified: branches/db4o/freenet/src/freenet/node/fcp/URIGeneratedMessage.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/URIGeneratedMessage.java 
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/fcp/URIGeneratedMessage.java 
2008-08-07 18:30:55 UTC (rev 21657)
@@ -13,16 +13,19 @@

        private final FreenetURI uri;
        private final String identifier;
+       private final boolean global;

-       public URIGeneratedMessage(FreenetURI uri, String identifier) {
+       public URIGeneratedMessage(FreenetURI uri, String identifier, boolean 
global) {
                this.uri = uri;
                this.identifier = identifier;
+               this.global = global;
        }

        public SimpleFieldSet getFieldSet() {
                SimpleFieldSet fs = new SimpleFieldSet(true);
                fs.putSingle("URI", uri.toString());
                fs.putSingle("Identifier", identifier);
+               fs.put("Global", global);
                return fs;
        }


Modified: 
branches/db4o/freenet/src/freenet/node/simulator/RealNodeBusyNetworkTest.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/node/simulator/RealNodeBusyNetworkTest.java   
    2008-08-07 16:48:54 UTC (rev 21656)
+++ 
branches/db4o/freenet/src/freenet/node/simulator/RealNodeBusyNetworkTest.java   
    2008-08-07 18:30:55 UTC (rev 21657)
@@ -47,6 +47,7 @@
     static final boolean ENABLE_PER_NODE_FAILURE_TABLES = false;
     static final boolean ENABLE_SWAP_QUEUEING = false;
     static final boolean ENABLE_PACKET_COALESCING = true;
+    static final boolean ENABLE_FOAF = true;

     static final int TARGET_SUCCESSES = 20;
     //static final int NUMBER_OF_NODES = 50;
@@ -74,7 +75,7 @@
         Executor executor = new PooledExecutor();
         for(int i=0;i<NUMBER_OF_NODES;i++) {
             nodes[i] = 
-               NodeStarter.createTestNode(5001+i, name, false, true, false, 
MAX_HTL, 20 /* 5% */, random, executor, 500*NUMBER_OF_NODES, 
(CHKBlock.DATA_LENGTH+CHKBlock.TOTAL_HEADERS_LENGTH)*100, true, 
ENABLE_SWAPPING, false, ENABLE_ULPRS, ENABLE_PER_NODE_FAILURE_TABLES, 
ENABLE_SWAP_QUEUEING, ENABLE_PACKET_COALESCING, 8000);
+               NodeStarter.createTestNode(5001+i, 0, name, false, true, false, 
MAX_HTL, 20 /* 5% */, random, executor, 500*NUMBER_OF_NODES, 
(CHKBlock.DATA_LENGTH+CHKBlock.TOTAL_HEADERS_LENGTH)*100, true, 
ENABLE_SWAPPING, false, ENABLE_ULPRS, ENABLE_PER_NODE_FAILURE_TABLES, 
ENABLE_SWAP_QUEUEING, ENABLE_PACKET_COALESCING, 8000, ENABLE_FOAF, false);
             Logger.normal(RealNodeRoutingTest.class, "Created node "+i);
         }


Modified: 
branches/db4o/freenet/src/freenet/node/simulator/RealNodeNetworkColoringTest.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/node/simulator/RealNodeNetworkColoringTest.java
   2008-08-07 16:48:54 UTC (rev 21656)
+++ 
branches/db4o/freenet/src/freenet/node/simulator/RealNodeNetworkColoringTest.java
   2008-08-07 18:30:55 UTC (rev 21657)
@@ -40,6 +40,7 @@

     static final short MAX_HTL = (short)6;
        static final int DEGREE = 5;
+       static final boolean ENABLE_FOAF = false;

        static final long storeSize = 1024*1024;

@@ -78,21 +79,21 @@
         for(int i=0;i<NUMBER_OF_NODES;i++) {
                        allNodes[totalNodes] =
             subnetA[i] = 
-               NodeStarter.createTestNode(5001+totalNodes, wd, false, true, 
true, MAX_HTL, 0 /* no dropped packets */, random, executor, 
500*NUMBER_OF_NODES, storeSize, true, true, false, false, false, false, true, 
0);
+               NodeStarter.createTestNode(5001+totalNodes, 0, wd, false, true, 
true, MAX_HTL, 0 /* no dropped packets */, random, executor, 
500*NUMBER_OF_NODES, storeSize, true, true, false, false, false, false, true, 
0, ENABLE_FOAF, false);
                        totalNodes++;
             Logger.normal(RealNodeRoutingTest.class, "Created 'A' node 
"+totalNodes);
         }
         for(int i=0;i<NUMBER_OF_NODES;i++) {
                        allNodes[totalNodes] =
             subnetB[i] = 
-                       NodeStarter.createTestNode(5001+totalNodes, wd, false, 
true, true, MAX_HTL, 0 /* no dropped packets */, random, executor, 
500*NUMBER_OF_NODES, storeSize, true, true, false, false, false, false, true, 
0);
+                       NodeStarter.createTestNode(5001+totalNodes, 0, wd, 
false, true, true, MAX_HTL, 0 /* no dropped packets */, random, executor, 
500*NUMBER_OF_NODES, storeSize, true, true, false, false, false, false, true, 
0, ENABLE_FOAF, false);
                        totalNodes++;
             Logger.normal(RealNodeRoutingTest.class, "Created 'B' node 
"+totalNodes);
         }
                for(int i=0;i<BRIDGES;i++) {
                        allNodes[totalNodes] =
             bridges[i] = 
-                       NodeStarter.createTestNode(5001+totalNodes, wd, false, 
true, true, MAX_HTL, 0 /* no dropped packets */, random, executor, 
500*NUMBER_OF_NODES, storeSize, true, true, false, false, false, false, true, 
0);
+                       NodeStarter.createTestNode(5001+totalNodes, 0, wd, 
false, true, true, MAX_HTL, 0 /* no dropped packets */, random, executor, 
500*NUMBER_OF_NODES, storeSize, true, true, false, false, false, false, true, 
0,ENABLE_FOAF, false);
                        totalNodes++;
             Logger.normal(RealNodeRoutingTest.class, "Created bridge node 
"+totalNodes);
         }

Modified: branches/db4o/freenet/src/freenet/node/simulator/RealNodePingTest.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/simulator/RealNodePingTest.java      
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/simulator/RealNodePingTest.java      
2008-08-07 18:30:55 UTC (rev 21657)
@@ -33,8 +33,8 @@
         RandomSource random = NodeStarter.globalTestInit("pingtest", false, 
Logger.ERROR, "");
         // Create 2 nodes
         Executor executor = new PooledExecutor();
-        Node node1 = NodeStarter.createTestNode(5001, "pingtest", false, 
false, true, Node.DEFAULT_MAX_HTL, 0, random, executor, 1000, 65536, true, 
false, false, false, false, false, true, 0);
-        Node node2 = NodeStarter.createTestNode(5002, "pingtest", false, 
false, true, Node.DEFAULT_MAX_HTL, 0, random, executor, 1000, 65536, true, 
false, false, false, false, false, true, 0);
+        Node node1 = NodeStarter.createTestNode(5001, 0, "pingtest", false, 
false, true, Node.DEFAULT_MAX_HTL, 0, random, executor, 1000, 65536, true, 
false, false, false, false, false, true, 0, false, false);
+        Node node2 = NodeStarter.createTestNode(5002, 0, "pingtest", false, 
false, true, Node.DEFAULT_MAX_HTL, 0, random, executor, 1000, 65536, true, 
false, false, false, false, false, true, 0, false, false);
         // Connect
         node1.connect(node2);
         node2.connect(node1);

Modified: 
branches/db4o/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java 
    2008-08-07 16:48:54 UTC (rev 21656)
+++ 
branches/db4o/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java 
    2008-08-07 18:30:55 UTC (rev 21657)
@@ -46,6 +46,7 @@
     static final boolean ENABLE_PER_NODE_FAILURE_TABLES = false;
     static final boolean ENABLE_SWAP_QUEUEING = false;
     static final boolean ENABLE_PACKET_COALESCING = true;
+    static final boolean ENABLE_FOAF = true;

     static final int TARGET_SUCCESSES = 20;
     //static final int NUMBER_OF_NODES = 50;
@@ -74,7 +75,7 @@
         Executor executor = new PooledExecutor();
         for(int i=0;i<NUMBER_OF_NODES;i++) {
             nodes[i] = 
-               NodeStarter.createTestNode(5001+i, name, false, true, false, 
MAX_HTL, 20 /* 5% */, random, executor, 500*NUMBER_OF_NODES, 256*1024, true, 
ENABLE_SWAPPING, false, ENABLE_ULPRS, ENABLE_PER_NODE_FAILURE_TABLES, 
ENABLE_SWAP_QUEUEING, ENABLE_PACKET_COALESCING, 12000);
+               NodeStarter.createTestNode(5001+i, 0, name, false, true, false, 
MAX_HTL, 20 /* 5% */, random, executor, 500*NUMBER_OF_NODES, 256*1024, true, 
ENABLE_SWAPPING, false, ENABLE_ULPRS, ENABLE_PER_NODE_FAILURE_TABLES, 
ENABLE_SWAP_QUEUEING, ENABLE_PACKET_COALESCING, 12000, ENABLE_FOAF, false);
             Logger.normal(RealNodeRoutingTest.class, "Created node "+i);
         }


Modified: 
branches/db4o/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java   
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java   
2008-08-07 18:30:55 UTC (rev 21657)
@@ -27,152 +27,156 @@
  */
 public class RealNodeRoutingTest extends RealNodeTest {

-    static final int NUMBER_OF_NODES = 500;
-    static final int DEGREE = 10;
-    static final short MAX_HTL = (short)10;
-    static final boolean START_WITH_IDEAL_LOCATIONS = true;
-    static final boolean FORCE_NEIGHBOUR_CONNECTIONS = true;
-    static final int MAX_PINGS = 2000;
-    static final boolean ENABLE_SWAPPING = false;
-    static final boolean ENABLE_SWAP_QUEUEING = false;
-    
-    public static void main(String[] args) throws Exception {
-        System.out.println("Routing test using real nodes:");
-        System.out.println();
-        String dir = "realNodeRequestInsertTest";
-        File wd = new File(dir);
-        if(!FileUtil.removeAll(wd)) {
-               System.err.println("Mass delete failed, test may not be 
accurate.");
-               System.exit(EXIT_CANNOT_DELETE_OLD_DATA);
-        }
-        wd.mkdir();
-        //NOTE: globalTestInit returns in ignored random source
-        NodeStarter.globalTestInit(dir, false, Logger.ERROR, "");
-        DummyRandomSource random = new DummyRandomSource();
-        //DiffieHellman.init(random);
-        Node[] nodes = new Node[NUMBER_OF_NODES];
-        Logger.normal(RealNodeRoutingTest.class, "Creating nodes...");
-        Executor executor = new PooledExecutor();
-        for(int i=0;i<NUMBER_OF_NODES;i++) {
-               System.err.println("Creating node "+i);
-            nodes[i] = 
-               NodeStarter.createTestNode(5001+i, dir, false, true, true, 
MAX_HTL, 0 /* no dropped packets */, random, executor, 500*NUMBER_OF_NODES, 
65536, true, ENABLE_SWAPPING, false, false, false, ENABLE_SWAP_QUEUEING, true, 
0);
-            Logger.normal(RealNodeRoutingTest.class, "Created node "+i);
-        }
-        Logger.normal(RealNodeRoutingTest.class, "Created "+NUMBER_OF_NODES+" 
nodes");
-        // Now link them up
-        makeKleinbergNetwork(nodes, START_WITH_IDEAL_LOCATIONS, DEGREE, 
FORCE_NEIGHBOUR_CONNECTIONS);
+       static final int NUMBER_OF_NODES = 500;
+       static final int DEGREE = 10;
+       static final short MAX_HTL = (short) 10;
+       static final boolean START_WITH_IDEAL_LOCATIONS = true;
+       static final boolean FORCE_NEIGHBOUR_CONNECTIONS = true;
+       static final int MAX_PINGS = 2000;
+       static final boolean ENABLE_SWAPPING = false;
+       static final boolean ENABLE_SWAP_QUEUEING = false;
+       static final boolean ENABLE_FOAF = true;

-        Logger.normal(RealNodeRoutingTest.class, "Added random links");
-        
-        for(int i=0;i<NUMBER_OF_NODES;i++) {
-               System.err.println("Starting node "+i);
-            nodes[i].start(false);
-        }
-        
-        waitForAllConnected(nodes);
-        
-        waitForPingAverage(0.98, nodes, random, MAX_PINGS, 5000);
-        
-    }
+       public static void main(String[] args) throws Exception {
+               System.out.println("Routing test using real nodes:");
+               System.out.println();
+               String dir = "realNodeRequestInsertTest";
+               File wd = new File(dir);
+               if(!FileUtil.removeAll(wd)) {
+                       System.err.println("Mass delete failed, test may not be 
accurate.");
+                       System.exit(EXIT_CANNOT_DELETE_OLD_DATA);
+               }
+               wd.mkdir();
+               //NOTE: globalTestInit returns in ignored random source
+               NodeStarter.globalTestInit(dir, false, Logger.ERROR, "");
+               DummyRandomSource random = new DummyRandomSource();
+               //DiffieHellman.init(random);
+               Node[] nodes = new Node[NUMBER_OF_NODES];
+               Logger.normal(RealNodeRoutingTest.class, "Creating nodes...");
+               Executor executor = new PooledExecutor();
+               for(int i = 0; i < NUMBER_OF_NODES; i++) {
+                       System.err.println("Creating node " + i);
+                       nodes[i] = NodeStarter.createTestNode(5001 + i, 0, dir, 
false, true, true, MAX_HTL, 0 /* no dropped packets */, random, executor, 500 * 
NUMBER_OF_NODES, 65536, true, ENABLE_SWAPPING, false, false, false, 
ENABLE_SWAP_QUEUEING, true, 0, ENABLE_FOAF, false);
+                       Logger.normal(RealNodeRoutingTest.class, "Created node 
" + i);
+               }
+               Logger.normal(RealNodeRoutingTest.class, "Created " + 
NUMBER_OF_NODES + " nodes");
+               // Now link them up
+               makeKleinbergNetwork(nodes, START_WITH_IDEAL_LOCATIONS, DEGREE, 
FORCE_NEIGHBOUR_CONNECTIONS);

+               Logger.normal(RealNodeRoutingTest.class, "Added random links");
+
+               for(int i = 0; i < NUMBER_OF_NODES; i++) {
+                       System.err.println("Starting node " + i);
+                       nodes[i].start(false);
+               }
+
+               waitForAllConnected(nodes);
+
+               waitForPingAverage(0.98, nodes, random, MAX_PINGS, 5000);
+
+       }
+
        static void waitForPingAverage(double accuracy, Node[] nodes, 
RandomSource random, int maxTests, int sleepTime) throws InterruptedException {
-               
-        int cycleNumber = 0;
-        int lastSwaps = 0;
-        int lastNoSwaps = 0;
-        int failures = 0;
-        int successes = 0;
-        RunningAverage avg = new SimpleRunningAverage(100, 0.0);
-        RunningAverage avg2 = new BootstrappingDecayingRunningAverage(0.0, 
0.0, 1.0, 100, null);
-        int pings = 0;
-        for(int total=0;total<maxTests;total++) {
-            cycleNumber++;
-            try {
-                Thread.sleep(sleepTime);
-            } catch (InterruptedException e) {
-                // Ignore
-            }
-            for(int i=0;i<nodes.length;i++) {
-               System.err.println("Cycle "+cycleNumber+" node "+i+": 
"+nodes[i].getLocation());
-            }
-            int newSwaps = LocationManager.swaps;
-            int totalStarted = LocationManager.startedSwaps;
-            int noSwaps = LocationManager.noSwaps;
-            System.err.println("Swaps: "+(newSwaps-lastSwaps));
-            System.err.println("\nTotal swaps: Started*2: "+totalStarted*2+", 
succeeded: "+newSwaps+", last minute failures: "+noSwaps+
-                    ", ratio "+(double)noSwaps/(double)newSwaps+", early 
failures: "+((totalStarted*2)-(noSwaps+newSwaps)));
-            System.err.println("This cycle ratio: 
"+((double)(noSwaps-lastNoSwaps)) / ((double)(newSwaps - lastSwaps)));
-            lastNoSwaps = noSwaps;
-            System.err.println("Swaps rejected (already locked): 
"+LocationManager.swapsRejectedAlreadyLocked);
-            System.err.println("Swaps rejected (nowhere to go): 
"+LocationManager.swapsRejectedNowhereToGo);
-            System.err.println("Swaps rejected (rate limit): 
"+LocationManager.swapsRejectedRateLimit);
-            System.err.println("Swaps rejected (loop): 
"+LocationManager.swapsRejectedLoop);
-            System.err.println("Swaps rejected (recognized ID):" 
+LocationManager.swapsRejectedRecognizedID);
-            System.err.println("Swaps failed:" +LocationManager.noSwaps);
-            System.err.println("Swaps succeeded:" +LocationManager.swaps);
+               int totalHopsTaken = 0;
+               int cycleNumber = 0;
+               int lastSwaps = 0;
+               int lastNoSwaps = 0;
+               int failures = 0;
+               int successes = 0;
+               RunningAverage avg = new SimpleRunningAverage(100, 0.0);
+               RunningAverage avg2 = new 
BootstrappingDecayingRunningAverage(0.0, 0.0, 1.0, 100, null);
+               int pings = 0;
+               for(int total = 0; total < maxTests; total++) {
+                       cycleNumber++;
+                       try {
+                               Thread.sleep(sleepTime);
+                       } catch(InterruptedException e) {
+                               // Ignore
+                       }
+                       for(int i = 0; i < nodes.length; i++) {
+                               System.err.println("Cycle " + cycleNumber + " 
node " + i + ": " + nodes[i].getLocation());
+                       }
+                       int newSwaps = LocationManager.swaps;
+                       int totalStarted = LocationManager.startedSwaps;
+                       int noSwaps = LocationManager.noSwaps;
+                       System.err.println("Swaps: " + (newSwaps - lastSwaps));
+                       System.err.println("\nTotal swaps: Started*2: " + 
totalStarted * 2 + ", succeeded: " + newSwaps + ", last minute failures: " + 
noSwaps +
+                               ", ratio " + (double) noSwaps / (double) 
newSwaps + ", early failures: " + ((totalStarted * 2) - (noSwaps + newSwaps)));
+                       System.err.println("This cycle ratio: " + ((double) 
(noSwaps - lastNoSwaps)) / ((double) (newSwaps - lastSwaps)));
+                       lastNoSwaps = noSwaps;
+                       System.err.println("Swaps rejected (already locked): " 
+ LocationManager.swapsRejectedAlreadyLocked);
+                       System.err.println("Swaps rejected (nowhere to go): " + 
LocationManager.swapsRejectedNowhereToGo);
+                       System.err.println("Swaps rejected (rate limit): " + 
LocationManager.swapsRejectedRateLimit);
+                       System.err.println("Swaps rejected (loop): " + 
LocationManager.swapsRejectedLoop);
+                       System.err.println("Swaps rejected (recognized ID):" + 
LocationManager.swapsRejectedRecognizedID);
+                       System.err.println("Swaps failed:" + 
LocationManager.noSwaps);
+                       System.err.println("Swaps succeeded:" + 
LocationManager.swaps);

-            double totalSwapInterval = 0.0;
-            double totalSwapTime = 0.0;
-            for(int i=0;i<nodes.length;i++) {
-               totalSwapInterval += nodes[i].lm.getSendSwapInterval();
-               totalSwapTime += nodes[i].lm.getAverageSwapTime();
-            }
-            System.err.println("Average swap time: "+(totalSwapTime / 
nodes.length));
-            System.err.println("Average swap sender interval: 
"+(totalSwapInterval / nodes.length));
-            
-            waitForAllConnected(nodes);
-            
-            lastSwaps = newSwaps;
-            // Do some (routed) test-pings
-            for(int i=0;i<10;i++) {
-                try {
-                    Thread.sleep(sleepTime);
-                } catch (InterruptedException e1) {
-                }
-                try {
-                Node randomNode = nodes[random.nextInt(nodes.length)];
-                Node randomNode2 = randomNode;
-                while(randomNode2 == randomNode)
-                    randomNode2 = nodes[random.nextInt(nodes.length)];
-                double loc2 = randomNode2.getLocation();
-               Logger.normal(RealNodeRoutingTest.class, "Pinging 
"+randomNode2.getDarknetPortNumber()+" @ "+loc2+" from 
"+randomNode.getDarknetPortNumber()+" @ "+randomNode.getLocation());
-                int hopsTaken = randomNode.routedPing(loc2, 
randomNode2.getDarknetIdentity());
-                pings++;
-                if(hopsTaken < 0) {
-                    failures++;
-                    avg.report(0.0);
-                    avg2.report(0.0);
-                    double ratio = (double)successes / 
((double)(failures+successes));
-                    System.err.println("Routed ping "+pings+" FAILED from 
"+randomNode.getDarknetPortNumber()+" to "+randomNode2.getDarknetPortNumber()+" 
(long:"+ratio+", short:"+avg.currentValue()+", vague:"+avg2.currentValue()+ 
')');
-                } else {
-                    successes++;
-                    avg.report(1.0);
-                    avg2.report(1.0);
-                    double ratio = (double)successes / 
((double)(failures+successes));
-                    System.err.println("Routed ping "+pings+" success: 
"+hopsTaken+ ' ' +randomNode.getDarknetPortNumber()+" to 
"+randomNode2.getDarknetPortNumber()+" (long:"+ratio+", 
short:"+avg.currentValue()+", vague:"+avg2.currentValue()+ ')');
-                }
-                } catch (Throwable t) {
-                    Logger.error(RealNodeRoutingTest.class, "Caught "+t, t);
-                }
-            }
-            if(pings > 10 && avg.currentValue() > accuracy && 
((double)successes / ((double)(failures+successes)) > accuracy)) {
-               System.err.println();
-               System.err.println("Reached "+(accuracy*100)+"% accuracy.");
-               System.err.println();
-               System.err.println("Network size: "+nodes.length);
-               System.err.println("Maximum HTL: "+MAX_HTL);
-               System.err.println("Total started swaps: 
"+LocationManager.startedSwaps);
-                System.err.println("Total rejected swaps (already locked): 
"+LocationManager.swapsRejectedAlreadyLocked);
-                System.err.println("Total swaps rejected (nowhere to go): 
"+LocationManager.swapsRejectedNowhereToGo);
-                System.err.println("Total swaps rejected (rate limit): 
"+LocationManager.swapsRejectedRateLimit);
-                System.err.println("Total swaps rejected (loop): 
"+LocationManager.swapsRejectedLoop);
-                System.err.println("Total swaps rejected (recognized ID):" 
+LocationManager.swapsRejectedRecognizedID);
-                System.err.println("Total swaps failed:" 
+LocationManager.noSwaps);
-                System.err.println("Total swaps succeeded:" 
+LocationManager.swaps);
-                return;
-            }
-        }
+                       double totalSwapInterval = 0.0;
+                       double totalSwapTime = 0.0;
+                       for(int i = 0; i < nodes.length; i++) {
+                               totalSwapInterval += 
nodes[i].lm.getSendSwapInterval();
+                               totalSwapTime += 
nodes[i].lm.getAverageSwapTime();
+                       }
+                       System.err.println("Average swap time: " + 
(totalSwapTime / nodes.length));
+                       System.err.println("Average swap sender interval: " + 
(totalSwapInterval / nodes.length));
+
+                       waitForAllConnected(nodes);
+
+                       lastSwaps = newSwaps;
+                       // Do some (routed) test-pings
+                       for(int i = 0; i < 10; i++) {
+                               try {
+                                       Thread.sleep(sleepTime);
+                               } catch(InterruptedException e1) {
+                               }
+                               try {
+                                       Node randomNode = 
nodes[random.nextInt(nodes.length)];
+                                       Node randomNode2 = randomNode;
+                                       while(randomNode2 == randomNode) {
+                                               randomNode2 = 
nodes[random.nextInt(nodes.length)];
+                                       }
+                                       double loc2 = randomNode2.getLocation();
+                                       
Logger.normal(RealNodeRoutingTest.class, "Pinging " + 
randomNode2.getDarknetPortNumber() + " @ " + loc2 + " from " + 
randomNode.getDarknetPortNumber() + " @ " + randomNode.getLocation());
+                                       
+                                       int hopsTaken = 
randomNode.routedPing(loc2, randomNode2.getDarknetIdentity());
+                                       pings++;
+                                       if(hopsTaken < 0) {
+                                               failures++;
+                                               avg.report(0.0);
+                                               avg2.report(0.0);
+                                               double ratio = (double) 
successes / ((double) (failures + successes));
+                                               System.err.println("Routed ping 
" + pings + " FAILED from " + randomNode.getDarknetPortNumber() + " to " + 
randomNode2.getDarknetPortNumber() + " (long:" + ratio + ", short:" + 
avg.currentValue() + ", vague:" + avg2.currentValue() + ')');
+                                       } else {
+                                               totalHopsTaken += hopsTaken;
+                                               successes++;
+                                               avg.report(1.0);
+                                               avg2.report(1.0);
+                                               double ratio = (double) 
successes / ((double) (failures + successes));
+                                               System.err.println("Routed ping 
" + pings + " success: " + hopsTaken + ' ' + randomNode.getDarknetPortNumber() 
+ " to " + randomNode2.getDarknetPortNumber() + " (long:" + ratio + ", short:" 
+ avg.currentValue() + ", vague:" + avg2.currentValue() + ')');
+                                       }
+                               } catch(Throwable t) {
+                                       Logger.error(RealNodeRoutingTest.class, 
"Caught " + t, t);
+                               }
+                       }
+                       if(pings > 10 && avg.currentValue() > accuracy && 
((double) successes / ((double) (failures + successes)) > accuracy)) {
+                               System.err.println();
+                               System.err.println("Reached " + (accuracy * 
100) + "% accuracy.");
+                               System.err.println();
+                               System.err.println("Network size: " + 
nodes.length);
+                               System.err.println("Maximum HTL: " + MAX_HTL);
+                               System.err.println("Average path length for 
successful requests: "+totalHopsTaken/successes);
+                               System.err.println("Total started swaps: " + 
LocationManager.startedSwaps);
+                               System.err.println("Total rejected swaps 
(already locked): " + LocationManager.swapsRejectedAlreadyLocked);
+                               System.err.println("Total swaps rejected 
(nowhere to go): " + LocationManager.swapsRejectedNowhereToGo);
+                               System.err.println("Total swaps rejected (rate 
limit): " + LocationManager.swapsRejectedRateLimit);
+                               System.err.println("Total swaps rejected 
(loop): " + LocationManager.swapsRejectedLoop);
+                               System.err.println("Total swaps rejected 
(recognized ID):" + LocationManager.swapsRejectedRecognizedID);
+                               System.err.println("Total swaps failed:" + 
LocationManager.noSwaps);
+                               System.err.println("Total swaps succeeded:" + 
LocationManager.swaps);
+                               return;
+                       }
+               }
                System.exit(EXIT_PING_TARGET_NOT_REACHED);
        }
 }

Modified: 
branches/db4o/freenet/src/freenet/node/simulator/RealNodeSecretPingTest.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/node/simulator/RealNodeSecretPingTest.java    
    2008-08-07 16:48:54 UTC (rev 21656)
+++ 
branches/db4o/freenet/src/freenet/node/simulator/RealNodeSecretPingTest.java    
    2008-08-07 18:30:55 UTC (rev 21657)
@@ -66,7 +66,7 @@

         for(int i=0;i<NUMBER_OF_NODES;i++) {
             nodes[i] = 
-               NodeStarter.createTestNode(5001+i, wd, false, true, true, 
MAX_HTL, 0 /* no dropped packets */, random, executor, 500*NUMBER_OF_NODES, 
storeSize, true, true, false, false, false, true, true, 0);
+               NodeStarter.createTestNode(5001+i, 0, wd, false, true, true, 
MAX_HTL, 0 /* no dropped packets */, random, executor, 500*NUMBER_OF_NODES, 
storeSize, true, true, false, false, false, true, true, 0, true, false);
             Logger.normal(RealNodeRoutingTest.class, "Created node "+i);
         }
         Logger.normal(RealNodeRoutingTest.class, "Created "+NUMBER_OF_NODES+" 
nodes");

Modified: branches/db4o/freenet/src/freenet/node/simulator/RealNodeULPRTest.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/simulator/RealNodeULPRTest.java      
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/simulator/RealNodeULPRTest.java      
2008-08-07 18:30:55 UTC (rev 21657)
@@ -69,6 +69,7 @@
     static final boolean ENABLE_SWAPPING = true;
     static final boolean ENABLE_ULPRS = true; // This is the point of the 
test, but it's probably a good idea to be able to do a comparison if we want to
     static final boolean ENABLE_PER_NODE_FAILURE_TABLES = true;
+    static final boolean ENABLE_FOAF = true;

     public static void main(String[] args) throws FSParseException, 
PeerParseException, CHKEncodeException, InvalidThresholdException, 
NodeInitException, ReferenceSignatureVerificationException, 
KeyCollisionException, SSKEncodeException, IOException, InterruptedException, 
SSKVerifyException {
        freenet.node.RequestHandler.SEND_OLD_FORMAT_SSK = false;
@@ -92,7 +93,7 @@
         Executor executor = new PooledExecutor();
         for(int i=0;i<NUMBER_OF_NODES;i++) {
             nodes[i] = 
-               NodeStarter.createTestNode(5000+i, testName, false, true, true, 
MAX_HTL, 20 /* 5% */, random, executor, 500*NUMBER_OF_NODES, 1024*1024, true, 
ENABLE_SWAPPING, false, ENABLE_ULPRS, ENABLE_PER_NODE_FAILURE_TABLES, true, 
true, 0);
+               NodeStarter.createTestNode(5000+i, 0, testName, false, true, 
true, MAX_HTL, 20 /* 5% */, random, executor, 500*NUMBER_OF_NODES, 1024*1024, 
true, ENABLE_SWAPPING, false, ENABLE_ULPRS, ENABLE_PER_NODE_FAILURE_TABLES, 
true, true, 0, ENABLE_FOAF, false);
             Logger.normal(RealNodeRoutingTest.class, "Created node "+i);
         }
         SimpleFieldSet refs[] = new SimpleFieldSet[NUMBER_OF_NODES];

Copied: branches/db4o/freenet/src/freenet/node/simulator/SeednodePingTest.java 
(from rev 21652, trunk/freenet/src/freenet/node/simulator/SeednodePingTest.java)
===================================================================
--- branches/db4o/freenet/src/freenet/node/simulator/SeednodePingTest.java      
                        (rev 0)
+++ branches/db4o/freenet/src/freenet/node/simulator/SeednodePingTest.java      
2008-08-07 18:30:55 UTC (rev 21657)
@@ -0,0 +1,114 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.node.simulator;
+
+import freenet.crypt.RandomSource;
+import freenet.io.comm.NotConnectedException;
+import freenet.io.comm.PeerParseException;
+import freenet.io.comm.ReferenceSignatureVerificationException;
+import freenet.node.Announcer;
+import freenet.node.FSParseException;
+import freenet.node.Node;
+import freenet.node.NodeCrypto;
+import freenet.node.NodeInitException;
+import freenet.node.NodeStarter;
+import freenet.node.OpennetDisabledException;
+import freenet.node.SeedServerPeerNode;
+import freenet.node.SeedServerTestPeerNode;
+import freenet.node.SeedServerTestPeerNode.FATE;
+import freenet.support.Executor;
+import freenet.support.Logger;
+import freenet.support.PooledExecutor;
+import freenet.support.LoggerHook.InvalidThresholdException;
+import freenet.support.SimpleFieldSet;
+import freenet.support.TimeUtil;
+import java.io.File;
+import java.io.IOException;
+import java.util.EnumMap;
+import java.util.Map;
+import java.util.Vector;
+
+/**
+ * @author Florent Daigni&egrave;re &lt;nextgens at freenetproject.org&gt;
+ */
+public class SeednodePingTest extends RealNodeTest {
+
+    public static void main(String[] args) throws FSParseException, 
IOException, OpennetDisabledException, PeerParseException, 
InterruptedException, ReferenceSignatureVerificationException, 
NodeInitException, InvalidThresholdException {
+        RandomSource random = NodeStarter.globalTestInit("seednode-pingtest", 
false, Logger.ERROR, "");
+        // Create one node
+        Executor executor = new PooledExecutor();
+       Node node = NodeStarter.createTestNode(5000, 5001, "seednode-pingtest", 
true, false, false, Node.DEFAULT_MAX_HTL, 0, random, executor, 1000, 
5*1024*1024, true, false, false, false, false, false, false, 0, false, false);
+       NodeCrypto.DISABLE_GROUP_STRIP = true;
+       // Connect & ping
+       Vector<SeedServerTestPeerNode> seedNodes = new 
Vector<SeedServerTestPeerNode>();
+       Vector<SimpleFieldSet> seedNodesAsSFS = Announcer.readSeednodes(new 
File("/tmp/"));
+       int numberOfNodesInTheFile = 0;
+       for(SimpleFieldSet sfs : seedNodesAsSFS) {
+               numberOfNodesInTheFile++;
+               SeedServerTestPeerNode seednode = 
node.createNewSeedServerTestPeerNode(sfs);
+               try {
+                       node.connectToSeednode(seednode);
+                       seedNodes.add(seednode);
+               } catch (Exception fse) {
+                       System.out.println("ERROR adding "+seednode.toString()+ 
" "+fse.getMessage());
+               }
+       }       
+       // Start it
+        node.start(true);
+       //Logger.setupStdoutLogging(Logger.MINOR, 
"freenet:NORMAL,freenet.node.NodeDispatcher:MINOR,freenet.node.FNPPacketMangler:MINOR");
+       Logger.getChain().setThreshold(32); // kill logging
+       Thread.sleep(2000);
+       if(seedNodes.size() != numberOfNodesInTheFile)
+                   System.out.println("ERROR ADDING SOME OF THE SEEDNODES!!");
+       System.out.println("Let some time for the "+ seedNodes.size() +" nodes 
to connect...");
+       Thread.sleep(8000);
+       
+       int pingID = 0;
+       long deadline = System.currentTimeMillis() + 2*60*1000;
+       while(System.currentTimeMillis() < deadline) {
+               int countConnectedSeednodes = 0;
+               for(SeedServerPeerNode seednode : 
node.peers.getConnectedSeedServerPeersVector(null)) {
+                       try {
+                               double pingTime = seednode.averagePingTime();
+                               int uptime = seednode.getUptime();
+                               long timeDelta = seednode.getClockDelta();
+                               if(seednode.isRealConnection())
+                                       continue;
+                               countConnectedSeednodes++;
+                               boolean ping = seednode.ping(pingID++);
+                               if(ping)
+                                       
System.out.println(seednode.getIdentityString()+
+                                               " uptime="+uptime+
+                                               " ping="+ping+
+                                               " pingTime="+pingTime+
+                                               " uptime="+seednode.getUptime()+
+                                               " 
timeDelta="+TimeUtil.formatTime(timeDelta));
+                               // sanity check
+                               if(seednode.isRoutable())
+                                       System.out.println(seednode + " is 
routable!");
+                       } catch (NotConnectedException e) {
+                               System.out.println(seednode.getIdentityString() 
+ " is not connected "+seednode.getHandshakeCount());
+                       }
+               }
+               Map<FATE, Integer> totals = new 
EnumMap(SeedServerTestPeerNode.FATE.class);
+               for(SeedServerTestPeerNode seednode : seedNodes) {
+                       FATE fate = seednode.getFate();
+                       Integer x = totals.get(fate);
+                       if(x == null)
+                               totals.put(fate, 1);
+                       else
+                               totals.put(fate, x+1);
+                       System.out.println(seednode.getIdentityString() + " : 
"+fate+ " : "+seednode.getPeerNodeStatusString());
+               }
+               System.out.println("TOTALS:");
+               for(FATE fate : totals.keySet()) {
+                       System.out.println(fate + " : "+totals.get(fate));
+               }
+               System.out.println("################## 
("+node.peers.countConnectedPeers()+") 
"+countConnectedSeednodes+'/'+node.peers.countSeednodes());
+               Thread.sleep(5000);
+       }
+    System.out.println("Completed seednodes scan.");
+    System.exit(0);
+    }
+}

Modified: branches/db4o/freenet/src/freenet/node/updater/NodeUpdateManager.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/updater/NodeUpdateManager.java       
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/updater/NodeUpdateManager.java       
2008-08-07 18:30:55 UTC (rev 21657)
@@ -52,9 +52,9 @@

        boolean wasEnabledOnStartup;
        /** Is auto-update enabled? */
-       boolean isAutoUpdateAllowed;
+       volatile boolean isAutoUpdateAllowed;
        /** Has the user given the go-ahead? */
-       boolean armed;
+       volatile boolean armed;
        /** Should we check for freenet-ext.jar updates? 
         * Normally set only when our freenet-ext.jar is known to be out of 
date. */
        final boolean shouldUpdateExt;
@@ -67,13 +67,13 @@

        final RevocationChecker revocationChecker;
        private String revocationMessage;
-       private boolean hasBeenBlown;
-       private boolean peersSayBlown;
+       private volatile boolean hasBeenBlown;
+       private volatile boolean peersSayBlown;

        /** Is there a new main jar ready to deploy? */
-       private boolean hasNewMainJar;
+       private volatile boolean hasNewMainJar;
        /** Is there a new ext jar ready to deploy? */
-       private boolean hasNewExtJar;
+       private volatile boolean hasNewExtJar;
        /** If another main jar is being fetched, when did the fetch start? */
        private long startedFetchingNextMainJar;
        /** If another ext jar is being fetched, when did the fetch start? */
@@ -88,6 +88,7 @@
        public final UpdateOverMandatoryManager uom;

        private boolean logMINOR;
+       private boolean disabledThisSession;

        public NodeUpdateManager(Node node, Config config) throws 
InvalidConfigValueException {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
@@ -200,13 +201,8 @@
        /**
         * Is auto-update enabled?
         */
-       public boolean isEnabled() {
-               NodeUpdater updater;
-               synchronized(this) {
-                       updater = mainUpdater;
-                       if(updater == null) return false;
-               }
-               return updater.isRunning();
+       public synchronized boolean isEnabled() {
+               return (mainUpdater != null);
        }

        /**
@@ -222,7 +218,7 @@
                }
                NodeUpdater main = null, ext = null;
                synchronized(this) {
-                       boolean enabled = (mainUpdater != null && 
mainUpdater.isRunning());
+                       boolean enabled = (mainUpdater != null);
                        if(enabled == enable) return;
                        if(!enable) {
                                // Kill it
@@ -293,9 +289,8 @@
                                updateURI = uri;
                                updater = mainUpdater;
                        }
+                       if(updater == null) return;
                }
-               if(updater == null) return;
-               if(updater.isRunning()) return;
                updater.onChangeURI(uri);
        }

@@ -319,7 +314,7 @@
        /**
         * @return Is auto-update currently enabled?
         */
-       public synchronized boolean isAutoUpdateAllowed() {
+       public boolean isAutoUpdateAllowed() {
                return isAutoUpdateAllowed;
        }

@@ -386,6 +381,12 @@
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                try {
                        synchronized(this) {
+                               if(disabledThisSession) {
+                                       String msg = "Not deploying update 
because disabled for this session (bad java version??)";
+                                       Logger.error(this, msg);
+                                       System.err.println(msg);
+                                       return;
+                               }
                                if(hasBeenBlown) {
                                        String msg = "Trying to update but key 
has been blown! Not updating, message was "+revocationMessage;
                                        Logger.error(this, msg);
@@ -700,9 +701,7 @@
        }

        public void arm() {
-               synchronized(this) {
-                       armed = true;
-               }
+               armed = true;
                deployOffThread(0);
        }

@@ -727,14 +726,20 @@
                return hasBeenBlown;
        }

-       public synchronized boolean hasNewMainJar() {
+       public boolean hasNewMainJar() {
                return hasNewMainJar;
        }

-       public synchronized boolean hasNewExtJar() {
+       public boolean hasNewExtJar() {
                return hasNewExtJar;
        }

+       /**
+        * What version has been fetched?
+        * 
+        * This includes jar's fetched via UOM, because the UOM code feeds
+        * its results through the mainUpdater.
+        */
        public int newMainJarVersion() {
                if(mainUpdater == null) return -1;
                return mainUpdater.getFetchedVersion();
@@ -771,6 +776,9 @@
                return revocationChecker.getRevocationDNFCounter();
        }

+       /**
+        * What version is the node currently running?
+        */
        public int getMainVersion() {
                return Version.buildNumber();
        }
@@ -904,5 +912,12 @@
                }

        };
+
+       public void disableThisSession() {
+               disabledThisSession = true;
+       }

+       protected long getStartedFetchingNextMainJarTimestamp() {
+               return startedFetchingNextMainJar;
+       }
 }

Modified: branches/db4o/freenet/src/freenet/node/updater/NodeUpdater.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/updater/NodeUpdater.java     
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/updater/NodeUpdater.java     
2008-08-07 18:30:55 UTC (rev 21657)
@@ -25,6 +25,7 @@
 import freenet.node.Ticker;
 import freenet.node.Version;
 import freenet.support.Logger;
+import freenet.support.api.Bucket;
 import freenet.support.io.BucketTools;
 import freenet.support.io.FileBucket;

@@ -96,14 +97,15 @@
                if(found <= availableVersion){
                        return;
                }
-                       Logger.minor(this, "Updating availableVersion from 
"+availableVersion+" to "+found+" and queueing an update");
+                       Logger.minor(this, "Updating availableVersion from " + 
availableVersion + " to " + found + " and queueing an update");
                        this.availableVersion = found;
                }
                        ticker.queueTimedJob(new Runnable() {
+
                                public void run() {
                                        maybeUpdate();
                                }
-                       }, 60*1000); // leave some time in case we get later 
editions
+                       }, 60 * 1000); // leave some time in case we get later 
editions
                        manager.onStartFetching(extUpdate);
        }

@@ -115,7 +117,7 @@
                        if(logMINOR)
                                Logger.minor(this, "maybeUpdate: 
isFetching="+isFetching+", isRunning="+isRunning+", 
availableVersion="+availableVersion);
                        if(isFetching || (!isRunning)) return;
-                       if(availableVersion == fetchedVersion) return;
+                       if(availableVersion <= fetchedVersion) return;
                        fetchingVersion = availableVersion;

                        if(availableVersion > currentVersion) {
@@ -188,9 +190,13 @@
        void onSuccess(FetchResult result, ClientGetter state, File 
tempBlobFile, int fetchedVersion) {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
                synchronized(this) {
-                       if(fetchedVersion < this.fetchedVersion) {
+                       if(fetchedVersion <= this.fetchedVersion) {
                                tempBlobFile.delete();
-                               result.asBucket().free();
+                               if(result != null) {
+                                       Bucket toFree = result.asBucket();
+                                       if(toFree != null)
+                                               toFree.free();
+                               }
                                return;
                        }
                        if(result == null || result.asBucket() == null || 
result.asBucket().size() == 0) {
@@ -273,10 +279,6 @@
        public void onGeneratedURI(FreenetURI uri, BaseClientPutter state, 
ObjectContainer container) {
                // Impossible
        }
-
-       public synchronized  boolean isRunning(){
-               return isRunning;
-       }

        /** Called before kill(). Don't do anything that will involve taking 
locks. */
        public void preKill() {

Modified: 
branches/db4o/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java  
    2008-08-07 16:48:54 UTC (rev 21656)
+++ 
branches/db4o/freenet/src/freenet/node/updater/UpdateOverMandatoryManager.java  
    2008-08-07 18:30:55 UTC (rev 21657)
@@ -50,8 +50,10 @@
 import freenet.support.HTMLNode;
 import freenet.support.Logger;
 import freenet.support.SizeUtil;
+import freenet.support.TimeUtil;
 import freenet.support.io.FileBucket;
 import freenet.support.io.RandomAccessFileWrapper;
+import java.io.FileFilter;

 /**
  * Co-ordinates update over mandatory. Update over mandatory = updating from 
your peers, even
@@ -80,9 +82,13 @@
        static final int MAX_NODES_SENDING_MAIN_JAR = 2;
        /** Maximum time between asking for the main jar and it starting to 
transfer */
        static final int REQUEST_MAIN_JAR_TIMEOUT = 60*1000;
+       //** Grace time before we use UoM to update */
+       public static final int GRACE_TIME = 60*60*1000; // 1h
        private boolean logMINOR;

        private UserAlert alert;
+       private static final Pattern extBuildNumberPattern = 
Pattern.compile("^ext(?:-jar)?-(\\d+)\\.fblob(\\.tmp)*$");
+       private static final Pattern mainBuildNumberPattern = 
Pattern.compile("^main(?:-jar)?-(\\d+)\\.fblob(\\.tmp)*$");

        public UpdateOverMandatoryManager(NodeUpdateManager manager) {
                this.updateManager = manager;
@@ -207,29 +213,83 @@

                if(!updateManager.isEnabled()) return true; // Don't care if 
not enabled, except for the revocation URI

+               long now = System.currentTimeMillis();
+               long started = 
updateManager.getStartedFetchingNextMainJarTimestamp();
+               long whenToTakeOverTheNormalUpdater;
+               if(started > 0) whenToTakeOverTheNormalUpdater = started + 
GRACE_TIME;
+               else whenToTakeOverTheNormalUpdater = 
System.currentTimeMillis() + GRACE_TIME;
+               boolean isOutdated = updateManager.node.isOudated();
+               // if the new build is self-mandatory or if the "normal" 
updater has been trying to update for more than one hour
+               Logger.normal(this, "We received a valid UOMAnnounce : 
(isOutdated="+isOutdated+" version="+mainJarVersion +" 
whenToTakeOverTheNormalUpdater="+TimeUtil.formatTime(whenToTakeOverTheNormalUpdater-now)+")
 file length "+mainJarFileLength+" updateManager version 
"+updateManager.newMainJarVersion());
                if(mainJarVersion > Version.buildNumber() && mainJarFileLength 
> 0 &&
                                mainJarVersion > 
updateManager.newMainJarVersion()) {
-                       // Fetch it
-                       try {
-                               FreenetURI mainJarURI = new 
FreenetURI(jarKey).setSuggestedEdition(mainJarVersion);
-                               
if(mainJarURI.equals(updateManager.updateURI.setSuggestedEdition(mainJarVersion)))
 {
-                                       sendUOMRequestMain(source, true);
-                               } else {
-                                       System.err.println("Node 
"+source.userToString()+" offered us a new main jar (version 
"+mainJarVersion+") but his key was different to ours:\n"+
-                                                       "our key: 
"+updateManager.updateURI+"\nhis key:"+mainJarURI);
+                       source.setMainJarOfferedVersion(mainJarVersion);
+                       // Offer is valid.
+                       if(logMINOR) Logger.minor(this, "Offer is valid");
+                       if((isOutdated) || whenToTakeOverTheNormalUpdater < 
now) {
+                               // Take up the offer, subject to limits on 
number of simultaneous downloads.
+                               // If we have fetches running already, then 
sendUOMRequestMain() will add the offer to nodesOfferedMainJar,
+                               // so that if all our fetches fail, we can 
fetch from this node.
+                                       if(!isOutdated) {
+                                               Logger.error(this, "The update 
process seems to have been stuck for over an hour; let's switch to UoM! SHOULD 
NOT HAPPEN! (1)");
+                                               System.out.println("The update 
process seems to have been stuck for over an hour; let's switch to UoM! SHOULD 
NOT HAPPEN! (1)");
+                                       } else
+                                               if(logMINOR) Logger.minor(this, 
"Fetching via UOM as our build is deprecated");
+                                       // Fetch it
+                                       try {
+                                               FreenetURI mainJarURI = new 
FreenetURI(jarKey).setSuggestedEdition(mainJarVersion);
+                                               
if(mainJarURI.equals(updateManager.updateURI.setSuggestedEdition(mainJarVersion)))
+                                                       
sendUOMRequestMain(source, true);
+                                               else
+                                                       
System.err.println("Node " + source.userToString() + " offered us a new main 
jar (version " + mainJarVersion + ") but his key was different to ours:\n" +
+                                                                       "our 
key: " + updateManager.updateURI + "\nhis key:" + mainJarURI);
+                                       } catch(MalformedURLException e) {
+                                               // Should maybe be a useralert?
+                                               Logger.error(this, "Node " + 
source + " sent us a UOMAnnounce claiming to have a new jar, but it had an 
invalid URI: " + revocationKey + " : " + e, e);
+                                               System.err.println("Node " + 
source.userToString() + " sent us a UOMAnnounce claiming to have a new jar, but 
it had an invalid URI: " + revocationKey + " : " + e);
+                                       }
+                       } else {
+                               // Don't take up the offer. Add to 
nodesOfferedMainJar, so that we know where to fetch it from when we need it.
+                               synchronized(this) {
+                                       nodesOfferedMainJar.add(source);
                                }
-                       } catch (MalformedURLException e) {
-                               // Should maybe be a useralert?
-                               Logger.error(this, "Node "+source+" sent us a 
UOMAnnounce claiming to have a new jar, but it had an invalid URI: 
"+revocationKey+" : "+e, e);
-                               System.err.println("Node 
"+source.userToString()+" sent us a UOMAnnounce claiming to have a new jar, but 
it had an invalid URI: "+revocationKey+" : "+e);
+                               
updateManager.node.getTicker().queueTimedJob(new Runnable() {
+                                       
+                                       public void run() {
+                                               if(updateManager.isBlown()) 
return;
+                                               if(!updateManager.isEnabled()) 
return;
+                                               
if(updateManager.hasNewMainJar()) return;
+                                               
if(!updateManager.node.isOudated()) {
+                                                       Logger.error(this, "The 
update process seems to have been stuck for over an hour; let's switch to UoM! 
SHOULD NOT HAPPEN! (2)");
+                                                       System.out.println("The 
update process seems to have been stuck for over an hour; let's switch to UoM! 
SHOULD NOT HAPPEN! (2)");
+                                               }
+                                               maybeRequestMainJar();
+                                       }
+                                       
+                               }, whenToTakeOverTheNormalUpdater - now);
                        }
                }

                return true;
        }

-       protected void sendUOMRequestMain(final PeerNode source, boolean 
addOnFail) {
+       private void sendUOMRequestMain(final PeerNode source, boolean 
addOnFail) {
+               if(logMINOR)
+                       Logger.minor(this, 
"sendUOMRequestMain("+source+","+addOnFail+")");
                synchronized(this) {
+                       long offeredVersion = source.getMainJarOfferedVersion();
+                       if(offeredVersion < updateManager.newMainJarVersion()) {
+                               if(offeredVersion <= 0)
+                                       Logger.error(this, "Not sending UOM 
request to "+source+" because it hasn't offered anything!");
+                               else {
+                                       if(logMINOR) Logger.minor(this, "Not 
sending UOM request to "+source+" because we already have its offered version 
"+offeredVersion);
+                               }
+                               return;
+                       }
+                       if(updateManager.getMainVersion() >= offeredVersion) {
+                               if(logMINOR) Logger.minor(this, "Not fetching 
from "+source+" because current jar version "+updateManager.getMainVersion()+" 
is more recent than "+source.getMainJarOfferedVersion());
+                               return;
+                       }
                        if(nodesAskedSendMainJar.contains(source)) {
                                if(logMINOR) Logger.minor(this, "Recently asked 
node "+source+" so not re-asking yet.");
                                return;
@@ -321,7 +381,7 @@
                updateManager.node.clientCore.alerts.register(alert);
        }

-       class PeersSayKeyBlownAlert extends AbstractUserAlert {
+       private class PeersSayKeyBlownAlert extends AbstractUserAlert {

                public PeersSayKeyBlownAlert() {
                        super(false, null, null, null, null, 
UserAlert.CRITICAL_ERROR, true, null, false, null);
@@ -1187,73 +1247,51 @@
                long memoryInUse = r.totalMemory() - r.freeMemory();
                System.err.println("Memory in use before listing temp files: 
"+memoryInUse);

+               boolean gotError = false;
                File[] oldTempFiles = oldTempFilesPeerDir.listFiles(new 
FileFilter() {
-
-                       public boolean accept(File arg0) {
-                               String name = arg0.getName().toLowerCase();
-                               return name.endsWith(".fblob") || 
name.endsWith(".fblob.tmp");
-                       }
-                       
-               });
-               if(oldTempFiles == null) {
-                       return false;
-               }
-               boolean gotError = false;
-               File oldTempFile;
-               String oldTempFileName;
-               String extBuildNumberRegexStr = "^ext(?:-jar)?-(\\d+)\\.fblob$";
-               String mainBuildNumberRegexStr = 
"^main(?:-jar)?-(\\d+)\\.fblob$";
-               Pattern extBuildNumberPattern = 
Pattern.compile(extBuildNumberRegexStr);
-               Pattern mainBuildNumberPattern = 
Pattern.compile(mainBuildNumberRegexStr);
-               Matcher extBuildNumberMatcher;
-               Matcher mainBuildNumberMatcher;
-               String buildNumberStr;
-               int buildNumber;
-               int lastGoodMainBuildNumber = Version.lastGoodBuild();
-               int recommendedExtBuildNumber = 
NodeStarter.RECOMMENDED_EXT_BUILD_NUMBER;
-               for (int i = 0; i < oldTempFiles.length; i++) {
-                       oldTempFile = oldTempFiles[i];
-                       oldTempFileName = oldTempFile.getName();
-                       if(oldTempFileName.endsWith(".fblob.tmp")) {
-                               if(oldTempFileName.startsWith("ext-jar-") || 
oldTempFileName.startsWith("main-jar-") || 
oldTempFileName.startsWith("revocation-") || 
oldTempFileName.startsWith("main-")) {
-                                       if(!oldTempFile.delete()) {
-                                               if(oldTempFile.exists()) {
-                                                       Logger.error(this, 
"Cannot delete temporary persistent file "+oldTempFileName+" even though it 
exists: must be TOO persistent :)");
-                                               } else {
-                                                       Logger.normal(this, 
"Temporary persistent file does not exist when deleting: "+oldTempFileName);
-                                               }
-                                       }
-                               }
-                       } else if(oldTempFileName.endsWith(".fblob")) {
-                               mainBuildNumberMatcher = 
mainBuildNumberPattern.matcher(oldTempFileName);
-                               extBuildNumberMatcher = 
extBuildNumberPattern.matcher(oldTempFileName);
+                       private final int lastGoodMainBuildNumber = 
Version.lastGoodBuild();
+                       private final int recommendedExtBuildNumber = 
NodeStarter.RECOMMENDED_EXT_BUILD_NUMBER;
+                       
+                       public boolean accept(File file) {
+                               String fileName = file.getName();
+                               
+                               if(fileName.startsWith("revocation-") && 
fileName.endsWith(".fblob.tmp"))
+                                       return true;
+                               
+                               String buildNumberStr;
+                               int buildNumber;
+                               Matcher extBuildNumberMatcher = 
extBuildNumberPattern.matcher(fileName);
+                               Matcher mainBuildNumberMatcher = 
mainBuildNumberPattern.matcher(fileName);
+                               
                                if(mainBuildNumberMatcher.matches()) {
                                        buildNumberStr = 
mainBuildNumberMatcher.group(1);
                                        buildNumber = 
Integer.parseInt(buildNumberStr);
                                        if(buildNumber < 
lastGoodMainBuildNumber) {
-                                               if(!oldTempFile.delete()) {
-                                                       
if(oldTempFile.exists()) {
-                                                               
Logger.error(this, "Cannot delete temporary persistent file "+oldTempFileName+" 
even though it exists: must be TOO persistent :)");
-                                                       } else {
-                                                               
Logger.normal(this, "Temporary persistent file does not exist when deleting: 
"+oldTempFileName);
-                                                       }
-                                               }
+                                               return true;
                                        }
                                } else if(extBuildNumberMatcher.matches()) {
                                        buildNumberStr = 
extBuildNumberMatcher.group(1);
                                        buildNumber = 
Integer.parseInt(buildNumberStr);
                                        if(buildNumber < 
recommendedExtBuildNumber) {
-                                               if(!oldTempFile.delete()) {
-                                                       
if(oldTempFile.exists()) {
-                                                               
Logger.error(this, "Cannot delete temporary persistent file "+oldTempFileName+" 
even though it exists: must be TOO persistent :)");
-                                                       } else {
-                                                               
Logger.normal(this, "Temporary persistent file does not exist when deleting: 
"+oldTempFileName);
-                                                       }
-                                               }
+                                               return true;
                                        }
                                }
+                               
+                               return false;
                        }
+               });
+
+               for(File fileToDelete : oldTempFiles) {
+                       String fileToDeleteName = fileToDelete.getName();
+                       if(!fileToDelete.delete()) {
+                               if(fileToDelete.exists())
+                                       Logger.error(this, "Cannot delete 
temporary persistent file " + fileToDeleteName + " even though it exists: must 
be TOO persistent :)");
+                               else
+                                       Logger.normal(this, "Temporary 
persistent file does not exist when deleting: " + fileToDeleteName);
+                               gotError =true;
+                       }
                }
+               
                return !gotError;
        }


Modified: 
branches/db4o/freenet/src/freenet/node/useralerts/UserAlertManager.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/useralerts/UserAlertManager.java     
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/node/useralerts/UserAlertManager.java     
2008-08-07 18:30:55 UTC (rev 21657)
@@ -127,17 +127,18 @@
         * /alerts/[ anchor pointing to the real alert].
         */
        public HTMLNode createAlertsShort(String title, boolean advancedMode, 
boolean drawDumpEventsForm) {
-               UserAlert[] alerts = getAlerts();
+               UserAlert[] currentAlerts = getAlerts();
                short maxLevel = Short.MAX_VALUE;
                int events = 0;
-               for(int i=0;i<alerts.length;i++) {
-                       boolean isValid = alerts[i].isValid();
-                       short level = alerts[i].getPriorityClass();
-                       if(isValid) {
-                               if(level < maxLevel) maxLevel = level;
-                               if(alerts[i].isEventNotification()) events++;
-                       }
+               for(int i=0;i<currentAlerts.length;i++) {
+                       if (!currentAlerts[i].isValid())
+                               continue;
+                       short level = currentAlerts[i].getPriorityClass();
+                       if(level < maxLevel) maxLevel = level;
+                       if(currentAlerts[i].isEventNotification()) events++;
                }
+               if(maxLevel == Short.MAX_VALUE)
+                       return new HTMLNode("#", "");
                if(events < 2) drawDumpEventsForm = false;
                HTMLNode boxNode = new HTMLNode("div", "class", "infobox 
infobox-"+getAlertLevelName(maxLevel)+" infobox-summary-status-box");
                boxNode.addChild("div", "class", "infobox-header infobox 
summary-status-header", title);
@@ -146,26 +147,23 @@
                        contentNode.addChild("p", "class", "click-for-more", 
l10n("clickForMore"));
                HTMLNode alertsNode = contentNode.addChild("ul", "class", 
"alert-summary");
                int totalNumber = 0;
-               for (int i = 0; i < alerts.length; i++) {
-                       UserAlert alert = alerts[i];
+               for (int i = 0; i < currentAlerts.length; i++) {
+                       UserAlert alert = currentAlerts[i];
                        if (!alert.isValid())
                                continue;
                        HTMLNode listItem = alertsNode.addChild("li", "class", 
"alert-summary-text-"+getAlertLevelName(alert.getPriorityClass()));
                        listItem.addChild("a", "href", 
"/alerts/#"+alert.anchor(), alert.getShortText());
                        totalNumber++;
                }
-               if (totalNumber == 0) {
-                       return new HTMLNode("#", "");
-               }
                if(drawDumpEventsForm) {
                        HTMLNode dumpFormNode = contentNode.addChild("form", 
new String[] { "action", "method" }, new String[] { "/", "post" 
}).addChild("div");
                        dumpFormNode.addChild("input", new String[] { "type", 
"name", "value" }, new String[] { "hidden", "formPassword", core.formPassword 
});
                        StringBuffer sb = new StringBuffer();
-                       for(int i=0;i<alerts.length;i++) {
-                               if(!alerts[i].isEventNotification()) continue;
+                       for(int i=0;i<currentAlerts.length;i++) {
+                               if(!currentAlerts[i].isEventNotification()) 
continue;
                                if(sb.length() != 0)
                                        sb.append(",");
-                               sb.append(alerts[i].anchor());
+                               sb.append(currentAlerts[i].anchor());
                        }
                        dumpFormNode.addChild("input", new String[] { "type", 
"name", "value" }, new String[] { "hidden", "events", sb.toString() });
                        dumpFormNode.addChild("input", new String[] { "type", 
"name", "value" }, new String[] { "submit", "dismiss-events", 
l10n("dumpEventsButton") });

Copied: branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoader.java 
(from rev 21652, trunk/freenet/src/freenet/pluginmanager/PluginDownLoader.java)
===================================================================
--- branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoader.java       
                        (rev 0)
+++ branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoader.java       
2008-08-07 18:30:55 UTC (rev 21657)
@@ -0,0 +1,35 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.pluginmanager;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * load a plugin from wherever 
+ * @author saces
+ *
+ */
+public abstract class PluginDownLoader<T> {
+       
+       private T source;
+
+       public String setSource(String source) throws PluginNotFoundException {
+               this.source = checkSource(source);
+               return getPluginName(source);
+       }
+
+       public T getSource() {
+               return source;
+       }
+       
+       abstract InputStream getInputStream() throws IOException, 
PluginNotFoundException;
+       
+       abstract T checkSource(String source) throws PluginNotFoundException;
+       
+       abstract String getPluginName(String source) throws 
PluginNotFoundException;
+       
+       abstract String getSHA1sum() throws PluginNotFoundException;
+
+}

Copied: 
branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderFile.java (from 
rev 21652, trunk/freenet/src/freenet/pluginmanager/PluginDownLoaderFile.java)
===================================================================
--- branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderFile.java   
                        (rev 0)
+++ branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderFile.java   
2008-08-07 18:30:55 UTC (rev 21657)
@@ -0,0 +1,32 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.pluginmanager;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class PluginDownLoaderFile extends PluginDownLoader<File> {
+
+       public File checkSource(String source) {
+               return new File(source);
+       }
+
+       @Override
+       InputStream getInputStream() throws IOException {
+               return new FileInputStream(getSource());
+       }
+
+       @Override
+       String getPluginName(String source) throws PluginNotFoundException {
+               return source.substring(source.lastIndexOf('/') + 1);
+       }
+
+       @Override
+       String getSHA1sum() throws PluginNotFoundException {
+               return null;
+       }
+
+}

Copied: 
branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderFreenet.java 
(from rev 21652, 
trunk/freenet/src/freenet/pluginmanager/PluginDownLoaderFreenet.java)
===================================================================
--- 
branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderFreenet.java    
                            (rev 0)
+++ 
branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderFreenet.java    
    2008-08-07 18:30:55 UTC (rev 21657)
@@ -0,0 +1,64 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.pluginmanager;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+
+import freenet.client.FetchException;
+import freenet.client.FetchResult;
+import freenet.client.HighLevelSimpleClient;
+import freenet.keys.FreenetURI;
+import freenet.support.Logger;
+
+public class PluginDownLoaderFreenet extends PluginDownLoader<FreenetURI> {
+       
+       private boolean logMINOR;
+
+       final HighLevelSimpleClient hlsc;
+
+       PluginDownLoaderFreenet(HighLevelSimpleClient hlsc) {
+               logMINOR = Logger.shouldLog(Logger.MINOR, this);
+               this.hlsc = hlsc;
+       }
+
+       public FreenetURI checkSource(String source) throws 
PluginNotFoundException {
+               try {
+                       return new FreenetURI(source);
+               } catch (MalformedURLException e) {
+                       Logger.error(this, "not a valid freenet key: " + 
source, e);
+                       throw new PluginNotFoundException("not a valid freenet 
key: " + source, e);
+               }
+       }
+
+       @Override
+       InputStream getInputStream() throws IOException, 
PluginNotFoundException {
+               FreenetURI uri = getSource();
+               while (true) {
+                       try {
+                               FetchResult fres = hlsc.fetch(uri);
+                               return fres.asBucket().getInputStream();
+                       } catch (FetchException e) {
+                               if ((e.getMode() == 
FetchException.PERMANENT_REDIRECT) || (e.getMode() == 
FetchException.TOO_MANY_PATH_COMPONENTS)) {
+                                       uri = e.newURI;
+                                       continue;
+                               }
+                               Logger.error(this, "error while fetching 
plugin: " + getSource(), e);
+                               throw new PluginNotFoundException("error while 
fetching plugin: " + getSource(), e);
+                       }
+               }
+       }
+
+       @Override
+       String getPluginName(String source) throws PluginNotFoundException {
+               return source.substring(source.lastIndexOf('/') + 1);
+       }
+
+       @Override
+       String getSHA1sum() throws PluginNotFoundException {
+               return null;
+       }
+
+}

Copied: 
branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderOfficial.java 
(from rev 21652, 
trunk/freenet/src/freenet/pluginmanager/PluginDownLoaderOfficial.java)
===================================================================
--- 
branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderOfficial.java   
                            (rev 0)
+++ 
branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderOfficial.java   
    2008-08-07 18:30:55 UTC (rev 21657)
@@ -0,0 +1,104 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.pluginmanager;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.security.KeyStore;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateFactory;
+import java.util.Collection;
+import java.util.Iterator;
+
+import freenet.support.io.Closer;
+import freenet.support.io.FileUtil;
+
+public class PluginDownLoaderOfficial extends PluginDownLoaderURL {
+       
+       private static final String certurl = 
"freenet/clients/http/staticfiles/startssl.pem";
+       private static final String certfile = "startssl.pem";
+
+       public URL checkSource(String source) throws PluginNotFoundException {
+               return 
super.checkSource("https://checksums.freenetproject.org/latest/"; +
+               source + ".jar");
+       }
+
+       @Override
+       String getPluginName(String source) throws PluginNotFoundException {
+               return source + ".jar";
+       }
+
+       @Override
+       String getSHA1sum() throws PluginNotFoundException {
+               return null;
+       }
+
+       @Override
+       InputStream getInputStream() throws IOException {
+               File TMP_KEYSTORE = null;
+               FileInputStream fis = null;
+               InputStream is = null;
+               try {
+                       TMP_KEYSTORE = File.createTempFile("keystore", ".tmp");
+                       TMP_KEYSTORE.deleteOnExit();
+                       
+                       KeyStore ks = KeyStore.getInstance("JKS");
+                       ks.load(null, new char[0]);
+
+                       is = getCert();
+
+                       CertificateFactory cf = 
CertificateFactory.getInstance("X.509");
+                       Collection c = cf.generateCertificates(is);
+                       Iterator it = c.iterator();
+                       while(it.hasNext()) {
+                               Certificate cert = (Certificate) it.next();
+                               
ks.setCertificateEntry(cert.getPublicKey().toString(), cert);
+                       }
+                       ks.store(new FileOutputStream(TMP_KEYSTORE), new 
char[0]);
+                       System.out.println("The CA has been imported into the 
trustStore");
+               } catch(Exception e) {
+                       System.err.println("Error while handling the CA :" + 
e.getMessage());
+                       throw new IOException("Error while handling the CA : 
"+e);
+               } finally {
+                       Closer.close(fis);
+               }
+
+               System.setProperty("javax.net.ssl.trustStore", 
TMP_KEYSTORE.toString());
+               
+               return super.getInputStream();
+       }
+
+       private InputStream getCert() throws IOException {
+               
+               // normal the file should be here,
+               // left by installer or update script
+               File certFile = new File(certfile).getAbsoluteFile();
+               
+               if (certFile.exists()) {
+                       return new FileInputStream(certFile);
+               }
+               
+               // try to create pem file
+               ClassLoader loader = ClassLoader.getSystemClassLoader();
+               InputStream in = loader.getResourceAsStream(certurl);
+               if(in != null) {
+                       FileUtil.writeTo(in, certFile);
+                       if (certFile.exists()) {
+                               System.err.println("Nodes certfile created, use 
it");
+                               return new FileInputStream(certFile);
+                       }
+                       System.err.println("Nodes certfile couldnt created, try 
direct");
+                       // couldnt write the file, maybe paranoid selinux or 
hardware node ;)
+                       return in;
+               }       
+               
+               System.err.println("Certficate file '"+certfile+"' not found on 
disk nor buildin.");
+               throw new IOException("Certficate file '"+certfile+"' not found 
on disk nor buildin.");
+       }
+
+}

Copied: 
branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderURL.java (from 
rev 21652, trunk/freenet/src/freenet/pluginmanager/PluginDownLoaderURL.java)
===================================================================
--- branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderURL.java    
                        (rev 0)
+++ branches/db4o/freenet/src/freenet/pluginmanager/PluginDownLoaderURL.java    
2008-08-07 18:30:55 UTC (rev 21657)
@@ -0,0 +1,98 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.pluginmanager;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+
+import freenet.support.Logger;
+
+public class PluginDownLoaderURL extends PluginDownLoader<URL> {
+
+       public URL checkSource(String source) throws PluginNotFoundException {
+               try {
+                       return new URL(source);
+               } catch (MalformedURLException e) {
+                       Logger.error(this, "could not build plugin url for " + 
source, e);
+                       throw new PluginNotFoundException("could not build 
plugin url for " + source, e);
+               }
+       }
+
+       @Override
+       InputStream getInputStream() throws IOException {
+               URLConnection urlConnection = getSource().openConnection();
+               urlConnection.setUseCaches(false);
+               urlConnection.setAllowUserInteraction(false);
+               //urlConnection.connect();
+               return openConnectionCheckRedirects(urlConnection);
+       }
+
+       @Override
+       String getPluginName(String source) throws PluginNotFoundException {
+               String name = source.substring(source.lastIndexOf('/') + 1);
+               if (name.endsWith(".url")) {
+                       name = name.substring(0, name.length() - 4);
+               }
+               return name;
+       }
+
+       @Override
+       String getSHA1sum() throws PluginNotFoundException {
+               return null;
+       }
+       
+       static InputStream openConnectionCheckRedirects(URLConnection c) throws 
IOException
+       {
+               boolean redir;
+               int redirects = 0;
+               InputStream in = null;
+               do
+               {
+                       if (c instanceof HttpURLConnection)
+                       {
+                               ((HttpURLConnection) 
c).setInstanceFollowRedirects(false);
+                       }
+                       // We want to open the input stream before getting 
headers
+                       // because getHeaderField() et al swallow IOExceptions.
+                       in = c.getInputStream();
+                       redir = false;
+                       if (c instanceof HttpURLConnection)
+                       {
+                               HttpURLConnection http = (HttpURLConnection) c;
+                               int stat = http.getResponseCode();
+                               if (stat >= 300 && stat <= 307 && stat != 306 &&
+                                               stat != 
HttpURLConnection.HTTP_NOT_MODIFIED)
+                               {
+                                       URL base = http.getURL();
+                                       String loc = 
http.getHeaderField("Location");
+                                       URL target = null;
+                                       if (loc != null)
+                                       {
+                                               target = new URL(base, loc);
+                                       }
+                                       http.disconnect();
+                                       // Redirection should be allowed only 
for HTTP and HTTPS
+                                       // and should be limited to 5 
redirections at most.
+                                       if (target == null || 
!(target.getProtocol().equals("http")
+                                                               || 
target.getProtocol().equals("https")
+                                                               || 
target.getProtocol().equals("ftp"))
+                                                       || redirects >= 5)
+                                       {
+                                               throw new 
SecurityException("illegal URL redirect");
+                                       }
+                                       redir = true;
+                                       c = target.openConnection();
+                                       redirects++;
+                               }
+                       }
+               }
+               while (redir);
+               return in;
+       }
+}
+

Modified: branches/db4o/freenet/src/freenet/pluginmanager/PluginManager.java
===================================================================
--- branches/db4o/freenet/src/freenet/pluginmanager/PluginManager.java  
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/pluginmanager/PluginManager.java  
2008-08-07 18:30:55 UTC (rev 21657)
@@ -3,7 +3,10 @@
  * http://www.gnu.org/ for further details of the GPL. */
 package freenet.pluginmanager;

+import java.io.BufferedInputStream;
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -11,9 +14,13 @@
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLConnection;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Set;
 import java.util.Vector;
 import java.util.jar.Attributes;
@@ -22,18 +29,23 @@
 import java.util.jar.Manifest;
 import java.util.zip.ZipException;

+import freenet.client.HighLevelSimpleClient;
 import freenet.config.InvalidConfigValueException;
 import freenet.config.SubConfig;
+import freenet.keys.FreenetURI;
 import freenet.l10n.L10n;
 import freenet.node.Node;
 import freenet.node.NodeClientCore;
+import freenet.node.RequestStarter;
 import freenet.node.Ticker;
 import freenet.node.useralerts.SimpleUserAlert;
 import freenet.node.useralerts.UserAlert;
+import freenet.support.HexUtil;
 import freenet.support.JarClassLoader;
 import freenet.support.Logger;
 import freenet.support.api.HTTPRequest;
 import freenet.support.api.StringArrCallback;
+import freenet.support.api.StringCallback;
 import freenet.support.io.Closer;
 import freenet.support.io.FileUtil;

@@ -49,6 +61,9 @@
         *
         */

+       private String configFile;
+       private String installDir;
+       
        private final HashMap toadletList;

        /* All currently starting plugins. */
@@ -59,15 +74,55 @@
        private final NodeClientCore core;
        SubConfig pmconfig;
        private boolean logMINOR;
+       private boolean logDEBUG;
+       private final HighLevelSimpleClient client;

        public PluginManager(Node node) {
+               
+               logMINOR = Logger.shouldLog(Logger.MINOR, this);
+               logDEBUG = Logger.shouldLog(Logger.DEBUG, this);
+               // config 
+               
                toadletList = new HashMap();
                pluginWrappers = new Vector();
                this.node = node;
                this.core = node.clientCore;
-               logMINOR = Logger.shouldLog(Logger.MINOR, this);
+               
+               if(logMINOR) Logger.minor(this, "Starting Plugin Manager");
+               
+               if(logDEBUG) Logger.debug(this, "Initialize Plugin Manager 
config");
+               
+               client = 
core.makeClient(RequestStarter.INTERACTIVE_PRIORITY_CLASS, true);
+               

                pmconfig = new SubConfig("pluginmanager", node.config);
+//             pmconfig.register("configfile", "fplugins.ini", 9, true, true, 
"PluginConfig.configFile", "PluginConfig.configFileLong",
+//                             new StringCallback() {
+//                     public String get() {
+//                             return configFile;
+//                     }
+//
+//                     public void set(String val) throws 
InvalidConfigValueException {
+//                             configFile = val;
+//                     }
+//             });
+//             configFile = pmconfig.getString("configfile");
+//             pmconfig.register("installdir", "fplugins", 9, true, true, 
"PluginConfig.installDir", "PluginConfig.installDirLong",
+//                             new StringCallback() {
+//                     public String get() {
+//                             return installDir;
+//                             //return getConfigLoadString();
+//                     }
+//
+//                     public void set(String val) throws 
InvalidConfigValueException {
+//                             installDir = val;
+//                             //if(storeDir.equals(new File(val))) return;
+//                             // FIXME
+//                             //throw new 
InvalidConfigValueException(L10n.getString("PluginManager.cannotSetOnceLoaded"));
+//                     }
+//             });
+//             installDir = pmconfig.getString("installdir");
+
                // Start plugins in the config
                pmconfig.register("loadplugin", null, 9, true, false, 
"PluginManager.loadedOnStartup", "PluginManager.loadedOnStartupLong",
                                new StringArrCallback() {
@@ -84,26 +139,11 @@

                String fns[] = pmconfig.getStringArr("loadplugin");
                if (fns != null) {
-                       for (int i = 0; i < fns.length; i++) {
-                               String name = fns[i];
-                               /* FIXME - compatibility code, remove somewhen 
*/
-                               boolean refresh = name.endsWith("*");
-                               if (refresh) {
-                                       name = name.substring(0, name.length() 
- 1);
-                               }
-                               /* FIXME - end of compatibility code */
-                               startPlugin(name, false);
-                       }
+                       for (String name : fns)
+                               startPluginAuto(name, false);
                }

                pmconfig.finishedInitialization();
-               /*System.err.println("=================================");
-                 pmconfig.finishedInitialization();
-                 fns = pmconfig.getStringArr("loadplugin");
-                 for (int i = 0 ; i < fns.length ; i++)
-                 System.err.println("Load: " + StringArrOption.decode(fns[i]));
-                 System.err.println("=================================");
-                */
        }

        private String[] getConfigLoadString() {
@@ -134,8 +174,52 @@
                        return new HashSet/* <PluginProgress> 
*/(startingPlugins);
                }
        }
+       
+       
+       // try to guess around...
+       public void startPluginAuto(final String pluginname, boolean store) {
+               
+               if (isOfficialPlugin(pluginname)) {
+                       startPluginOfficial(pluginname, store);
+                       return;
+               }
+               
+               try {
+                       FreenetURI uri = new FreenetURI(pluginname);
+                       startPluginFreenet(pluginname, store);
+                       return;
+               } catch (MalformedURLException e) {
+                       // not a freenet key
+               }
+               
+               File[] roots = File.listRoots();
+               for (File f: roots) {
+                       if (pluginname.startsWith(f.getName())) {
+                               startPluginFile(pluginname, store);
+                               return;
+                       }
+               }

-       public void startPlugin(final String filename, final boolean store) {
+               startPluginURL(pluginname, store);
+       }
+       
+       public void startPluginOfficial(final String pluginname, boolean store) 
{
+               realStartPlugin(new PluginDownLoaderOfficial(), pluginname, 
store);
+       }
+       
+       public void startPluginFile(final String filename, boolean store) {
+               realStartPlugin(new PluginDownLoaderFile(), filename, store);
+       }
+       
+       public void startPluginURL(final String filename, boolean store) {
+               realStartPlugin(new PluginDownLoaderURL(), filename, store);
+       }
+       
+       public void startPluginFreenet(final String filename, boolean store) {
+               realStartPlugin(new PluginDownLoaderFreenet(client), filename, 
true);
+       }
+       
+       private void realStartPlugin(final PluginDownLoader pdl, final String 
filename, final boolean store) {
                if (filename.trim().length() == 0)
                        return;
                final PluginProgress pluginProgress = new 
PluginProgress(filename);
@@ -148,7 +232,7 @@
                                Logger.normal(this, "Loading plugin: " + 
filename);
                                FredPlugin plug;
                                try {
-                                       plug = loadPlugin(filename);
+                                       plug = loadPlugin(pdl, filename);
                                        
pluginProgress.setProgress(PluginProgress.STARTING);
                                        PluginInfoWrapper pi = 
PluginHandler.startPlugin(PluginManager.this, filename, plug, new 
PluginRespirator(node, PluginManager.this));
                                        synchronized (pluginWrappers) {
@@ -267,6 +351,7 @@
                } else {
                        pluginFile = new File(pluginDirectory, 
pluginSpecification.substring(lastSlash + 1));
                }
+               if(logDEBUG) Logger.minor(this, "Delete plugin - plugname: " + 
pluginSpecification + "filename: " + pluginFile.getAbsolutePath() , new 
Exception("debug"));
                if (pluginFile.exists()) {
                        pluginFile.delete();
                }
@@ -377,6 +462,22 @@
                }
                return null;
        }
+       
+       /**
+        * look for a Plugin with given classname
+        * @param plugname
+        * @return the true if not found
+        */
+       public boolean isPluginLoaded(String plugname) {
+               synchronized (pluginWrappers) {
+                       for(int i=0;i<pluginWrappers.size();i++) {
+                               PluginInfoWrapper pi = (PluginInfoWrapper) 
pluginWrappers.get(i);
+                               if (pi.getPluginClassName().equals(plugname))
+                                       return true;
+                       }
+               }
+               return false;
+       }

        public String handleHTTPGet(String plugin, HTTPRequest request) throws 
PluginHTTPException {
                FredPlugin handler = null;
@@ -440,6 +541,40 @@
                        pi.stopPlugin(this, maxWaitTime);
                }
        }
+       
+       /**
+        * Returns a list of the names of all available official plugins. Right 
now
+        * this list is hardcoded but in future we could retrieve this list 
from emu
+        * or from freenet itself.
+        * 
+        * @return A list of all available plugin names
+        */
+       public List<String> findAvailablePlugins() {
+               List<String> availablePlugins = new ArrayList<String> ();
+               availablePlugins.add("Echo");
+               availablePlugins.add("Freemail");
+               availablePlugins.add("HelloWorld");
+               availablePlugins.add("HelloFCP");
+               availablePlugins.add("JSTUN");
+               availablePlugins.add("KeyExplorer");
+               availablePlugins.add("MDNSDiscovery");
+               availablePlugins.add("SNMP");
+               availablePlugins.add("TestGallery");
+               availablePlugins.add("ThawIndexBrowser");
+               availablePlugins.add("UPnP");
+               availablePlugins.add("XMLLibrarian");
+               availablePlugins.add("XMLSpider");
+               return availablePlugins;
+       }
+       
+       public boolean isOfficialPlugin(String name) {
+               if ((name == null) || (name.trim().length() == 0)) return false;
+               List<String> availablePlugins = findAvailablePlugins();
+               for(String n:availablePlugins) {
+                       if (n.equals(name)) return true;                        
+               }
+               return false;
+       }

        /**
         * Tries to load a plugin from the given name. If the name only 
contains the
@@ -448,6 +583,7 @@
         * complete url and the short file already exists in the plugin 
directory
         * it's loaded from the plugin directory, otherwise it's retrieved from 
the
         * remote server.
+        * @param pdl 
         * 
         * @param name
         *            The specification of the plugin
@@ -455,32 +591,10 @@
         * @throws PluginNotFoundException
         *             If anything goes wrong.
         */
-       private FredPlugin loadPlugin(String name) throws 
PluginNotFoundException {
-               URL pluginUrl = null;
-               /* check if name is a local file. */
-               File pluginFile = new File(name);
-               if (pluginFile.exists() && pluginFile.isFile()) {
-                       try {
-                               pluginUrl = pluginFile.toURI().toURL();
-                       } catch (MalformedURLException e) {
-                               throw new PluginNotFoundException("can not 
convert local path");
-                       }
-               } else {
-                       /* check if name contains a URL. */
-                       try {
-                               pluginUrl = new URL(name);
-                       } catch (MalformedURLException mue1) {
-                       }
-               }
-               if (pluginUrl == null) {
-                       try {
-                               pluginUrl = new 
URL("http://downloads.freenetproject.org/alpha/plugins/"; + name + ".jar.url");
-                       } catch (MalformedURLException mue1) {
-                               Logger.error(this, "could not build plugin url 
for " + name, mue1);
-                               throw new PluginNotFoundException("could not 
build plugin url for " + name, mue1);
-                       }
-               }
-
+       private FredPlugin loadPlugin(PluginDownLoader pdl, String name) throws 
PluginNotFoundException {
+               
+               pdl.setSource(name);
+               
                /* check for plugin directory. */
                File pluginDirectory = new File(node.getNodeDir(), "plugins");
                if ((pluginDirectory.exists() && 
!pluginDirectory.isDirectory()) || (!pluginDirectory.exists() && 
!pluginDirectory.mkdirs())) {
@@ -489,14 +603,8 @@
                }

                /* get plugin filename. */
-               String completeFilename = pluginUrl.getPath();
-               String filename = 
completeFilename.substring(completeFilename.lastIndexOf('/') + 1);
-               // The URL to the JAR file might end with .url because of the 
insane download server that redirects to a JAR file
-               // in response to a request for a file ending '.url'. Strip it 
off if so, since we want our JAR to end with '.jar'.
-               if (filename.endsWith(".url")) {
-                       filename = filename.substring(0, filename.length() - 4);
-               }
-               pluginFile = new File(pluginDirectory, filename);
+               String filename = pdl.getPluginName(name);
+               File pluginFile = new File(pluginDirectory, filename);

                /* check if file needs to be downloaded. */
                if (logMINOR) {
@@ -508,16 +616,14 @@
                                try {
                                        File tempPluginFile = null;
                                        OutputStream pluginOutputStream = null;
-                                       URLConnection urlConnection = null;
                                        InputStream pluginInputStream = null;
                                        try {
                                                tempPluginFile = 
File.createTempFile("plugin-", ".jar", pluginDirectory);
+                                               tempPluginFile.deleteOnExit();
+                                               
+                                               
                                                pluginOutputStream = new 
FileOutputStream(tempPluginFile);
-                                               urlConnection = 
pluginUrl.openConnection();
-                                               
urlConnection.setUseCaches(false);
-                                               
urlConnection.setAllowUserInteraction(false);
-                                               urlConnection.connect();
-                                               pluginInputStream = 
urlConnection.getInputStream();
+                                               pluginInputStream = 
pdl.getInputStream();
                                                byte[] buffer = new byte[1024];
                                                int read;
                                                while ((read = 
pluginInputStream.read(buffer)) != -1) {
@@ -530,6 +636,16 @@
                                                        Logger.error(this, 
"could not rename temp file to plugin file");
                                                        throw new 
PluginNotFoundException("could not rename temp file to plugin file");
                                                }
+                                               
+                                               String digest = 
pdl.getSHA1sum();
+                                               if (digest != null) {
+                                                       String testsum = 
getFileSHA1(pluginFile);
+                                                       if 
(!(digest.equalsIgnoreCase(testsum))) {
+                                                               
Logger.error(this, "Checksum verification failed, should be " +digest+ " but 
was " + testsum);
+                                                               throw new 
PluginNotFoundException("Checksum verification failed, should be " +digest+ " 
but was " + testsum);
+                                                       }
+                                               }
+                                               
                                        } catch (IOException ioe1) {
                                                Logger.error(this, "could not 
load plugin", ioe1);
                                                if (tempPluginFile != null) {
@@ -625,6 +741,32 @@
                }
        }

+       private String getFileSHA1(File file) throws PluginNotFoundException {
+               final int BUFFERSIZE = 4096;
+               MessageDigest hash = null;
+               FileInputStream fis = null;
+               BufferedInputStream bis = null;
+               
+               try {
+                       hash = MessageDigest.getInstance("SHA-1");
+                       // We compute the hash
+                       // 
http://java.sun.com/developer/TechTips/1998/tt0915.html#tip2
+                       fis = new FileInputStream(file);
+                       bis = new BufferedInputStream(fis);
+                       int len = 0;
+                       byte[] buffer = new byte[BUFFERSIZE];
+                       while((len = bis.read(buffer)) > -1) {
+                               hash.update(buffer, 0, len);
+                       }       
+               } catch (Exception e) {
+                       throw new PluginNotFoundException("Error while 
computing sha1 hash of the downloaded plugin: "+e, e);
+               } finally {
+                       Closer.close(bis);
+                       Closer.close(fis);
+               }
+               return HexUtil.bytesToHex(hash.digest());
+       }
+
        Ticker getTicker() {
                return node.getTicker();
        }

Modified: branches/db4o/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
===================================================================
--- branches/db4o/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 
2008-08-07 18:30:55 UTC (rev 21657)
@@ -986,10 +986,6 @@

                                long lruVal = 0;
                                Transaction t = null;
-                               if(storeRAF.getFilePointer() != l * 
(headerBlockSize + dataBlockSize)) {
-                                       System.err.println("File pointer is 
"+storeRAF.getFilePointer()+" but should be "+((headerBlockSize + 
dataBlockSize)));
-                                       
System.exit(NodeInitException.EXIT_STORE_RECONSTRUCT);
-                               }
                                boolean dataRead = false;
                                if(lruRAFLength > (l+1)*8) {
                                        try {

Modified: branches/db4o/freenet/src/freenet/support/FileLoggerHook.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/FileLoggerHook.java       
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/support/FileLoggerHook.java       
2008-08-07 18:30:55 UTC (rev 21657)
@@ -816,7 +816,7 @@
                sb.append('\n');

                for(int j=0;j<20 && e != null;j++) {
-                               
+
                        sb.append(e.toString());

                        StackTraceElement[] trace = e.getStackTrace();

Modified: branches/db4o/freenet/src/freenet/support/LibraryLoader.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/LibraryLoader.java        
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/support/LibraryLoader.java        
2008-08-07 18:30:55 UTC (rev 21657)
@@ -25,13 +25,16 @@
                } else 
if(System.getProperty("os.arch").toLowerCase().matches("(ppc)")) {
                        arch = "ppc";
                } else {
+                       // We want to try the i386 libraries if the 
architecture is unknown
+                       // Wrappers MUST fallback to "plain java" 
implementation if loading native libraries fails
                        arch = "i386";
                }

                return arch;
        }

-       public static void loadNative(String path, String libraryName) {
+       public static boolean loadNative(String path, String libraryName) {
+               boolean success = false;
                final boolean isWindows = File.pathSeparatorChar == ';';
                final String prefix = (isWindows ? ".dll" : 
((System.getProperty("os.name")).toLowerCase().startsWith("mac") ? ".jnilib" : 
".so"));
                final String libraryNameWithPrefix = (isWindows ? "" : "lib") + 
libraryName;
@@ -43,6 +46,7 @@
                if (nativeLib.exists()) {
                        System.out.println("Attempting to load the NativeThread 
library ["+libraryName+']');
                        System.loadLibrary(libraryName);
+                       success = true;
                } else {
                        try {
                                // Get the resource
@@ -68,10 +72,13 @@
                                // Finally, load the dll
                                System.out.println("Attempting to load the 
"+libraryName+" library ["+resource+']');
                                System.load(temporaryLib.getPath());
+                               success = true;
                        } catch(Throwable e) {
                                System.err.println("Caught the following 
exception attempting to load "+resourceName);
                                e.printStackTrace();
                        }
                }
+
+               return success;
        }
 }

Modified: branches/db4o/freenet/src/freenet/support/Serializer.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/Serializer.java   2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/support/Serializer.java   2008-08-07 
18:30:55 UTC (rev 21657)
@@ -63,7 +63,7 @@
                        throw new IOException("Boolean is non boolean value: 
"+bool);
                } else if (type.equals(Byte.class)) {
                        int b = dis.readByte();
-                       return new Byte((byte)b);
+                       return new Byte((byte) b);
                } else if (type.equals(Short.class)) {
                        return new Short(dis.readShort());
                } else if (type.equals(Integer.class)) {
@@ -102,20 +102,21 @@
                }
        }

-       public static void writeToDataOutputStream(Object object, 
DataOutputStream dos, PeerContext ctx) throws IOException {
+       public static void writeToDataOutputStream(Object object, 
DataOutputStream dos, PeerContext ctx) throws IOException {   
                Class type = object.getClass();
-               if (type.equals(Boolean.class)) {
+               if (type.equals(Long.class)) {
+                       dos.writeLong(((Long) object).longValue());
+               } else if (type.equals(Boolean.class)) {
                        dos.write(((Boolean) object).booleanValue() ? 1 : 0);
-               } else if (type.equals(Byte.class)) {
-                       dos.write(((Byte) object).byteValue());
-               } else if (type.equals(Short.class)) {
-                       dos.writeShort(((Short) object).shortValue());
                } else if (type.equals(Integer.class)) {
                        dos.writeInt(((Integer) object).intValue());
-               } else if (type.equals(Long.class)) {
-                       dos.writeLong(((Long) object).longValue());
+               } else if (type.equals(Short.class)) {
+                       dos.writeShort(((Short) object).shortValue());
                } else if (type.equals(Double.class)) {
                    dos.writeDouble(((Double) object).doubleValue());
+               } else if 
(WritableToDataOutputStream.class.isAssignableFrom(type)) {
+                       WritableToDataOutputStream b = 
(WritableToDataOutputStream) object;
+                       b.writeToDataOutputStream(dos);
                } else if (type.equals(String.class)) {
                        String s = (String) object;
                        dos.writeInt(s.length());
@@ -130,11 +131,8 @@
                                        writeToDataOutputStream(i.next(), dos, 
ctx);
                                }
                        }
-               } else if (type.equals(Peer.class)) {
-                       ((Peer)object).writeToDataOutputStream(dos);
-               } else if 
(WritableToDataOutputStream.class.isAssignableFrom(type)) {
-                       WritableToDataOutputStream b = 
(WritableToDataOutputStream) object;
-                       b.writeToDataOutputStream(dos);
+               } else if (type.equals(Byte.class)) {
+                       dos.write(((Byte) object).byteValue());
                } else {
                        throw new RuntimeException("Unrecognised field type: " 
+ type);
                }

Modified: branches/db4o/freenet/src/freenet/support/SimpleFieldSet.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/SimpleFieldSet.java       
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/support/SimpleFieldSet.java       
2008-08-07 18:30:55 UTC (rev 21657)
@@ -840,11 +840,16 @@
        }

        public void put(String key, int[] value) {
-               // FIXME this could be more efficient...
                removeValue(key);
-               for(int i=0;i<value.length;i++)
-                       putAppend(key, Integer.toString(value[i]));
+               for(int v : value)
+                       putAppend(key, String.valueOf(v));
        }
+       
+       public void put(String key, double[] value) {
+               removeValue(key);
+               for(double v : value)
+                       putAppend(key, String.valueOf(v));
+       }

        public int[] getIntArray(String key) {
                String[] strings = getAll(key);
@@ -860,6 +865,22 @@
                }
                return ret;
        }
+       
+       public double[] getDoubleArray(String key) {
+               String[] strings = getAll(key);
+               if(strings == null) return null;
+               double[] ret = new double[strings.length];
+               for(int i=0;i<strings.length;i++) {
+                       try {
+                               ret[i] = Double.valueOf(strings[i]);
+                       } catch(NumberFormatException e) {
+                               Logger.error(this, "Cannot parse "+strings[i]+" 
: "+e,e);
+                               return null;
+                       }
+               }
+               
+               return ret;
+       }

        public void putOverwrite(String key, String[] strings) {
                putOverwrite(key, unsplit(strings));

Modified: branches/db4o/freenet/src/freenet/support/URIPreEncoder.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/URIPreEncoder.java        
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/support/URIPreEncoder.java        
2008-08-07 18:30:55 UTC (rev 21657)
@@ -19,7 +19,7 @@
 public class URIPreEncoder {

        // We deliberately include '%' because we don't want to interfere with 
stuff which is already encoded.
-       public final static String allowedChars = 
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-!.~'()*,;:$&+=?/@%#";
+       public final static String allowedChars = 
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-!.~'()*,;:$&+=?/@%";

        public static String encode(String s) {
                StringBuffer output = new StringBuffer(s.length()*2);

Modified: branches/db4o/freenet/src/freenet/support/io/NativeThread.java
===================================================================
--- branches/db4o/freenet/src/freenet/support/io/NativeThread.java      
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/src/freenet/support/io/NativeThread.java      
2008-08-07 18:30:55 UTC (rev 21657)
@@ -39,11 +39,9 @@
        static {
                Logger.minor(NativeThread.class, "Running init()");
                // Loading the NativeThread library isn't useful on macos
-               _loadNative = 
("Linux".equalsIgnoreCase(System.getProperty("os.name"))) && 
(NodeStarter.extBuildNumber > 18);
-               Logger.debug(NativeThread.class, "Run init(): should 
loadNative="+_loadNative);
-               if(_loadNative) {
-                       //System.loadLibrary("NativeThread");
-                       LibraryLoader.loadNative("/freenet/support/io/", 
"NativeThread");
+               boolean maybeLoadNative = 
("Linux".equalsIgnoreCase(System.getProperty("os.name"))) && 
(NodeStarter.extBuildNumber > 18);
+               Logger.debug(NativeThread.class, "Run init(): should 
loadNative="+maybeLoadNative);
+               if(maybeLoadNative && 
LibraryLoader.loadNative("/freenet/support/io/", "NativeThread")) {
                        NATIVE_PRIORITY_BASE = getLinuxPriority();
                        NATIVE_PRIORITY_RANGE = 20 - NATIVE_PRIORITY_BASE;
                        System.out.println("Using the NativeThread 
implementation (base nice level is "+NATIVE_PRIORITY_BASE+')');
@@ -53,6 +51,7 @@
                        HAS_PLENTY_NICE_LEVELS = NATIVE_PRIORITY_RANGE 
>=JAVA_PRIORITY_RANGE;
                        if(!(HAS_ENOUGH_NICE_LEVELS && HAS_THREE_NICE_LEVELS))
                                System.err.println("WARNING!!! The JVM has been 
niced down to a level which won't allow it to schedule threads properly! LOWER 
THE NICE LEVEL!!");
+                       _loadNative = true;
                } else {
                        // unused anyway
                        NATIVE_PRIORITY_BASE = 0;
@@ -60,6 +59,7 @@
                        HAS_THREE_NICE_LEVELS = true;
                        HAS_ENOUGH_NICE_LEVELS = true;
                        HAS_PLENTY_NICE_LEVELS = true;
+                       _loadNative = false;
                }
                Logger.minor(NativeThread.class, "Run init(): _loadNative = 
"+_loadNative);
        }
@@ -118,7 +118,7 @@
                        /* The user has reniced freenet or we didn't use the 
PacketSender to create the thread
                         * either ways it's bad for us.
                         * 
-                        * Let's diable the renicing as we can't rely on it 
anymore.
+                        * Let's disable the renicing as we can't rely on it 
anymore.
                         */
                        _disabled = true;
                        Logger.error(this, "Freenet has detected it has been 
reniced : THAT'S BAD, DON'T DO IT! Nice level detected statically: 
"+NATIVE_PRIORITY_BASE+" actual nice level: "+realPrio+" on "+this);

Modified: 
branches/db4o/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
===================================================================
--- 
branches/db4o/freenet/src/freenet/support/io/PersistentTempBucketFactory.java   
    2008-08-07 16:48:54 UTC (rev 21656)
+++ 
branches/db4o/freenet/src/freenet/support/io/PersistentTempBucketFactory.java   
    2008-08-07 18:30:55 UTC (rev 21657)
@@ -17,6 +17,7 @@
 import freenet.support.Logger;
 import freenet.support.api.Bucket;
 import freenet.support.api.BucketFactory;
+import java.io.FileFilter;

 /**
  * Handles persistent temp files. These are used for e.g. persistent downloads.
@@ -44,7 +45,7 @@

        private final long nodeDBHandle;

-       public PersistentTempBucketFactory(File dir, String prefix, 
RandomSource strongPRNG, Random weakPRNG, long nodeDBHandle) throws IOException 
{
+       public PersistentTempBucketFactory(File dir, final String prefix, 
RandomSource strongPRNG, Random weakPRNG, long nodeDBHandle) throws IOException 
{
                boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
                this.strongPRNG = strongPRNG;
                this.nodeDBHandle = nodeDBHandle;
@@ -59,24 +60,24 @@
                if(!dir.isDirectory())
                        throw new IOException("Directory is not a directory: 
"+dir);
                originalFiles = new HashSet();
-               File[] files = dir.listFiles();
-               if((files != null) && (files.length > 0)) {
-                       for(int i=0;i<files.length;i++) {
-                               File f = files[i];
-                               String name = f.getName();
-                               if(f.isDirectory()) continue;
-                               if(!f.exists()) continue;
-                               if(!name.startsWith(prefix)) {
-                               if(Logger.shouldLog(Logger.MINOR, this))
-                                       Logger.minor(this, "Ignoring "+name);
-                                       continue;
-                               }
-                               f = FileUtil.getCanonicalFile(f);
-                               if(logMINOR)
-                                       Logger.minor(this, "Found "+f);
-                               originalFiles.add(f);
+               File[] files = dir.listFiles(new FileFilter() {
+
+                       public boolean accept(File pathname) {
+                               if(!pathname.exists() || pathname.isDirectory())
+                                       return false;
+                               String name = pathname.getName();
+                               if(name.startsWith(prefix))
+                                       return true;
+                               return false;
                        }
+               });
+               for(File f : files) {
+                       f = FileUtil.getCanonicalFile(f);
+                       if(logMINOR)
+                               Logger.minor(this, "Found " + f);
+                       originalFiles.add(f);
                }
+               
                bucketsToFree = new LinkedList();
        }


Copied: branches/db4o/freenet/test/freenet/clients (from rev 21652, 
trunk/freenet/test/freenet/clients)

Copied: branches/db4o/freenet/test/freenet/clients/http (from rev 21652, 
trunk/freenet/test/freenet/clients/http)

Copied: branches/db4o/freenet/test/freenet/clients/http/filter (from rev 21652, 
trunk/freenet/test/freenet/clients/http/filter)

Deleted: 
branches/db4o/freenet/test/freenet/clients/http/filter/ContentFilterTest.java
===================================================================
--- trunk/freenet/test/freenet/clients/http/filter/ContentFilterTest.java       
2008-08-06 23:28:32 UTC (rev 21652)
+++ 
branches/db4o/freenet/test/freenet/clients/http/filter/ContentFilterTest.java   
    2008-08-07 18:30:55 UTC (rev 21657)
@@ -1,68 +0,0 @@
-/* This code is part of Freenet. It is distributed under the GNU General
- * Public License, version 2 (or at your option any later version). See
- * http://www.gnu.org/ for further details of the GPL. */
-package freenet.clients.http.filter;
-
-import freenet.support.api.BucketFactory;
-import freenet.support.io.ArrayBucket;
-import freenet.support.io.ArrayBucketFactory;
-import java.net.URI;
-import junit.framework.TestCase;
-
-/**
- * A simple meta-test to track regressions of the content-filter
- *
- * @author Florent Daigni&egrave;re &lt;nextgens at freenetproject.org&gt;
- */
-public class ContentFilterTest extends TestCase {
-       private static final String BASE_URI_PROTOCOL = "http";
-       private static final String BASE_URI_CONTENT = "localhost:8888";
-       private static final String BASE_URI = 
BASE_URI_PROTOCOL+"://"+BASE_URI_CONTENT+'/';
-       
-       private static final String EXTERNAL_LINK = "www.evilwebsite.gov";
-       private static final String EXTERNAL_LINK_OK = "<a />";
-       // check that external links are not allowed
-       private static final String EXTERNAL_LINK_CHECK1 = "<a 
href=\""+EXTERNAL_LINK+"\"/>";
-       private static final String EXTERNAL_LINK_CHECK2 = "<a 
href=\""+BASE_URI_PROTOCOL+"://"+EXTERNAL_LINK+"\"/>";
-       private static final String EXTERNAL_LINK_CHECK3 = "<a 
href=\""+BASE_URI_CONTENT+"@http://"+EXTERNAL_LINK+"\"/>";
-       
-       private static final String INTERNAL_RELATIVE_LINK = "<a href=\"/KSK at 
gpl.txt\" />";
-       private static final String INTERNAL_ABSOLUTE_LINK = "<a 
href=\""+BASE_URI+"KSK at gpl.txt\" />";
-       
-       // @see bug #710
-       private static final String ANCHOR_TEST = "<a href=\"#test\" />";
-       // @see bug #2451
-       private static final String POUNT_CHARACTER_ENCODING_TEST = "<a 
href=\"/CHK at 
DUiGC5D1ZsnFpH07WGkNVDujNlxhtgGxXBKrMT-9Rkw,~GrAWp02o9YylpxL1Fr4fPDozWmebhGv4qUoFlrxnY4,AAIC--8/Testing
 - [blah] Apostrophe' - gratuitous #1 AND CAPITAL LETTERS!!!!.ogg\" />";
-       private static final String POUNT_CHARACTER_ENCODING_TEST_RESULT = "<a 
href=\"/CHK at 
DUiGC5D1ZsnFpH07WGkNVDujNlxhtgGxXBKrMT-9Rkw,~GrAWp02o9YylpxL1Fr4fPDozWmebhGv4qUoFlrxnY4,AAIC--8/Testing%20-%20%5bblah%5d%20Apostrophe%27%20-%20gratuitous%20%231%20AND%20CAPITAL%20LETTERS%21%21%21%21.ogg\"
 />";
-       // @see bug #2297
-       private static final String PREVENT_FPROXY_ACCESS = "<a 
href=\""+BASE_URI+"\"/>";
-       private static final String WHITELIST_STATIC_CONTENT = "<a 
href=\"/static/themes/clean/theme.css\" />";
-
-       private final BucketFactory bf = new ArrayBucketFactory();
-
-       public void testHTMLFilter() throws Exception {
-               // General sanity checks
-               // is "relativization" working?
-               assertEquals(INTERNAL_RELATIVE_LINK, 
HTMLFilter(INTERNAL_RELATIVE_LINK));
-               assertEquals(INTERNAL_RELATIVE_LINK, 
HTMLFilter(INTERNAL_ABSOLUTE_LINK));
-               // are external links stripped out ?
-               
assertTrue(HTMLFilter(EXTERNAL_LINK_CHECK1).startsWith(EXTERNAL_LINK_OK));
-               
assertTrue(HTMLFilter(EXTERNAL_LINK_CHECK2).contains(GenericReadFilterCallback.magicHTTPEscapeString));
-               
assertTrue(HTMLFilter(EXTERNAL_LINK_CHECK3).startsWith(EXTERNAL_LINK_OK));
-               
-               // regression testing
-               assertEquals(ANCHOR_TEST, HTMLFilter(ANCHOR_TEST));
-               
-               assertEquals(POUNT_CHARACTER_ENCODING_TEST_RESULT, 
HTMLFilter(POUNT_CHARACTER_ENCODING_TEST));
-               
-               
assertTrue(HTMLFilter(PREVENT_FPROXY_ACCESS).contains(GenericReadFilterCallback.magicHTTPEscapeString));
-               assertEquals(WHITELIST_STATIC_CONTENT, 
HTMLFilter(WHITELIST_STATIC_CONTENT));
-       }
-               
-       private String HTMLFilter(String data) throws Exception {
-               String typeName = "text/html";
-               URI baseURI = new URI(BASE_URI);
-               
-               return ContentFilter.filter(new 
ArrayBucket(data.getBytes("UTF-8")), bf, typeName, baseURI, 
null).data.toString();
-       }
-}

Copied: 
branches/db4o/freenet/test/freenet/clients/http/filter/ContentFilterTest.java 
(from rev 21652, 
trunk/freenet/test/freenet/clients/http/filter/ContentFilterTest.java)
===================================================================
--- 
branches/db4o/freenet/test/freenet/clients/http/filter/ContentFilterTest.java   
                            (rev 0)
+++ 
branches/db4o/freenet/test/freenet/clients/http/filter/ContentFilterTest.java   
    2008-08-07 18:30:55 UTC (rev 21657)
@@ -0,0 +1,68 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.clients.http.filter;
+
+import freenet.support.api.BucketFactory;
+import freenet.support.io.ArrayBucket;
+import freenet.support.io.ArrayBucketFactory;
+import java.net.URI;
+import junit.framework.TestCase;
+
+/**
+ * A simple meta-test to track regressions of the content-filter
+ *
+ * @author Florent Daigni&egrave;re &lt;nextgens at freenetproject.org&gt;
+ */
+public class ContentFilterTest extends TestCase {
+       private static final String BASE_URI_PROTOCOL = "http";
+       private static final String BASE_URI_CONTENT = "localhost:8888";
+       private static final String BASE_URI = 
BASE_URI_PROTOCOL+"://"+BASE_URI_CONTENT+'/';
+       
+       private static final String EXTERNAL_LINK = "www.evilwebsite.gov";
+       private static final String EXTERNAL_LINK_OK = "<a />";
+       // check that external links are not allowed
+       private static final String EXTERNAL_LINK_CHECK1 = "<a 
href=\""+EXTERNAL_LINK+"\"/>";
+       private static final String EXTERNAL_LINK_CHECK2 = "<a 
href=\""+BASE_URI_PROTOCOL+"://"+EXTERNAL_LINK+"\"/>";
+       private static final String EXTERNAL_LINK_CHECK3 = "<a 
href=\""+BASE_URI_CONTENT+"@http://"+EXTERNAL_LINK+"\"/>";
+       
+       private static final String INTERNAL_RELATIVE_LINK = "<a href=\"/KSK at 
gpl.txt\" />";
+       private static final String INTERNAL_ABSOLUTE_LINK = "<a 
href=\""+BASE_URI+"KSK at gpl.txt\" />";
+       
+       // @see bug #710
+       private static final String ANCHOR_TEST = "<a href=\"#test\" />";
+       // @see bug #2451
+       private static final String POUNT_CHARACTER_ENCODING_TEST = "<a 
href=\"/CHK at 
DUiGC5D1ZsnFpH07WGkNVDujNlxhtgGxXBKrMT-9Rkw,~GrAWp02o9YylpxL1Fr4fPDozWmebhGv4qUoFlrxnY4,AAIC--8/Testing
 - [blah] Apostrophe' - gratuitous #1 AND CAPITAL LETTERS!!!!.ogg\" />";
+       private static final String POUNT_CHARACTER_ENCODING_TEST_RESULT = "<a 
href=\"/CHK at 
DUiGC5D1ZsnFpH07WGkNVDujNlxhtgGxXBKrMT-9Rkw,~GrAWp02o9YylpxL1Fr4fPDozWmebhGv4qUoFlrxnY4,AAIC--8/Testing%20-%20%5bblah%5d%20Apostrophe%27%20-%20gratuitous%20%231%20AND%20CAPITAL%20LETTERS%21%21%21%21.ogg\"
 />";
+       // @see bug #2297
+       private static final String PREVENT_FPROXY_ACCESS = "<a 
href=\""+BASE_URI+"\"/>";
+       private static final String WHITELIST_STATIC_CONTENT = "<a 
href=\"/static/themes/clean/theme.css\" />";
+
+       private final BucketFactory bf = new ArrayBucketFactory();
+
+       public void testHTMLFilter() throws Exception {
+               // General sanity checks
+               // is "relativization" working?
+               assertEquals(INTERNAL_RELATIVE_LINK, 
HTMLFilter(INTERNAL_RELATIVE_LINK));
+               assertEquals(INTERNAL_RELATIVE_LINK, 
HTMLFilter(INTERNAL_ABSOLUTE_LINK));
+               // are external links stripped out ?
+               
assertTrue(HTMLFilter(EXTERNAL_LINK_CHECK1).startsWith(EXTERNAL_LINK_OK));
+               
assertTrue(HTMLFilter(EXTERNAL_LINK_CHECK2).contains(GenericReadFilterCallback.magicHTTPEscapeString));
+               
assertTrue(HTMLFilter(EXTERNAL_LINK_CHECK3).startsWith(EXTERNAL_LINK_OK));
+               
+               // regression testing
+               assertEquals(ANCHOR_TEST, HTMLFilter(ANCHOR_TEST));
+               
+               assertEquals(POUNT_CHARACTER_ENCODING_TEST_RESULT, 
HTMLFilter(POUNT_CHARACTER_ENCODING_TEST));
+               
+               
assertTrue(HTMLFilter(PREVENT_FPROXY_ACCESS).contains(GenericReadFilterCallback.magicHTTPEscapeString));
+               assertEquals(WHITELIST_STATIC_CONTENT, 
HTMLFilter(WHITELIST_STATIC_CONTENT));
+       }
+               
+       private String HTMLFilter(String data) throws Exception {
+               String typeName = "text/html";
+               URI baseURI = new URI(BASE_URI);
+               
+               return ContentFilter.filter(new 
ArrayBucket(data.getBytes("UTF-8")), bf, typeName, baseURI, 
null).data.toString();
+       }
+}

Modified: branches/db4o/freenet/test/freenet/config/ConfigTest.java
===================================================================
--- branches/db4o/freenet/test/freenet/config/ConfigTest.java   2008-08-07 
16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/test/freenet/config/ConfigTest.java   2008-08-07 
18:30:55 UTC (rev 21657)
@@ -15,8 +15,7 @@
  */
 package freenet.config;

-import freenet.config.Config;
-import freenet.config.SubConfig;
+import freenet.utils.UTFUtil;
 import junit.framework.TestCase;

 /**
@@ -44,7 +43,12 @@

        public void testRegister() {
                /* test if we can register */
-               assertNotNull(new SubConfig("testing1%?~#{[|`^@??&?", conf));
+               StringBuffer sb = new StringBuffer();
+               for(int i=0; i< UTFUtil.PRINTABLE_ASCII.length; i++)
+                       sb.append(UTFUtil.PRINTABLE_ASCII[i]);
+               for(int i=0; i< UTFUtil.STRESSED_UTF.length; i++)
+                       sb.append(UTFUtil.STRESSED_UTF[i]);
+               assertNotNull(new SubConfig(sb.toString(), conf));

                /* test if it prevents multiple registrations */
                try{
@@ -65,5 +69,4 @@
        public void testGet() {
                assertSame(sc, conf.get("testing"));
        }
-
 }

Modified: branches/db4o/freenet/test/freenet/support/SimpleFieldSetTest.java
===================================================================
--- branches/db4o/freenet/test/freenet/support/SimpleFieldSetTest.java  
2008-08-07 16:48:54 UTC (rev 21656)
+++ branches/db4o/freenet/test/freenet/support/SimpleFieldSetTest.java  
2008-08-07 18:30:55 UTC (rev 21657)
@@ -620,6 +620,20 @@
        }

        /**
+        * Tests the getDoubleArray(String) method
+        */
+       public void testGetDoubleArray() {
+               SimpleFieldSet methodSFS = new SimpleFieldSet(true);
+               String keyPrefix = "foo";
+               for (int i = 0; i<15; i++)
+                       
methodSFS.putAppend(keyPrefix,String.valueOf((double)i));
+               double[] result = methodSFS.getDoubleArray(keyPrefix);
+               for (int i = 0; i<15; i++)
+                       assertTrue(result[i]== ((double)i));
+               
+       }
+       
+       /**
         * Tests removeValue(String) method
         */
        public void testRemoveValue() {


Reply via email to