// Path: src/input/Event.java
// public class Event {
// 	public static enum EventType {
// 		Key(1<<0),
// 		Mouse(1<<1),
// 		Custom(1<<2);
// 		
// 		private EventType(int mask) {
// 			mMask = mask;
// 		}
// 		
// 		public int getMask() {
// 			return mMask;
// 		}
// 		
// 		private int mMask;
// 	}
// 	
// 	public static abstract class Listener {
// 		public Listener(int mask) {mMask = mask;}
// 		public int getMask() {return mMask;} //accepted event types
// 		public abstract void onEvent(Event e);
// 		private int mMask;
// 	}
// 	
// 	public static class Signal {
// 		public void connect(Listener l) {
// 			mListeners.add(l);
// 		}
// 		
// 		public void fire(Event e) {
// 			for (Listener l : mListeners)
// 				if ((e.getEventMask() & l.getMask()) != 0) {
// 					l.onEvent(e);
// 					if (e.consumed())
// 						break;
// 				}
// 		}
// 		
// 		private ArrayList<Listener> mListeners = new ArrayList<Listener>();
// 	}
// 	
// 	public Event(EventType type, Input input) {
// 		mEventType = type;
// 		mInput = input;
// 	}
// 	
// 	public EventType getEventType() {
// 		return mEventType;
// 	}
// 	
// 	public int getEventMask() {
// 		return mEventType.getMask();
// 	}
// 	
// 	public boolean consumed() {
// 		return mConsumed;
// 	}
// 	
// 	public void consume() {
// 		mConsumed = true;
// 	}
// 	
// 	public Input getInput() {
// 		return mInput;
// 	}
// 	
// 	private Input mInput;
// 	private boolean mConsumed = false;
// 	private EventType mEventType;
// }


import java.awt.*;
import gui.*;
import input.*;
import input.Event;
import util.*;
			public void onMouseEvent(MouseEvent e) {
				mSq.setColor(Color.yellow);
			}
		});
		mSq.onMouseLeave.connect(new MouseEvent.Listener() {
			public void onMouseEvent(MouseEvent e) {
				mSq.setColor(Color.red);
			}
		});
		mSq.onMouseMove.connect(new MouseEvent.Listener() {
			public void onMouseEvent(MouseEvent e) {
				if (e.getInput().getButton(MouseEvent.MouseButton.Left))
					mSq.setPos(new UDim(e.getInput().getMousePos().fvec().sub(new FVec(50, 50))));
			}
		});
		//
		mRoot.invokeLayout(new Vec(300, 300));
	}
	
	public void onStep() {
		//System.out.println("Step..\n");
		mRoot.invokeRender(getRenderTarget());
		render();
		int h = getInput().getKeyState(KeyEvent.Key.Right) ? 3 : 0;
		h += getInput().getKeyState(KeyEvent.Key.Left) ? -3 : 0;
		int v = getInput().getKeyState(KeyEvent.Key.Down) ? 3 : 0;
		v += getInput().getKeyState(KeyEvent.Key.Up) ? -3 : 0;
		mSq.setPos(new UDim(mSq.getPos().getOffset().add(new FVec(h, v))));
	}
	
// Path: src/input/Event.java
// public class Event {
// 	public static enum EventType {
// 		Key(1<<0),
// 		Mouse(1<<1),
// 		Custom(1<<2);
// 		
// 		private EventType(int mask) {
// 			mMask = mask;
// 		}
// 		
// 		public int getMask() {
// 			return mMask;
// 		}
// 		
// 		private int mMask;
// 	}
// 	
// 	public static abstract class Listener {
// 		public Listener(int mask) {mMask = mask;}
// 		public int getMask() {return mMask;} //accepted event types
// 		public abstract void onEvent(Event e);
// 		private int mMask;
// 	}
// 	
// 	public static class Signal {
// 		public void connect(Listener l) {
// 			mListeners.add(l);
// 		}
// 		
// 		public void fire(Event e) {
// 			for (Listener l : mListeners)
// 				if ((e.getEventMask() & l.getMask()) != 0) {
// 					l.onEvent(e);
// 					if (e.consumed())
// 						break;
// 				}
// 		}
// 		
// 		private ArrayList<Listener> mListeners = new ArrayList<Listener>();
// 	}
// 	
// 	public Event(EventType type, Input input) {
// 		mEventType = type;
// 		mInput = input;
// 	}
// 	
// 	public EventType getEventType() {
// 		return mEventType;
// 	}
// 	
// 	public int getEventMask() {
// 		return mEventType.getMask();
// 	}
// 	
// 	public boolean consumed() {
// 		return mConsumed;
// 	}
// 	
// 	public void consume() {
// 		mConsumed = true;
// 	}
// 	
// 	public Input getInput() {
// 		return mInput;
// 	}
// 	
// 	private Input mInput;
// 	private boolean mConsumed = false;
// 	private EventType mEventType;
// }


// Path: src/main/TestApp.java
import java.awt.*;
import gui.*;
import input.*;
import input.Event;
import util.*;

			public void onMouseEvent(MouseEvent e) {
				mSq.setColor(Color.yellow);
			}
		});
		mSq.onMouseLeave.connect(new MouseEvent.Listener() {
			public void onMouseEvent(MouseEvent e) {
				mSq.setColor(Color.red);
			}
		});
		mSq.onMouseMove.connect(new MouseEvent.Listener() {
			public void onMouseEvent(MouseEvent e) {
				if (e.getInput().getButton(MouseEvent.MouseButton.Left))
					mSq.setPos(new UDim(e.getInput().getMousePos().fvec().sub(new FVec(50, 50))));
			}
		});
		//
		mRoot.invokeLayout(new Vec(300, 300));
	}
	
	public void onStep() {
		//System.out.println("Step..\n");
		mRoot.invokeRender(getRenderTarget());
		render();
		int h = getInput().getKeyState(KeyEvent.Key.Right) ? 3 : 0;
		h += getInput().getKeyState(KeyEvent.Key.Left) ? -3 : 0;
		int v = getInput().getKeyState(KeyEvent.Key.Down) ? 3 : 0;
		v += getInput().getKeyState(KeyEvent.Key.Up) ? -3 : 0;
		mSq.setPos(new UDim(mSq.getPos().getOffset().add(new FVec(h, v))));
	}
	
	public void onEvent(Event e) {