$estr = function() { return js.Boot.__string_rec(this,''); }
js = {}
js.Boot = function() { }
js.Boot.__name__ = ["js","Boot"];
js.Boot.__unhtml = function(s) {
	return s.split("&").join("&amp;").split("<").join("&lt;").split(">").join("&gt;");
}
js.Boot.__trace = function(v,i) {
	{
		var msg = (i != null?i.fileName + ":" + i.lineNumber + ": ":"");
		msg += js.Boot.__unhtml(js.Boot.__string_rec(v,"")) + "<br/>";
		var d = document.getElementById("haxe:trace");
		if(d == null) alert("No haxe:trace element defined\n" + msg);
		else d.innerHTML += msg;
	}
}
js.Boot.__clear_trace = function() {
	{
		var d = document.getElementById("haxe:trace");
		if(d != null) d.innerHTML = "";
		else null;
	}
}
js.Boot.__closure = function(o,f) {
	{
		var m = o[f];
		if(m == null) return null;
		var f1 = function() {
			return m.apply(o,arguments);
		}
		f1.scope = o;
		f1.method = m;
		return f1;
	}
}
js.Boot.__string_rec = function(o,s) {
	{
		if(o == null) return "null";
		if(s.length >= 5) return "<...>";
		var t = typeof(o);
		if(t == "function" && (o.__name__ != null || o.__ename__ != null)) t = "object";
		switch(t) {
		case "object":{
			if(o instanceof Array) {
				if(o.__enum__ != null) {
					if(o.length == 2) return o[0];
					var str = o[0] + "(";
					s += "\t";
					{
						var _g1 = 2, _g = o.length;
						while(_g1 < _g) {
							var i = _g1++;
							if(i != 2) str += "," + js.Boot.__string_rec(o[i],s);
							else str += js.Boot.__string_rec(o[i],s);
						}
					}
					return str + ")";
				}
				var l = o.length;
				var i;
				var str = "[";
				s += "\t";
				{
					var _g = 0;
					while(_g < l) {
						var i1 = _g++;
						str += ((i1 > 0?",":"")) + js.Boot.__string_rec(o[i1],s);
					}
				}
				str += "]";
				return str;
			}
			var tostr;
			try {
				tostr = o.toString;
			}
			catch( $e0 ) {
				{
					var e = $e0;
					{
						return "???";
					}
				}
			}
			if(tostr != null && tostr != Object.toString) {
				var s2 = o.toString();
				if(s2 != "[object Object]") return s2;
			}
			var k;
			var str = "{\n";
			s += "\t";
			var hasp = (o.hasOwnProperty != null);
			for( var k in o ) { ;
			if(hasp && !o.hasOwnProperty(k)) continue;
			if(k == "prototype" || k == "__class__" || k == "__super__" || k == "__interfaces__") continue;
			if(str.length != 2) str += ", \n";
			str += s + k + " : " + js.Boot.__string_rec(o[k],s);
			}
			s = s.substring(1);
			str += "\n" + s + "}";
			return str;
		}break;
		case "function":{
			return "<function>";
		}break;
		case "string":{
			return o;
		}break;
		default:{
			return String(o);
		}break;
		}
	}
}
js.Boot.__interfLoop = function(cc,cl) {
	if(cc == null) return false;
	if(cc == cl) return true;
	var intf = cc.__interfaces__;
	if(intf != null) {
		var _g1 = 0, _g = intf.length;
		while(_g1 < _g) {
			var i = _g1++;
			var i1 = intf[i];
			if(i1 == cl || js.Boot.__interfLoop(i1,cl)) return true;
		}
	}
	return js.Boot.__interfLoop(cc.__super__,cl);
}
js.Boot.__instanceof = function(o,cl) {
	{
		try {
			if(o instanceof cl) {
				if(cl == Array) return (o.__enum__ == null);
				return true;
			}
			if(js.Boot.__interfLoop(o.__class__,cl)) return true;
		}
		catch( $e1 ) {
			{
				var e = $e1;
				{
					if(cl == null) return false;
				}
			}
		}
		switch(cl) {
		case Int:{
			return (Math.ceil(o) === o) && isFinite(o);
		}break;
		case Float:{
			return typeof(o) == "number";
		}break;
		case Bool:{
			return (o === true || o === false);
		}break;
		case String:{
			return typeof(o) == "string";
		}break;
		case Dynamic:{
			return true;
		}break;
		default:{
			if(o != null && o.__enum__ == cl) return true;
			return false;
		}break;
		}
	}
}
js.Boot.__init = function() {
	{
		js.Lib.isIE = (document.all != null && window.opera == null);
		js.Lib.isOpera = (window.opera != null);
		Array.prototype.copy = Array.prototype.slice;
		Array.prototype.insert = function(i,x) {
			this.splice(i,0,x);
		}
		Array.prototype.remove = function(obj) {
			var i = 0;
			var l = this.length;
			while(i < l) {
				if(this[i] == obj) {
					this.splice(i,1);
					return true;
				}
				i++;
			}
			return false;
		}
		Array.prototype.iterator = function() {
			return { cur : 0, arr : this, hasNext : function() {
				return this.cur < this.arr.length;
			}, next : function() {
				return this.arr[this.cur++];
			}}
		}
		String.prototype.__class__ = String;
		String.__name__ = ["String"];
		Array.prototype.__class__ = Array;
		Array.__name__ = ["Array"];
		var cca = String.prototype.charCodeAt;
		String.prototype.charCodeAt = function(i) {
			var x = cca.call(this,i);
			if(isNaN(x)) return null;
			return x;
		}
		var oldsub = String.prototype.substr;
		String.prototype.substr = function(pos,len) {
			if(pos != null && pos != 0 && len != null && len < 0) return "";
			if(len == null) len = this.length;
			if(pos < 0) {
				pos = this.length + pos;
				if(pos < 0) pos = 0;
			}
			else if(len < 0) {
				len = this.length + len - pos;
			}
			return oldsub.apply(this,[pos,len]);
		}
		Int = new Object();
		Dynamic = new Object();
		Float = Number;
		Bool = new Object();
		Bool["true"] = true;
		Bool["false"] = false;
		$closure = js.Boot.__closure;
	}
}
js.Boot.prototype.__class__ = js.Boot;
haxe = {}
haxe.Firebug = function() { }
haxe.Firebug.__name__ = ["haxe","Firebug"];
haxe.Firebug.detect = function() {
	try {
		return console != null && console.error != null;
	}
	catch( $e2 ) {
		{
			var e = $e2;
			{
				return false;
			}
		}
	}
}
haxe.Firebug.redirectTraces = function() {
	haxe.Log.trace = $closure(haxe.Firebug,"trace");
	js.Lib.setErrorHandler($closure(haxe.Firebug,"onError"));
}
haxe.Firebug.onError = function(err,stack) {
	var buf = err + "\n";
	{
		var _g = 0;
		while(_g < stack.length) {
			var s = stack[_g];
			++_g;
			buf += "Called from " + s + "\n";
		}
	}
	haxe.Firebug.trace(buf,null);
	return true;
}
haxe.Firebug.trace = function(v,inf) {
	var type = (inf != null && inf.customParams != null?inf.customParams[0]:null);
	if(type != "warn" && type != "info" && type != "debug" && type != "error") type = (inf == null?"error":"log");
	console[type](((inf == null?"":inf.fileName + ":" + inf.lineNumber + " : ")) + Std.string(v));
}
haxe.Firebug.prototype.__class__ = haxe.Firebug;
js.Lib = function() { }
js.Lib.__name__ = ["js","Lib"];
js.Lib.isIE = null;
js.Lib.isOpera = null;
js.Lib.alert = function(v) {
	alert(js.Boot.__string_rec(v,""));
}
js.Lib.eval = function(code) {
	return eval(code);
}
js.Lib.setErrorHandler = function(f) {
	js.Lib.onerror = f;
}
js.Lib.prototype.__class__ = js.Lib;
haxe.Log = function() { }
haxe.Log.__name__ = ["haxe","Log"];
haxe.Log.trace = function(v,infos) {
	js.Boot.__trace(v,infos);
}
haxe.Log.clear = function() {
	js.Boot.__clear_trace();
}
haxe.Log.prototype.__class__ = haxe.Log;
Std = function() { }
Std.__name__ = ["Std"];
Std["is"] = function(v,t) {
	return js.Boot.__instanceof(v,t);
}
Std.string = function(s) {
	return js.Boot.__string_rec(s,"");
}
Std["int"] = function(x) {
	if(x < 0) return Math.ceil(x);
	return Math.floor(x);
}
Std.bool = function(x) {
	return (x !== 0 && x != null && x !== false);
}
Std.parseInt = function(x) {
	{
		var v = parseInt(x);
		if(Math.isNaN(v)) return null;
		return v;
	}
}
Std.parseFloat = function(x) {
	return parseFloat(x);
}
Std.chr = function(x) {
	return String.fromCharCode(x);
}
Std.ord = function(x) {
	if(x == "") return null;
	else return x.charCodeAt(0);
}
Std.random = function(x) {
	return Math.floor(Math.random() * x);
}
Std.resource = function(name) {
	return js.Boot.__res[name];
}
Std.prototype.__class__ = Std;
haxe.Md5 = function() { }
haxe.Md5.__name__ = ["haxe","Md5"];
haxe.Md5.encode = function(s) {
	return haxe.Md5.__jsflash_encode(s);
}
haxe.Md5.bitOR = function(a,b) {
	var lsb = (a & 1) | (b & 1);
	var msb31 = (a >>> 1) | (b >>> 1);
	return (msb31 << 1) | lsb;
}
haxe.Md5.bitXOR = function(a,b) {
	var lsb = (a & 1) ^ (b & 1);
	var msb31 = (a >>> 1) ^ (b >>> 1);
	return (msb31 << 1) | lsb;
}
haxe.Md5.bitAND = function(a,b) {
	var lsb = (a & 1) & (b & 1);
	var msb31 = (a >>> 1) & (b >>> 1);
	return (msb31 << 1) | lsb;
}
haxe.Md5.addme = function(x,y) {
	var lsw = (x & 65535) + (y & 65535);
	var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
	return (msw << 16) | (lsw & 65535);
}
haxe.Md5.rhex = function(num) {
	var str = "";
	var hex_chr = "0123456789abcdef";
	{
		var _g = 0;
		while(_g < 4) {
			var j = _g++;
			str += hex_chr.charAt((num >> (j * 8 + 4)) & 15) + hex_chr.charAt((num >> (j * 8)) & 15);
		}
	}
	return str;
}
haxe.Md5.str2blks = function(str) {
	var nblk = ((str.length + 8) >> 6) + 1;
	var blks = new Array();
	{
		var _g1 = 0, _g = (nblk * 16);
		while(_g1 < _g) {
			var i = _g1++;
			blks[i] = 0;
		}
	}
	var i = 0;
	while(i < str.length) {
		blks[i >> 2] |= str.charCodeAt(i) << (((str.length * 8 + i) % 4) * 8);
		i++;
	}
	blks[i >> 2] |= 128 << (((str.length * 8 + i) % 4) * 8);
	var l = str.length * 8;
	blks[nblk * 16 - 2] = (l & 255);
	blks[nblk * 16 - 2] |= ((l >>> 8) & 255) << 8;
	blks[nblk * 16 - 2] |= ((l >>> 16) & 255) << 16;
	blks[nblk * 16 - 2] |= ((l >>> 24) & 255) << 24;
	return blks;
}
haxe.Md5.rol = function(num,cnt) {
	return (num << cnt) | (num >>> (32 - cnt));
}
haxe.Md5.cmn = function(q,a,b,x,s,t) {
	return haxe.Md5.addme(haxe.Md5.rol((haxe.Md5.addme(haxe.Md5.addme(a,q),haxe.Md5.addme(x,t))),s),b);
}
haxe.Md5.ff = function(a,b,c,d,x,s,t) {
	return haxe.Md5.cmn(haxe.Md5.bitOR(haxe.Md5.bitAND(b,c),haxe.Md5.bitAND((~b),d)),a,b,x,s,t);
}
haxe.Md5.gg = function(a,b,c,d,x,s,t) {
	return haxe.Md5.cmn(haxe.Md5.bitOR(haxe.Md5.bitAND(b,d),haxe.Md5.bitAND(c,(~d))),a,b,x,s,t);
}
haxe.Md5.hh = function(a,b,c,d,x,s,t) {
	return haxe.Md5.cmn(haxe.Md5.bitXOR(haxe.Md5.bitXOR(b,c),d),a,b,x,s,t);
}
haxe.Md5.ii = function(a,b,c,d,x,s,t) {
	return haxe.Md5.cmn(haxe.Md5.bitXOR(c,haxe.Md5.bitOR(b,(~d))),a,b,x,s,t);
}
haxe.Md5.__jsflash_encode = function(str) {
	var x = haxe.Md5.str2blks(str);
	var a = 1732584193;
	var b = -271733879;
	var c = -1732584194;
	var d = 271733878;
	var step;
	var i = 0;
	while(i < x.length) {
		var olda = a;
		var oldb = b;
		var oldc = c;
		var oldd = d;
		step = 0;
		a = haxe.Md5.ff(a,b,c,d,x[i + 0],7,-680876936);
		d = haxe.Md5.ff(d,a,b,c,x[i + 1],12,-389564586);
		c = haxe.Md5.ff(c,d,a,b,x[i + 2],17,606105819);
		b = haxe.Md5.ff(b,c,d,a,x[i + 3],22,-1044525330);
		a = haxe.Md5.ff(a,b,c,d,x[i + 4],7,-176418897);
		d = haxe.Md5.ff(d,a,b,c,x[i + 5],12,1200080426);
		c = haxe.Md5.ff(c,d,a,b,x[i + 6],17,-1473231341);
		b = haxe.Md5.ff(b,c,d,a,x[i + 7],22,-45705983);
		a = haxe.Md5.ff(a,b,c,d,x[i + 8],7,1770035416);
		d = haxe.Md5.ff(d,a,b,c,x[i + 9],12,-1958414417);
		c = haxe.Md5.ff(c,d,a,b,x[i + 10],17,-42063);
		b = haxe.Md5.ff(b,c,d,a,x[i + 11],22,-1990404162);
		a = haxe.Md5.ff(a,b,c,d,x[i + 12],7,1804603682);
		d = haxe.Md5.ff(d,a,b,c,x[i + 13],12,-40341101);
		c = haxe.Md5.ff(c,d,a,b,x[i + 14],17,-1502002290);
		b = haxe.Md5.ff(b,c,d,a,x[i + 15],22,1236535329);
		a = haxe.Md5.gg(a,b,c,d,x[i + 1],5,-165796510);
		d = haxe.Md5.gg(d,a,b,c,x[i + 6],9,-1069501632);
		c = haxe.Md5.gg(c,d,a,b,x[i + 11],14,643717713);
		b = haxe.Md5.gg(b,c,d,a,x[i + 0],20,-373897302);
		a = haxe.Md5.gg(a,b,c,d,x[i + 5],5,-701558691);
		d = haxe.Md5.gg(d,a,b,c,x[i + 10],9,38016083);
		c = haxe.Md5.gg(c,d,a,b,x[i + 15],14,-660478335);
		b = haxe.Md5.gg(b,c,d,a,x[i + 4],20,-405537848);
		a = haxe.Md5.gg(a,b,c,d,x[i + 9],5,568446438);
		d = haxe.Md5.gg(d,a,b,c,x[i + 14],9,-1019803690);
		c = haxe.Md5.gg(c,d,a,b,x[i + 3],14,-187363961);
		b = haxe.Md5.gg(b,c,d,a,x[i + 8],20,1163531501);
		a = haxe.Md5.gg(a,b,c,d,x[i + 13],5,-1444681467);
		d = haxe.Md5.gg(d,a,b,c,x[i + 2],9,-51403784);
		c = haxe.Md5.gg(c,d,a,b,x[i + 7],14,1735328473);
		b = haxe.Md5.gg(b,c,d,a,x[i + 12],20,-1926607734);
		a = haxe.Md5.hh(a,b,c,d,x[i + 5],4,-378558);
		d = haxe.Md5.hh(d,a,b,c,x[i + 8],11,-2022574463);
		c = haxe.Md5.hh(c,d,a,b,x[i + 11],16,1839030562);
		b = haxe.Md5.hh(b,c,d,a,x[i + 14],23,-35309556);
		a = haxe.Md5.hh(a,b,c,d,x[i + 1],4,-1530992060);
		d = haxe.Md5.hh(d,a,b,c,x[i + 4],11,1272893353);
		c = haxe.Md5.hh(c,d,a,b,x[i + 7],16,-155497632);
		b = haxe.Md5.hh(b,c,d,a,x[i + 10],23,-1094730640);
		a = haxe.Md5.hh(a,b,c,d,x[i + 13],4,681279174);
		d = haxe.Md5.hh(d,a,b,c,x[i + 0],11,-358537222);
		c = haxe.Md5.hh(c,d,a,b,x[i + 3],16,-722521979);
		b = haxe.Md5.hh(b,c,d,a,x[i + 6],23,76029189);
		a = haxe.Md5.hh(a,b,c,d,x[i + 9],4,-640364487);
		d = haxe.Md5.hh(d,a,b,c,x[i + 12],11,-421815835);
		c = haxe.Md5.hh(c,d,a,b,x[i + 15],16,530742520);
		b = haxe.Md5.hh(b,c,d,a,x[i + 2],23,-995338651);
		a = haxe.Md5.ii(a,b,c,d,x[i + 0],6,-198630844);
		d = haxe.Md5.ii(d,a,b,c,x[i + 7],10,1126891415);
		c = haxe.Md5.ii(c,d,a,b,x[i + 14],15,-1416354905);
		b = haxe.Md5.ii(b,c,d,a,x[i + 5],21,-57434055);
		a = haxe.Md5.ii(a,b,c,d,x[i + 12],6,1700485571);
		d = haxe.Md5.ii(d,a,b,c,x[i + 3],10,-1894986606);
		c = haxe.Md5.ii(c,d,a,b,x[i + 10],15,-1051523);
		b = haxe.Md5.ii(b,c,d,a,x[i + 1],21,-2054922799);
		a = haxe.Md5.ii(a,b,c,d,x[i + 8],6,1873313359);
		d = haxe.Md5.ii(d,a,b,c,x[i + 15],10,-30611744);
		c = haxe.Md5.ii(c,d,a,b,x[i + 6],15,-1560198380);
		b = haxe.Md5.ii(b,c,d,a,x[i + 13],21,1309151649);
		a = haxe.Md5.ii(a,b,c,d,x[i + 4],6,-145523070);
		d = haxe.Md5.ii(d,a,b,c,x[i + 11],10,-1120210379);
		c = haxe.Md5.ii(c,d,a,b,x[i + 2],15,718787259);
		b = haxe.Md5.ii(b,c,d,a,x[i + 9],21,-343485551);
		a = haxe.Md5.addme(a,olda);
		b = haxe.Md5.addme(b,oldb);
		c = haxe.Md5.addme(c,oldc);
		d = haxe.Md5.addme(d,oldd);
		i += 16;
	}
	return haxe.Md5.rhex(a) + haxe.Md5.rhex(b) + haxe.Md5.rhex(c) + haxe.Md5.rhex(d);
}
haxe.Md5.prototype.__class__ = haxe.Md5;
StringTools = function() { }
StringTools.__name__ = ["StringTools"];
StringTools.urlEncode = function(s) {
	return encodeURIComponent(s);
}
StringTools.urlDecode = function(s) {
	return decodeURIComponent(s.split("+").join(" "));
}
StringTools.htmlEscape = function(s) {
	return s.split("&").join("&amp;").split("<").join("&lt;").split(">").join("&gt;");
}
StringTools.htmlUnescape = function(s) {
	return s.split("&gt;").join(">").split("&lt;").join("<").split("&amp;").join("&");
}
StringTools.startsWith = function(s,start) {
	return (s.length >= start.length && s.substr(0,start.length) == start);
}
StringTools.endsWith = function(s,end) {
	var elen = end.length;
	var slen = s.length;
	return (slen >= elen && s.substr(slen - elen,elen) == end);
}
StringTools.isSpace = function(s,pos) {
	var c = s.charCodeAt(pos);
	return (c >= 9 && c <= 13) || c == 32;
}
StringTools.ltrim = function(s) {
	var l = s.length;
	var r = 0;
	while(r < l && StringTools.isSpace(s,r)) {
		r++;
	}
	if(r > 0) return s.substr(r,l - r);
	else return s;
}
StringTools.rtrim = function(s) {
	var l = s.length;
	var r = 0;
	while(r < l && StringTools.isSpace(s,l - r - 1)) {
		r++;
	}
	if(r > 0) {
		return s.substr(0,l - r);
	}
	else {
		return s;
	}
}
StringTools.trim = function(s) {
	return StringTools.ltrim(StringTools.rtrim(s));
}
StringTools.rpad = function(s,c,l) {
	var sl = s.length;
	var cl = c.length;
	while(sl < l) {
		if(l - sl < cl) {
			s += c.substr(0,l - sl);
			sl = l;
		}
		else {
			s += c;
			sl += cl;
		}
	}
	return s;
}
StringTools.lpad = function(s,c,l) {
	var ns = "";
	var sl = s.length;
	if(sl >= l) return s;
	var cl = c.length;
	while(sl < l) {
		if(l - sl < cl) {
			ns += c.substr(0,l - sl);
			sl = l;
		}
		else {
			ns += c;
			sl += cl;
		}
	}
	return ns + s;
}
StringTools.replace = function(s,sub,by) {
	return s.split(sub).join(by);
}
StringTools.baseEncode = function(s,base) {
	var len = base.length;
	var nbits = 1;
	while(len > 1 << nbits) nbits++;
	if(nbits > 8 || len != 1 << nbits) throw "baseEncode: base must be a power of two.";
	var size = Std["int"]((s.length * 8 + nbits - 1) / nbits);
	var out = new StringBuf();
	var buf = 0;
	var curbits = 0;
	var mask = ((1 << nbits) - 1);
	var pin = 0;
	while(size-- > 0) {
		while(curbits < nbits) {
			curbits += 8;
			buf <<= 8;
			var t = s.charCodeAt(pin++);
			if(t > 255) throw "baseEncode: bad chars";
			buf |= t;
		}
		curbits -= nbits;
		out.addChar(base.charCodeAt((buf >> curbits) & mask));
	}
	return out.toString();
}
StringTools.baseDecode = function(s,base) {
	var len = base.length;
	var nbits = 1;
	while(len > 1 << nbits) nbits++;
	if(nbits > 8 || len != 1 << nbits) throw "baseDecode: base must be a power of two.";
	var size = (s.length * 8 + nbits - 1) / nbits;
	var tbl = new Array();
	{
		var _g = 0;
		while(_g < 256) {
			var i = _g++;
			tbl[i] = -1;
		}
	}
	{
		var _g = 0;
		while(_g < len) {
			var i = _g++;
			tbl[base.charCodeAt(i)] = i;
		}
	}
	var size1 = (s.length * nbits) / 8;
	var out = new StringBuf();
	var buf = 0;
	var curbits = 0;
	var pin = 0;
	while(size1-- > 0) {
		while(curbits < 8) {
			curbits += nbits;
			buf <<= nbits;
			var i = tbl[s.charCodeAt(pin++)];
			if(i == -1) throw "baseDecode: bad chars";
			buf |= i;
		}
		curbits -= 8;
		out.addChar((buf >> curbits) & 255);
	}
	return out.toString();
}
StringTools.hex = function(n,digits) {
	var neg = false;
	if(n < 0) {
		neg = true;
		n = -n;
	}
	var s = n.toString(16);
	s = s.toUpperCase();
	if(digits != null) while(s.length < digits) s = "0" + s;
	if(neg) s = "-" + s;
	return s;
}
StringTools.prototype.__class__ = StringTools;
Hash = function(p) { if( p === $_ ) return; {
	{
		this.h = {}
		if(this.h.__proto__ != null) {
			this.h.__proto__ = null;
			delete(this.h.__proto__);
		}
		else null;
	}
}}
Hash.__name__ = ["Hash"];
Hash.prototype.exists = function(key) {
	try {
		key = "$" + key;
		return this.hasOwnProperty.call(this.h,key);
	}
	catch( $e3 ) {
		{
			var e = $e3;
			{
				
				for(var i in this.h)
					if( i == key ) return true;
			;
				return false;
			}
		}
	}
}
Hash.prototype.get = function(key) {
	return this.h["$" + key];
}
Hash.prototype.h = null;
Hash.prototype.iterator = function() {
	return { ref : this.h, it : this.keys(), hasNext : function() {
		return this.it.hasNext();
	}, next : function() {
		var i = this.it.next();
		return this.ref["$" + i];
	}}
}
Hash.prototype.keys = function() {
	var a = new Array();
	
			for(var i in this.h)
				a.push(i.substr(1));
		;
	return a.iterator();
}
Hash.prototype.remove = function(key) {
	if(!this.exists(key)) return false;
	delete(this.h["$" + key]);
	return true;
}
Hash.prototype.set = function(key,value) {
	this.h["$" + key] = value;
}
Hash.prototype.toString = function() {
	var s = new StringBuf();
	s.add("{");
	var it = this.keys();
	{ var $it4 = it;
	while( $it4.hasNext() ) { var i = $it4.next();
	{
		s.add(i);
		s.add(" => ");
		s.add(Std.string(this.get(i)));
		if(it.hasNext()) s.add(", ");
	}
	}}
	s.add("}");
	return s.toString();
}
Hash.prototype.__class__ = Hash;
List = function(p) { if( p === $_ ) return; {
	this.length = 0;
}}
List.__name__ = ["List"];
List.prototype.add = function(item) {
	var x = [item,null];
	if(this.h == null) this.h = x;
	else this.q[1] = x;
	this.q = x;
	this.length++;
}
List.prototype.clear = function() {
	this.h = null;
	this.length = 0;
}
List.prototype.filter = function(f) {
	var l2 = new List();
	var l = this.h;
	while(l != null) {
		var v = l[0];
		l = l[1];
		if(f(v)) l2.add(v);
	}
	return l2;
}
List.prototype.first = function() {
	return (this.h == null?null:this.h[0]);
}
List.prototype.h = null;
List.prototype.isEmpty = function() {
	return (this.h == null);
}
List.prototype.iterator = function() {
	return { h : this.h, hasNext : function() {
		return (this.h != null);
	}, next : function() {
		{
			if(this.h == null) return null;
			var x = this.h[0];
			this.h = this.h[1];
			return x;
		}
	}}
}
List.prototype.join = function(sep) {
	var s = new StringBuf();
	var first = true;
	var l = this.h;
	while(l != null) {
		if(first) first = false;
		else s.add(sep);
		s.add(l[0]);
		l = l[1];
	}
	return s.toString();
}
List.prototype.last = function() {
	return (this.q == null?null:this.q[0]);
}
List.prototype.length = null;
List.prototype.map = function(f) {
	var b = new List();
	var l = this.h;
	while(l != null) {
		var v = l[0];
		l = l[1];
		b.add(f(v));
	}
	return b;
}
List.prototype.pop = function() {
	if(this.h == null) return null;
	var x = this.h[0];
	this.h = this.h[1];
	if(this.h == null) this.q = null;
	this.length--;
	return x;
}
List.prototype.push = function(item) {
	var x = [item,this.h];
	this.h = x;
	if(this.q == null) this.q = x;
	this.length++;
}
List.prototype.q = null;
List.prototype.remove = function(v) {
	var prev = null;
	var l = this.h;
	while(l != null) {
		if(l[0] == v) {
			if(prev == null) this.h = l[1];
			else prev[1] = l[1];
			if(this.q == l) this.q = prev;
			this.length--;
			return true;
		}
		prev = l;
		l = l[1];
	}
	return false;
}
List.prototype.toString = function() {
	var s = new StringBuf();
	var first = true;
	var l = this.h;
	s.add("{");
	while(l != null) {
		if(first) first = false;
		else s.add(", ");
		s.add(l[0]);
		l = l[1];
	}
	s.add("}");
	return s.toString();
}
List.prototype.__class__ = List;
js.fx = {}
js.fx.Tool = function() { }
js.fx.Tool.__name__ = ["js","fx","Tool"];
js.fx.Tool.nextElement = function(node) {
	var next = node.nextSibling;
	while(next != null && next.nodeName != node.nodeName) next = next.nextSibling;
	return next;
}
js.fx.Tool.prevElement = function(node) {
	var prev = node.previousSibling;
	while(prev != null && prev.nodeName != node.nodeName) prev = prev.previousSibling;
	return prev;
}
js.fx.Tool.placeBefore = function(newNode,oldNode) {
	if(newNode.parentNode != null) newNode.parentNode.removeChild(newNode);
	oldNode.parentNode.insertBefore(newNode,oldNode);
}
js.fx.Tool.placeAfter = function(newNode,oldNode) {
	if(newNode.parentNode != null) newNode.parentNode.removeChild(newNode);
	if(oldNode.nextSibling == null) oldNode.parentNode.appendChild(newNode);
	else oldNode.parentNode.insertBefore(newNode,oldNode.nextSibling);
}
js.fx.Tool.trace = function(x) {
	js.Lib.document.getElementById("trace").innerHTML = Std.string(x);
}
js.fx.Tool.addCssClass = function(e,c) {
	if(e.className.indexOf(c) == -1) e.className = e.className + " " + c;
}
js.fx.Tool.removeCssClass = function(e,c) {
	if(e.className.indexOf(c) != -1) e.className = StringTools.replace(e.className,c,"");
}
js.fx.Tool.preventDefault = function(evt) {
	if(evt == null) evt = js.Lib.window.event;
	if(evt.preventDefault != null) evt.preventDefault();
	else evt.returnValue = false;
	return false;
}
js.fx.Tool.cancelBubble = function(evt) {
	if(evt == null) evt = js.Lib.window.event;
	if(evt.stopPropagation != null) evt.stopPropagation();
	else evt.cancelBubble = true;
	return false;
}
js.fx.Tool.findElementsWithClassName = function(parent,tag,className) {
	if(parent == null) parent = js.Lib.document.body;
	if(tag == null) tag = "*";
	var elements = (tag == "*" && parent.all != null?parent.all:parent.getElementsByTagName(tag));
	var results = new List();
	var regexp = new EReg("(^|\\s)" + className + "(\\s|$)","");
	{
		var _g1 = 0, _g = elements.length;
		while(_g1 < _g) {
			var i = _g1++;
			if(Std.string(elements[i].className) == "") continue;
			if(regexp.match("" + elements[i].className)) results.push(elements[i]);
		}
	}
	return results;
}
js.fx.Tool.prototype.__class__ = js.fx.Tool;
EReg = function(r,opt) { if( r === $_ ) return; {
	opt = opt.split("u").join("");
	this.r = new RegExp(r,opt);
}}
EReg.__name__ = ["EReg"];
EReg.prototype.customReplace = function(s,f) {
	var buf = new StringBuf();
	while(true) {
		if(!this.match(s)) break;
		buf.add(this.matchedLeft());
		buf.add(f(this));
		s = this.matchedRight();
	}
	buf.add(s);
	return buf.toString();
}
EReg.prototype.match = function(s) {
	{
		this.r.m = this.r.exec(s);
		this.r.s = s;
		this.r.l = RegExp.leftContext;
		this.r.r = RegExp.rightContext;
		return (this.r.m != null);
	}
}
EReg.prototype.matched = function(n) {
	return (this.r.m != null && n >= 0 && n < this.r.m.length?this.r.m[n]:function($this) {
		var $r;
		throw "EReg::matched";
		return $r;
	}(this));
}
EReg.prototype.matchedLeft = function() {
	{
		if(this.r.m == null) throw "EReg::matchedLeft";
		if(this.r.l == null) return this.r.s.substr(0,this.r.m.index);
		return this.r.l;
	}
}
EReg.prototype.matchedPos = function() {
	if(this.r.m == null) throw "EReg::matchedPos";
	return { pos : this.r.m.index, len : this.r.m[0].length}
}
EReg.prototype.matchedRight = function() {
	{
		if(this.r.m == null) throw "EReg::matchedRight";
		if(this.r.r == null) {
			var sz = this.r.m.index + this.r.m[0].length;
			return this.r.s.substr(sz,this.r.s.length - sz);
		}
		return this.r.r;
	}
}
EReg.prototype.r = null;
EReg.prototype.replace = function(s,by) {
	return s.replace(this.r,by);
}
EReg.prototype.split = function(s) {
	var d = "#__delim__#";
	return s.replace(this.r,d).split(d);
}
EReg.prototype.__class__ = EReg;
js.Application = function() { }
js.Application.__name__ = ["js","Application"];
js.Application.main = function() {
	if(haxe.Firebug.detect()) haxe.Firebug.redirectTraces();
	js.JSLib.main();
	js.JSLib.addListener("JSLib.DOM_READY",$closure(js.Application,"init"));
}
js.Application.setContent = function(ob,content) {
	ob.innerHTML = content;
}
js.Application.handleLoginClick = function(e) {
	var accountForm = js.Lib.document.getElementById("accountForm");
	var accountUsername = js.Lib.document.getElementById("user[username]");
	var accountPassword = js.Lib.document.getElementById("user[password]");
	var accountButton = js.Lib.document.getElementById("loginButton");
	if((accountPassword.value != "" && accountUsername.value != "") || accountButton.value == "Logout") {
		accountPassword.value = haxe.Md5.encode(accountPassword.value);
		accountForm.submit();
	}
	else {
		js.Lib.alert("Please fill in your login details and try again");
	}
}
js.Application.handleFormSubmit = function(e) {
	js.Application.handleLoginClick(e);
	return js.fx.Tool.cancelBubble(e);
}
js.Application.init = function() {
	var accountForm = js.Lib.document.getElementById("accountForm");
	accountForm.onsubmit = $closure(js.Application,"handleFormSubmit");
}
js.Application.prototype.__class__ = js.Application;
StringBuf = function(p) { if( p === $_ ) return; {
	this.b = "";
}}
StringBuf.__name__ = ["StringBuf"];
StringBuf.prototype.add = function(x) {
	this.b += x;
}
StringBuf.prototype.addChar = function(c) {
	this.b += String.fromCharCode(c);
}
StringBuf.prototype.addSub = function(s,pos,len) {
	this.b += s.substr(pos,len);
}
StringBuf.prototype.b = null;
StringBuf.prototype.toString = function() {
	return this.b;
}
StringBuf.prototype.__class__ = StringBuf;
js.JSLib = function() { }
js.JSLib.__name__ = ["js","JSLib"];
js.JSLib.initialize = function() {
	if(js.JSLib.INITIALIZED) return;
	js.JSLib.INITIALIZED = true;
	if(haxe.Firebug.detect()) haxe.Firebug.redirectTraces();
	{
		if(document.addEventListener) {
			document.addEventListener("DOMContentLoaded",function() {
				document.removeEventListener("DOMContentLoaded",arguments.callee,false);
				js.JSLib.ready();
			},false);
		}
		else if(document.attachEvent) {
			document.attachEvent("onreadystatechange",function() {
				if(document.readyState == "complete") {
					document.detachEvent("onreadystatechange",arguments.callee);
					js.JSLib.ready();
				}
			});
			if(document.documentElement.doScroll && window == window.top) (function() {
				if(js.JSLib.DOM_IS_READY) return;
				try {
					document.documentElement.doScroll("left");
				}
				catch( $e5 ) {
					{
						var error = $e5;
						{
							setTimeout(arguments.callee,0);
							return;
						}
					}
				}
				js.JSLib.ready();
			})();
		}
		window.onload = $closure(js.JSLib,"ready");
	}
}
js.JSLib.main = function() {
	js.JSLib.initialize();
}
js.JSLib.addListener = function(evt,meth) {
	if(!js.JSLib.listeners.exists(evt)) js.JSLib.listeners.set(evt,new Array());
	js.JSLib.listeners.get(evt).push(meth);
}
js.JSLib.ready = function() {
	if(!js.JSLib.DOM_IS_READY) {
		js.JSLib.DOM_IS_READY = true;
		{
			var _g = 0, _g1 = js.JSLib.listeners.get("JSLib.DOM_READY");
			while(_g < _g1.length) {
				var a = _g1[_g];
				++_g;
				a();
			}
		}
	}
}
js.JSLib.prototype.__class__ = js.JSLib;
IntIter = function(min,max) { if( min === $_ ) return; {
	this.min = min;
	this.max = max;
}}
IntIter.__name__ = ["IntIter"];
IntIter.prototype.hasNext = function() {
	return this.min < this.max;
}
IntIter.prototype.max = null;
IntIter.prototype.min = null;
IntIter.prototype.next = function() {
	return this.min++;
}
IntIter.prototype.__class__ = IntIter;
$Main = function() { }
$Main.__name__ = ["@Main"];
$Main.prototype.__class__ = $Main;
$_ = {}
js.Boot.__res = {}
js.Boot.__init();
{
	
			onerror = function(msg,url,line) {
				var f = js.Lib.onerror;
				if( f == null )
					return false;
				return f(msg,[url+":"+line]);
			}
		;
}
{
	Math.NaN = Number["NaN"];
	Math.NEGATIVE_INFINITY = Number["NEGATIVE_INFINITY"];
	Math.POSITIVE_INFINITY = Number["POSITIVE_INFINITY"];
	Math.isFinite = function(i) {
		return isFinite(i);
	}
	Math.isNaN = function(i) {
		return isNaN(i);
	}
}
js.Lib.document = document;
js.Lib.window = window;
js.Lib.onerror = null;
js.JSLib.DOM_READY = "JSLib.DOM_READY";
js.JSLib.listeners = new Hash();
js.JSLib.INITIALIZED = false;
js.JSLib.DOM_IS_READY = false;
$Main.init = js.Application.main();
