Index: /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.classpath
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.classpath	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.classpath	(revision 31449)
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/java-8-oracle">
+		<attributes>
+			<attribute name="owner.project.facets" value="java"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/Apache Tomcat v8.0">
+		<attributes>
+			<attribute name="owner.project.facets" value="jst.web"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
+	<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
+	<classpathentry kind="lib" path="WebContent/WEB-INF/lib/ActionObject.jar"/>
+	<classpathentry kind="output" path="build/classes"/>
+</classpath>
Index: /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.project
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.project	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.project	(revision 31449)
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>GWTTomcatSocketServer</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.validation.validationbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+	</natures>
+</projectDescription>
Index: /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.settings/.jsdtscope
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.settings/.jsdtscope	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.settings/.jsdtscope	(revision 31449)
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="WebContent"/>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject">
+		<attributes>
+			<attribute name="hide" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
+	<classpathentry kind="output" path=""/>
+</classpath>
Index: /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.settings/org.eclipse.jdt.core.prefs	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.settings/org.eclipse.jdt.core.prefs	(revision 31449)
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
Index: /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.settings/org.eclipse.wst.common.component
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.settings/org.eclipse.wst.common.component	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.settings/org.eclipse.wst.common.component	(revision 31449)
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
+    <wb-module deploy-name="GWTTomcatSocketServer">
+        <wb-resource deploy-path="/" source-path="/WebContent" tag="defaultRootSource"/>
+        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src"/>
+        <property name="java-output-path" value="/GWTTomcatSocketServer/build/classes"/>
+        <property name="context-root" value="GWTTomcatSocketServer"/>
+    </wb-module>
+</project-modules>
Index: /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.settings/org.eclipse.wst.common.project.facet.core.xml
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.settings/org.eclipse.wst.common.project.facet.core.xml	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.settings/org.eclipse.wst.common.project.facet.core.xml	(revision 31449)
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <runtime name="Apache Tomcat v8.0"/>
+  <fixed facet="java"/>
+  <fixed facet="wst.jsdt.web"/>
+  <fixed facet="jst.web"/>
+  <installed facet="java" version="1.8"/>
+  <installed facet="jst.web" version="3.1"/>
+  <installed facet="wst.jsdt.web" version="1.0"/>
+</faceted-project>
Index: /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.settings/org.eclipse.wst.jsdt.ui.superType.container
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.settings/org.eclipse.wst.jsdt.ui.superType.container	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.settings/org.eclipse.wst.jsdt.ui.superType.container	(revision 31449)
@@ -0,0 +1,1 @@
+org.eclipse.wst.jsdt.launching.baseBrowserLibrary
Index: /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.settings/org.eclipse.wst.jsdt.ui.superType.name
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.settings/org.eclipse.wst.jsdt.ui.superType.name	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/.settings/org.eclipse.wst.jsdt.ui.superType.name	(revision 31449)
@@ -0,0 +1,1 @@
+Window
Index: /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/WebContent/META-INF/MANIFEST.MF
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/WebContent/META-INF/MANIFEST.MF	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/WebContent/META-INF/MANIFEST.MF	(revision 31449)
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path: 
+
Index: /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/src/ActionResponseHandler.java
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/src/ActionResponseHandler.java	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/src/ActionResponseHandler.java	(revision 31449)
@@ -0,0 +1,77 @@
+import java.util.LinkedList;
+
+import org.nbk4.gwt.action.client.ActionRequest;
+
+
+public abstract class ActionResponseHandler {
+	//there may be some sort of concurrency issue to deal with - we'll figure that out later
+	private static Object monitor = new Object();
+	private static LinkedList<ActionResponseHandler> registeredHandlers = new LinkedList<ActionResponseHandler>();
+	
+	private static long getRelativeTimeOutDate(long timeOut) {
+		if(timeOut <= 0) {
+			return 0;
+		}
+		else {
+			return (System.currentTimeMillis() / 1000L) + timeOut;
+		}
+	}
+	
+	public static void addHandler(ActionResponseHandler handler) {
+		synchronized(monitor) {
+			registeredHandlers.add(handler);
+		}
+	}
+	
+	public static boolean handleIfResponse(ActionRequest request) {
+		LinkedList<ActionResponseHandler> opt_filter = new LinkedList<ActionResponseHandler>();
+		
+		//don't want any changes to the object as we use it
+		synchronized(monitor) {
+			boolean done = false;
+			for (ActionResponseHandler handler : registeredHandlers) {
+				if(handler.isTimedOut()) {
+					//we've handled this event - nothing else to do here
+				}				
+				else if (!done && handler.tryToHandle(request)) {
+					done = true;
+				}
+				else {
+					opt_filter.add(handler);
+				}
+			}
+			registeredHandlers = opt_filter;
+		}
+		//no matching event handler found
+		return false;
+	}
+	
+	/*FIELDS*/
+	private long timeOutDate = 0;
+	
+	/*FUNCTIONS*/
+	//timeOut in seconds: use zero, or anything less than 0, for no timeout
+	//If a response is received, then any non-answering call past the timeout will be destructed!
+	protected ActionResponseHandler(long timeOut) {
+		timeOutDate = getRelativeTimeOutDate(timeOut);
+	}
+	
+	/**
+	 *tryToHandle: should have presupplied a target to handle.
+	 *When getting the request, handle it as you decide. Return true to mark that it was
+	 *handled, which allows the managing class to destroy this handler.
+	 */	
+	public abstract boolean tryToHandle(ActionRequest request);
+	
+	//Implementation of this entirely up to end user? Who knows. Set a timeout, destroy self on timeout>?
+	
+	//TODO: convert to milliseconds, change parameter to indicate milliseconds
+	public boolean isTimedOut() {
+		if (timeOutDate != 0 && System.currentTimeMillis() / 1000L >= timeOutDate) {
+			//TODO: Logger
+			System.err.println("DEBUG: Handler has timed out: ");
+			return true;
+		}
+		return false;
+	}
+}
Index: /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/src/MyServerEndpoint.java
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/src/MyServerEndpoint.java	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GWTTomcatSocketServer/src/MyServerEndpoint.java	(revision 31449)
@@ -0,0 +1,249 @@
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.channels.NotYetConnectedException;
+import java.util.ArrayList;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.websocket.OnClose;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+
+import org.nbk4.gwt.action.client.ActionObject;
+import org.nbk4.gwt.action.client.ActionObjectBuilder;
+import org.nbk4.gwt.action.client.ActionProperty;
+import org.nbk4.gwt.action.client.ActionRequest;
+import org.nbk4.gwt.action.client.RequestType;
+
+import com.google.gson.Gson;
+
+@ServerEndpoint("/IOtask") 
+public class MyServerEndpoint {
+	private static final Gson gson = new Gson();
+	private static final Logger logger = Logger.getLogger(MyServerEndpoint.class.getName());
+	/**
+	 * @OnOpen allows us to intercept the creation of a new session.
+	 * The session class allows us to send data to the user.
+	 * In the method onOpen, we'll let the user know that the handshake was 
+	 * successful.
+	 */
+	@OnOpen
+	public void onOpen(Session session){
+		logger.log(Level.INFO, session.getId() + " has opened a connection", session);
+		//System.out.println(session.getId() + " has opened a connection"); 
+		sendAlertMessage("Connection has been established to the websocket server!",
+				"Connected to server",
+				session);
+	}
+	
+	/**
+	 * Sends an alert to the end client. The client cannot respond to the server.
+	 * @param  message alert message
+	 * @param  header  alert title
+	 * @param  current connected session
+	 * @return True/False - whether or not we could send a response to the user
+	 */
+	private boolean sendAlertMessage(String message, String header, Session session) {
+		ActionObject messageToSend = ActionObjectBuilder.messageBoxSpawnObject(header, 
+				message, new String[] {"OK"}, false);
+		try {
+			session.getBasicRemote().sendText(gson.toJson(messageToSend));
+		} catch (Exception thrown) {
+			logger.log(Level.WARNING, "could not send error message to user", thrown);
+			return false;
+		}
+		return true;		
+	}
+	
+	/**
+	 * Sends an alert to the end client that provides a server response on user action
+	 * @param  message The window text to provide the client
+	 * @param  header The title/header text of the alert
+	 * @param  session The current user session
+	 * @return True/False - whether or not we could send a response to the user
+	 */
+	private boolean sendRespondableAlertMessage(String message, String header, Session session) {
+		ActionObject messageToSend = ActionObjectBuilder.messageBoxSpawnObject(header, 
+				message, new String[] {"OK", "Cancel"}, true); //push this to using ACTUAL buttons later
+		try {
+			session.getBasicRemote().sendText(gson.toJson(messageToSend));
+			
+			MyActionResponseHandler handler = new MyActionResponseHandler(0L, messageToSend.actionID, session);
+			ActionResponseHandler.addHandler(handler);
+		} catch (Exception thrown) {
+			logger.log(Level.WARNING, "could not send error message to user", thrown);
+			return false;
+		}
+		return true;		
+	}
+	
+	/**
+	 * When a user sends a message to the server, this function will intercept the message
+	 * and allow us to react to it. For now the message is read as a String.
+	 */
+	@OnMessage
+	public void onMessage(String message, Session session){
+		logger.setLevel(Level.ALL);
+		logger.log(Level.FINE, "Message from " + session.getId() + ": " + message);
+		
+		try {
+			ActionRequest AR = null;
+			try {
+				AR = gson.fromJson(message, ActionRequest.class);
+			} catch (Exception e) {
+				//if this hasn't completed, or in the case that it ends up null, then we need to warn user
+				logger.log(Level.SEVERE, "Error decoding JSON: ActionRequest did not match " + message, e);
+				AR = null;
+			} finally {
+				if(AR == null) {
+					//warn end user that something is wrong
+					sendAlertMessage("INVALID JSON", 
+							"Error decoding JSON: ActionRequest did not match " + message, 
+							session);
+					return;
+				}
+			}
+			
+			if(!ActionResponseHandler.handleIfResponse(AR)) {
+				ArrayList<ActionProperty> AP = AR.properties;
+				
+				if(AR.requestType == RequestType.PROCESS_FILE) {
+					String file_loc_string = "";
+					int file_chunk_size = 0;
+					long file_copy_limit = 0;
+					
+					for(ActionProperty property : AP) {
+						switch (property.property) {
+							case FILE_LOCATION_STRING : file_loc_string = property.label; break;
+							case FILE_CHUNK_SIZE      : file_chunk_size = Integer.parseInt(property.label); break;
+							case FILE_COPY_LIMIT      : file_copy_limit = Long.parseLong(property.label); break;
+							default:
+								break;
+						}				
+					}
+					
+					handleLoadingBarResponse(file_loc_string, file_chunk_size, file_copy_limit, session);
+				}
+			}
+		} catch (IOException ex) {
+			logger.log(Level.SEVERE, ex.toString(), ex);			
+			sendAlertMessage("ERROR", 
+					ex.toString(), 
+					session);
+		} catch (Exception ex) {			
+			logger.log(Level.SEVERE, ex.toString(), ex);
+			sendAlertMessage("ERROR", 
+					ex.toString(), 
+					session);
+		}
+	}
+	
+	private void handleLoadingBarResponse(String location, int chunkSize, long totalSize, Session session) throws Exception {
+		int completed = 0;
+		
+		File file = new File(location);
+		
+		if(!file.exists()) {
+			sendRespondableAlertMessage("File '" + location + "' doesn't exist - would you like to check again?", "Error", session);
+			return;
+		}
+		
+		if(!(file.isFile() && file.canRead())) {
+			sendAlertMessage("File '" + location + "' is not a file or cannot be read", "Error", session);			
+			return;
+		}
+		
+		FileInputStream f_in = null;
+		try {
+			f_in = new FileInputStream(file);
+		}
+		catch (FileNotFoundException exception) {
+			// A FileNotFoundException translates into a ReadNotPermittedException in this case
+			sendAlertMessage("File '" + location + "' could not be opened", "Error", session);
+			return;	
+		}
+				
+		byte data[] = new byte[chunkSize];
+		int data_size = 0;
+		boolean first = true;
+		totalSize = Math.min(totalSize, file.length());
+		
+		try {
+			while(completed < totalSize && (data_size = f_in.read(data, 0, chunkSize)) != -1) {			
+				completed += data_size;
+								
+				double progress = totalSize == 0 ? 1.0 : Math.min(1.0, (completed) / (double)(totalSize));
+								
+				String message = first ? "Processing "/* + location */+ ": {0}% completed" : null;
+				
+				first = false;
+				
+				ActionObject loadBarAction = ActionObjectBuilder.loadBarUpdateActionObject(progress, message);
+				String loadBarActionJSON = gson.toJson(loadBarAction);
+				
+				session.getBasicRemote().sendText(loadBarActionJSON);
+			}
+		} catch (NotYetConnectedException | IOException e1) {
+			// TODO Auto-generated catch block
+			e1.printStackTrace();
+		}
+		
+		try {
+			f_in.close();
+		} catch (IOException e) { 
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+		String[] buttons = new String[] {"OK", "Close Window", "Stop!"};
+		ActionObject completedTransferDialog = ActionObjectBuilder.messageBoxSpawnObject("Transfer Successful", 
+				"Successfully processed " + location, buttons, false);
+		String messageBoxJSON = gson.toJson(completedTransferDialog);
+		
+		session.getBasicRemote().sendText(messageBoxJSON);
+	}
+	
+	//TODO: separate file
+	private class MyActionResponseHandler extends ActionResponseHandler {
+		private long myListenerID;
+		private Session session;
+		
+		public MyActionResponseHandler(long timeOutMillis, long listenID, Session session) {
+			super(timeOutMillis);
+			myListenerID = listenID;
+			this.session = session;
+		}
+		
+		@Override
+		public boolean tryToHandle(ActionRequest request) {
+			logger.log(Level.INFO, "Request ID: " + request.requestID);
+			logger.log(Level.INFO, "My ID: " + myListenerID);
+			
+			if(request.requestType == RequestType.RESPONSE_ALERT_WINDOW) {
+				if(myListenerID == request.requestID) {
+					logger.log(Level.INFO, "The user responded to the alert");
+					
+					int buttonPress = request.properties.get(0).ID;
+					String button = buttonPress == 0 ? "OK" : "Cancel";
+					sendAlertMessage("You clicked on button " + buttonPress + "/" + button, "Server Response", session);
+					return true;
+				}
+			}
+			return false;
+		}
+	}
+	
+	/**
+	 * The user closes the connection.
+	 * Note: you can't send messages to the client from this method
+	 */
+	@OnClose
+	public void onClose(Session session){
+		logger.log(Level.INFO, "Session " +session.getId()+" has ended");
+	}
+}
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.classpath
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.classpath	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.classpath	(revision 31449)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" output="test-classes" path="test"/>
+	<classpathentry kind="con" path="com.google.gwt.eclipse.core.GWT_CONTAINER/GWT"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="lib" path="war/WEB-INF/lib/gxt.jar"/>
+	<classpathentry kind="lib" path="war/WEB-INF/lib/greenstone.jar"/>
+	<classpathentry kind="lib" path="war/WEB-INF/lib/gxt-theme-neptune.jar"/>
+	<classpathentry kind="lib" path="war/WEB-INF/lib/ActionObject.jar"/>
+	<classpathentry kind="lib" path="lib/jackson-annotations-2.7.2.jar"/>
+	<classpathentry kind="lib" path="lib/gwt-jackson-0.14.1.jar"/>
+	<classpathentry kind="lib" path="lib/javapoet-1.0.0.jar"/>
+	<classpathentry kind="lib" path="lib/jackson-annotations-2.7.2-sources.jar"/>
+	<classpathentry kind="output" path="war/WEB-INF/classes"/>
+</classpath>
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.project
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.project	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.project	(revision 31449)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>GXTWebsocketClient</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.google.gdt.eclipse.core.webAppProjectValidator</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.google.gwt.eclipse.core.gwtProjectValidator</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>com.google.gwt.eclipse.core.gwtNature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+	</natures>
+</projectDescription>
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.settings/com.google.gdt.eclipse.core.prefs
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.settings/com.google.gdt.eclipse.core.prefs	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.settings/com.google.gdt.eclipse.core.prefs	(revision 31449)
@@ -0,0 +1,4 @@
+eclipse.preferences.version=1
+jarsExcludedFromWebInfLib=/home/nbk4/workspace/TestGXTwithWebSockets/lib/jackson-annotations-2.7.2.jar|/home/nbk4/workspace/TestGXTwithWebSockets/lib/gwt-jackson-0.14.1.jar|/home/nbk4/workspace/TestGXTwithWebSockets/lib/jackson-annotations-2.7.2-sources.jar|/home/nbk4/workspace/TestGXTwithWebSockets/lib/javapoet-1.0.0.jar
+warSrcDir=war
+warSrcDirIsOutput=true
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.settings/com.google.gwt.eclipse.core.prefs
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.settings/com.google.gwt.eclipse.core.prefs	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.settings/com.google.gwt.eclipse.core.prefs	(revision 31449)
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+filesCopiedToWebInfLib=gwt-servlet.jar
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.settings/org.eclipse.jdt.core.prefs	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.settings/org.eclipse.jdt.core.prefs	(revision 31449)
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.settings/org.eclipse.m2e.core.prefs
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.settings/org.eclipse.m2e.core.prefs	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.settings/org.eclipse.m2e.core.prefs	(revision 31449)
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.settings/org.eclipse.wst.common.project.facet.core.xml
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.settings/org.eclipse.wst.common.project.facet.core.xml	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/.settings/org.eclipse.wst.common.project.facet.core.xml	(revision 31449)
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="java" version="1.8"/>
+</faceted-project>
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/example/SocketTest/TestElementalSockets.gwt.xml
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/example/SocketTest/TestElementalSockets.gwt.xml	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/example/SocketTest/TestElementalSockets.gwt.xml	(revision 31449)
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  When updating your version of GWT, you should also update this DTD reference,
+  so that your app can take advantage of the latest GWT module capabilities.
+-->
+<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.7.0//EN"
+  "http://gwtproject.org/doctype/2.7.0/gwt-module.dtd">
+<module rename-to='testelementalsockets'>
+
+  <!-- Inherit the core Web Toolkit stuff.                        -->
+  <inherits name='com.google.gwt.user.User'/>
+  <inherits name="com.google.gwt.http.HTTP" /> 
+
+  <!-- Other module inherits                                      -->
+  <inherits name='com.sencha.gxt.ui.GXT' />
+  <inherits name="com.sksamuel.gwt.GwtWebsockets" />
+  <inherits name="org.nbk4.gwt.action.ServerActionResponse" />
+  <inherits name="com.github.nmorel.gwtjackson.GwtJackson" />
+
+  <!-- GXT Theme -->
+  <!-- Be sure to include Neptunes gxt-theme-neptune.jar in the classpath -->
+  
+  <inherits name="com.gs3.theme.greenstone.Theme" />
+  
+   <!-- GXT Stylesheet -->
+ <stylesheet src="reset.css" />
+  
+  <!-- Specify the app entry point class.                         -->
+  <entry-point class='com.example.SocketTest.client.TestGXTSockets'/>
+
+  <!-- Specify the paths for translatable code                    -->
+  <source path='client'/>
+  <source path='shared'/>
+  
+  <!-- allow Super Dev Mode -->
+  <add-linker name="xsiframe"/>
+</module>
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/example/SocketTest/client/RequestObjectBuilder.java
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/example/SocketTest/client/RequestObjectBuilder.java	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/example/SocketTest/client/RequestObjectBuilder.java	(revision 31449)
@@ -0,0 +1,33 @@
+package com.example.SocketTest.client;
+
+import java.util.ArrayList;
+
+import org.nbk4.gwt.action.client.ActionProperty;
+import org.nbk4.gwt.action.client.ActionRequest;
+import org.nbk4.gwt.action.client.ActionTypeProperty;
+import org.nbk4.gwt.action.client.RequestType;
+
+@SuppressWarnings("serial")
+public class RequestObjectBuilder extends ActionRequest {
+	public static ActionRequest GenerateProcessFileRequest(int chunkSize, int totalSize, String location) {
+		ArrayList<ActionProperty> actionProperties = new ArrayList<ActionProperty>();		
+
+		actionProperties.add(new ActionProperty(ActionTypeProperty.FILE_LOCATION_STRING, 0, location));
+		actionProperties.add(new ActionProperty(ActionTypeProperty.FILE_CHUNK_SIZE, 1, Integer.toString(chunkSize)));
+		actionProperties.add(new ActionProperty(ActionTypeProperty.FILE_COPY_LIMIT, 2, Integer.toString(totalSize)));
+
+		ActionRequest AR = new ActionRequest(RequestType.PROCESS_FILE, -1, actionProperties);
+		
+		return AR;
+	}
+	
+	public static ActionRequest GenerateResponseRequest(int selected, long ID) {
+		ArrayList<ActionProperty> actionProperties = new ArrayList<ActionProperty>();
+		
+		actionProperties.add(new ActionProperty(ActionTypeProperty.BUTTON_PRESS, selected, ""));
+		
+		ActionRequest AR = new ActionRequest(RequestType.RESPONSE_ALERT_WINDOW, ID, actionProperties);
+		
+		return AR;
+	}
+}
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/example/SocketTest/client/TestGXTSockets.java
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/example/SocketTest/client/TestGXTSockets.java	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/example/SocketTest/client/TestGXTSockets.java	(revision 31449)
@@ -0,0 +1,268 @@
+package com.example.SocketTest.client;
+
+import org.nbk4.gwt.action.client.ActionObject;
+import org.nbk4.gwt.action.client.ActionProperty;
+import org.nbk4.gwt.action.client.ActionRequest;
+import org.nbk4.gwt.action.client.ActionType;
+
+import com.github.nmorel.gwtjackson.client.ObjectReader;
+import com.github.nmorel.gwtjackson.client.ObjectWriter;
+import com.google.gwt.core.client.EntryPoint;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.safehtml.shared.SafeHtml;
+import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
+import com.google.gwt.user.client.ui.RootPanel;
+import com.sencha.gxt.core.client.util.Margins;
+import com.sencha.gxt.widget.core.client.ContentPanel;
+import com.sencha.gxt.widget.core.client.ProgressBar;
+import com.sencha.gxt.widget.core.client.box.AlertMessageBox;
+import com.sencha.gxt.widget.core.client.button.TextButton;
+import com.sencha.gxt.widget.core.client.container.CenterLayoutContainer;
+import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer;
+import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData;
+import com.sencha.gxt.widget.core.client.container.Viewport;
+import com.sencha.gxt.widget.core.client.event.SelectEvent;
+import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler;
+import com.sencha.gxt.widget.core.client.form.FieldLabel;
+import com.sencha.gxt.widget.core.client.form.IntegerField;
+import com.sencha.gxt.widget.core.client.form.TextField;
+import com.sksamuel.gwt.websockets.*;
+
+/**
+ * Entry point classes define <code>onModuleLoad()</code>.
+ */
+public class TestGXTSockets implements EntryPoint {
+	
+	private ContentPanel contentPanel = new ContentPanel();
+	private CenterLayoutContainer centerLayout = new CenterLayoutContainer();
+	private VerticalLayoutContainer layoutSeperationBox = new VerticalLayoutContainer();
+	
+	private TextButton textButton = new TextButton("Process File");
+	
+	private IntegerField byteCountField = new IntegerField();
+	private IntegerField chunkSizeField = new IntegerField();
+	private TextField locationField = new TextField();
+	
+	private ProgressBar progressBar = new ProgressBar();
+	
+	private FieldLabel locationFieldLabel;
+	private FieldLabel byteSizeFieldLabel;
+	private FieldLabel chunkSizeFieldLabel;
+	
+	private Viewport viewport = new Viewport();
+	private Websocket socket;
+	
+	public static interface ActionRequestWriter extends ObjectWriter<ActionRequest> {}
+	public static interface ActionObjectReader extends ObjectReader<ActionObject> {}
+	
+	private ActionRequestWriter writer;
+	private ActionObjectReader  reader;
+	/**
+	 * This is the entry point method.
+	 */
+	public void onModuleLoad() {
+		writer = GWT.create( ActionRequestWriter.class );
+		reader = GWT.create( ActionObjectReader .class );		
+		
+		//DEFINE AND ADD FIELDS
+		locationField.setValue("/home/nbk4/Dummy Files/index.zip");
+		locationFieldLabel = new FieldLabel(locationField, "Copy Location");
+		layoutSeperationBox.add(locationFieldLabel, new VerticalLayoutData(1, -1));
+		
+		byteCountField.setValue(16);
+		byteSizeFieldLabel = new FieldLabel(byteCountField, "Kilobytes to Copy");
+		layoutSeperationBox.add(byteSizeFieldLabel , new VerticalLayoutData(1, -1));
+		
+		chunkSizeField.setValue(1024);
+		chunkSizeFieldLabel = new FieldLabel(chunkSizeField, "Buffer Size (bytes)");
+		layoutSeperationBox.add(chunkSizeFieldLabel, new VerticalLayoutData(1, -1));
+		
+		layoutSeperationBox.add(textButton, new VerticalLayoutData(1, -1));
+		layoutSeperationBox.add(progressBar, new VerticalLayoutData(1, -1, new Margins(3, 0, 0, 0)));
+		
+		contentPanel.add(centerLayout);
+		centerLayout.add(layoutSeperationBox);
+		
+		viewport.add(contentPanel);
+		//GXT Stuff
+		
+		RootPanel.get().add(viewport);
+		
+		//TODO: actually properly manage an address
+		socket = getWebSocket("ws://localhost:8080/GWTTomcatSocketServer/IOtask");
+		
+		socket.open();
+		
+		textButton.addSelectHandler(new SelectHandler() {
+			@Override
+			public void onSelect(SelectEvent event) {
+				getRequestMessage();
+			}
+		});
+	}
+	
+	private Websocket getWebSocket(String address) {
+		Websocket socket = new Websocket(address);
+		socket.addListener(new myWebSocketListener());
+		return socket;
+	}
+	
+	private class myWebSocketListener implements WebsocketListener {
+		@Override
+		public void onClose(CloseEvent event) {
+		}
+		@Override
+		public void onMessage(String response) {
+			// do something with the data transmission
+			handleOnMessage(response);			
+		}
+		@Override
+		public void onOpen() {
+		}			
+	}
+	
+	private void handleOnMessage(final String JSON) {
+		//it seems tomcat sends this string on establishing a websocket connection, can't figure out why
+		if(JSON.equals("Connection Established")) {
+			return;//do nothing
+		}
+		try {
+			ActionObject object = reader.read(JSON);
+			handleActionObject(object);			
+		} catch (Exception e) {
+			alertMessage("Invalid message recieved from server", e.toString());
+		}
+	}
+	
+	long lastProgressBarUpdateId = -1;
+	
+	/**Define behaviors for actions here: expand the list of properties as needed to match additions to the framework */
+	private void handleActionObject(ActionObject actionObject) {
+		
+		long actionObjectID = actionObject.actionID;
+		
+		if(actionObject.actionType == ActionType.UPDATE_PROGRESSBAR && actionObject.actionID > lastProgressBarUpdateId) {
+			lastProgressBarUpdateId = actionObject.actionID; 
+			
+			for(ActionProperty property : actionObject.properties) {
+				switch (property.property) {
+
+					/**Update progress bar progress*/
+					case PROGRESS_BAR_PROGRESS : progressBar.setValue(Double.parseDouble(property.label)); break;
+					
+					/**Update progress bar message*/
+					case PROGRESS_BAR_STRING   : progressBar.updateText(property.label); break;
+					default : {
+						String title = "ERROR: INVALID PROPERTY";
+						String text = "The supplied property '" + property.property + "' is either invalid,"
+								+ "or is not compatible with the supplied action type ('UPDATE_PROGRESSBAR')";
+						alertMessage(title, text);
+						break;
+					}
+				}
+			}
+		}		
+		else if (actionObject.actionType == ActionType.SHOW_DIALOG || actionObject.actionType == ActionType.SHOW_DIALOG_NORESPONSE) {
+			AlertMessageBox self = new AlertMessageBox("[missing resource]", "[missing resource]");
+			boolean sendResponse = actionObject.actionType == ActionType.SHOW_DIALOG;
+			self.setPredefinedButtons();
+			
+			for(ActionProperty property : actionObject.properties) {
+				int propertyID = property.ID;
+				switch (property.property) {					
+					/**Update the messagebox window heading*/
+					case MESSAGE_WINDOW_TITLE : self.setHeading(property.label); break;
+					
+					/**Update the messagebox window text*/
+					case MESSAGE_WINDOW_TEXT : self.setMessage(property.label); break;
+					
+					/**Add a specified button to the messagebox window: sendResponse defines whether a response will be sent*/
+					case BUTTON : {
+						TextButton button = 
+								new TextButton(property.label, new MyButtonSelectHandler(self, actionObjectID, propertyID, sendResponse));
+						self.addButton(button);
+						break;
+					} 
+					
+					/**Update progress bar progress*/
+					case PROGRESS_BAR_PROGRESS : progressBar.updateProgress(Double.parseDouble(property.label), null); break;
+					
+					/**Update progress bar message*/
+					case PROGRESS_BAR_STRING   : progressBar.updateText(property.label); break;
+					
+					default : {
+						String title = "ERROR: INVALID PROPERTY";
+						String text = "The supplied property '" + property.property + "' is either invalid,"
+								+ "or is not compatible with the supplied action type ('SHOW_DIALOG')";
+						alertMessage(title, text);
+						break;
+					}
+				}
+			}
+			
+			self.setWidth(500);
+			self.setMinButtonWidth(40);
+			self.getButtonBar().forceLayout();
+			self.show();
+			self.getButtonBar().forceLayout();
+		}
+	}
+	
+	private void alertMessage(String title, String text) {
+		AlertMessageBox amb = new AlertMessageBox(StringToHTML(title), StringToHTML(text));
+		amb.show();
+	}
+	
+	private SafeHtml StringToHTML(String input) {
+		SafeHtmlBuilder builder = new SafeHtmlBuilder();
+		builder.appendEscapedLines(input);
+		return builder.toSafeHtml();		
+	}
+	
+	private class MyButtonSelectHandler implements SelectHandler {
+		AlertMessageBox self;
+		long selfID;
+		int buttonID;
+		boolean sendResponse;
+		public MyButtonSelectHandler(AlertMessageBox self, long selfID, int buttonID, boolean sendResponse) {
+			this.self = self;
+			this.selfID = selfID;
+			this.buttonID = buttonID;
+			this.sendResponse = sendResponse;
+		}
+		
+		@Override
+		public void onSelect(SelectEvent event) {
+			self.hide();
+			
+			if(sendResponse) {
+				ActionRequest AR = RequestObjectBuilder.GenerateResponseRequest(buttonID, selfID);
+				String JSON = writer.write(AR);
+				socket.send(JSON);
+			}
+		}
+		
+		@SuppressWarnings("unused")
+		public int getButtonID() {
+			return buttonID;
+		}
+		
+		
+		@SuppressWarnings("unused")
+		public long getSelfID() {
+			return selfID;
+		}
+	}
+	
+	private void getRequestMessage() {
+		//TODO: convert chunk/totalSize to long
+		int chunkSize = Math.max(chunkSizeField.getValue(), 1);
+		String location = locationField.getValue();
+		int totalSize = Math.max(byteCountField.getValue() * 1024, 0); //allow zero here to emulate zero size files
+		
+		ActionRequest AR = RequestObjectBuilder.GenerateProcessFileRequest(chunkSize, totalSize, location);
+		
+		String JSON = writer.write(AR);
+		socket.send(JSON);
+	}
+}
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/example/SocketTest/shared/FieldVerifier.java
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/example/SocketTest/shared/FieldVerifier.java	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/example/SocketTest/shared/FieldVerifier.java	(revision 31449)
@@ -0,0 +1,42 @@
+package com.example.SocketTest.shared;
+
+/**
+ * <p>
+ * FieldVerifier validates that the name the user enters is valid.
+ * </p>
+ * <p>
+ * This class is in the <code>shared</code> package because we use it in both
+ * the client code and on the server. On the client, we verify that the name is
+ * valid before sending an RPC request so the user doesn't have to wait for a
+ * network round trip to get feedback. On the server, we verify that the name is
+ * correct to ensure that the input is correct regardless of where the RPC
+ * originates.
+ * </p>
+ * <p>
+ * When creating a class that is used on both the client and the server, be sure
+ * that all code is translatable and does not use native JavaScript. Code that
+ * is not translatable (such as code that interacts with a database or the file
+ * system) cannot be compiled into client-side JavaScript. Code that uses native
+ * JavaScript (such as Widgets) cannot be run on the server.
+ * </p>
+ */
+public class FieldVerifier {
+
+	/**
+	 * Verifies that the specified name is valid for our service.
+	 * 
+	 * In this example, we only require that the name is at least four
+	 * characters. In your application, you can use more complex checks to ensure
+	 * that usernames, passwords, email addresses, URLs, and other fields have the
+	 * proper syntax.
+	 * 
+	 * @param name the name to validate
+	 * @return true if valid, false if invalid
+	 */
+	public static boolean isValidName(String name) {
+		if (name == null) {
+			return false;
+		}
+		return name.length() > 3;
+	}
+}
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/example/SocketTest/shared/LoadBarAction.java
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/example/SocketTest/shared/LoadBarAction.java	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/example/SocketTest/shared/LoadBarAction.java	(revision 31449)
@@ -0,0 +1,28 @@
+package com.example.SocketTest.shared;
+
+import java.io.Serializable;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+
+public class LoadBarAction implements Serializable, IsSerializable {
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 5180921929154389134L;
+	
+	public LoadBarAction() {
+		
+	}
+	
+	public LoadBarAction(String action, int chunks, int chunkSize, int totalSize) {
+		this.action = action;
+		this.chunks = chunks;
+		this.chunkSize = chunkSize;
+		this.totalSize = totalSize;
+	}
+	
+	public String action;
+	public int chunks;
+	public int chunkSize;
+	public int totalSize;
+}
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/GwtWebsockets.gwt.xml
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/GwtWebsockets.gwt.xml	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/GwtWebsockets.gwt.xml	(revision 31449)
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--Copyright 2013 Stephen Samuel
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. -->
+<module>
+
+    <inherits name='com.google.gwt.user.User'/>
+    <source path="websockets"/>
+
+</module>
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/websockets/Base64Utils.java
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/websockets/Base64Utils.java	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/websockets/Base64Utils.java	(revision 31449)
@@ -0,0 +1,208 @@
+/*
+ * Copyright 2009 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.sksamuel.gwt.websockets;
+
+/**
+ * A utility to decode and encode byte arrays as Strings, using only "safe"
+ * characters.
+ */
+public class Base64Utils {
+
+  /**
+   * An array mapping size but values to the characters that will be used to
+   * represent them. Note that this is not identical to the set of characters
+   * used by MIME-Base64.
+   */
+  private static final char[] base64Chars = new char[] {
+      'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
+      'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b',
+      'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
+      'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3',
+      '4', '5', '6', '7', '8', '9', '$', '_'};
+
+  /**
+   * An array mapping legal base 64 characters [a-zA-Z0-9$_] to their associated
+   * 6-bit values. The source indices will be given by 7-bit ASCII characters,
+   * thus the array size needs to be 128 (actually 123 would suffice for the
+   * given set of characters in use).
+   */
+  private static final byte[] base64Values = new byte[128];
+
+  /**
+   * Initialize the base 64 encoder values.
+   */
+  static {
+    // Invert the mapping (i -> base64Chars[i])
+    for (int i = 0; i < base64Chars.length; i++) {
+      base64Values[base64Chars[i]] = (byte) i;
+    }
+  }
+
+  /**
+   * Decode a base64 string into a byte array.
+   * 
+   * @param data the encoded data.
+   * @return a byte array.
+   * @see #fromBase64(String)
+   */
+  public static byte[] fromBase64(String data) {
+    if (data == null) {
+      return null;
+    }
+
+    int len = data.length();
+    assert (len % 4) == 0;
+
+    if (len == 0) {
+      return new byte[0];
+    }
+
+    char[] chars = new char[len];
+    data.getChars(0, len, chars, 0);
+
+    int olen = 3 * (len / 4);
+    if (chars[len - 2] == '=') {
+      --olen;
+    }
+    if (chars[len - 1] == '=') {
+      --olen;
+    }
+
+    byte[] bytes = new byte[olen];
+
+    int iidx = 0;
+    int oidx = 0;
+    while (iidx < len) {
+      int c0 = base64Values[chars[iidx++] & 0xff];
+      int c1 = base64Values[chars[iidx++] & 0xff];
+      int c2 = base64Values[chars[iidx++] & 0xff];
+      int c3 = base64Values[chars[iidx++] & 0xff];
+      int c24 = (c0 << 18) | (c1 << 12) | (c2 << 6) | c3;
+
+      bytes[oidx++] = (byte) (c24 >> 16);
+      if (oidx == olen) {
+        break;
+      }
+      bytes[oidx++] = (byte) (c24 >> 8);
+      if (oidx == olen) {
+        break;
+      }
+      bytes[oidx++] = (byte) c24;
+    }
+
+    return bytes;
+  }
+
+  /**
+   * Decode a base64 string into a long value.
+   */
+  public static long longFromBase64(String value) {
+    int pos = 0;
+    long longVal = base64Values[value.charAt(pos++)];
+    int len = value.length();
+    while (pos < len) {
+      longVal <<= 6;
+      longVal |= base64Values[value.charAt(pos++)];
+    }
+    return longVal;
+  }
+
+  /**
+   * Converts a byte array into a base 64 encoded string. Null is encoded as
+   * null, and an empty array is encoded as an empty string. Otherwise, the byte
+   * data is read 3 bytes at a time, with bytes off the end of the array padded
+   * with zeros. Each 24-bit chunk is encoded as 4 characters from the sequence
+   * [A-Za-z0-9$_]. If one of the source positions consists entirely of padding
+   * zeros, an '=' character is used instead.
+   * 
+   * @param data a byte array, which may be null or empty
+   * @return a String
+   */
+  public static String toBase64(byte[] data) {
+    if (data == null) {
+      return null;
+    }
+
+    int len = data.length;
+    if (len == 0) {
+      return "";
+    }
+
+    int olen = 4 * ((len + 2) / 3);
+    char[] chars = new char[olen];
+
+    int iidx = 0;
+    int oidx = 0;
+    int charsLeft = len;
+    while (charsLeft > 0) {
+      int b0 = data[iidx++] & 0xff;
+      int b1 = (charsLeft > 1) ? data[iidx++] & 0xff : 0;
+      int b2 = (charsLeft > 2) ? data[iidx++] & 0xff : 0;
+      int b24 = (b0 << 16) | (b1 << 8) | b2;
+
+      int c0 = (b24 >> 18) & 0x3f;
+      int c1 = (b24 >> 12) & 0x3f;
+      int c2 = (b24 >> 6) & 0x3f;
+      int c3 = b24 & 0x3f;
+
+      chars[oidx++] = base64Chars[c0];
+      chars[oidx++] = base64Chars[c1];
+      chars[oidx++] = (charsLeft > 1) ? base64Chars[c2] : '=';
+      chars[oidx++] = (charsLeft > 2) ? base64Chars[c3] : '=';
+
+      charsLeft -= 3;
+    }
+
+    return new String(chars);
+  }
+
+  /**
+   * Return a string containing a base-64 encoded version of the given long
+   * value.  Leading groups of all zero bits are omitted.
+   */
+  public static String toBase64(long value) {
+    // Convert to ints early to avoid need for long ops
+    int low = (int) (value & 0xffffffff);
+    int high = (int) (value >> 32);
+
+    StringBuilder sb = new StringBuilder();
+    boolean haveNonZero = base64Append(sb, (high >> 28) & 0xf, false);
+    haveNonZero = base64Append(sb, (high >> 22) & 0x3f, haveNonZero);
+    haveNonZero = base64Append(sb, (high >> 16) & 0x3f, haveNonZero);
+    haveNonZero = base64Append(sb, (high >> 10) & 0x3f, haveNonZero);
+    haveNonZero = base64Append(sb, (high >> 4) & 0x3f, haveNonZero);
+    int v = ((high & 0xf) << 2) | ((low >> 30) & 0x3);
+    haveNonZero = base64Append(sb, v, haveNonZero);
+    haveNonZero = base64Append(sb, (low >> 24) & 0x3f, haveNonZero);
+    haveNonZero = base64Append(sb, (low >> 18) & 0x3f, haveNonZero);
+    haveNonZero = base64Append(sb, (low >> 12) & 0x3f, haveNonZero);
+    base64Append(sb, (low >> 6) & 0x3f, haveNonZero);
+    base64Append(sb, low & 0x3f, true);
+
+    return sb.toString();
+  }
+
+  private static boolean base64Append(StringBuilder sb, int digit,
+      boolean haveNonZero) {
+    if (digit > 0) {
+      haveNonZero = true;
+    }
+    if (haveNonZero) {
+      sb.append(base64Chars[digit]);
+    }
+    return haveNonZero;
+  }
+}
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/websockets/BinaryWebsocketListener.java
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/websockets/BinaryWebsocketListener.java	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/websockets/BinaryWebsocketListener.java	(revision 31449)
@@ -0,0 +1,25 @@
+/**
+ Copyright 2013 Stephen Samuel
+
+ Licensed under the Apache License,Version2.0(the"License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,software
+ distributed under the License is distributed on an"AS IS"BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+package com.sksamuel.gwt.websockets;
+
+
+/**
+ * @author Stephen Samuel
+ */
+public interface BinaryWebsocketListener extends WebsocketListener {
+
+    void onMessage(byte[] bytes);
+}
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/websockets/CloseEvent.java
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/websockets/CloseEvent.java	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/websockets/CloseEvent.java	(revision 31449)
@@ -0,0 +1,26 @@
+package com.sksamuel.gwt.websockets;
+
+public class CloseEvent {
+
+    private final short code;
+    private final String reason;
+    private final boolean wasClean;
+
+    public CloseEvent(short code, String reason, boolean wasClean) {
+        this.code = code;
+        this.reason = reason;
+        this.wasClean = wasClean;
+    }
+
+    public short code() {
+        return code;
+    }
+
+    public String reason() {
+        return reason;
+    }
+
+    public boolean wasClean() {
+        return wasClean;
+    }
+}
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/websockets/Websocket.java
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/websockets/Websocket.java	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/websockets/Websocket.java	(revision 31449)
@@ -0,0 +1,122 @@
+/**
+ Copyright 2013 Stephen Samuel
+
+ Licensed under the Apache License,Version2.0(the"License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,software
+ distributed under the License is distributed on an"AS IS"BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+package com.sksamuel.gwt.websockets;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Stephen K Samuel 14 Sep 2012 08:58:55
+ */
+public class Websocket {
+
+    private static int counter = 1;
+
+    private static native boolean _isWebsocket() /*-{
+        return ("WebSocket" in window);
+    }-*/;
+
+    public static boolean isSupported() {
+        return _isWebsocket();
+    }
+
+    private final Set<WebsocketListener> listeners = new HashSet<WebsocketListener>();
+
+    private final String varName;
+    private final String url;
+
+    public Websocket(String url) {
+        this.url = url;
+        this.varName = "gwtws-" + counter++;
+    }
+
+    private native void _close(String s) /*-{
+        $wnd[s].close();
+    }-*/;
+
+    private native void _open(Websocket ws, String s, String url) /*-{
+        $wnd[s] = new WebSocket(url);
+        $wnd[s].onopen = function() { ws.@com.sksamuel.gwt.websockets.Websocket::onOpen()(); };
+        $wnd[s].onclose = function(evt) { ws.@com.sksamuel.gwt.websockets.Websocket::onClose(SLjava/lang/String;Z)(evt.code, evt.reason, evt.wasClean); };
+        $wnd[s].onerror = function() { ws.@com.sksamuel.gwt.websockets.Websocket::onError()(); };
+        $wnd[s].onmessage = function(msg) { ws.@com.sksamuel.gwt.websockets.Websocket::onMessage(Ljava/lang/String;)(msg.data); }
+    }-*/;
+
+    private native void _send(String s, String msg) /*-{
+        $wnd[s].send(msg);
+    }-*/;
+
+    private native int _state(String s) /*-{
+        return $wnd[s].readyState;
+    }-*/;
+
+    public void addListener(WebsocketListener listener) {
+        listeners.add(listener);
+    }
+    public void removeListener(WebsocketListener listener) {
+        listeners.remove(listener);
+    }
+
+    public void close() {
+        _close(varName);
+    }
+
+    public int getState() {
+        return _state(varName);
+    }
+
+    protected void onClose(short code, String reason, boolean wasClean) {
+        CloseEvent event = new CloseEvent(code, reason, wasClean);
+        for (WebsocketListener listener : listeners)
+            listener.onClose(event);
+    }
+
+    protected void onError() {
+        for (WebsocketListener listener : listeners) {
+            if (listener instanceof WebsocketListenerExt) {
+                ((WebsocketListenerExt)listener).onError();
+            }
+        }
+    }
+
+    protected void onMessage(String msg) {
+        for (WebsocketListener listener : listeners) {
+            listener.onMessage(msg);
+            if (listener instanceof BinaryWebsocketListener) {
+                byte[] bytes = Base64Utils.fromBase64(msg);
+                ((BinaryWebsocketListener) listener).onMessage(bytes);
+            }
+        }
+    }
+
+    protected void onOpen() {
+        for (WebsocketListener listener : listeners)
+            listener.onOpen();
+    }
+
+    public void open() {
+        _open(this, varName, url);
+    }
+
+    public void send(String msg) {
+        _send(varName, msg);
+    }
+
+    public void send(byte[] bytes) {
+        String base64 = Base64Utils.toBase64(bytes);
+        send(base64);
+    }
+}
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/websockets/WebsocketListener.java
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/websockets/WebsocketListener.java	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/websockets/WebsocketListener.java	(revision 31449)
@@ -0,0 +1,28 @@
+/**
+ Copyright 2013 Stephen Samuel
+
+ Licensed under the Apache License,Version2.0(the"License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,software
+ distributed under the License is distributed on an"AS IS"BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+package com.sksamuel.gwt.websockets;
+
+/**
+ * @author Stephen K Samuel 14 Sep 2012 08:58:10
+ */
+public interface WebsocketListener {
+
+    void onClose(CloseEvent event);
+
+    void onMessage(String msg);
+
+    void onOpen();
+}
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/websockets/WebsocketListenerExt.java
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/websockets/WebsocketListenerExt.java	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/src/com/sksamuel/gwt/websockets/WebsocketListenerExt.java	(revision 31449)
@@ -0,0 +1,24 @@
+/**
+ Copyright 2013 Stephen Samuel
+
+ Licensed under the Apache License,Version2.0(the"License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,software
+ distributed under the License is distributed on an"AS IS"BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+package com.sksamuel.gwt.websockets;
+
+/**
+ * @author Stephan Hesse
+ */
+public interface WebsocketListenerExt
+extends WebsocketListener {
+    void onError();
+}
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/TestElementalSockets.css
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/TestElementalSockets.css	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/TestElementalSockets.css	(revision 31449)
@@ -0,0 +1,1 @@
+/** Add css rules here for your application. */
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/TestElementalSockets.html
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/TestElementalSockets.html	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/TestElementalSockets.html	(revision 31449)
@@ -0,0 +1,44 @@
+<!doctype html>
+<!-- The DOCTYPE declaration above will set the     -->
+<!-- browser's rendering engine into                -->
+<!-- "Standards Mode". Replacing this declaration   -->
+<!-- with a "Quirks Mode" doctype is not supported. -->
+
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+
+    <!--                                                               -->
+    <!-- Consider inlining CSS to reduce the number of requested files -->
+    <!--                                                               -->
+    <link type="text/css" rel="stylesheet" href="TestElementalSockets.css">
+
+    <!--                                           -->
+    <!-- Any title is fine                         -->
+    <!--                                           -->
+    <title>Web Application Starter Project</title>
+    
+    <!--                                           -->
+    <!-- This script loads your compiled module.   -->
+    <!-- If you add any GWT meta tags, they must   -->
+    <!-- be added before this line.                -->
+    <!--                                           -->
+    <script type="text/javascript" language="javascript" src="testelementalsockets/testelementalsockets.nocache.js"></script>
+  </head>
+
+  <!--                                           -->
+  <!-- The body can have arbitrary html, or      -->
+  <!-- you can leave the body empty if you want  -->
+  <!-- to create a completely dynamic UI.        -->
+  <!--                                           -->
+  <body>
+
+    <!-- RECOMMENDED if your web app will not function without JavaScript enabled -->
+    <noscript>
+      <div style="width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif">
+        Your web browser must have JavaScript enabled
+        in order for this application to display correctly.
+      </div>
+    </noscript>
+  </body>
+</html>
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/WEB-INF/classes/com/example/SocketTest/TestElementalSockets.gwt.xml
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/WEB-INF/classes/com/example/SocketTest/TestElementalSockets.gwt.xml	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/WEB-INF/classes/com/example/SocketTest/TestElementalSockets.gwt.xml	(revision 31449)
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  When updating your version of GWT, you should also update this DTD reference,
+  so that your app can take advantage of the latest GWT module capabilities.
+-->
+<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.7.0//EN"
+  "http://gwtproject.org/doctype/2.7.0/gwt-module.dtd">
+<module rename-to='testelementalsockets'>
+
+  <!-- Inherit the core Web Toolkit stuff.                        -->
+  <inherits name='com.google.gwt.user.User'/>
+  <inherits name="com.google.gwt.http.HTTP" /> 
+
+  <!-- Other module inherits                                      -->
+  <inherits name='com.sencha.gxt.ui.GXT' />
+  <inherits name="com.sksamuel.gwt.GwtWebsockets" />
+  <inherits name="org.nbk4.gwt.action.ServerActionResponse" />
+  <inherits name="com.github.nmorel.gwtjackson.GwtJackson" />
+
+  <!-- GXT Theme -->
+  <!-- Be sure to include Neptunes gxt-theme-neptune.jar in the classpath -->
+  
+  <inherits name="com.gs3.theme.greenstone.Theme" />
+  
+   <!-- GXT Stylesheet -->
+ <stylesheet src="reset.css" />
+  
+  <!-- Specify the app entry point class.                         -->
+  <entry-point class='com.example.SocketTest.client.TestGXTSockets'/>
+
+  <!-- Specify the paths for translatable code                    -->
+  <source path='client'/>
+  <source path='shared'/>
+  
+  <!-- allow Super Dev Mode -->
+  <add-linker name="xsiframe"/>
+</module>
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/WEB-INF/classes/com/sksamuel/gwt/GwtWebsockets.gwt.xml
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/WEB-INF/classes/com/sksamuel/gwt/GwtWebsockets.gwt.xml	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/WEB-INF/classes/com/sksamuel/gwt/GwtWebsockets.gwt.xml	(revision 31449)
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--Copyright 2013 Stephen Samuel
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. -->
+<module>
+
+    <inherits name='com.google.gwt.user.User'/>
+    <source path="websockets"/>
+
+</module>
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/WEB-INF/web.xml
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/WEB-INF/web.xml	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/WEB-INF/web.xml	(revision 31449)
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
+              http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+         version="2.5"
+         xmlns="http://java.sun.com/xml/ns/javaee">
+  <!-- Servlets -->
+
+  <!-- Default page to serve -->
+  <welcome-file-list>
+    <welcome-file>TestElementalSockets.html</welcome-file>
+  </welcome-file-list>
+
+</web-app>
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/2AFC897481E0897045BE75214B7B83C0.gwt.rpc
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/2AFC897481E0897045BE75214B7B83C0.gwt.rpc	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/2AFC897481E0897045BE75214B7B83C0.gwt.rpc	(revision 31449)
@@ -0,0 +1,30 @@
+@FinalFields, false
+com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException, true, true, true, true, com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException/3936916533, 3936916533
+com.google.gwt.user.client.rpc.RpcTokenException, true, true, true, true, com.google.gwt.user.client.rpc.RpcTokenException/2345075298, 2345075298
+com.google.gwt.user.client.rpc.SerializableException, true, true, true, true, com.google.gwt.user.client.rpc.SerializableException/3047383460, 3047383460
+com.google.gwt.user.client.rpc.SerializationException, true, false, true, false, com.google.gwt.user.client.rpc.SerializationException/2836333220, 2836333220
+com.google.gwt.user.client.rpc.SerializedTypeViolationException, true, true, true, true, com.google.gwt.user.client.rpc.SerializedTypeViolationException/914601580, 914601580
+com.google.gwt.user.client.rpc.XsrfToken, false, false, true, true, com.google.gwt.user.client.rpc.XsrfToken/4254043109, 4254043109
+com.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion, true, true, true, true, com.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion/2803420099, 2803420099
+[Lcom.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion;, true, true, true, true, [Lcom.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion;/1531882420, 1531882420
+com.google.gwt.user.client.ui.SuggestOracle$Request, true, true, true, true, com.google.gwt.user.client.ui.SuggestOracle$Request/3707347745, 3707347745
+com.google.gwt.user.client.ui.SuggestOracle$Response, true, true, true, true, com.google.gwt.user.client.ui.SuggestOracle$Response/3840253928, 3840253928
+[Lcom.google.gwt.user.client.ui.SuggestOracle$Suggestion;, true, true, true, true, [Lcom.google.gwt.user.client.ui.SuggestOracle$Suggestion;/3224244884, 3224244884
+com.sangnd.gwt.gson.shared.GwtGsonService, false, false, false, false, _, 2929953405
+java.lang.Boolean, true, true, true, true, java.lang.Boolean/476441737, 476441737
+java.lang.Exception, true, false, true, false, java.lang.Exception/1920171873, 1920171873
+java.lang.RuntimeException, true, false, true, false, java.lang.RuntimeException/515124647, 515124647
+java.lang.String, true, true, true, true, java.lang.String/2004016611, 2004016611
+java.lang.Throwable, true, false, true, false, java.lang.Throwable/2953622131, 2953622131
+java.util.ArrayList, true, true, true, true, java.util.ArrayList/4159755760, 4159755760
+java.util.Arrays$ArrayList, true, true, true, true, java.util.Arrays$ArrayList/2507071751, 2507071751
+java.util.Collections$EmptyList, true, true, true, true, java.util.Collections$EmptyList/4157118744, 4157118744
+java.util.Collections$EmptySet, true, true, true, true, java.util.Collections$EmptySet/3523698179, 3523698179
+java.util.Collections$SingletonList, true, true, true, true, java.util.Collections$SingletonList/1586180994, 1586180994
+java.util.HashSet, true, true, true, true, java.util.HashSet/3273092938, 3273092938
+java.util.LinkedHashSet, true, true, true, true, java.util.LinkedHashSet/95640124, 95640124
+java.util.LinkedList, true, true, true, true, java.util.LinkedList/3953877921, 3953877921
+java.util.Stack, true, true, true, true, java.util.Stack/1346942793, 1346942793
+java.util.TreeMap, true, true, true, true, java.util.TreeMap/1493889780, 1493889780
+java.util.TreeSet, true, true, true, true, java.util.TreeSet/4043497002, 4043497002
+java.util.Vector, true, true, true, true, java.util.Vector/3057315478, 3057315478
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/52C5EA1A5DBAED5B652CB7892B1242AD.gwt.rpc
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/52C5EA1A5DBAED5B652CB7892B1242AD.gwt.rpc	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/52C5EA1A5DBAED5B652CB7892B1242AD.gwt.rpc	(revision 31449)
@@ -0,0 +1,38 @@
+@FinalFields, false
+com.example.SocketTest.client.RequestObjectBuilder, true, true, true, true, com.example.SocketTest.client.RequestObjectBuilder/3711662284, 3711662284
+com.example.SocketTest.shared.LoadBarAction, true, true, true, true, com.example.SocketTest.shared.LoadBarAction/38007348, 38007348
+com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException, true, true, true, true, com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException/3936916533, 3936916533
+com.google.gwt.user.client.rpc.RpcTokenException, true, true, true, true, com.google.gwt.user.client.rpc.RpcTokenException/2345075298, 2345075298
+com.google.gwt.user.client.rpc.SerializableException, true, true, true, true, com.google.gwt.user.client.rpc.SerializableException/3047383460, 3047383460
+com.google.gwt.user.client.rpc.SerializationException, true, false, true, false, com.google.gwt.user.client.rpc.SerializationException/2836333220, 2836333220
+com.google.gwt.user.client.rpc.SerializedTypeViolationException, true, true, true, true, com.google.gwt.user.client.rpc.SerializedTypeViolationException/914601580, 914601580
+com.google.gwt.user.client.rpc.XsrfToken, false, false, true, true, com.google.gwt.user.client.rpc.XsrfToken/4254043109, 4254043109
+com.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion, true, true, true, true, com.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion/2803420099, 2803420099
+[Lcom.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion;, true, true, true, true, [Lcom.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion;/1531882420, 1531882420
+com.google.gwt.user.client.ui.SuggestOracle$Request, true, true, true, true, com.google.gwt.user.client.ui.SuggestOracle$Request/3707347745, 3707347745
+com.google.gwt.user.client.ui.SuggestOracle$Response, true, true, true, true, com.google.gwt.user.client.ui.SuggestOracle$Response/3840253928, 3840253928
+[Lcom.google.gwt.user.client.ui.SuggestOracle$Suggestion;, true, true, true, true, [Lcom.google.gwt.user.client.ui.SuggestOracle$Suggestion;/3224244884, 3224244884
+com.sangnd.gwt.gson.shared.GwtGsonService, false, false, false, false, _, 2929953405
+java.lang.Boolean, true, true, true, true, java.lang.Boolean/476441737, 476441737
+java.lang.Exception, true, false, true, false, java.lang.Exception/1920171873, 1920171873
+java.lang.RuntimeException, true, false, true, false, java.lang.RuntimeException/515124647, 515124647
+java.lang.String, true, true, true, true, java.lang.String/2004016611, 2004016611
+java.lang.Throwable, true, false, true, false, java.lang.Throwable/2953622131, 2953622131
+java.util.ArrayList, true, true, true, true, java.util.ArrayList/4159755760, 4159755760
+java.util.Arrays$ArrayList, true, true, true, true, java.util.Arrays$ArrayList/2507071751, 2507071751
+java.util.Collections$EmptyList, true, true, true, true, java.util.Collections$EmptyList/4157118744, 4157118744
+java.util.Collections$EmptySet, true, true, true, true, java.util.Collections$EmptySet/3523698179, 3523698179
+java.util.Collections$SingletonList, true, true, true, true, java.util.Collections$SingletonList/1586180994, 1586180994
+java.util.HashSet, true, true, true, true, java.util.HashSet/3273092938, 3273092938
+java.util.LinkedHashSet, true, true, true, true, java.util.LinkedHashSet/95640124, 95640124
+java.util.LinkedList, true, true, true, true, java.util.LinkedList/3953877921, 3953877921
+java.util.Stack, true, true, true, true, java.util.Stack/1346942793, 1346942793
+java.util.TreeMap, true, true, true, true, java.util.TreeMap/1493889780, 1493889780
+java.util.TreeSet, true, true, true, true, java.util.TreeSet/4043497002, 4043497002
+java.util.Vector, true, true, true, true, java.util.Vector/3057315478, 3057315478
+org.nbk4.gwt.action.client.ActionObject, true, true, true, true, org.nbk4.gwt.action.client.ActionObject/2205672129, 2205672129
+org.nbk4.gwt.action.client.ActionProperty, true, true, true, true, org.nbk4.gwt.action.client.ActionProperty/3998165760, 3998165760
+org.nbk4.gwt.action.client.ActionRequest, true, true, true, true, org.nbk4.gwt.action.client.ActionRequest/3801872028, 3801872028
+org.nbk4.gwt.action.client.ActionType, true, true, true, true, org.nbk4.gwt.action.client.ActionType/4167923150, 4167923150
+org.nbk4.gwt.action.client.ActionTypeProperty, true, true, true, true, org.nbk4.gwt.action.client.ActionTypeProperty/948183041, 948183041
+org.nbk4.gwt.action.client.RequestType, true, true, true, true, org.nbk4.gwt.action.client.RequestType/1798511996, 1798511996
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/53D2DCFEC7BD2C6AB0345DC160500C98.gwt.rpc
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/53D2DCFEC7BD2C6AB0345DC160500C98.gwt.rpc	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/53D2DCFEC7BD2C6AB0345DC160500C98.gwt.rpc	(revision 31449)
@@ -0,0 +1,31 @@
+@FinalFields, false
+com.example.SocketTest.shared.LoadBarAction, true, true, true, true, com.example.SocketTest.shared.LoadBarAction/38007348, 38007348
+com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException, true, true, true, true, com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException/3936916533, 3936916533
+com.google.gwt.user.client.rpc.RpcTokenException, true, true, true, true, com.google.gwt.user.client.rpc.RpcTokenException/2345075298, 2345075298
+com.google.gwt.user.client.rpc.SerializableException, true, true, true, true, com.google.gwt.user.client.rpc.SerializableException/3047383460, 3047383460
+com.google.gwt.user.client.rpc.SerializationException, true, false, true, false, com.google.gwt.user.client.rpc.SerializationException/2836333220, 2836333220
+com.google.gwt.user.client.rpc.SerializedTypeViolationException, true, true, true, true, com.google.gwt.user.client.rpc.SerializedTypeViolationException/914601580, 914601580
+com.google.gwt.user.client.rpc.XsrfToken, false, false, true, true, com.google.gwt.user.client.rpc.XsrfToken/4254043109, 4254043109
+com.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion, true, true, true, true, com.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion/2803420099, 2803420099
+[Lcom.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion;, true, true, true, true, [Lcom.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion;/1531882420, 1531882420
+com.google.gwt.user.client.ui.SuggestOracle$Request, true, true, true, true, com.google.gwt.user.client.ui.SuggestOracle$Request/3707347745, 3707347745
+com.google.gwt.user.client.ui.SuggestOracle$Response, true, true, true, true, com.google.gwt.user.client.ui.SuggestOracle$Response/3840253928, 3840253928
+[Lcom.google.gwt.user.client.ui.SuggestOracle$Suggestion;, true, true, true, true, [Lcom.google.gwt.user.client.ui.SuggestOracle$Suggestion;/3224244884, 3224244884
+com.sangnd.gwt.gson.shared.GwtGsonService, false, false, false, false, _, 2929953405
+java.lang.Boolean, true, true, true, true, java.lang.Boolean/476441737, 476441737
+java.lang.Exception, true, false, true, false, java.lang.Exception/1920171873, 1920171873
+java.lang.RuntimeException, true, false, true, false, java.lang.RuntimeException/515124647, 515124647
+java.lang.String, true, true, true, true, java.lang.String/2004016611, 2004016611
+java.lang.Throwable, true, false, true, false, java.lang.Throwable/2953622131, 2953622131
+java.util.ArrayList, true, true, true, true, java.util.ArrayList/4159755760, 4159755760
+java.util.Arrays$ArrayList, true, true, true, true, java.util.Arrays$ArrayList/2507071751, 2507071751
+java.util.Collections$EmptyList, true, true, true, true, java.util.Collections$EmptyList/4157118744, 4157118744
+java.util.Collections$EmptySet, true, true, true, true, java.util.Collections$EmptySet/3523698179, 3523698179
+java.util.Collections$SingletonList, true, true, true, true, java.util.Collections$SingletonList/1586180994, 1586180994
+java.util.HashSet, true, true, true, true, java.util.HashSet/3273092938, 3273092938
+java.util.LinkedHashSet, true, true, true, true, java.util.LinkedHashSet/95640124, 95640124
+java.util.LinkedList, true, true, true, true, java.util.LinkedList/3953877921, 3953877921
+java.util.Stack, true, true, true, true, java.util.Stack/1346942793, 1346942793
+java.util.TreeMap, true, true, true, true, java.util.TreeMap/1493889780, 1493889780
+java.util.TreeSet, true, true, true, true, java.util.TreeSet/4043497002, 4043497002
+java.util.Vector, true, true, true, true, java.util.Vector/3057315478, 3057315478
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/76B5DFB9D0516959380F31A3BD0A11B1.gwt.rpc
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/76B5DFB9D0516959380F31A3BD0A11B1.gwt.rpc	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/76B5DFB9D0516959380F31A3BD0A11B1.gwt.rpc	(revision 31449)
@@ -0,0 +1,11 @@
+@FinalFields, false
+com.example.SocketTest.client.GreetingService, false, false, false, false, _, 380925740
+com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException, true, true, true, true, com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException/3936916533, 3936916533
+com.google.gwt.user.client.rpc.RpcTokenException, true, true, false, false, com.google.gwt.user.client.rpc.RpcTokenException/2345075298, 2345075298
+com.google.gwt.user.client.rpc.XsrfToken, false, false, true, true, com.google.gwt.user.client.rpc.XsrfToken/4254043109, 4254043109
+java.lang.Exception, true, false, true, false, java.lang.Exception/1920171873, 1920171873
+java.lang.IllegalArgumentException, true, true, false, false, java.lang.IllegalArgumentException/1755012560, 1755012560
+java.lang.NumberFormatException, true, true, false, false, java.lang.NumberFormatException/3305228476, 3305228476
+java.lang.RuntimeException, true, false, true, false, java.lang.RuntimeException/515124647, 515124647
+java.lang.String, true, true, true, true, java.lang.String/2004016611, 2004016611
+java.lang.Throwable, true, false, true, false, java.lang.Throwable/2953622131, 2953622131
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/C1C5EC6CDCDF6FC37CB2BD31856D1962.gwt.rpc
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/C1C5EC6CDCDF6FC37CB2BD31856D1962.gwt.rpc	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/C1C5EC6CDCDF6FC37CB2BD31856D1962.gwt.rpc	(revision 31449)
@@ -0,0 +1,32 @@
+@FinalFields, false
+com.example.SocketTest.shared.Car, true, true, true, true, com.example.SocketTest.shared.Car/735687784, 735687784
+com.example.SocketTest.shared.LoadBarAction, true, true, true, true, com.example.SocketTest.shared.LoadBarAction/38007348, 38007348
+com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException, true, true, true, true, com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException/3936916533, 3936916533
+com.google.gwt.user.client.rpc.RpcTokenException, true, true, true, true, com.google.gwt.user.client.rpc.RpcTokenException/2345075298, 2345075298
+com.google.gwt.user.client.rpc.SerializableException, true, true, true, true, com.google.gwt.user.client.rpc.SerializableException/3047383460, 3047383460
+com.google.gwt.user.client.rpc.SerializationException, true, false, true, false, com.google.gwt.user.client.rpc.SerializationException/2836333220, 2836333220
+com.google.gwt.user.client.rpc.SerializedTypeViolationException, true, true, true, true, com.google.gwt.user.client.rpc.SerializedTypeViolationException/914601580, 914601580
+com.google.gwt.user.client.rpc.XsrfToken, false, false, true, true, com.google.gwt.user.client.rpc.XsrfToken/4254043109, 4254043109
+com.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion, true, true, true, true, com.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion/2803420099, 2803420099
+[Lcom.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion;, true, true, true, true, [Lcom.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion;/1531882420, 1531882420
+com.google.gwt.user.client.ui.SuggestOracle$Request, true, true, true, true, com.google.gwt.user.client.ui.SuggestOracle$Request/3707347745, 3707347745
+com.google.gwt.user.client.ui.SuggestOracle$Response, true, true, true, true, com.google.gwt.user.client.ui.SuggestOracle$Response/3840253928, 3840253928
+[Lcom.google.gwt.user.client.ui.SuggestOracle$Suggestion;, true, true, true, true, [Lcom.google.gwt.user.client.ui.SuggestOracle$Suggestion;/3224244884, 3224244884
+com.sangnd.gwt.gson.shared.GwtGsonService, false, false, false, false, _, 2929953405
+java.lang.Boolean, true, true, true, true, java.lang.Boolean/476441737, 476441737
+java.lang.Exception, true, false, true, false, java.lang.Exception/1920171873, 1920171873
+java.lang.RuntimeException, true, false, true, false, java.lang.RuntimeException/515124647, 515124647
+java.lang.String, true, true, true, true, java.lang.String/2004016611, 2004016611
+java.lang.Throwable, true, false, true, false, java.lang.Throwable/2953622131, 2953622131
+java.util.ArrayList, true, true, true, true, java.util.ArrayList/4159755760, 4159755760
+java.util.Arrays$ArrayList, true, true, true, true, java.util.Arrays$ArrayList/2507071751, 2507071751
+java.util.Collections$EmptyList, true, true, true, true, java.util.Collections$EmptyList/4157118744, 4157118744
+java.util.Collections$EmptySet, true, true, true, true, java.util.Collections$EmptySet/3523698179, 3523698179
+java.util.Collections$SingletonList, true, true, true, true, java.util.Collections$SingletonList/1586180994, 1586180994
+java.util.HashSet, true, true, true, true, java.util.HashSet/3273092938, 3273092938
+java.util.LinkedHashSet, true, true, true, true, java.util.LinkedHashSet/95640124, 95640124
+java.util.LinkedList, true, true, true, true, java.util.LinkedList/3953877921, 3953877921
+java.util.Stack, true, true, true, true, java.util.Stack/1346942793, 1346942793
+java.util.TreeMap, true, true, true, true, java.util.TreeMap/1493889780, 1493889780
+java.util.TreeSet, true, true, true, true, java.util.TreeSet/4043497002, 4043497002
+java.util.Vector, true, true, true, true, java.util.Vector/3057315478, 3057315478
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/C46EC608046AFCC05AE26A43DBDAC4B7.gwt.rpc
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/C46EC608046AFCC05AE26A43DBDAC4B7.gwt.rpc	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/C46EC608046AFCC05AE26A43DBDAC4B7.gwt.rpc	(revision 31449)
@@ -0,0 +1,37 @@
+@FinalFields, false
+com.example.SocketTest.shared.LoadBarAction, true, true, true, true, com.example.SocketTest.shared.LoadBarAction/38007348, 38007348
+com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException, true, true, true, true, com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException/3936916533, 3936916533
+com.google.gwt.user.client.rpc.RpcTokenException, true, true, true, true, com.google.gwt.user.client.rpc.RpcTokenException/2345075298, 2345075298
+com.google.gwt.user.client.rpc.SerializableException, true, true, true, true, com.google.gwt.user.client.rpc.SerializableException/3047383460, 3047383460
+com.google.gwt.user.client.rpc.SerializationException, true, false, true, false, com.google.gwt.user.client.rpc.SerializationException/2836333220, 2836333220
+com.google.gwt.user.client.rpc.SerializedTypeViolationException, true, true, true, true, com.google.gwt.user.client.rpc.SerializedTypeViolationException/914601580, 914601580
+com.google.gwt.user.client.rpc.XsrfToken, false, false, true, true, com.google.gwt.user.client.rpc.XsrfToken/4254043109, 4254043109
+com.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion, true, true, true, true, com.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion/2803420099, 2803420099
+[Lcom.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion;, true, true, true, true, [Lcom.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion;/1531882420, 1531882420
+com.google.gwt.user.client.ui.SuggestOracle$Request, true, true, true, true, com.google.gwt.user.client.ui.SuggestOracle$Request/3707347745, 3707347745
+com.google.gwt.user.client.ui.SuggestOracle$Response, true, true, true, true, com.google.gwt.user.client.ui.SuggestOracle$Response/3840253928, 3840253928
+[Lcom.google.gwt.user.client.ui.SuggestOracle$Suggestion;, true, true, true, true, [Lcom.google.gwt.user.client.ui.SuggestOracle$Suggestion;/3224244884, 3224244884
+com.sangnd.gwt.gson.shared.GwtGsonService, false, false, false, false, _, 2929953405
+java.lang.Boolean, true, true, true, true, java.lang.Boolean/476441737, 476441737
+java.lang.Exception, true, false, true, false, java.lang.Exception/1920171873, 1920171873
+java.lang.RuntimeException, true, false, true, false, java.lang.RuntimeException/515124647, 515124647
+java.lang.String, true, true, true, true, java.lang.String/2004016611, 2004016611
+java.lang.Throwable, true, false, true, false, java.lang.Throwable/2953622131, 2953622131
+java.util.ArrayList, true, true, true, true, java.util.ArrayList/4159755760, 4159755760
+java.util.Arrays$ArrayList, true, true, true, true, java.util.Arrays$ArrayList/2507071751, 2507071751
+java.util.Collections$EmptyList, true, true, true, true, java.util.Collections$EmptyList/4157118744, 4157118744
+java.util.Collections$EmptySet, true, true, true, true, java.util.Collections$EmptySet/3523698179, 3523698179
+java.util.Collections$SingletonList, true, true, true, true, java.util.Collections$SingletonList/1586180994, 1586180994
+java.util.HashSet, true, true, true, true, java.util.HashSet/3273092938, 3273092938
+java.util.LinkedHashSet, true, true, true, true, java.util.LinkedHashSet/95640124, 95640124
+java.util.LinkedList, true, true, true, true, java.util.LinkedList/3953877921, 3953877921
+java.util.Stack, true, true, true, true, java.util.Stack/1346942793, 1346942793
+java.util.TreeMap, true, true, true, true, java.util.TreeMap/1493889780, 1493889780
+java.util.TreeSet, true, true, true, true, java.util.TreeSet/4043497002, 4043497002
+java.util.Vector, true, true, true, true, java.util.Vector/3057315478, 3057315478
+org.nbk4.gwt.action.client.ActionObject, true, true, true, true, org.nbk4.gwt.action.client.ActionObject/2205672129, 2205672129
+org.nbk4.gwt.action.client.ActionProperty, true, true, true, true, org.nbk4.gwt.action.client.ActionProperty/3998165760, 3998165760
+org.nbk4.gwt.action.client.ActionRequest, true, true, true, true, org.nbk4.gwt.action.client.ActionRequest/3801872028, 3801872028
+org.nbk4.gwt.action.client.ActionType, true, true, true, true, org.nbk4.gwt.action.client.ActionType/4167923150, 4167923150
+org.nbk4.gwt.action.client.ActionTypeProperty, true, true, true, true, org.nbk4.gwt.action.client.ActionTypeProperty/948183041, 948183041
+org.nbk4.gwt.action.client.RequestType, true, true, true, true, org.nbk4.gwt.action.client.RequestType/1798511996, 1798511996
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/CA56335625AC3E1B2A0576DB34D24641.gwt.rpc
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/CA56335625AC3E1B2A0576DB34D24641.gwt.rpc	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/CA56335625AC3E1B2A0576DB34D24641.gwt.rpc	(revision 31449)
@@ -0,0 +1,35 @@
+@FinalFields, false
+com.example.SocketTest.shared.LoadBarAction, true, true, true, true, com.example.SocketTest.shared.LoadBarAction/38007348, 38007348
+com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException, true, true, true, true, com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException/3936916533, 3936916533
+com.google.gwt.user.client.rpc.RpcTokenException, true, true, true, true, com.google.gwt.user.client.rpc.RpcTokenException/2345075298, 2345075298
+com.google.gwt.user.client.rpc.SerializableException, true, true, true, true, com.google.gwt.user.client.rpc.SerializableException/3047383460, 3047383460
+com.google.gwt.user.client.rpc.SerializationException, true, false, true, false, com.google.gwt.user.client.rpc.SerializationException/2836333220, 2836333220
+com.google.gwt.user.client.rpc.SerializedTypeViolationException, true, true, true, true, com.google.gwt.user.client.rpc.SerializedTypeViolationException/914601580, 914601580
+com.google.gwt.user.client.rpc.XsrfToken, false, false, true, true, com.google.gwt.user.client.rpc.XsrfToken/4254043109, 4254043109
+com.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion, true, true, true, true, com.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion/2803420099, 2803420099
+[Lcom.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion;, true, true, true, true, [Lcom.google.gwt.user.client.ui.MultiWordSuggestOracle$MultiWordSuggestion;/1531882420, 1531882420
+com.google.gwt.user.client.ui.SuggestOracle$Request, true, true, true, true, com.google.gwt.user.client.ui.SuggestOracle$Request/3707347745, 3707347745
+com.google.gwt.user.client.ui.SuggestOracle$Response, true, true, true, true, com.google.gwt.user.client.ui.SuggestOracle$Response/3840253928, 3840253928
+[Lcom.google.gwt.user.client.ui.SuggestOracle$Suggestion;, true, true, true, true, [Lcom.google.gwt.user.client.ui.SuggestOracle$Suggestion;/3224244884, 3224244884
+com.sangnd.gwt.gson.shared.GwtGsonService, false, false, false, false, _, 2929953405
+java.lang.Boolean, true, true, true, true, java.lang.Boolean/476441737, 476441737
+java.lang.Exception, true, false, true, false, java.lang.Exception/1920171873, 1920171873
+java.lang.RuntimeException, true, false, true, false, java.lang.RuntimeException/515124647, 515124647
+java.lang.String, true, true, true, true, java.lang.String/2004016611, 2004016611
+java.lang.Throwable, true, false, true, false, java.lang.Throwable/2953622131, 2953622131
+java.util.ArrayList, true, true, true, true, java.util.ArrayList/4159755760, 4159755760
+java.util.Arrays$ArrayList, true, true, true, true, java.util.Arrays$ArrayList/2507071751, 2507071751
+java.util.Collections$EmptyList, true, true, true, true, java.util.Collections$EmptyList/4157118744, 4157118744
+java.util.Collections$EmptySet, true, true, true, true, java.util.Collections$EmptySet/3523698179, 3523698179
+java.util.Collections$SingletonList, true, true, true, true, java.util.Collections$SingletonList/1586180994, 1586180994
+java.util.HashSet, true, true, true, true, java.util.HashSet/3273092938, 3273092938
+java.util.LinkedHashSet, true, true, true, true, java.util.LinkedHashSet/95640124, 95640124
+java.util.LinkedList, true, true, true, true, java.util.LinkedList/3953877921, 3953877921
+java.util.Stack, true, true, true, true, java.util.Stack/1346942793, 1346942793
+java.util.TreeMap, true, true, true, true, java.util.TreeMap/1493889780, 1493889780
+java.util.TreeSet, true, true, true, true, java.util.TreeSet/4043497002, 4043497002
+java.util.Vector, true, true, true, true, java.util.Vector/3057315478, 3057315478
+org.nbk4.gwt.action.client.ActionObject, true, true, true, true, org.nbk4.gwt.action.client.ActionObject/2205672129, 2205672129
+org.nbk4.gwt.action.client.ActionProperty, true, true, true, true, org.nbk4.gwt.action.client.ActionProperty/3998165760, 3998165760
+org.nbk4.gwt.action.client.ActionType, true, true, true, true, org.nbk4.gwt.action.client.ActionType/4167923150, 4167923150
+org.nbk4.gwt.action.client.ActionTypeProperty, true, true, true, true, org.nbk4.gwt.action.client.ActionTypeProperty/3707251794, 3707251794
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/blank.html
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/blank.html	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/blank.html	(revision 31449)
@@ -0,0 +1,1 @@
+<html></html>
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/gwt/clean/clean.css
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/gwt/clean/clean.css	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/gwt/clean/clean.css	(revision 31449)
@@ -0,0 +1,1121 @@
+/**
+ * The file contains styles for GWT widgets in the Clean theme.
+ */
+
+body, table td, select, button {
+  font-family: Arial Unicode MS, Arial, sans-serif;
+  font-size: small;
+}
+pre {
+  font-family: "courier new", courier;
+  font-size: small;
+}
+body {
+  color: black;
+  margin: 10px;
+  border: 0px;
+  padding: 0px;
+  background: #fff;
+  direction: ltr;
+}
+a, a:visited {
+  color: #0066cc;
+  text-decoration:none;
+}
+
+a:hover {
+  color: #0066cc;
+  text-decoration:underline;
+}
+
+select {
+  background: white;
+}
+
+/**
+ * The reference theme can be used to determine when this style sheet has
+ * loaded.  Create a hidden div element with absolute position, assign the style
+ * name below, and attach it to the DOM.  Use a timer to detect when the
+ * element's height and width are set to 5px.
+ */
+.gwt-Reference-clean {
+  height: 5px;
+  width: 5px;
+  zoom: 1;
+}
+
+.gwt-Button {
+  margin: 0;
+  padding: 5px 7px;
+  text-decoration: none;
+  cursor: pointer;
+  cursor: hand;
+  font-size:small;
+  background: url("images/hborder.png") repeat-x 0px -2077px;
+  border:1px solid #bbb;
+  border-bottom: 1px solid #a0a0a0;
+  border-radius: 3px;
+ -moz-border-radius: 3px;
+}
+.gwt-Button:active {
+  border: 1px inset #ccc;
+}
+.gwt-Button:hover {
+  border-color: #939393;
+}
+.gwt-Button[disabled] {
+  cursor: default;
+  color: #888;
+}
+.gwt-Button[disabled]:hover {
+  border: 1px outset #ccc;
+}
+
+.gwt-CheckBox {
+}
+.gwt-CheckBox-disabled {
+  color: #888;
+}
+
+.gwt-DecoratorPanel {
+}
+.gwt-DecoratorPanel .topCenter {
+  border-top: 1px solid #bbb;
+  line-height: 0px;
+}
+.gwt-DecoratorPanel .bottomCenter {
+  border-bottom: 1px solid #bbb;
+  line-height: 0px;
+}
+.gwt-DecoratorPanel .topCenterInner,
+.gwt-DecoratorPanel .bottomCenterInner {
+  height: 1px;
+  line-height: 0px;
+  font-size: 1px;
+}
+.gwt-DecoratorPanel .middleLeft {
+  border-left: 1px solid #bbb;
+}
+.gwt-DecoratorPanel .middleRight {
+  border-right: 1px solid #bbb;
+}
+.gwt-DecoratorPanel .middleLeftInner,
+.gwt-DecoratorPanel .middleRightInner {
+  width: 1px;
+  line-height: 1px;
+}
+.gwt-DecoratorPanel .topLeftInner,
+.gwt-DecoratorPanel .topRightInner,
+.gwt-DecoratorPanel .bottomLeftInner,
+.gwt-DecoratorPanel .bottomRightInner {
+  width: 5px;
+  height: 5px;
+  zoom: 1;
+  font-size: 1px;
+  overflow: hidden;
+}
+.gwt-DecoratorPanel .topLeft {
+  line-height: 0px;
+  background: url(images/circles.png) no-repeat 0px -6px;
+}
+.gwt-DecoratorPanel .topRight {
+  line-height: 0px;
+  background: url(images/circles.png) no-repeat -5px -6px;
+}
+.gwt-DecoratorPanel .bottomLeft {
+  line-height: 0px;
+  background: url(images/circles.png) no-repeat 0px -11px;
+}
+.gwt-DecoratorPanel .bottomRight {
+  line-height: 0px;
+  background: url(images/circles.png) no-repeat -5px -11px;
+}
+
+.gwt-DialogBox .Caption {
+  background: #F1F1F1;
+  padding: 4px 8px 4px 4px;
+  cursor: default;
+  font-family: Arial Unicode MS, Arial, sans-serif;
+  font-weight: bold;
+  border-bottom: 1px solid #bbbbbb;
+  border-top: 1px solid #D2D2D2;
+}
+.gwt-DialogBox .dialogContent {
+}
+.gwt-DialogBox .dialogMiddleCenter {
+  padding: 3px;
+  background: white;
+}
+.gwt-DialogBox .dialogBottomCenter {
+  background: url(images/hborder.png) repeat-x 0px -2945px;
+}
+.gwt-DialogBox .dialogMiddleLeft {
+  background: url(images/vborder.png) repeat-y -31px 0px;
+}
+.gwt-DialogBox .dialogMiddleRight {
+  background: url(images/vborder.png) repeat-y -32px 0px;
+}
+.gwt-DialogBox .dialogTopLeftInner {
+  width: 10px;
+  height: 8px;
+  zoom: 1;
+}
+.gwt-DialogBox .dialogTopRightInner {
+  width: 12px;
+  zoom: 1;
+}
+.gwt-DialogBox .dialogBottomLeftInner {
+  width: 10px;
+  height: 12px;
+  zoom: 1;
+}
+.gwt-DialogBox .dialogBottomRightInner {
+  width: 12px;
+  height: 12px;
+  zoom: 1;
+}
+.gwt-DialogBox .dialogTopLeft {
+  background: url(images/circles.png) no-repeat -20px 0px;
+}
+.gwt-DialogBox .dialogTopRight {
+  background: url(images/circles.png) no-repeat -28px 0px;
+}
+.gwt-DialogBox .dialogBottomLeft {
+  background: url(images/circles.png) no-repeat 0px -36px;
+}
+.gwt-DialogBox .dialogBottomRight {
+  background: url(images/circles.png) no-repeat -8px -36px;
+}
+
+.gwt-DisclosurePanel {
+}
+.gwt-DisclosurePanel-open {
+}
+.gwt-DisclosurePanel-closed {
+}
+.gwt-DisclosurePanel .header,
+.gwt-DisclosurePanel .header a,
+.gwt-DisclosurePanel .header td {
+  text-decoration: none;  /* Remove underline from header */
+  color: black;
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-DisclosurePanel .content {
+  border-left: 3px solid #e7e7e7;
+  padding: 4px 0px 4px 8px;
+  margin-left: 6px;
+}
+
+.gwt-FileUpload {
+}
+
+.gwt-Frame {
+  border-top: 2px solid #666;
+  border-left: 2px solid #666;
+  border-right: 2px solid #bbb;
+  border-bottom: 2px solid #bbb;
+}
+
+.gwt-HorizontalSplitPanel {
+}
+.gwt-HorizontalSplitPanel .hsplitter {
+  cursor: move;
+  border: 0px;
+  background: #e7e7e7;
+  line-height: 0px;
+}
+.gwt-VerticalSplitPanel {
+}
+.gwt-VerticalSplitPanel .vsplitter {
+  cursor: move;
+  border: 0px;
+  background: #e7e7e7;
+  line-height: 0px;
+}
+
+.gwt-HTML {
+  padding: 0 0px;
+}
+
+.gwt-Hyperlink {
+  cursor: pointer;
+}
+
+.gwt-Image {
+}
+
+.gwt-Label {
+}
+
+.gwt-ListBox {
+}
+
+.gwt-MenuBar {
+  cursor: default;
+}
+.gwt-MenuBar .gwt-MenuItem {
+  cursor: default;
+  font-family: Arial Unicode MS, Arial, sans-serif;
+}
+.gwt-MenuBar .gwt-MenuItem-selected {
+  background: #E3E8F3;
+}
+.gwt-MenuBar-horizontal {
+  background: #e3e8f3 url(images/hborder.png) repeat-x 0px -2003px;
+  border: 1px solid #e0e0e0;
+}
+.gwt-MenuBar-horizontal .gwt-MenuItem {
+  padding: 5px 10px;
+  vertical-align: bottom;
+  color: #000;
+  font-weight: bold;
+}
+.gwt-MenuBar-horizontal .gwt-MenuItemSeparator {
+  width: 1px;
+  padding: 0px;
+  margin: 0px;
+  border: 0px;
+  border-left: 1px solid #ccc;
+  background: white;
+}
+.gwt-MenuBar-horizontal .gwt-MenuItemSeparator .menuSeparatorInner {
+  width: 1px;
+  height: 1px;
+  background: white;
+}
+.gwt-MenuBar-vertical {
+  margin-top: 0px;
+  margin-left: 0px;
+  background: white;
+}
+.gwt-MenuBar-vertical table {
+  border-collapse: collapse;
+}
+.gwt-MenuBar-vertical .gwt-MenuItem {
+  padding: 2px 40px 2px 1px;
+}
+.gwt-MenuBar-vertical .gwt-MenuItemSeparator {
+  padding: 2px 0px;
+}
+.gwt-MenuBar-vertical .gwt-MenuItemSeparator .menuSeparatorInner {
+  height: 1px;
+  padding: 0px;
+  border: 0px;
+  border-top: 1px solid #ccc;
+  overflow: hidden;
+}
+.gwt-MenuBar-vertical .subMenuIcon {
+  padding-right: 4px;
+}
+.gwt-MenuBar-vertical .subMenuIcon-selected {
+  background: #E3E8F3;
+}
+.gwt-MenuBarPopup .menuPopupTopCenter {
+  background: url(images/hborder.png) 0px -12px repeat-x;
+}
+.gwt-MenuBarPopup .menuPopupBottomCenter {
+  background: url(images/hborder.png) 0px -13px repeat-x;
+}
+.gwt-MenuBarPopup .menuPopupMiddleLeft {
+  background: url(images/vborder.png) -12px 0px repeat-y;
+}
+.gwt-MenuBarPopup .menuPopupMiddleRight {
+  background: url(images/vborder.png) -13px 0px repeat-y;
+}
+.gwt-MenuBarPopup .menuPopupTopLeftInner {
+  width: 5px;
+  height: 5px;
+  zoom: 1;
+}
+.gwt-MenuBarPopup .menuPopupTopRightInner {
+  width: 8px;
+  height: 5px;
+  zoom: 1;
+}
+.gwt-MenuBarPopup .menuPopupBottomLeftInner {
+  width: 5px;
+  height: 8px;
+  zoom: 1;
+}
+.gwt-MenuBarPopup .menuPopupBottomRightInner {
+  width: 8px;
+  height: 8px;
+  zoom: 1;
+}
+.gwt-MenuBarPopup .menuPopupTopLeft {
+  background: url(images/corner.png) no-repeat 0px -36px;
+}
+.gwt-MenuBarPopup .menuPopupTopRight {
+  background: url(images/corner.png) no-repeat -5px -36px;
+}
+.gwt-MenuBarPopup .menuPopupBottomLeft {
+  background: url(images/corner.png) no-repeat 0px -41px;
+}
+.gwt-MenuBarPopup .menuPopupBottomRight {
+  background: url(images/corner.png) no-repeat -5px -41px;
+}
+
+.gwt-PasswordTextBox {
+  padding: 5px 4px;
+  border: 1px solid #ccc;
+  border-top: 1px solid #999;
+  font-size: 100%;
+}
+.gwt-PasswordTextBox-readonly {
+  color: #888;
+}
+
+.gwt-PopupPanel {
+  border: 3px solid #e7e7e7;
+  padding: 3px;
+  background: white;
+}
+
+.gwt-DecoratedPopupPanel .popupContent {
+}
+.gwt-DecoratedPopupPanel .popupMiddleCenter {
+  padding: 3px;
+  background: #f1f1f1;
+}
+.gwt-DecoratedPopupPanel .popupTopCenter {
+  background: url(images/hborder.png) 0px -2937px repeat-x;
+}
+.gwt-DecoratedPopupPanel .popupBottomCenter {
+  background:  url(images/hborder.png) repeat-x 0px -2938px;
+}
+.gwt-DecoratedPopupPanel .popupMiddleLeft {
+  background: url(images/vborder.png) -21px 0px repeat-y;
+}
+.gwt-DecoratedPopupPanel .popupMiddleRight {
+  background: url(images/vborder.png) repeat-y -24px 0px;
+}
+.gwt-DecoratedPopupPanel .popupTopLeftInner {
+  width: 6px;
+  height: 5px;
+  zoom: 1;
+}
+.gwt-DecoratedPopupPanel .popupTopRightInner {
+  width: 6px;
+  height: 5px;
+  zoom: 1;
+}
+.gwt-DecoratedPopupPanel .popupBottomLeftInner {
+  width: 6px;
+  height: 6px;
+  zoom: 1;
+}
+.gwt-DecoratedPopupPanel .popupBottomRightInner {
+  width: 6px;
+  height: 6px;
+  zoom: 1;
+}
+.gwt-DecoratedPopupPanel .popupTopLeft {
+  background: url(images/circles.png) no-repeat 0px -16px;
+}
+.gwt-DecoratedPopupPanel .popupTopRight {
+  background: url(images/circles.png) no-repeat -6px -16px;
+}
+.gwt-DecoratedPopupPanel .popupBottomLeft {
+  background: url(images/circles.png) no-repeat 0px -21px;
+}
+.gwt-DecoratedPopupPanel .popupBottomRight {
+  background: url(images/circles.png) no-repeat -6px -21px;
+}
+
+.gwt-PopupPanelGlass {
+  background-color: #000;
+  opacity: 0.3;
+  filter: alpha(opacity=30);
+}
+
+.gwt-PushButton-up,
+.gwt-PushButton-up-hovering,
+.gwt-PushButton-up-disabled,
+.gwt-PushButton-down,
+.gwt-PushButton-down-hovering,
+.gwt-PushButton-down-disabled {
+  margin: 0;
+  text-decoration: none;
+  background: url("images/hborder.png") repeat-x 0px -27px;
+  border-radius: 2px;
+  -moz-border-radius: 2px;
+}
+.gwt-PushButton-up,
+.gwt-PushButton-up-hovering,
+.gwt-PushButton-up-disabled {
+  padding: 3px 5px 3px 5px;
+}
+.gwt-PushButton-up {
+  border:1px solid #bbb;
+  border-bottom: 1px solid #a0a0a0;
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-PushButton-up-hovering {
+  border: 1px solid;
+  border-color: #939393;
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-PushButton-up-disabled {
+  border: 1px solid #bbb;
+  cursor: default;
+  opacity: .5;
+  filter: alpha(opacity=45);
+  zoom: 1;
+}
+.gwt-PushButton-down,
+.gwt-PushButton-down-hovering,
+.gwt-PushButton-down-disabled {
+  padding: 4px 4px 2px 6px;
+  outline:none;
+}
+.gwt-PushButton-down {
+  border: 1px inset #666;
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-PushButton-down-hovering {
+  border: 1px solid #939393;
+  border-top: 1px solid #333333;
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-PushButton-down-disabled {
+  border: 1px outset #ccc;
+  cursor: default;
+  opacity: 0.5;
+  filter: alpha(opacity=45);
+  zoom: 1;
+}
+
+.gwt-RadioButton {
+}
+.gwt-RadioButton-disabled {
+  color: #888;
+}
+
+.gwt-RichTextArea {
+}
+.hasRichTextToolbar {
+  border: 0px;
+}
+.gwt-RichTextToolbar {
+  background: #e3e8f3 url(images/hborder.png) repeat-x 0px -2003px;
+  border-bottom: 1px solid #BBBBBB;
+  padding: 3px;
+  margin: 0px;
+}
+.gwt-RichTextToolbar .gwt-PushButton-up {
+  padding: 0px 1px 0px 0px;
+  margin-right: 4px;
+  margin-bottom: 4px;
+  border-width: 1px;
+}
+.gwt-RichTextToolbar .gwt-PushButton-up-hovering {
+  margin-right: 4px;
+  margin-bottom: 4px;
+  padding: 0px 1px 0px 0px;
+  border-width: 1px;
+}
+.gwt-RichTextToolbar .gwt-PushButton-down {
+  margin-right: 4px;
+  margin-bottom: 4px;
+  padding: 0px 0px 0px 1px;
+  border-width: 1px;
+}
+.gwt-RichTextToolbar .gwt-PushButton-down-hovering {
+  margin-right: 4px;
+  margin-bottom: 4px;
+  padding: 0px 0px 0px 1px;
+  border-width: 1px;
+}
+.gwt-RichTextToolbar .gwt-ToggleButton-up {
+  margin-right: 4px;
+  margin-bottom: 4px;
+  padding: 0px 1px 0px 0px;
+  border:1px solid #bbb;
+  border-bottom: 1px solid #a0a0a0;
+}
+.gwt-RichTextToolbar .gwt-ToggleButton-up-hovering {
+  margin-right: 4px;
+  margin-bottom: 4px;
+  padding: 0px 1px 0px 0px;
+  border-width: 1px;
+}
+.gwt-RichTextToolbar .gwt-ToggleButton-down {
+  margin-right: 4px;
+  margin-bottom: 4px;
+  padding: 0px 0px 0px 1px;
+  border-width: 1px;
+}
+.gwt-RichTextToolbar .gwt-ToggleButton-down-hovering {
+  margin-right: 4px;
+  margin-bottom: 4px;
+  padding: 0px 0px 0px 1px;
+  border-width: 1px;
+}
+
+.gwt-StackPanel {
+  border-bottom: 1px solid #bbbbbb;
+}
+.gwt-StackPanel .gwt-StackPanelItem {
+  cursor: pointer;
+  cursor: hand;
+  font-weight: bold;
+  font-size: 1.3em;
+  padding: 3px;
+  border: 1px solid #bbbbbb;
+  border-bottom: 0px;
+  background: #d3def6 url(images/hborder.png) repeat-x 0px -989px;
+}
+.gwt-StackPanel .gwt-StackPanelContent {
+  border: 1px solid #bbbbbb;
+  border-bottom: 0px;
+  background: white;
+  padding: 2px 2px 10px 5px;
+}
+
+.gwt-DecoratedStackPanel {
+  border-bottom: 1px solid #bbbbbb;
+}
+.gwt-DecoratedStackPanel .gwt-StackPanelContent {
+  border: 1px solid #bbbbbb;
+  border-bottom: 0px;
+  background: white;
+  padding: 2px 2px 10px 5px;
+}
+.gwt-DecoratedStackPanel .gwt-StackPanelItem {
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-DecoratedStackPanel .stackItemTopLeft,
+.gwt-DecoratedStackPanel .stackItemTopRight {
+  height: 6px;
+  width: 6px;
+  zoom: 1;
+}
+.gwt-DecoratedStackPanel .stackItemTopLeft {
+  border-left: 1px solid #bbbbbb;
+  background: #d3def6 url(images/corner.png) no-repeat 0px -49px;
+}
+.gwt-DecoratedStackPanel .stackItemTopRight {
+  border-right: 1px solid #bbbbbb;
+  background: #d3def6 url(images/corner.png) no-repeat -6px -49px;
+}
+.gwt-DecoratedStackPanel .stackItemTopLeftInner,
+.gwt-DecoratedStackPanel .stackItemTopRightInner {
+  width: 1px;
+  height: 1px;
+}
+
+.gwt-DecoratedStackPanel .stackItemTopCenter {
+  background: url(images/hborder.png) 0px -21px repeat-x;
+}
+.gwt-DecoratedStackPanel .stackItemMiddleLeft {
+  background: #d3def6 url(images/hborder.png) repeat-x 0px -989px;
+  border-left: 1px solid #bbbbbb;
+}
+.gwt-DecoratedStackPanel .stackItemMiddleLeftInner,
+.gwt-DecoratedStackPanel .stackItemMiddleRightInner {
+  width: 1px;
+  height: 1px;
+}
+.gwt-DecoratedStackPanel .stackItemMiddleRight {
+  background: #d3def6 url(images/hborder.png) repeat-x 0px -989px;
+  border-right: 1px solid #bbbbbb;
+}
+.gwt-DecoratedStackPanel .stackItemMiddleCenter {
+  font-weight: bold;
+  font-size: 1.3em;
+  background: #d3def6 url(images/hborder.png) repeat-x 0px -989px;
+}
+.gwt-DecoratedStackPanel .gwt-StackPanelItem-first .stackItemTopRight,
+.gwt-DecoratedStackPanel .gwt-StackPanelItem-first .stackItemTopLeft {
+  border: 0px;
+  background-color: white;
+}
+.gwt-DecoratedStackPanel .gwt-StackPanelItem-below-selected .stackItemTopLeft,
+.gwt-DecoratedStackPanel .gwt-StackPanelItem-below-selected .stackItemTopRight {
+  background-color: white;
+}
+
+.gwt-SuggestBox {
+  padding: 5px 4px;
+  border: 1px solid #ccc;
+  border-top: 1px solid #999;
+  font-size: 100%;
+  font-family: Arial Unicode MS, Arial, sans-serif;
+}
+
+.gwt-SuggestBoxPopup {
+}
+
+.gwt-SuggestBoxPopup .item {
+  padding: 2px 6px;
+  color: #000;
+  cursor: default;
+  font-size: 110%;
+}
+.gwt-SuggestBoxPopup .item-selected {
+  background: #D5E2FF;
+}
+.gwt-SuggestBoxPopup .suggestPopupContent {
+  background: white;
+}
+.gwt-SuggestBoxPopup .suggestPopupTopCenter {
+  border-top: 1px solid #bbb;
+}
+.gwt-SuggestBoxPopup .suggestPopupBottomCenter {
+  border-bottom: 1px solid #bbb;
+}
+.gwt-SuggestBoxPopup .suggestPopupTopCenterInner,
+.gwt-SuggestBoxPopup .suggestPopupBottomCenterInner {
+  height: 1px;
+  line-height: 1px;
+}
+.gwt-SuggestBoxPopup .suggestPopupMiddleLeft {
+  border-left: 1px solid #bbb;
+}
+.gwt-SuggestBoxPopup .suggestPopupMiddleRight {
+  border-right: 1px solid #bbb;
+}
+.gwt-SuggestBoxPopup .suggestPopupMiddleLeftInner,
+.gwt-SuggestBoxPopup .suggestPopupMiddleRightInner {
+  width: 1px;
+  line-height: 1px;
+}
+.gwt-SuggestBoxPopup .suggestPopupTopLeftInner {
+  width: 0px;
+  height: 0px;
+  zoom: 1;
+}
+.gwt-SuggestBoxPopup .suggestPopupTopRightInner {
+  width: 0px;
+  height: 0px;
+  zoom: 1;
+}
+.gwt-SuggestBoxPopup .suggestPopupBottomLeftInner {
+  width: 0px;
+  height: 0px;
+  zoom: 1;
+}
+.gwt-SuggestBoxPopup .suggestPopupBottomRightInner {
+  width: 0px;
+  height: 0px;
+  zoom: 1;
+}
+.gwt-SuggestBoxPopup .suggestPopupTopLeft {
+  background: url(images/circles.png) no-repeat 0px -6px;
+  width:5px;
+  height:5px;
+}
+.gwt-SuggestBoxPopup .suggestPopupTopRight {
+  background: url(images/circles.png) no-repeat -5px -6px;
+  width:5px;
+  height:5px;
+}
+.gwt-SuggestBoxPopup .suggestPopupBottomLeft {
+  background: url(images/circles.png) no-repeat 0px -11px;
+  width:5px;
+  height:5px;
+}
+.gwt-SuggestBoxPopup .suggestPopupBottomRight {
+  background: url(images/circles.png) no-repeat -5px -11px;
+  width:5px;
+  height:5px;
+}
+
+.gwt-TabBar {
+  background: #ccc;
+  padding-top: 6px;
+}
+.gwt-TabBar .gwt-TabBarFirst {
+  width: 5px;  /* first tab distance from the left */
+}
+.gwt-TabBar .gwt-TabBarRest {
+}
+.gwt-TabBar .gwt-TabBarItem {
+  margin-left: 4px;
+  padding: 4px 8px 4px 8px;
+  cursor: pointer;
+  cursor: hand;
+  color: white;
+  font-weight: normal;
+  text-align: center;
+  background: #8E8E8E;
+  -moz-border-radius: 3px 3px 0px 0px;
+  border-radius: 3px 3px 0px 0px;
+}
+.gwt-TabBar .gwt-TabBarItem-selected {
+  cursor: default;
+  background: white;
+  color: #333;
+  font-weight: bold;
+}
+.gwt-TabBar .gwt-TabBarItem-disabled {
+  cursor: default;
+  color: #999999;
+}
+.gwt-TabPanel {
+}
+.gwt-TabPanelBottom {
+  border-color: #ccc;
+  border-style: solid;
+  border-width: 0px 1px 1px;
+  overflow: hidden;
+  padding: 6px;
+}
+.gwt-DecoratedTabBar {
+  background: #ccc;
+  padding-top: 6px;
+}
+.gwt-DecoratedTabBar .gwt-TabBarFirst {
+  width: 5px;  /* first tab distance from the left */
+}
+.gwt-DecoratedTabBar .gwt-TabBarRest {
+}
+.gwt-DecoratedTabBar .gwt-TabBarItem {
+  border-collapse: collapse;
+  margin-left: 4px;
+}
+.gwt-DecoratedTabBar .tabTopCenter {
+  padding: 0px;
+  background: #8E8E8E;
+}
+.gwt-DecoratedTabBar .tabTopLeft,
+.gwt-DecoratedTabBar .tabTopRight {
+  padding: 0px;
+  zoom: 1;
+}
+.gwt-DecoratedTabBar .tabTopLeftInner,
+.gwt-DecoratedTabBar .tabTopRightInner {
+  width: 3px;
+  height: 3px;
+}
+.gwt-DecoratedTabBar .tabTopLeft {
+  background: url(images/circles.png) no-repeat 0px 0px;
+}
+.gwt-DecoratedTabBar .tabTopRight {
+  background: url(images/circles.png) no-repeat -3px 0px;
+}
+
+.gwt-DecoratedTabBar .tabMiddleLeft,
+.gwt-DecoratedTabBar .tabMiddleRight {
+  width: 3px;
+  padding: 0px;
+  background: #8E8E8E;
+}
+.gwt-DecoratedTabBar .tabMiddleLeftInner,
+.gwt-DecoratedTabBar .tabMiddleRightInner {
+  width: 1px;
+  height: 1px;
+}
+.gwt-DecoratedTabBar .tabMiddleCenter {
+  padding: 0px 5px 4px 5px;
+  cursor: pointer;
+  cursor: hand;
+  color: #fff;
+  font-weight: normal;
+  text-align: center;
+  background: #8E8E8E;
+}
+.gwt-DecoratedTabBar .gwt-TabBarItem-selected .tabTopCenter {
+  background:#fff;
+}
+.gwt-DecoratedTabBar .gwt-TabBarItem-selected .tabTopLeft {
+  background: url(images/circles.png) no-repeat -6px 0px;
+}
+.gwt-DecoratedTabBar .gwt-TabBarItem-selected .tabTopRight {
+  background: url(images/circles.png) no-repeat -9px 0px;
+}
+.gwt-DecoratedTabBar .gwt-TabBarItem-selected .tabMiddleLeft,
+.gwt-DecoratedTabBar .gwt-TabBarItem-selected .tabMiddleRight {
+  background: #fff;
+}
+.gwt-DecoratedTabBar .gwt-TabBarItem-selected .tabMiddleCenter {
+  cursor: default;
+  background: #fff;
+  color:#333;
+  font-weight:bold;
+}
+.gwt-DecoratedTabBar .gwt-TabBarItem-disabled .tabMiddleCenter {
+  cursor: default;
+  color: #999999;
+}
+
+.gwt-TextArea {
+  padding: 4px;
+  border: 1px solid #ccc;
+  border-top: 1px solid #666;
+  font-size: 100%;
+  font-family: Arial Unicode MS, Arial, sans-serif;
+}
+.gwt-TextArea-readonly {
+  color: #888;
+}
+
+.gwt-TextBox {
+  padding: 5px 4px;
+  border: 1px solid #ccc;
+  border-top: 1px solid #999;
+  font-size: small;
+  font-family: Arial Unicode MS, Arial, sans-serif;
+}
+.gwt-TextBox-readonly {
+  color: #888;
+}
+.gwt-ToggleButton-up,
+.gwt-ToggleButton-up-hovering,
+.gwt-ToggleButton-up-disabled,
+.gwt-ToggleButton-down,
+.gwt-ToggleButton-down-hovering,
+.gwt-ToggleButton-down-disabled {
+  margin: 0;
+  text-decoration: none;
+  background: url("images/hborder.png") repeat-x 0px -27px;
+  -moz-border-radius: 2px;
+  border-radius: 2px;
+}
+.gwt-ToggleButton-up,
+.gwt-ToggleButton-up-hovering,
+.gwt-ToggleButton-up-disabled {
+  padding: 3px 5px 3px 5px;
+}
+.gwt-ToggleButton-up {
+  border:1px solid #bbb;
+  border-bottom: 1px solid #a0a0a0;
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-ToggleButton-up-hovering {
+  border: 1px solid;
+  border-color: #939393;
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-ToggleButton-up-disabled {
+  border: 1px solid #bbb;
+  cursor: default;
+  opacity: .5;
+  zoom: 1;
+  filter: alpha(opacity=45);
+}
+.gwt-ToggleButton-down,
+.gwt-ToggleButton-down-hovering,
+.gwt-ToggleButton-down-disabled {
+  padding: 4px 4px 2px 6px;
+}
+.gwt-ToggleButton-down {
+  background-position: 0 -513px;
+  border: 1px inset #666;
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-ToggleButton-down-hovering {
+  background-position: 0 -513px;
+  border: 1px inset;
+  border-color: #9cf #69e #69e #7af;
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-ToggleButton-down-disabled {
+  background-position: 0 -513px;
+  border: 1px inset #ccc;
+  cursor: default;
+  opacity: .5;
+  zoom: 1;
+  filter: alpha(opacity=45);
+}
+
+.gwt-Tree .gwt-TreeItem {
+  padding: 1px 0px;
+  margin: 0px;
+  white-space: nowrap;
+  cursor: hand;
+  cursor: pointer;
+}
+.gwt-Tree .gwt-TreeItem-selected {
+  background: #ebeff9;
+}
+.gwt-TreeItem .gwt-RadioButton input,
+.gwt-TreeItem .gwt-CheckBox input {
+  margin-left: 0px;
+}
+
+.gwt-DateBox {
+  padding: 5px 4px;
+  border: 1px solid #ccc;
+  border-top: 1px solid #999;
+  font-size: 100%;
+}
+.gwt-DateBox input {
+  width: 8em;
+}
+.dateBoxFormatError {
+  background: #ffcccc;
+}
+.dateBoxPopup {
+}
+
+.gwt-DatePicker {
+  border: 1px solid #ccc;
+  border-top:1px solid #999;
+  cursor: default;
+}
+.gwt-DatePicker td,
+.datePickerMonthSelector td:focus {
+  outline: none;
+}
+.datePickerDays {
+  width: 100%;
+  background: white;
+}
+.datePickerDay,
+.datePickerWeekdayLabel,
+.datePickerWeekendLabel {
+  font-size: 85%;
+  text-align: center;
+  padding: 4px;
+  outline: none;
+  font-weight:bold;
+  color:#333;
+  border-right: 1px solid #EDEDED;
+  border-bottom: 1px solid #EDEDED;
+}
+.datePickerWeekdayLabel,
+.datePickerWeekendLabel {
+  background: #fff;
+  padding: 0px 4px 2px;
+  cursor: default;
+  color:#666;
+  font-size:70%;
+  font-weight:normal;
+}
+.datePickerDay {
+  padding: 4px 7px;
+  cursor: hand;
+  cursor: pointer;
+}
+.datePickerDayIsWeekend {
+  background: #f7f7f7;
+}
+.datePickerDayIsFiller {
+  color: #999;
+  font-weight:normal;
+}
+.datePickerDayIsValue {
+  background: #d7dfe8;
+}
+.datePickerDayIsDisabled {
+  color: #AAAAAA;
+  font-style: italic;
+}
+.datePickerDayIsHighlighted {
+  background: #F0E68C;
+}
+.datePickerDayIsValueAndHighlighted {
+  background: #d7dfe8;
+}
+.datePickerDayIsToday {
+  padding: 3px;
+  color: #fff;
+  background: url(images/hborder.png) repeat-x 0px -2607px;
+}
+
+.datePickerMonthSelector {
+  width: 100%;
+  padding: 1px 0 5px 0;
+  background: #fff;
+}
+td.datePickerMonth,
+td.datePickerYear {
+  text-align: center;
+  vertical-align: middle;
+  white-space: nowrap;
+  font-size: 100%;
+  font-weight: bold;
+  color: #333;
+}
+.datePickerPreviousButton,
+.datePickerNextButton,
+.datePickerPreviousYearButton,
+.datePickerNextYearButton {
+  font-size: 120%;
+  line-height: 1em;
+  color: #3a6aad;
+  cursor: hand;
+  cursor: pointer;
+  font-weight: bold;
+  padding: 0px 4px;
+  outline: none;
+}
+
+.gwt-StackLayoutPanel {
+  border-bottom: 1px solid #bbbbbb;
+}
+.gwt-StackLayoutPanel .gwt-StackLayoutPanelHeader {
+  cursor: pointer;
+  cursor: hand;
+  font-weight: bold;
+  font-size: 1.3em;
+  padding: 3px;
+  border: 1px solid #bbbbbb;
+  border-bottom: 0px;
+  background: #d3def6 url(images/hborder.png) repeat-x 0px -989px;
+}
+.gwt-StackLayoutPanel .gwt-StackLayoutPanelHeader-hovering {
+  background: #d3def6;
+}
+.gwt-StackLayoutPanel .gwt-StackLayoutPanelContent {
+  border: 1px solid #bbbbbb;
+  border-bottom: 0px;
+  background: white;
+  padding: 2px 2px 10px 5px;
+}
+
+.gwt-TabLayoutPanel {
+}
+.gwt-TabLayoutPanel .gwt-TabLayoutPanelTabs {
+  background: #ccc;
+  padding-top: 6px;
+  padding-left: 5px;
+}
+.gwt-TabLayoutPanel .gwt-TabLayoutPanelContentContainer {
+  border-color: #ccc;
+  border-style: solid;
+  border-width: 0px 1px 1px;
+}
+.gwt-TabLayoutPanel .gwt-TabLayoutPanelContent {
+  overflow: hidden;
+  padding: 6px;
+}
+.gwt-TabLayoutPanel .gwt-TabLayoutPanelTab {
+  margin-left: 4px;
+  padding: 4px 8px 4px 8px;
+  cursor: pointer;
+  cursor: hand;
+  color: white;
+  font-weight: normal;
+  text-align: center;
+  background: #8E8E8E;
+  -moz-border-radius: 3px 3px 0px 0px;
+  border-radius: 3px 3px 0px 0px;
+}
+.gwt-TabLayoutPanel .gwt-TabLayoutPanelTab-selected {
+  cursor: default;
+  background: white;
+  color: #333;
+  font-weight: bold;
+}
+
+.gwt-SplitLayoutPanel-HDragger {
+  background: #e7e7e7 url(images/thumb_vertical.png) center center no-repeat;
+  cursor: col-resize;
+}
+
+.gwt-SplitLayoutPanel-VDragger {
+  background: #e7e7e7 url(images/thumb_horz.png) center center no-repeat;
+  cursor: row-resize;
+}
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/gwt/clean/clean_rtl.css
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/gwt/clean/clean_rtl.css	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/gwt/clean/clean_rtl.css	(revision 31449)
@@ -0,0 +1,1122 @@
+/**
+ * The file contains styles for GWT widgets in the Clean theme, in RTL mode.
+ */
+
+body, table td, select, button {
+  font-family: Arial Unicode MS, Arial, sans-serif;
+  font-size: small;
+}
+pre {
+  font-family: "courier new", courier;
+  font-size: small;
+}
+body {
+  color: black;
+  margin: 10px;
+  border: 0px;
+  padding: 0px;
+  background: #fff;
+  direction: rtl;
+}
+a, a:visited {
+  color: #0066cc;
+  text-decoration:none;
+}
+
+a:hover {
+  color: #0066cc;
+  text-decoration:underline;
+}
+
+select {
+  background: white;
+}
+
+/**
+ * The reference theme can be used to determine when this style sheet has
+ * loaded.  Create a hidden div element with absolute position, assign the style
+ * name below, and attach it to the DOM.  Use a timer to detect when the
+ * element's height and width are set to 5px.
+ */
+.gwt-Reference-clean-rtl {
+  height: 5px;
+  width: 5px;
+  zoom: 1;
+}
+
+.gwt-Button {
+  margin: 0;
+  padding: 5px 7px;
+  text-decoration: none;
+  cursor: pointer;
+  cursor: hand;
+  font-size:small;
+  background: url("images/hborder.png") repeat-x 0px -2077px;
+  border:1px solid #bbb;
+  border-bottom: 1px solid #a0a0a0;
+  border-radius: 3px;
+ -moz-border-radius: 3px;
+}
+.gwt-Button:active {
+  border: 1px inset #ccc;
+}
+.gwt-Button:hover {
+  border-color: #939393;
+}
+.gwt-Button[disabled] {
+  cursor: default;
+  color: #888;
+}
+.gwt-Button[disabled]:hover {
+  border: 1px outset #ccc;
+}
+
+.gwt-CheckBox {
+}
+.gwt-CheckBox-disabled {
+  color: #888;
+}
+
+.gwt-DecoratorPanel {
+}
+.gwt-DecoratorPanel .topCenter {
+  border-top: 1px solid #bbb;
+  line-height: 0px;
+}
+.gwt-DecoratorPanel .bottomCenter {
+  border-bottom: 1px solid #bbb;
+  line-height: 0px;
+}
+.gwt-DecoratorPanel .topCenterInner,
+.gwt-DecoratorPanel .bottomCenterInner {
+  height: 1px;
+  line-height: 0px;
+  font-size: 1px;
+}
+.gwt-DecoratorPanel .middleLeft {
+  border-left: 1px solid #bbb;
+}
+.gwt-DecoratorPanel .middleRight {
+  border-right: 1px solid #bbb;
+}
+.gwt-DecoratorPanel .middleLeftInner,
+.gwt-DecoratorPanel .middleRightInner {
+  width: 1px;
+  line-height: 1px;
+}
+.gwt-DecoratorPanel .topLeftInner,
+.gwt-DecoratorPanel .topRightInner,
+.gwt-DecoratorPanel .bottomLeftInner,
+.gwt-DecoratorPanel .bottomRightInner {
+  width: 5px;
+  height: 5px;
+  zoom: 1;
+  font-size: 1px;
+  overflow: hidden;
+}
+.gwt-DecoratorPanel .topLeft {
+  line-height: 0px;
+  background: url(images/circles.png) no-repeat 0px -6px;
+}
+.gwt-DecoratorPanel .topRight {
+  line-height: 0px;
+  background: url(images/circles.png) no-repeat -5px -6px;
+}
+.gwt-DecoratorPanel .bottomLeft {
+  line-height: 0px;
+  background: url(images/circles.png) no-repeat 0px -11px;
+}
+.gwt-DecoratorPanel .bottomRight {
+  line-height: 0px;
+  background: url(images/circles.png) no-repeat -5px -11px;
+}
+
+.gwt-DialogBox .Caption {
+  background: #F1F1F1;
+  padding: 4px 4px 4px 8px;
+  cursor: default;
+  font-family: Arial Unicode MS, Arial, sans-serif;
+  font-weight: bold;
+  border-bottom: 1px solid #bbbbbb;
+  border-top: 1px solid #D2D2D2;
+}
+.gwt-DialogBox .dialogContent {
+}
+.gwt-DialogBox .dialogMiddleCenter {
+  padding: 3px;
+  background: white;
+}
+.gwt-DialogBox .dialogBottomCenter {
+  background: url(images/hborder.png) repeat-x 0px -2945px;
+}
+.gwt-DialogBox .dialogMiddleLeft {
+  background: url(images/vborder.png) repeat-y -31px 0px;
+}
+.gwt-DialogBox .dialogMiddleRight {
+  background: url(images/vborder.png) repeat-y -32px 0px;
+}
+.gwt-DialogBox .dialogTopLeftInner {
+  width: 10px;
+  height: 8px;
+  zoom: 1;
+}
+.gwt-DialogBox .dialogTopRightInner {
+  width: 12px;
+  zoom: 1;
+}
+.gwt-DialogBox .dialogBottomLeftInner {
+  width: 10px;
+  height: 12px;
+  zoom: 1;
+}
+.gwt-DialogBox .dialogBottomRightInner {
+  width: 12px;
+  height: 12px;
+  zoom: 1;
+}
+.gwt-DialogBox .dialogTopLeft {
+  background: url(images/circles.png) no-repeat -20px 0px;
+}
+.gwt-DialogBox .dialogTopRight {
+  background: url(images/circles.png) no-repeat -28px 0px;
+}
+.gwt-DialogBox .dialogBottomLeft {
+  background: url(images/circles.png) no-repeat 0px -36px;
+}
+.gwt-DialogBox .dialogBottomRight {
+  background: url(images/circles.png) no-repeat -8px -36px;
+}
+
+.gwt-DisclosurePanel {
+}
+.gwt-DisclosurePanel-open {
+}
+.gwt-DisclosurePanel-closed {
+}
+.gwt-DisclosurePanel .header,
+.gwt-DisclosurePanel .header a,
+.gwt-DisclosurePanel .header td {
+  text-decoration: none;  /* Remove underline from header */
+  color: black;
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-DisclosurePanel .content {
+  border-right: 3px solid #e7e7e7;
+  padding: 4px 8px 4px 0px;
+  margin-right: 6px;
+}
+
+.gwt-FileUpload {
+}
+
+.gwt-Frame {
+  border-top: 2px solid #666;
+  border-left: 2px solid #666;
+  border-right: 2px solid #bbb;
+  border-bottom: 2px solid #bbb;
+}
+
+.gwt-HorizontalSplitPanel {
+}
+.gwt-HorizontalSplitPanel .hsplitter {
+  cursor: move;
+  border: 0px;
+  background: #e7e7e7;
+  line-height: 0px;
+}
+.gwt-VerticalSplitPanel {
+}
+.gwt-VerticalSplitPanel .vsplitter {
+  cursor: move;
+  border: 0px;
+  background: #e7e7e7;
+  line-height: 0px;
+}
+
+.gwt-HTML {
+  padding: 0 0px;
+}
+
+.gwt-Hyperlink {
+  cursor: pointer;
+}
+
+.gwt-Image {
+}
+
+.gwt-Label {
+}
+
+.gwt-ListBox {
+}
+
+.gwt-MenuBar {
+  cursor: default;
+}
+.gwt-MenuBar .gwt-MenuItem {
+  cursor: default;
+  font-family: Arial Unicode MS, Arial, sans-serif;
+}
+.gwt-MenuBar .gwt-MenuItem-selected {
+  background: #E3E8F3;
+}
+.gwt-MenuBar-horizontal {
+  background: #e3e8f3 url(images/hborder.png) repeat-x 0px -2003px;
+  border: 1px solid #e0e0e0;
+}
+.gwt-MenuBar-horizontal .gwt-MenuItem {
+  padding: 5px 10px;
+  vertical-align: bottom;
+  color: #000;
+  font-weight: bold;
+}
+.gwt-MenuBar-horizontal .gwt-MenuItemSeparator {
+  width: 1px;
+  padding: 0px;
+  margin: 0px;
+  border: 0px;
+  border-right: 1px solid #ccc;
+  background: white;
+}
+.gwt-MenuBar-horizontal .gwt-MenuItemSeparator .menuSeparatorInner {
+  width: 1px;
+  height: 1px;
+  background: white;
+}
+.gwt-MenuBar-vertical {
+  margin-top: 0px;
+  margin-right: 0px;
+  background: white;
+}
+.gwt-MenuBar-vertical table {
+  border-collapse: collapse;
+}
+.gwt-MenuBar-vertical .gwt-MenuItem {
+  padding: 2px 1px 2px 40px;
+}
+.gwt-MenuBar-vertical .gwt-MenuItemSeparator {
+  padding: 2px 0px;
+}
+.gwt-MenuBar-vertical .gwt-MenuItemSeparator .menuSeparatorInner {
+  height: 1px;
+  padding: 0px;
+  border: 0px;
+  border-top: 1px solid #ccc;
+  overflow: hidden;
+}
+.gwt-MenuBar-vertical .subMenuIcon {
+  padding-left: 4px;
+}
+.gwt-MenuBar-vertical .subMenuIcon-selected {
+  background: #E3E8F3;
+}
+.gwt-MenuBarPopup .menuPopupTopCenter {
+  background: url(images/hborder.png) 0px -12px repeat-x;
+}
+.gwt-MenuBarPopup .menuPopupBottomCenter {
+  background: url(images/hborder.png) 0px -13px repeat-x;
+}
+.gwt-MenuBarPopup .menuPopupMiddleLeft {
+  background: url(images/vborder.png) -12px 0px repeat-y;
+}
+.gwt-MenuBarPopup .menuPopupMiddleRight {
+  background: url(images/vborder.png) -13px 0px repeat-y;
+}
+.gwt-MenuBarPopup .menuPopupTopLeftInner {
+  width: 5px;
+  height: 5px;
+  zoom: 1;
+}
+.gwt-MenuBarPopup .menuPopupTopRightInner {
+  width: 8px;
+  height: 5px;
+  zoom: 1;
+}
+.gwt-MenuBarPopup .menuPopupBottomLeftInner {
+  width: 5px;
+  height: 8px;
+  zoom: 1;
+}
+.gwt-MenuBarPopup .menuPopupBottomRightInner {
+  width: 8px;
+  height: 8px;
+  zoom: 1;
+}
+.gwt-MenuBarPopup .menuPopupTopLeft {
+  background: url(images/corner.png) no-repeat 0px -36px;
+}
+.gwt-MenuBarPopup .menuPopupTopRight {
+  background: url(images/corner.png) no-repeat -5px -36px;
+}
+.gwt-MenuBarPopup .menuPopupBottomLeft {
+  background: url(images/corner.png) no-repeat 0px -41px;
+}
+.gwt-MenuBarPopup .menuPopupBottomRight {
+  background: url(images/corner.png) no-repeat -5px -41px;
+}
+
+.gwt-PasswordTextBox {
+  padding: 5px 4px;
+  border: 1px solid #ccc;
+  border-top: 1px solid #999;
+  font-size: 100%;
+}
+.gwt-PasswordTextBox-readonly {
+  color: #888;
+}
+
+.gwt-PopupPanel {
+  border: 3px solid #e7e7e7;
+  padding: 3px;
+  background: white;
+}
+
+.gwt-DecoratedPopupPanel .popupContent {
+}
+.gwt-DecoratedPopupPanel .popupMiddleCenter {
+  padding: 3px;
+  background: #f1f1f1;
+}
+.gwt-DecoratedPopupPanel .popupTopCenter {
+  background: url(images/hborder.png) 0px -2937px repeat-x;
+}
+.gwt-DecoratedPopupPanel .popupBottomCenter {
+  background:  url(images/hborder.png) repeat-x 0px -2938px;
+}
+.gwt-DecoratedPopupPanel .popupMiddleLeft {
+  background: url(images/vborder.png) -21px 0px repeat-y;
+}
+.gwt-DecoratedPopupPanel .popupMiddleRight {
+  background: url(images/vborder.png) repeat-y -24px 0px;
+}
+.gwt-DecoratedPopupPanel .popupTopLeftInner {
+  width: 6px;
+  height: 5px;
+  zoom: 1;
+}
+.gwt-DecoratedPopupPanel .popupTopRightInner {
+  width: 6px;
+  height: 5px;
+  zoom: 1;
+}
+.gwt-DecoratedPopupPanel .popupBottomLeftInner {
+  width: 6px;
+  height: 6px;
+  zoom: 1;
+}
+.gwt-DecoratedPopupPanel .popupBottomRightInner {
+  width: 6px;
+  height: 6px;
+  zoom: 1;
+}
+.gwt-DecoratedPopupPanel .popupTopLeft {
+  background: url(images/circles.png) no-repeat 0px -16px;
+}
+.gwt-DecoratedPopupPanel .popupTopRight {
+  background: url(images/circles.png) no-repeat -6px -16px;
+}
+.gwt-DecoratedPopupPanel .popupBottomLeft {
+  background: url(images/circles.png) no-repeat 0px -21px;
+}
+.gwt-DecoratedPopupPanel .popupBottomRight {
+  background: url(images/circles.png) no-repeat -6px -21px;
+}
+
+.gwt-PopupPanelGlass {
+  background-color: #000;
+  opacity: 0.3;
+  filter: alpha(opacity=30);
+}
+
+.gwt-PushButton-up,
+.gwt-PushButton-up-hovering,
+.gwt-PushButton-up-disabled,
+.gwt-PushButton-down,
+.gwt-PushButton-down-hovering,
+.gwt-PushButton-down-disabled {
+  margin: 0;
+  text-decoration: none;
+  background: url("images/hborder.png") repeat-x 0px -27px;
+  border-radius: 2px;
+  -moz-border-radius: 2px;
+}
+.gwt-PushButton-up,
+.gwt-PushButton-up-hovering,
+.gwt-PushButton-up-disabled {
+  padding: 3px 5px 3px 5px;
+}
+.gwt-PushButton-up {
+  border:1px solid #bbb;
+  border-bottom: 1px solid #a0a0a0;
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-PushButton-up-hovering {
+  border: 1px solid;
+  border-color: #939393;
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-PushButton-up-disabled {
+  border: 1px solid #bbb;
+  cursor: default;
+  opacity: .5;
+  filter: alpha(opacity=45);
+  zoom: 1;
+}
+.gwt-PushButton-down,
+.gwt-PushButton-down-hovering,
+.gwt-PushButton-down-disabled {
+  padding: 4px 6px 2px 4px;
+  outline:none;
+}
+.gwt-PushButton-down {
+  border: 1px inset #666;
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-PushButton-down-hovering {
+  border: 1px solid #939393;
+  border-top: 1px solid #333333;
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-PushButton-down-disabled {
+  border: 1px outset #ccc;
+  cursor: default;
+  opacity: 0.5;
+  filter: alpha(opacity=45);
+  zoom: 1;
+}
+
+.gwt-RadioButton {
+}
+.gwt-RadioButton-disabled {
+  color: #888;
+}
+
+.gwt-RichTextArea {
+}
+.hasRichTextToolbar {
+  border: 0px;
+}
+.gwt-RichTextToolbar {
+  background: #e3e8f3 url(images/hborder.png) repeat-x 0px -2003px;
+  border-bottom: 1px solid #BBBBBB;
+  padding: 3px;
+  margin: 0px;
+}
+.gwt-RichTextToolbar .gwt-PushButton-up {
+  padding: 0px 0px 0px 1px;
+  margin-left: 4px;
+  margin-bottom: 4px;
+  border-width: 1px;
+}
+.gwt-RichTextToolbar .gwt-PushButton-up-hovering {
+  margin-left: 4px;
+  margin-bottom: 4px;
+  padding: 0px 0px 0px 1px;
+  border-width: 1px;
+}
+.gwt-RichTextToolbar .gwt-PushButton-down {
+  margin-left: 4px;
+  margin-bottom: 4px;
+  padding: 0px 1px 0px 0px;
+  border-width: 1px;
+}
+.gwt-RichTextToolbar .gwt-PushButton-down-hovering {
+  margin-left: 4px;
+  margin-bottom: 4px;
+  padding: 0px 1px 0px 0px;
+  border-width: 1px;
+}
+.gwt-RichTextToolbar .gwt-ToggleButton-up {
+  margin-left: 4px;
+  margin-bottom: 4px;
+  padding: 0px 0px 0px 1px;
+  border:1px solid #bbb;
+  border-bottom: 1px solid #a0a0a0;
+}
+.gwt-RichTextToolbar .gwt-ToggleButton-up-hovering {
+  margin-left: 4px;
+  margin-bottom: 4px;
+  padding: 0px 0px 0px 1px;
+  border-width: 1px;
+}
+.gwt-RichTextToolbar .gwt-ToggleButton-down {
+  margin-left: 4px;
+  margin-bottom: 4px;
+  padding: 0px 1px 0px 0px;
+  border-width: 1px;
+}
+.gwt-RichTextToolbar .gwt-ToggleButton-down-hovering {
+  margin-left: 4px;
+  margin-bottom: 4px;
+  padding: 0px 1px 0px 0px;
+  border-width: 1px;
+}
+
+.gwt-StackPanel {
+  border-bottom: 1px solid #bbbbbb;
+}
+.gwt-StackPanel .gwt-StackPanelItem {
+  cursor: pointer;
+  cursor: hand;
+  font-weight: bold;
+  font-size: 1.3em;
+  padding: 3px;
+  border: 1px solid #bbbbbb;
+  border-bottom: 0px;
+  background: #d3def6 url(images/hborder.png) repeat-x 0px -989px;
+}
+.gwt-StackPanel .gwt-StackPanelContent {
+  border: 1px solid #bbbbbb;
+  border-bottom: 0px;
+  background: white;
+  padding: 2px 2px 10px 5px;
+}
+
+.gwt-DecoratedStackPanel {
+  border-bottom: 1px solid #bbbbbb;
+}
+.gwt-DecoratedStackPanel .gwt-StackPanelContent {
+  border: 1px solid #bbbbbb;
+  border-bottom: 0px;
+  background: white;
+  padding: 2px 5px 10px 2px;
+}
+.gwt-DecoratedStackPanel .gwt-StackPanelItem {
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-DecoratedStackPanel .stackItemTopLeft,
+.gwt-DecoratedStackPanel .stackItemTopRight {
+  height: 6px;
+  width: 6px;
+  zoom: 1;
+}
+.gwt-DecoratedStackPanel .stackItemTopLeft {
+  border-left: 1px solid #bbbbbb;
+  background: #d3def6 url(images/corner.png) no-repeat 0px -49px;
+}
+.gwt-DecoratedStackPanel .stackItemTopRight {
+  border-right: 1px solid #bbbbbb;
+  background: #d3def6 url(images/corner.png) no-repeat -6px -49px;
+}
+.gwt-DecoratedStackPanel .stackItemTopLeftInner,
+.gwt-DecoratedStackPanel .stackItemTopRightInner {
+  width: 1px;
+  height: 1px;
+}
+
+.gwt-DecoratedStackPanel .stackItemTopCenter {
+  background: url(images/hborder.png) 0px -21px repeat-x;
+}
+.gwt-DecoratedStackPanel .stackItemMiddleLeft {
+  background: #d3def6 url(images/hborder.png) repeat-x 0px -989px;
+  border-left: 1px solid #bbbbbb;
+}
+.gwt-DecoratedStackPanel .stackItemMiddleLeftInner,
+.gwt-DecoratedStackPanel .stackItemMiddleRightInner {
+  width: 1px;
+  height: 1px;
+}
+.gwt-DecoratedStackPanel .stackItemMiddleRight {
+  background: #d3def6 url(images/hborder.png) repeat-x 0px -989px;
+  border-right: 1px solid #bbbbbb;
+}
+.gwt-DecoratedStackPanel .stackItemMiddleCenter {
+  font-weight: bold;
+  font-size: 1.3em;
+  background: #d3def6 url(images/hborder.png) repeat-x 0px -989px;
+}
+.gwt-DecoratedStackPanel .gwt-StackPanelItem-first .stackItemTopRight,
+.gwt-DecoratedStackPanel .gwt-StackPanelItem-first .stackItemTopLeft {
+  border: 0px;
+  background-color: white;
+}
+.gwt-DecoratedStackPanel .gwt-StackPanelItem-below-selected .stackItemTopLeft,
+.gwt-DecoratedStackPanel .gwt-StackPanelItem-below-selected .stackItemTopRight {
+  background-color: white;
+}
+
+.gwt-SuggestBox {
+  padding: 5px 4px;
+  border: 1px solid #ccc;
+  border-top: 1px solid #999;
+  font-size: 100%;
+  font-family: Arial Unicode MS, Arial, sans-serif;
+}
+
+.gwt-SuggestBoxPopup {
+}
+
+.gwt-SuggestBoxPopup .item {
+  padding: 2px 6px;
+  color: #000;
+  cursor: default;
+  font-size: 110%;
+}
+.gwt-SuggestBoxPopup .item-selected {
+  background: #D5E2FF;
+}
+.gwt-SuggestBoxPopup .suggestPopupContent {
+  background: white;
+}
+.gwt-SuggestBoxPopup .suggestPopupTopCenter {
+  border-top: 1px solid #bbb;
+}
+.gwt-SuggestBoxPopup .suggestPopupBottomCenter {
+  border-bottom: 1px solid #bbb;
+}
+.gwt-SuggestBoxPopup .suggestPopupTopCenterInner,
+.gwt-SuggestBoxPopup .suggestPopupBottomCenterInner {
+  height: 1px;
+  line-height: 1px;
+}
+.gwt-SuggestBoxPopup .suggestPopupMiddleLeft {
+  border-left: 1px solid #bbb;
+}
+.gwt-SuggestBoxPopup .suggestPopupMiddleRight {
+  border-right: 1px solid #bbb;
+}
+.gwt-SuggestBoxPopup .suggestPopupMiddleLeftInner,
+.gwt-SuggestBoxPopup .suggestPopupMiddleRightInner {
+  width: 1px;
+  line-height: 1px;
+}
+.gwt-SuggestBoxPopup .suggestPopupTopLeftInner {
+  width: 0px;
+  height: 0px;
+  zoom: 1;
+}
+.gwt-SuggestBoxPopup .suggestPopupTopRightInner {
+  width: 0px;
+  height: 0px;
+  zoom: 1;
+}
+.gwt-SuggestBoxPopup .suggestPopupBottomLeftInner {
+  width: 0px;
+  height: 0px;
+  zoom: 1;
+}
+.gwt-SuggestBoxPopup .suggestPopupBottomRightInner {
+  width: 0px;
+  height: 0px;
+  zoom: 1;
+}
+.gwt-SuggestBoxPopup .suggestPopupTopLeft {
+  background: url(images/circles.png) no-repeat 0px -6px;
+  width:5px;
+  height:5px;
+}
+.gwt-SuggestBoxPopup .suggestPopupTopRight {
+  background: url(images/circles.png) no-repeat -5px -6px;
+  width:5px;
+  height:5px;
+}
+.gwt-SuggestBoxPopup .suggestPopupBottomLeft {
+  background: url(images/circles.png) no-repeat 0px -11px;
+  width:5px;
+  height:5px;
+}
+.gwt-SuggestBoxPopup .suggestPopupBottomRight {
+  background: url(images/circles.png) no-repeat -5px -11px;
+  width:5px;
+  height:5px;
+}
+
+.gwt-TabBar {
+  background: #ccc;
+  padding-top: 6px;
+}
+.gwt-TabBar .gwt-TabBarFirst {
+  width: 5px;  /* first tab distance from the left */
+}
+.gwt-TabBar .gwt-TabBarRest {
+}
+.gwt-TabBar .gwt-TabBarItem {
+  margin-right: 4px;
+  padding: 4px 8px 4px 8px;
+  cursor: pointer;
+  cursor: hand;
+  color: white;
+  font-weight: normal;
+  text-align: center;
+  background: #8E8E8E;
+  -moz-border-radius: 3px 3px 0px 0px;
+  border-radius: 3px 3px 0px 0px;
+}
+.gwt-TabBar .gwt-TabBarItem-selected {
+  cursor: default;
+  background: white;
+  color: #333;
+  font-weight: bold;
+}
+.gwt-TabBar .gwt-TabBarItem-disabled {
+  cursor: default;
+  color: #999999;
+}
+.gwt-TabPanel {
+}
+.gwt-TabPanelBottom {
+  border-color: #ccc;
+  border-style: solid;
+  border-width: 0px 1px 1px;
+  overflow: hidden;
+  padding: 6px;
+}
+.gwt-DecoratedTabBar {
+  background: #ccc;
+  padding-top: 6px;
+}
+.gwt-DecoratedTabBar .gwt-TabBarFirst {
+  width: 5px;  /* first tab distance from the left */
+}
+.gwt-DecoratedTabBar .gwt-TabBarRest {
+}
+.gwt-DecoratedTabBar .gwt-TabBarItem {
+  border-collapse: collapse;
+  margin-right: 4px;
+}
+.gwt-DecoratedTabBar .tabTopCenter {
+  padding: 0px;
+  background: #8E8E8E;
+}
+.gwt-DecoratedTabBar .tabTopLeft,
+.gwt-DecoratedTabBar .tabTopRight {
+  padding: 0px;
+  zoom: 1;
+}
+.gwt-DecoratedTabBar .tabTopLeftInner,
+.gwt-DecoratedTabBar .tabTopRightInner {
+  width: 3px;
+  height: 3px;
+}
+.gwt-DecoratedTabBar .tabTopLeft {
+  background: url(images/circles.png) no-repeat 0px 0px;
+}
+.gwt-DecoratedTabBar .tabTopRight {
+  background: url(images/circles.png) no-repeat -3px 0px;
+}
+
+.gwt-DecoratedTabBar .tabMiddleLeft,
+.gwt-DecoratedTabBar .tabMiddleRight {
+  width: 3px;
+  padding: 0px;
+  background: #8E8E8E;
+}
+.gwt-DecoratedTabBar .tabMiddleLeftInner,
+.gwt-DecoratedTabBar .tabMiddleRightInner {
+  width: 1px;
+  height: 1px;
+}
+.gwt-DecoratedTabBar .tabMiddleCenter {
+  padding: 0px 5px 4px 5px;
+  cursor: pointer;
+  cursor: hand;
+  color: #fff;
+  font-weight: normal;
+  text-align: center;
+  background: #8E8E8E;
+}
+.gwt-DecoratedTabBar .gwt-TabBarItem-selected .tabTopCenter {
+  background:#fff;
+}
+.gwt-DecoratedTabBar .gwt-TabBarItem-selected .tabTopLeft {
+  background: url(images/circles.png) no-repeat -6px 0px;
+}
+.gwt-DecoratedTabBar .gwt-TabBarItem-selected .tabTopRight {
+  background: url(images/circles.png) no-repeat -9px 0px;
+}
+.gwt-DecoratedTabBar .gwt-TabBarItem-selected .tabMiddleLeft,
+.gwt-DecoratedTabBar .gwt-TabBarItem-selected .tabMiddleRight {
+  background: #fff;
+}
+.gwt-DecoratedTabBar .gwt-TabBarItem-selected .tabMiddleCenter {
+  cursor: default;
+  background: #fff;
+  color:#333;
+  font-weight:bold;
+}
+.gwt-DecoratedTabBar .gwt-TabBarItem-disabled .tabMiddleCenter {
+  cursor: default;
+  color: #999999;
+}
+
+.gwt-TextArea {
+  padding: 4px;
+  border: 1px solid #ccc;
+  border-top: 1px solid #666;
+  font-size: 100%;
+  font-family: Arial Unicode MS, Arial, sans-serif;
+}
+.gwt-TextArea-readonly {
+  color: #888;
+}
+
+.gwt-TextBox {
+  padding: 5px 4px;
+  border: 1px solid #ccc;
+  border-top: 1px solid #999;
+  font-size: small;
+  font-family: Arial Unicode MS, Arial, sans-serif;
+}
+.gwt-TextBox-readonly {
+  color: #888;
+}
+.gwt-ToggleButton-up,
+.gwt-ToggleButton-up-hovering,
+.gwt-ToggleButton-up-disabled,
+.gwt-ToggleButton-down,
+.gwt-ToggleButton-down-hovering,
+.gwt-ToggleButton-down-disabled {
+  margin: 0;
+  text-decoration: none;
+  background: url("images/hborder.png") repeat-x 0px -27px;
+  -moz-border-radius: 2px;
+  border-radius: 2px;
+}
+.gwt-ToggleButton-up,
+.gwt-ToggleButton-up-hovering,
+.gwt-ToggleButton-up-disabled {
+  padding: 3px 5px 3px 5px;
+}
+.gwt-ToggleButton-up {
+  border:1px solid #bbb;
+  border-bottom: 1px solid #a0a0a0;
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-ToggleButton-up-hovering {
+  border: 1px solid;
+  border-color: #939393;
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-ToggleButton-up-disabled {
+  border: 1px solid #bbb;
+  cursor: default;
+  opacity: .5;
+  zoom: 1;
+  filter: alpha(opacity=45);
+}
+.gwt-ToggleButton-down,
+.gwt-ToggleButton-down-hovering,
+.gwt-ToggleButton-down-disabled {
+  padding: 4px 6px 2px 4px;
+}
+.gwt-ToggleButton-down {
+  background-position: 0 -513px;
+  border: 1px inset #666;
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-ToggleButton-down-hovering {
+  background-position: 0 -513px;
+  border: 1px inset;
+  border-color: #9cf #69e #69e #7af;
+  cursor: pointer;
+  cursor: hand;
+}
+.gwt-ToggleButton-down-disabled {
+  background-position: 0 -513px;
+  border: 1px inset #ccc;
+  cursor: default;
+  opacity: .5;
+  zoom: 1;
+  filter: alpha(opacity=45);
+}
+
+.gwt-Tree .gwt-TreeItem {
+  padding: 1px 0px;
+  margin: 0px;
+  white-space: nowrap;
+  cursor: hand;
+  cursor: pointer;
+  zoom: 1;
+}
+.gwt-Tree .gwt-TreeItem-selected {
+  background: #ebeff9;
+}
+.gwt-TreeItem .gwt-RadioButton input,
+.gwt-TreeItem .gwt-CheckBox input {
+  margin-right: 0px;
+}
+
+.gwt-DateBox {
+  padding: 5px 4px;
+  border: 1px solid #ccc;
+  border-top: 1px solid #999;
+  font-size: 100%;
+}
+.gwt-DateBox input {
+  width: 8em;
+}
+.dateBoxFormatError {
+  background: #ffcccc;
+}
+.dateBoxPopup {
+}
+
+.gwt-DatePicker {
+  border: 1px solid #ccc;
+  border-top:1px solid #999;
+  cursor: default;
+}
+.gwt-DatePicker td,
+.datePickerMonthSelector td:focus {
+  outline: none;
+}
+.datePickerDays {
+  width: 100%;
+  background: white;
+}
+.datePickerDay,
+.datePickerWeekdayLabel,
+.datePickerWeekendLabel {
+  font-size: 85%;
+  text-align: center;
+  padding: 4px;
+  outline: none;
+  font-weight:bold;
+  color:#333;
+  border-right: 1px solid #EDEDED;
+  border-bottom: 1px solid #EDEDED;
+}
+.datePickerWeekdayLabel,
+.datePickerWeekendLabel {
+  background: #fff;
+  padding: 0px 4px 2px;
+  cursor: default;
+  color:#666;
+  font-size:70%;
+  font-weight:normal;
+}
+.datePickerDay {
+  padding: 4px 7px;
+  cursor: hand;
+  cursor: pointer;
+}
+.datePickerDayIsWeekend {
+  background: #f7f7f7;
+}
+.datePickerDayIsFiller {
+  color: #999;
+  font-weight:normal;
+}
+.datePickerDayIsValue {
+  background: #d7dfe8;
+}
+.datePickerDayIsDisabled {
+  color: #AAAAAA;
+  font-style: italic;
+}
+.datePickerDayIsHighlighted {
+  background: #F0E68C;
+}
+.datePickerDayIsValueAndHighlighted {
+  background: #d7dfe8;
+}
+.datePickerDayIsToday {
+  padding: 3px;
+  color: #fff;
+  background: url(images/hborder.png) repeat-x 0px -2607px;
+}
+
+.datePickerMonthSelector {
+  width: 100%;
+  padding: 1px 0 5px 0;
+  background: #fff;
+}
+td.datePickerMonth,
+td.datePickerYear {
+  text-align: center;
+  vertical-align: middle;
+  white-space: nowrap;
+  font-size: 100%;
+  font-weight: bold;
+  color: #333;
+}
+.datePickerPreviousButton,
+.datePickerNextButton,
+.datePickerPreviousYearButton,
+.datePickerNextYearButton {
+  font-size: 120%;
+  line-height: 1em;
+  color: #3a6aad;
+  cursor: hand;
+  cursor: pointer;
+  font-weight: bold;
+  padding: 0px 4px;
+  outline: none;
+}
+
+.gwt-StackLayoutPanel {
+  border-bottom: 1px solid #bbbbbb;
+}
+.gwt-StackLayoutPanel .gwt-StackLayoutPanelHeader {
+  cursor: pointer;
+  cursor: hand;
+  font-weight: bold;
+  font-size: 1.3em;
+  padding: 3px;
+  border: 1px solid #bbbbbb;
+  border-bottom: 0px;
+  background: #d3def6 url(images/hborder.png) repeat-x 0px -989px;
+}
+.gwt-StackLayoutPanel .gwt-StackLayoutPanelHeader-hovering {
+  background: #d3def6;
+}
+.gwt-StackLayoutPanel .gwt-StackLayoutPanelContent {
+  border: 1px solid #bbbbbb;
+  border-bottom: 0px;
+  background: white;
+  padding: 2px 5px 10px 2px;
+}
+
+.gwt-TabLayoutPanel {
+}
+.gwt-TabLayoutPanel .gwt-TabLayoutPanelTabs {
+  background: #ccc;
+  padding-top: 6px;
+  padding-right: 5px;
+}
+.gwt-TabLayoutPanel .gwt-TabLayoutPanelContentContainer {
+  border-color: #ccc;
+  border-style: solid;
+  border-width: 0px 1px 1px;
+}
+.gwt-TabLayoutPanel .gwt-TabLayoutPanelContent {
+  overflow: hidden;
+  padding: 6px;
+}
+.gwt-TabLayoutPanel .gwt-TabLayoutPanelTab {
+  margin-right: 4px;
+  padding: 4px 8px 4px 8px;
+  cursor: pointer;
+  cursor: hand;
+  color: white;
+  font-weight: normal;
+  text-align: center;
+  background: #8E8E8E;
+  -moz-border-radius: 3px 3px 0px 0px;
+  border-radius: 3px 3px 0px 0px;
+}
+.gwt-TabLayoutPanel .gwt-TabLayoutPanelTab-selected {
+  cursor: default;
+  background: white;
+  color: #333;
+  font-weight: bold;
+}
+
+.gwt-SplitLayoutPanel-HDragger {
+  background: #e7e7e7 url(images/thumb_vertical.png) center center no-repeat;
+  cursor: col-resize;
+}
+
+.gwt-SplitLayoutPanel-VDragger {
+  background: #e7e7e7 url(images/thumb_horz.png) center center no-repeat;
+  cursor: row-resize;
+}
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/reset.css
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/reset.css	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/reset.css	(revision 31449)
@@ -0,0 +1,38 @@
+/**
+ * Sencha GXT 4.0.0 - Sencha for GWT
+ * Copyright (c) 2006-2015, Sencha Inc.
+ *
+ * licensing@sencha.com
+ * http://www.sencha.com/products/gxt/license/
+ *
+ * ================================================================================
+ * Open Source License
+ * ================================================================================
+ * This version of Sencha GXT is licensed under the terms of the Open Source GPL v3
+ * license. You may use this license only if you are prepared to distribute and
+ * share the source code of your application under the GPL v3 license:
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * If you are NOT prepared to distribute and share the source code of your
+ * application under the GPL v3 license, other commercial and oem licenses
+ * are available for an alternate download of Sencha GXT.
+ *
+ * Please see the Sencha GXT Licensing page at:
+ * http://www.sencha.com/products/gxt/license/
+ *
+ * For clarification or additional options, please contact:
+ * licensing@sencha.com
+ * ================================================================================
+ *
+ *
+ * ================================================================================
+ * Disclaimer
+ * ================================================================================
+ * THIS SOFTWARE IS DISTRIBUTED "AS-IS" WITHOUT ANY WARRANTIES, CONDITIONS AND
+ * REPRESENTATIONS WHETHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE
+ * IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, MERCHANTABLE QUALITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, DURABILITY, NON-INFRINGEMENT, PERFORMANCE AND
+ * THOSE ARISING BY STATUTE OR FROM CUSTOM OR USAGE OF TRADE OR COURSE OF DEALING.
+ * ================================================================================
+ */
+html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;}img,body,html{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}ol,ul {list-style:none;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;}q:before,q:after{content:'';}
Index: /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/testelementalsockets.nocache.js
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/testelementalsockets.nocache.js	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/GXTWebsocketClient/war/testelementalsockets/testelementalsockets.nocache.js	(revision 31449)
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+/**
+ * This startup script is used when we run superdevmode from an app server.
+ */
+(function($wnd, $doc){
+  // document.head does not exist in IE8
+  var $head = $doc.head || $doc.getElementsByTagName('head')[0];
+  // Compute some codeserver urls so as the user does not need bookmarklets
+  var hostName = $wnd.location.hostname;
+  var serverUrl = 'http://' + hostName + ':9876';
+  var module = 'testelementalsockets';
+  var nocacheUrl = serverUrl + '/recompile-requester/' + module;
+
+  // Insert the superdevmode nocache script in the first position of the head
+  var devModeScript = $doc.createElement('script');
+  devModeScript.src = nocacheUrl;
+
+  // Everybody except IE8 does fire an error event
+  // This means that we do not detect a non running SDM with IE8.
+  if (devModeScript.addEventListener) {
+    var callback = function() {
+      // Don't show the confirmation dialogue twice (multimodule)
+      if (!$wnd.__gwt__sdm__confirmed &&
+           (!$wnd.__gwt_sdm__recompiler || !$wnd.__gwt_sdm__recompiler.loaded)) {
+        $wnd.__gwt__sdm__confirmed = true;
+        if ($wnd.confirm(
+            "Couldn't load " +  module + " from Super Dev Mode\n" +
+            "server at " + serverUrl + ".\n" +
+            "Please make sure this server is ready.\n" +
+            "Do you want to try again?")) {
+          $wnd.location.reload();
+        }
+      }
+    };
+    devModeScript.addEventListener("error", callback, true);
+  }
+
+  var injectScriptTag = function(){
+    $head.insertBefore(devModeScript, $head.firstElementChild || $head.children[0]);
+  };
+
+  if (/loaded|complete/.test($doc.readyState)) {
+    injectScriptTag();
+  } else {
+    //defer app script insertion until the body is ready
+    if($wnd.addEventListener){
+      $wnd.addEventListener('load', injectScriptTag, false);
+    } else{
+      $wnd.attachEvent('onload', injectScriptTag);
+    }
+  }
+})(window, document);
Index: /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/README.md
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/README.md	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/README.md	(revision 31449)
@@ -0,0 +1,6 @@
+To compile:
+
+* Place your gwt-servlet.jar in the same directory as this README
+* gwt-servlet.jar should be from whatever version of gwt you are using
+* javac ../org/nbk4/gwt/action/client/*.java -cp .:gwt-servlet.jar
+* jar cvf ActionFramework.jar ./org
Index: /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/ServerActionResponse.gwt.xml
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/ServerActionResponse.gwt.xml	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/ServerActionResponse.gwt.xml	(revision 31449)
@@ -0,0 +1,3 @@
+<module>
+  <inherits name="com.google.gwt.user.User"/>
+</module>
Index: /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/ActionObject.java
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/ActionObject.java	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/ActionObject.java	(revision 31449)
@@ -0,0 +1,31 @@
+package org.nbk4.gwt.action.client;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+
+public class ActionObject implements Serializable, IsSerializable {
+	/*Structure (needs to be JSONable):
+	 * Action:
+	 *   Type:
+	 *   ID:
+	 *   Properties:
+	 */
+	protected static long id;
+	
+	protected static long getID() {
+		return ++id;
+	}
+	
+	public ActionObject() {}
+	public ActionObject(ActionType actionType, long actionID, ArrayList<ActionProperty> properties) {
+		this.actionType = actionType;
+		this.actionID = actionID;
+		this.properties = properties;
+	}
+	
+	public ActionType actionType;
+	public long actionID;
+	public ArrayList<ActionProperty> properties;
+}
Index: /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/ActionObjectBuilder.java
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/ActionObjectBuilder.java	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/ActionObjectBuilder.java	(revision 31449)
@@ -0,0 +1,54 @@
+package org.nbk4.gwt.action.client;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+
+@SuppressWarnings("serial")
+public class ActionObjectBuilder extends ActionObject implements Serializable, IsSerializable {
+	public static ActionObject loadBarUpdateActionObject(double progress, String message) {
+		int idIndex = 0;
+		
+		ActionType actionType = ActionType.UPDATE_PROGRESSBAR;
+		long actionID = getID();
+		ArrayList<ActionProperty> properties = new ArrayList<ActionProperty>(2);
+		
+		ActionProperty progressProperty = new ActionProperty(ActionTypeProperty.PROGRESS_BAR_PROGRESS, idIndex++, Double.toString(progress));
+		
+		ActionProperty messageProperty = new ActionProperty(ActionTypeProperty.PROGRESS_BAR_STRING, idIndex++, message);
+		
+		properties.add(progressProperty);
+		if(message != null) {
+			properties.add(messageProperty);
+		}
+		
+		ActionObject loadbar = new ActionObject(actionType, actionID, properties);
+		
+		return loadbar;
+	}
+	
+	public static ActionObject messageBoxSpawnObject(String header, String text, String[] buttons, boolean response) {
+		int idIndex = 0;
+		
+		ActionType actionType = response ? ActionType.SHOW_DIALOG : ActionType.SHOW_DIALOG_NORESPONSE;
+		long actionID = getID();
+		ArrayList<ActionProperty> properties = new ArrayList<ActionProperty>(buttons.length + 3); //buttons, window close, text, header
+			       		
+		for(String button : buttons) {
+			ActionProperty buttonProperty = new ActionProperty(ActionTypeProperty.BUTTON, idIndex++, button);
+			properties.add(buttonProperty);
+		}
+		
+		//ensure any additional fluff comes after the button offset, so we can accurately respond with the button index on the client side
+		ActionProperty windowTitleProperty = new ActionProperty(ActionTypeProperty.MESSAGE_WINDOW_TITLE, idIndex++, header);
+		ActionProperty windowTextProperty = new ActionProperty(ActionTypeProperty.MESSAGE_WINDOW_TEXT, idIndex++, text);
+				
+		properties.add(windowTitleProperty);
+		properties.add(windowTextProperty);
+
+		ActionObject messageBoxObject = new ActionObject(actionType, actionID, properties);
+		
+		return messageBoxObject;
+	}
+}
Index: /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/ActionProperty.java
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/ActionProperty.java	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/ActionProperty.java	(revision 31449)
@@ -0,0 +1,19 @@
+package org.nbk4.gwt.action.client;
+
+import java.io.Serializable;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+
+public class ActionProperty implements Serializable, IsSerializable{
+	public ActionProperty() {}
+	
+	public ActionProperty(ActionTypeProperty property, int ID, String label) {
+		this.property = property;
+		this.ID = ID;
+		this.label = label;
+	}
+	
+	public ActionTypeProperty property;
+	public int ID;
+	public String label;
+}
Index: /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/ActionRequest.java
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/ActionRequest.java	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/ActionRequest.java	(revision 31449)
@@ -0,0 +1,33 @@
+package org.nbk4.gwt.action.client;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+
+public class ActionRequest implements Serializable, IsSerializable {
+	/*Structure (needs to be JSONable):
+	 * ActionRequest:
+	 *   Type:
+	 *   ID:
+	 *   isResponse:
+	 *   Properties:
+	 */
+	protected static long id;
+	
+	protected static long getID() {
+		return ++id;
+	}
+	
+	public ActionRequest() {}
+	public ActionRequest(RequestType requestType, long requestID, ArrayList<ActionProperty> properties) {
+		this.requestType = requestType;
+		this.requestID = requestID;
+		this.properties = properties;
+	}
+	
+	public RequestType requestType;
+	public long requestID;
+
+	public ArrayList<ActionProperty> properties;
+}
Index: /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/ActionType.java
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/ActionType.java	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/ActionType.java	(revision 31449)
@@ -0,0 +1,25 @@
+package org.nbk4.gwt.action.client;
+
+import java.io.Serializable;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+
+public enum ActionType implements Serializable, IsSerializable{
+	UPDATE_PROGRESSBAR(0),
+	SHOW_DIALOG(1),
+	SHOW_DIALOG_NORESPONSE(2);
+	
+	private int value;
+	
+	private ActionType(int value){  
+		this.setValue(value);  
+	}
+
+	public int getValue() {
+		return value;
+	}
+
+	private void setValue(int value) {
+		this.value = value;
+	}
+}
Index: /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/ActionTypeProperty.java
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/ActionTypeProperty.java	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/ActionTypeProperty.java	(revision 31449)
@@ -0,0 +1,33 @@
+package org.nbk4.gwt.action.client;
+
+import java.io.Serializable;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+
+public enum ActionTypeProperty implements Serializable, IsSerializable {
+	BUTTON(0),
+	WINDOW_CLOSE(1),
+	PROGRESS_BAR_STRING(2),
+	PROGRESS_BAR_PROGRESS(3),
+	MESSAGE_WINDOW_TEXT(4),
+	    MESSAGE_WINDOW_TITLE(5),
+	    FILE_LOCATION_STRING(6),
+	    FILE_CHUNK_SIZE(7),
+	    FILE_COPY_LIMIT(8),
+	    BUTTON_PRESS(9);
+	
+	
+	private int value;
+	
+	private ActionTypeProperty(int value){  
+	    this.setValue(value);  
+	}
+	
+	public int getValue() {
+	    return value;
+	}
+	
+	private void setValue(int value) {
+	    this.value = value;
+	}  
+}
Index: /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/RequestType.java
===================================================================
--- /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/RequestType.java	(revision 31449)
+++ /other-projects/FileTransfer-WebSocketPair/ServerActionResponseBundle/org/nbk4/gwt/action/client/RequestType.java	(revision 31449)
@@ -0,0 +1,26 @@
+package org.nbk4.gwt.action.client;
+
+import java.io.Serializable;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+
+public enum RequestType implements Serializable, IsSerializable{
+    PROCESS_FILE(0),
+	CANCEL_FILE_PROCESSING(1),
+	CANCEL_BUILD_ACTION(2),
+	RESPONSE_ALERT_WINDOW(3);
+    
+    private int value;
+	
+    private RequestType(int value){  
+	this.setValue(value);  
+    }
+    
+    public int getValue() {
+		return value;
+    }
+    
+    private void setValue(int value) {
+	this.value = value;
+    }
+}
