public boolean execute(ChatClient sender, String[] args) {
			holoUpdate();
			return true;
		}
	}
	
	public String getInitialLocations() {
		if (initialLocations == null)
			return "";
		
		String locs = "";
				
		for (Point p : initialLocations) {
			locs += String.format("(%d, %d) ", (int)p.getX(), (int)p.getY());
		}
		
		return String.format("%s[%sHoloFinder%s] %s%d Possible initial locations:\n%s%s", BLD + RED, GRN, RED, YEL, initialLocations.size(), CYN, locs);
	}
	
	public String getNewLocations() {
		if (newLocations == null)
			return "";
	
		String locs = "";
				
		for (Point p : newLocations) {
			locs += String.format("(%d, %d) ", (int)p.getX(), (int)p.getY());
		}
		
		return String.format("%s[%sHoloFinder%s] %s%d Possible new locations:\n%s%s", BLD + RED, GRN, RED, YEL, newLocations.size(), CYN, locs);
	}
	
	/**
	 * Downloads a new live map and subtracts it from the previous, displaying the result
	 * in a new window.
	 */
	void updateImage() {
	
		liveMapNew = op.openURL(liveMapStr);
		
		//ImageProcessor ipOld = liveMapOrig.getProcessor();
		ImageProcessor ipNew = liveMapNew.getProcessor();
		
		//Calibration cal = liveMapNew.getCalibration();
		
		//We need to keep liveMapNew intact, so create a duplicate image
		//ImageProcessor ipTemp = duplicateImage(ipNew);
		
		//Temp = new - old
		//ipTemp.copyBits(ipOld, 0, 0, mode);
		
		//old = new
		//liveMapOld = liveMapNew;
		
		//find pts in old image
		//find pts in new image
		newLocations.clear();
		search(ipNew, newLocations);
		//find pts that are in new btu not old
		Iterator<Point> it = newLocations.iterator();
		while (it.hasNext()) {
			Point p = it.next();
			if (initialLocations.contains(p))
				it.remove();
		}
		
		//ipTemp.resetMinAndMax();
	
		ChatServer.echo(getNewLocations());
	}
	
	
	/**
	 * 
	 */
	void search(ImageProcessor ip, List<Point> list) {

		for (int x = 10; x < 1990; x++) {
			for (int y = 10; y < 1990; y++) {
				int pix = ip.getPixel(x, y);
					
				try {
					//Check if its green
					if (isGreen(pix)) {
						//Check for patterns
						
						if (isGreen(ip.get(x + 1, y)) &&				//XXX
							isGreen(ip.get(x + 2, y)) &&				// X
							isGreen(ip.get(x + 1, y + 1)) &&
							!isGreen(ip.get(x, y + 1)) &&
							!isGreen(ip.get(x + 2, y + 1)) &&
							!isGreen(ip.get(x + 1, y - 1)) &&
							!isGreen(ip.get(x - 1, y)) &&
							!isGreen(ip.get(x + 3, y)) &&
							!isGreen(ip.get(x + 1, y + 2)) &&
							!isGreen(ip.get(x, y - 1)) &&
							!isGreen(ip.get(x + 2, y - 1))) {
							
							checkPoint(x + 1, y, list);
						}						
						
						else if ((	isGreen(ip.get(x, y + 1)) &&		//X
									isGreen(ip.get(x + 1, y + 1)) &&	//XX
									isGreen(ip.get(x, y + 2)) &&		//X
									!isGreen(ip.get(x + 1, y)) &&
									!isGreen(ip.get(x + 1, y + 2)) &&
									!isGreen(ip.get(x - 1, y + 1)) &&
									!isGreen(ip.get(x, y - 1)) &&
									!isGreen(ip.get(x, y + 3)) &&
									!isGreen(ip.get(x + 2, y + 1)) &&
									!isGreen(ip.get(x - 1, y)) &&
									!isGreen(ip.get(x - 1, y + 2))) ||
									
								(	isGreen(ip.get(x - 1, y + 1)) &&	// X
									isGreen(ip.get(x, y + 1)) &&		//XX
									isGreen(ip.get(x, y + 2)) &&		// X
									!isGreen(ip.get(x - 1, y)) &&
									!isGreen(ip.get(x, y + 2)) &&
									!isGreen(ip.get(x + 1, y + 1)) &&
									!isGreen(ip.get(x, y - 1)) &&
									!isGreen(ip.get(x, y + 3)) &&
									!isGreen(ip.get(x - 2, y + 1)) &&
									!isGreen(ip.get(x + 1, y)) &&
									!isGreen(ip.get(x + 1, y + 2))) ||
									
								(	isGreen(ip.get(x - 1, y + 1)) &&	// X
									isGreen(ip.get(x, y + 1)) &&		//XXX
									isGreen(ip.get(x + 1, y + 1)) &&
									!isGreen(ip.get(x - 1, y)) &&
									!isGreen(ip.get(x + 1, y)) &&
									!isGreen(ip.get(x, y + 2)) &&
									!isGreen(ip.get(x - 2, y + 1)) &&
									!isGreen(ip.get(x + 2, y + 1)) &&
									!isGreen(ip.get(x, y - 1)) &&
									!isGreen(ip.get(x, y + 2)) &&
									!isGreen(ip.get(x + 2, y + 2)))) {
								
							
							checkPoint(x, y + 1, list);
							
						}
					}
					
				//This shouldnt happen because I skip the 10 border pixels around the entire map
				} catch (IndexOutOfBoundsException e) {
					continue;
				}
			}
		}
	}
	
	boolean isGreen(int val) {
		return (val == 4 || val == 5);	//not sure why index changed
	}
	
	/*
	void addPoint(int x, int y, Likt<Point> list) {
		Point p = new Point(x, y);
		if (!list.contains(p) && !gy.contains(p)) {
			list.add(p);
		}
	}
	*/
	
	void checkPoint(int x, int y, List<Point> list) {
		Point p = new Point(x, y);
		if (!list.contains(p) && !gy.contains(p)) {
			list.add(p);
		}
	}