anchor.diff:  				if(!chat.getJoinMessagesVisibility()) //ignore join messages unless the user turns them on
   					return;
   			}
  -			
  +
   			if(map["message"] == " left.")
   			{
   				connectedUsers.remove(map["username"]);
  
positive.code: 				..add(userElement)
  				..add(text)
  				..add(streetElement);
  			
  			removeOtherPlayer(map["username"]);
  		}
  		//TODO: remove after real usernames happen
  
negative.code: 				SpanElement newUsername = new SpanElement()
  					..text = map["newUsername"]
  					..style.color = _getColor(map["newUsername"]);
  
  				chatString.children
  				..add(oldUsername)
  				..add(text)
  				..add(newUsername);
  
  				if(map["username"] == chat.username) //although this message is broadcast to everyone, only change usernames if we were the one to type /setname
  				{
  					chat.username = map["newUsername"];
  					localStorage["username"] = chat.username;
  
  					//set name in upper left and above avatar
  					CurrentPlayer.playerName.text = map["newUsername"];
  					setName(map["newUsername"]);
  
  					//warn multiplayer server that it will receive messages from a new name but it should be the same person
  					map['street'] = currentStreet.label;
  					playerSocket.send(JSON.encode(map));
  				}
  
  				connectedUsers.remove(map["username"]);
  				connectedUsers.add(map["newUsername"]);
  			}
  			else
  			{
  