diff --git a/Elm.cabal b/Elm.cabal
--- a/Elm.cabal
+++ b/Elm.cabal
@@ -1,6 +1,6 @@
 
 Name:                Elm
-Version:             0.4.0.4
+Version:             0.5.0
 Synopsis:            The Elm language module.
 Description:         Elm aims to make client-side web-development more pleasant.
                      It is a statically/strongly typed, functional reactive
@@ -22,7 +22,7 @@
 Build-type:          Simple
 
 Extra-source-files:  changelog.txt
-Data-files:          elm-runtime-0.4.0.4.js
+Data-files:          elm-runtime-0.5.0.js
 Cabal-version:       >=1.8
 
 source-repository head
@@ -63,7 +63,7 @@
                        transformers >= 0.2,
                        mtl >= 2,
                        parsec >= 3.1.1,
-                       blaze-html == 0.5.0.*,
+                       blaze-html == 0.5.*,
                        blaze-markup == 0.5.1.*,
                        deepseq,
                        text,
@@ -106,7 +106,7 @@
                        transformers >= 0.2,
                        mtl >= 2,
                        parsec >= 3.1.1,
-                       blaze-html == 0.5.0.*,
+                       blaze-html == 0.5.*,
                        blaze-markup == 0.5.1.*,
                        deepseq,
                        cmdargs,
diff --git a/changelog.txt b/changelog.txt
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,4 +1,33 @@
 
+Release 0.5.0
+=============
+
+* Add Dict, Set, and Automaton libraries!
+
+* Add (,,) notation for creating tuples.
+
+* Redo HTTP library, allowing any kind of request and more flexibility.
+
+* Remove the library prefixes `Data.`, `Graphics.`, and `Signal.` because
+  they were more confusing than helpful.
+
+* Better type error reporting for ambiguous uses of variables and for
+  variables in aliased modules.
+
+* Add `readInt` and `readFloat` functions.
+* Add `complement` function to compute complementary colors.
+* Ensure that `String` is treated as an alias of `[Char]`.
+
+* Fix bug in pattern parsing. `A B _ _` was parsed as `A (B _ _)`.
+* Make pattern matching a bit more compact in generated code.
+* Make generated JS more readable.
+
+* The Haskell API exports the absolute path to the Elm runtime
+  system (with the corresponding version number). This makes it easier
+  to run Elm programs with less setup.
+
+
+
 Release 0.4.0
 =============
 
diff --git a/elm-runtime-0.4.0.4.js b/elm-runtime-0.4.0.4.js
deleted file mode 100644
--- a/elm-runtime-0.4.0.4.js
+++ /dev/null
@@ -1,90 +0,0 @@
-var Guid=function(){var g=0;return{guid:function(){return g+=1}}}(),Foreign=function(){var g=function(a){for(var b=["Nil"],c=a.length;c--;)b=["Cons",a[c],b];return b},c=function(a){for(var b=[];"Cons"===a[0];)b.push(a[1]),a=a[2];return b},b=function(a){return a.slice(1)},a=function(a){return["Tuple"+a.length].concat(a)};return{JavaScript:{castJSBoolToBool:function(a){return a},castBoolToJSBool:function(a){return a},castJSNumberToFloat:function(a){return a},castFloatToJSNumber:function(a){return a},
-castJSNumberToInt:function(a){return~~a},castIntToJSNumber:function(a){return a},Experimental:{castJSElementToElement:function(a){return function(b){return function(c){return["Element",Guid.guid(),["EExternalHtml",c],a,b,1,Nothing,Nothing]}}},castElementToJSElement:function(a){return Render.render(a)}},castJSArrayToList:g,castListToJSArray:c,castJSStringToString:g,castStringToJSString:function(a){return"string"===typeof a?a:c(a).join("")},castTupleToJSTuple2:b,castTupleToJSTuple3:b,castTupleToJSTuple4:b,
-castTupleToJSTuple5:b,castJSTupleToTuple2:a,castJSTupleToTuple3:a,castJSTupleToTuple4:a,castJSTupleToTuple5:a}}}(),ElmJSON=function(){function g(a){return function(h){function f(a){switch(a[0]){case "JsonNull":return null;case "JsonString":return b.castStringToJSString(a[1]);case "JsonObject":var j={},a=a[1][1],l;for(l in a)j[l]=f(a[l]);return j;case "JsonArray":j=b.castListToJSArray(a[1]);for(l=j.length;l--;)j[l]=f(j[l]);return j;default:return a[1]}}return JSON.stringify(f(["JsonObject",h]),null,
-b.castStringToJSString(a))}}function c(a){function h(a){switch(typeof a){case "string":return["JsonString",b.castJSStringToString(a)];case "number":return["JsonNumber",b.castJSNumberToFloat(a)];case "boolean":return["JsonBool",b.castJSBoolToBool(a)];case "object":if(null===a)return["JsonNull"];for(var j in a)a[j]=h(a[j]);return a instanceof Array?["JsonArray",b.castJSArrayToList(a)]:["JsonObject",["JSON",a]]}}var a=JSON.parse(a),f;for(f in a)a[f]=h(a[f]);return["JSON",a]}var b=Foreign.JavaScript;
-return{empty:["JSON",{}],singleton:function(a){return function(h){var f={};f[b.castStringToJSString(a)]=h;return["JSON",f]}},insert:function(a){return function(h){return function(f){var f=f[1],c={},j;for(j in f)c[j]=f[j];c[b.castStringToJSString(a)]=h;return["JSON",c]}}},lookup:function(a){return function(c){var f=b.castStringToJSString(a);return c[1].hasOwnProperty(f)?Just(c[1][f]):Nothing}},findWithDefault:function(a){return function(c){return function(f){var g=b.castStringToJSString(c);return f[1].hasOwnProperty(g)?
-f[1][g]:a}}},remove:function(a){return function(c){var c=c[1],f={},g;for(g in c)f[g]=c[g];delete f[b.castStringToJSString(a)];return["JSON",f]}},toPrettyJSString:g,toJSString:g(""),fromJSString:c,toPrettyString:function(a){return function(c){return b.castJSStringToString(g(a)(c))}},toString:function(a){return b.castJSStringToString(g("")(a))},fromString:function(a){return c(b.castStringToJSString(a))},toList:function(a){var a=a[1],c=[],f;for(f in a)c.push(Value.Tuple(b.castJSStringToString(f),a[f]));
-return b.castJSArrayToList(c)},fromList:function(a){for(var a=b.castListToJSArray(a),c={},f=a.length;f--;)c[b.castStringToJSString(a[f][1])]=a[f][2];return["JSON",c]},JsonString:function(a){return["JsonString",a]},JsonNumber:function(a){return["JsonNumber",a]},JsonBool:function(a){return["JsonBool",a]},JsonNull:["JsonNull"],JsonArray:function(a){return["JsonArray",a]},JsonObject:function(a){return["JsonObject",a]}}}();Foreign.JavaScript.JSON=ElmJSON;
-var Value=function(){function g(a){if(0==a.length)return a;for(var a=a.replace(/"/g,"&#34;").replace(/'/g,"&#39;").replace(/</g,"&#60;").replace(/>/g,"&#62;").replace(/\n/g,"<br/>"),a=a.split("<br/>"),b=a.length;b--;){var c=a,g=b,j;j=a[b];if(0!=j.length){j=j.split("");" "==j[0]&&(j[0]="&nbsp;");for(var l=j.length;--l;)" "==j[l][0]&&" "==j[l-1]&&(j[l-1]+=j[l],j[l]="");for(l=j.length;l--;)if(1<j[l].length&&" "==j[l][0]){for(var d=j[l].split(""),e=d.length-2;0<=e;e-=2)d[e]="&nbsp;";j[l]=d.join("")}j=
-j.join("")}c[g]=j}return a.join("<br/>")}var c=function(a,b){if("object"===typeof a){if(a===b)return!0;if(a.length!==b.length)return!1;for(var f=a.length;f--;)if(!c(a[f],b[f]))return!1;return!0}return a===b},b=function(a){if("boolean"===typeof a)return a?"True":"False";if("number"!==typeof a){if("string"===typeof a&&2>a.length)return"'"+a+"'";if(a[0]){if("Tuple"===a[0].substring(0,5)){for(var c="",f=a.length;--f;)c=","+b(a[f])+c;","===c[0]&&(c=c.substring(1));return"("+c+")"}if("Cons"===a[0])for(var f=
-"string"===typeof a[1]?'"':"]",g="string"===typeof a[1]?"":",",j="string"===typeof a[1]?function(a){return a}:b,c=("string"===typeof a[1]?'"':"[")+j(a[1]),a=a[2];;)if("Cons"===a[0])c+=g+j(a[1]),a=a[2];else return c+f;else{if("Nil"===a[0])return"[]";if("JSON"===a[0])return"(JSON.fromList "+b(ElmJSON.toList(a))+")";c="";for(f=a.length;--f;)c=" "+b(a[f])+c;c=a[0]+c;return 1<a.length?"("+c+")":c}}}return a+""};return{eq:c,str:function(a){for(var b=["Nil"],c=a.length;c--;)b=["Cons",a[c],b];return b},show:function(a){return Text.monospace(g(b(a)))},
-Tuple:function(){var a=arguments.length,b=Array(a+1);for(b[0]="Tuple"+arguments.length;a--;)b[a+1]=arguments[a];return b},append:function(a,b){if("string"===typeof a&&"string"===typeof b)return a.concat(b);if("Nil"===a[0])return b;for(var c=["Cons",a[1],["Nil"]],g=c,a=a[2];"Cons"===a[0];)g[2]=["Cons",a[1],["Nil"]],a=a[2],g=g[2];g[2]=b;return c},listToArray:function(a){for(var b=[];"Cons"===a[0];)b.push(a[1]),a=a[2];return b},toText:function(a){if("string"===typeof a)return g(a);for(var b=[];"Cons"===
-a[0];)b.push(a[1]),a=a[2];return g(b.join(""))},properEscape:g,getTextSize:function(a,b,c){var g=document.createElement("div");g.innerHTML=c;g.style.textAlign="left";0<a&&(g.style.width=a+"px");g.style.visibility="hidden";g.style.styleFloat="left";g.style.cssFloat="left";document.body.appendChild(g);c=window.getComputedStyle(g);a=c.getPropertyValue("width").slice(0,-2)-0;c=c.getPropertyValue("height").slice(0,-2)-0;document.body.removeChild(g);delete g;return[Math.ceil(a),Math.ceil(Math.max(b,c))]},
-getSize:function(a){a=a.cloneNode(!0);a.style.visibility="hidden";a.style.styleFloat="left";a.style.cssFloat="left";document.body.appendChild(a);var b=a.offsetWidth,c=a.offsetHeight;document.body.removeChild(a);delete a;return[b,c]},getExcess:function(a){a=a.cloneNode(!0);a.style.visibility="hidden";a.style.styleFloat="left";a.style.cssFloat="left";document.body.appendChild(a);var b=a.offsetWidth,c=a.offsetHeight,g=window.getComputedStyle(a),j=g.getPropertyValue("width").slice(0,-2)-0,g=g.getPropertyValue("height").slice(0,
--2)-0;document.body.removeChild(a);delete a;return[b-j,c-g]},groupForms:function(a){for(var a=Foreign.JavaScript.castListToJSArray(a),b=[],c=[],g=a.length;g--;){var j=a[g];switch(j[4][0]){case "FElement":0<c.length&&(b.push(c),c=[]);b.push(j);break;default:c.push(j)}}0<c.length&&b.push(c);return b}}}(),List=function(){function g(a){return function(b){if("Nil"===b[0])return b;"Cons"!==b[0]&&d("map");for(var i=["Cons",a(b[1]),["Nil"]],e=i,b=b[2];"Cons"===b[0];)e[2]=["Cons",a(b[1]),["Nil"]],b=b[2],e=
-e[2];return i}}function c(a){return function(b){return function(i){var e=b;if("Nil"===i[0])return e;for("Cons"!==i[0]&&d("foldl");"Cons"===i[0];)e=a(i[1])(e),i=i[2];return e}}}function b(a){return function(b){return function(i){var e=b;if("Nil"===i[0])return e;"Cons"!==i[0]&&d("foldr");for(var c=[];"Cons"===i[0];)c.push(i[1]),i=i[2];for(i=c.length;i--;)e=a(c[i])(e);return e}}}function a(a){return function(d){var i;"Cons"!==d[0]?i=void 0:(i=d[1],d=d[2],i=c(a)(i)(d));return i}}function h(a){return function(b){return function(i){if("Nil"===
-i[0])return["Cons",b,["Nil"]];"Cons"!==i[0]&&d("scanl");for(var e=[b];"Cons"===i[0];)b=a(i[1])(b),e.push(b),i=i[2];for(var i=["Nil"],c=e.length;c--;)i=["Cons",e[c],i];return i}}}function f(a){return function(d){a:{for(var i=[function(a){return"Nil"!==a[0]?void 0:["Tuple2",["Nil"],["Nil"]]},function(d){if("Cons"===d[0]){var b=d[1],d=d[2];var i=f(a)(d);"Tuple2"!==i[0]?b=void 0:(d=i[1],i=i[2],b=a(b)?["Tuple2",["Cons",b,d],i]:["Tuple2",d,["Cons",b,i]]);return b}}],b=i.length;b--;){var e=i[b](d);if(void 0!==
-e){d=e;break a}}d=void 0}return d}}function n(a){a:{for(var d=[function(a){return"Nil"!==a[0]?void 0:["Tuple2",["Nil"],["Nil"]]},function(a){if("Cons"!==a[0])a=void 0;else if(a=["Tuple2",a[1],n(a[2])],"Tuple2"!==a[0]||"Tuple2"!==a[1][0])a=void 0;else var d=a[1][1],b=a[1][2],a="Tuple2"!==a[2][0]?void 0:["Tuple2",["Cons",d,a[2][1]],["Cons",b,a[2][2]]];return a}],b=d.length;b--;){var e=d[b](a);if(void 0!==e){a=e;break a}}a=void 0}return a}function j(a){return function(d){a:{for(var b=[function(a){return"Nil"!==
-a[0]?void 0:["Nil"]},function(a){if("Cons"===a[0]){var d=a[1];return"Nil"!==a[2][0]?void 0:["Cons",d,["Nil"]]}},function(d){if("Cons"===d[0]){var b=d[1];if("Cons"===d[2][0]){var i=d[2][1],d=d[2][2];return["Cons",b,["Cons",a,j(a)(["Cons",i,d])]]}}}],e=b.length;e--;){var c=b[e](d);if(void 0!==c){d=c;break a}}d=void 0}return d}}function l(a){return function(d){a:{for(var b=[function(a){return"Nil"!==a[0]?void 0:["Nil"]},function(a){if("Cons"===a[0]){var d=a[1];return"Nil"!==a[2][0]?void 0:d}},function(d){if("Cons"===
-d[0]){var b=d[1];if("Cons"===d[2][0]){var e=d[2][1],d=d[2][2];return Value.append(b,Value.append(a,l(a)(["Cons",e,d])))}}}],e=b.length;e--;){var c=b[e](d);if(void 0!==c){d=c;break a}}d=void 0}return d}}var d=function(a){throw"Function '"+a+"' expecting a list!";},e=c(function(a){return function(d){return["Cons",a,d]}})(["Nil"]),u=b(function(a){return function(d){return Value.append(a,d)}})(["Nil"]),q=c(function(a){return function(d){return a&&d}})(!0),s=c(function(a){return function(d){return a||
-d}})(!1),k=c(function(a){return function(d){return a+d}})(0),m=c(function(a){return function(d){return a*d}})(1),r=a(function(a){return function(d){return Math.max(a,d)}}),v=a(function(a){return function(d){return Math.min(a,d)}});return{head:function(a){if("Cons"!==a[0])throw"Error: 'head' only accepts lists of length greater than one.";return a[1]},tail:function(a){if("Cons"!==a[0])throw"Error: 'tail' only accepts lists of length greater than one.";return a[2]},last:function(a){if("Cons"!==a[0])throw"Error: 'last' only accepts lists of length greater than one.";
-for(var d=a[1];"Cons"===a[0];)d=a[1],a=a[2];return d},map:g,foldl:c,foldr:b,foldl1:a,foldr1:function(a){return function(b){if("Nil"===b[0])throw"'foldr1' requires an non-empty list.";"Cons"!==b[0]&&d("foldr1");for(var e=[];"Cons"===b[0];)e.push(b[1]),b=b[2];for(var b=e.pop(),c=e.length;c--;)b=a(e[c])(b);return b}},scanl:h,scanl1:function(a){return function(d){if("Cons"!==d[0])throw"Error: 'scanl1' requires a list of at least length 1.";return h(a)(d[1])(d[2])}},filter:function(a){return function(b){if("Nil"===
-b[0])return b;"Cons"!==b[0]&&d("filter");for(var e=[];"Cons"===b[0];)a(b[1])&&e.push(b[1]),b=b[2];for(var b=["Nil"],c=e.length;c--;)b=["Cons",e[c],b];return b}},length:function(a){for(var d=0;"Cons"===a[0];)d+=1,a=a[2];return d},reverse:e,concat:u,concatMap:function(a){return function(d){return u(g(a)(d))}},and:q,or:s,forall:function(a){return c(function(d){return function(b){return b&&a(d)}})(!0)},exists:function(a){return c(function(d){return function(b){return b||a(d)}})(!1)},sum:k,product:m,maximum:r,
-minimum:v,partition:f,zipWith:function(a){return function(b){return function(e){if("Nil"===b[0]||"Nil"===e[0])return["Nil"];("Cons"!==b[0]||"Cons"!==e[0])&&d("zipWith");for(var c=[];"Cons"===b[0]&&"Cons"===e[0];)c.push(a(b[1])(e[1])),b=b[2],e=e[2];for(var e=["Nil"],l=c.length;l--;)e=["Cons",c[l],e];return e}}},zip:function(a){return function(b){if("Nil"===a[0]||"Nil"===b[0])return["Nil"];("Cons"!==a[0]||"Cons"!==b[0])&&d("zip");for(var e=[];"Cons"===a[0]&&"Cons"===b[0];)e.push(["Tuple2",a[1],b[1]]),
-a=a[2],b=b[2];for(var b=["Nil"],c=e.length;c--;)b=["Cons",e[c],b];return b}},unzip:n,intersperse:j,intercalate:l,sort:function(a){if("Nil"===a[0])return a;"Cons"!==a[0]&&d("sort");for(var b=[];"Cons"===a[0];)b.push(a[1]),a=a[2];b.sort(function(a,d){return a-d});for(var a=["Nil"],e=b.length;e--;)a=["Cons",b[e],a];return a},take:function(a){return function(b){if(0>=a)return["Nil"];if("Nil"===b[0])return b;"Cons"!==b[0]&&d("take");var e=["Cons",b[1],["Nil"]],c=e,b=b[2];for(--a;"Cons"===b[0]&&0<a;)c[2]=
-["Cons",b[1],["Nil"]],c=c[2],b=b[2],--a;return e}},drop:function(a){return function(b){if("Nil"===b[0])return b;for("Cons"!==b[0]&&d("drop");"Cons"===b[0]&&0<a;)b=b[2],--a;return b}}}}(),Data=function(){var g;g=function(b){return function(a){return"Just"===b[0]?["Cons",b[1],a]:a}};var c=function(b){return function(a){return function(c){var g=b(a);return"Just"===g[0]?["Cons",g[1],c]:c}}};g={Just:function(b){return["Just",b]},Nothing:["Nothing"],catMaybes:List.foldr(g)(["Nil"]),isJust:function(b){return"Just"===
-b[0]},isNothing:function(b){return"Nothing"===b[0]},fromMaybe:function(b){return function(a){return"Just"===a[0]?a[1]:b}},consMaybe:g,mapMaybe:function(b){return List.foldr(c(b))(["Nil"])},maybe:function(b){return function(a){return function(c){return"Just"===c[0]?a(c[1]):b}}}};return{String:{toText:Value.toText,properEscape:Value.properEscape},Char:{fromCode:function(b){return String.fromCharCode(b)},toCode:function(b){return b.charCodeAt(0)},toUpper:function(b){return b.toUpperCase()},toLower:function(b){return b.toLowerCase()},
-toLocaleUpper:function(b){return b.toLocaleUpperCase()},toLocaleLower:function(b){return b.toLocaleLowerCase()}},Maybe:g,List:List}}(),ElmCode=ElmCode||{};ElmCode.Graphics=ElmCode.Graphics||{};
-ElmCode.Graphics.Color=function(){return{rgba:function(g){return function(c){return function(b){return function(a){return["Color",g,c,b,a]}}}},rgb:function(g){return function(c){return function(b){return["Color",g,c,b,1]}}},red:["Color",255,0,0,1],green:["Color",0,255,0,1],blue:["Color",0,0,255,1],yellow:["Color",255,255,0,1],cyan:["Color",0,255,255,1],magenta:["Color",255,0,255,1],black:["Color",0,0,0,1],white:["Color",255,255,255,1],gray:["Color",128,128,128,1],grey:["Color",128,128,128,1],extract:function(g){return 1===
-g[4]?"rgb("+g[1]+","+g[2]+","+g[3]+")":"rgba("+g[1]+","+g[2]+","+g[3]+","+g[4]+")"}}}();
-var Collage=function(){function g(a,b){var d=b.length-1;if(!(0>=d))for(a.moveTo(b[d][1],b[d][2]);d--;)a.lineTo(b[d][1],b[d][2])}function c(a,b,d,e){0===a.length&&(a=[8,4]);var c=e.length-1;if(!(0>=c)){var g=e[c][1],s=e[c][2],f=0,m=0,r=0,h=0,p=0,n=0,i=a.length,x=!0,w=a[0];for(b.moveTo(g,s);c--;){f=e[c][1];m=e[c][2];r=f-g;h=m-s;for(p=Math.sqrt(r*r+h*h);w<=p;)g+=r*w/p,s+=h*w/p,b[x?"lineTo":"moveTo"](g,s),r=f-g,h=m-s,p=Math.sqrt(r*r+h*h),x=!x,n=(n+1)%i,w=a[n];0<p&&(b[x?"lineTo":"moveTo"](f,m),w-=p);g=
-f;s=m}}b.strokeStyle=ElmCode.Graphics.Color.extract(d);b.stroke()}function b(a,b,d,e,u){b.clearRect(0,0,d,e);for(d=u.length;d--;){var q=u[d],f=a,e=b,k=q[1],m=q[2],h=q[3][1],n=q[3][2],q=q[4];e.save();(0!==h||0!==n)&&e.translate(h,n);k!==~~k&&e.rotate(2*Math.PI*k);1!==m&&e.scale(m,m);e.beginPath();switch(q[0]){case "FLine":a:switch(f=e,k=q,q=k[3][1],k[1][0]){case "Solid":k=k[2];g(f,q);f.strokeStyle=ElmCode.Graphics.Color.extract(k);f.stroke();break;case "Dotted":c([3,3],f,k[2],q);break a;case "Dashed":c([8,
-4],f,k[2],q);break a;case "Custom":c(k[1][1],f,k[2],q)}break;case "FShape":a:switch(h=f,m=e,f=q[1],k=q[2],q=q[3][1],f[0]){case "Filled":f=m;g(f,q);f.fillStyle=ElmCode.Graphics.Color.extract(k);f.fill();break a;case "Outlined":f=m;g(f,q);f.strokeStyle=ElmCode.Graphics.Color.extract(k);f.stroke();break a;case "Textured":k=h;f=f[1];h=new Image;h.src=Foreign.JavaScript.castStringToJSString(f);h.onload=k;g(m,q);m.fillStyle=m.createPattern(h,"repeat");m.fill();break a;case "CustomOutline":c(f[1],m,k,q)}break;
-case "FImage":k=e,m=q[1],h=q[2],q=q[3],n=new Image,n.onload=f,n.src=Foreign.JavaScript.castStringToJSString(q),k.drawImage(n,-m/2,-h/2,m,h)}e.restore()}}function a(a,c,d){var e=Render.newElement("canvas");e.style.width=~~a+"px";e.style.height=~~c+"px";e.style.display="block";e.width=~~a;e.height=~~c;if(e.getContext){var g=e.getContext("2d"),a=e.width,c=e.height;b(function(){b(this,g,a,c,d)},g,a,c,d);return e}e.innerHTML="Your browser does not support the canvas element.";return e}function h(a,b,d,
-e,c,g,f){var k=Render.render(f),d="translate("+(c-f[3]/2)+"px,"+(g-f[4]/2)+"px) "+(1===e?"":"scale("+e+","+e+")")+" "+(d===~~d?"":"rotate("+360*d+"deg)");k.style.transform=d;k.style.msTransform=d;k.style.MozTransform=d;k.style.webkitTransform=d;k.style.OTransform=d;d=Render.newElement("div");Render.addTo(d,k);d.style.width=~~a+"px";d.style.height=~~b+"px";d.style.overflow="hidden";return d}function f(c,g,d){if(!Value.eq(d,g)){var e=c.style.width.slice(0,-2)-0,u=c.style.height.slice(0,-2)-0;if("object"===
-typeof d[0]){if("object"===typeof g[0]&&c.getContext){var f=c.getContext("2d");return b(function(){b(this,f,e,u,d)},f,e,u,d)}g=a(e,u,d);g.style.position="absolute";return c.parentNode.replaceChild(g,c)}g=h(e,u,d[1],d[2],d[3][1],d[3][2],d[4][1]);g.style.position="absolute";return c.parentNode.replaceChild(g,c)}}function n(a,b,d,e,c){var g=0,f,k=(a[1]-e[1])/d,a=(a[2]-e[2])/d;0!==b&&(b*=2*Math.PI,b=0===k?(0<a?Math.PI/2:-Math.PI/2)-b:Math.atan(a/k)+(0<k?0:Math.PI)-b,a=Math.sqrt(k*k+a*a),k=a*Math.cos(b),
-a*=Math.sin(b));if(0===c.length)return!1;f=c[0];for(d=c.length-1;d--;){b=c[d];e=f[1];f=f[2];var h=b[1],n=b[2];if(f<n)var v=f,p=n;else v=n,p=f;if(e<h)var t=e,i=h;else t=h,i=e;v<a&&a<=p&&k<=i&&(k<=t||k<=(a-f)*(h-e)/(n-f)+e)&&++g;f=b}return 1===g%2}return{collage:function(b,c,d){if(0===d.length)return a(b,c,[]);for(var e=Array(d.length),g=d.length;g--;){var f=d[g];e[g]="string"===typeof f[0]?h(b,c,f[1],f[2],f[3][1],f[3][2],f[4][1]):a(b,c,f)}return 1===d.length?e[0]:Render.flowWith(Render.goIn,function(a){return a},
-e)},updateCollage:function(a,b,d){if(1===d.length)return f(a,b[0],d[0]);for(var a=a.childNodes,e=a.length,c=e;c--;)f(a[e-c-1],b[c],d[c])},insideForm:function(a){return function(b){var d=a[1],c=a[2];if(6>b.length){var g=b[3][1],f=b[3][2],h=0,k=b[2];switch(b[4][0]){case "FShape":for(var m=b[4][3][1],r=m.length;--r;)var v=m[r],h=Math.max(h,v[1]*v[1]+v[2]*v[2]);h*=k*k;break;case "FImage":m=k*b[4][1]/2;k=k*b[4][2]/2;h=m*m+k*k;break;case "FElement":m=k*b[4][1][3]/2,k=k*b[4][1][4]/2,h=m*m+k*k}b.push(function(a,
-b){var d=a-g,c=b-f;return d*d+c*c<h+1})}if(!b[5](d,c))return!1;var p,t;switch(b[4][0]){case "FShape":return n(a,b[1],b[2],b[3],b[4][3][1]);case "FLine":return!1;case "FImage":p=b[4][1]/2;t=b[4][2]/2;break;case "FElement":p=b[4][1][3]/2,t=b[4][1][4]/2}return n(a,b[1],b[2],b[3],[[null,p,t],[null,-p,t],[null,-p,-t],[null,p,-t],[null,p,t]])}}}}(),ElmCode=ElmCode||{};ElmCode.Graphics=ElmCode.Graphics||{};
-ElmCode.Graphics.Element=function(){function g(a){return function(b){return["Position",a,b]}}function c(a){return function(b){return["EText",a,b]}}function b(a){return function(b){return["EFlow",a,Foreign.JavaScript.castListToJSArray(b)]}}function a(a){return["Line",Foreign.JavaScript.castListToJSArray(a)]}function h(a){return function(b){var d=Foreign.JavaScript.castListToJSArray(a);0<d.length&&d.push(d[0]);return["Shape",d,b]}}function f(a){return function(b){return function(d){return function(c){return["Form",
-a,b,d,c]}}}}function n(a){return function(b){return function(d){return["FLine",a,b,d]}}}function j(a){return function(b){return function(d){return["FShape",a,b,d]}}}function l(a,b,d,c,e,i){return["Element",Guid.guid(),a,b,d,c,e,i]}function d(a,b,d){return["Element",Guid.guid(),a,b,d,1,Nothing,Nothing]}function e(a){return~~a[3]}function u(a){return~~a[4]}function q(a){return function(b){return function(c){return d(["EImage",Foreign.JavaScript.castStringToJSString(c)],a,b)}}}function s(a){return function(b){return d(x,
-a,b)}}function k(a){return function(b){return function(d){var c=map(function(d){return["Tuple2",a/2*cos(2*(pi/50)*d),b/2*sin(2*(pi/50)*d)]}),e=49,i=["Nil"];if(0<=e){do i=["Cons",e,i];while(0<e--)}return h(c(i))(d)}}}var m=["DRight"],r=["DDown"],v=["DOut"],p=["Near"],t=["Mid"],i=["Far"],x=["EEmpty"],w=["Solid"],y=["Dotted"],z=["Dashed"],A=["Filled"],B=["Outlined"],C=g(p)(p),D=g(i)(p),E=g(p)(i),F=g(i)(i),G=g(p)(t),H=g(i)(t),p=g(t)(p),i=g(t)(i),t=g(t)(t);return{left:["DLeft"],right:m,down:r,up:["DUp"],
-inward:["DIn"],outward:v,topLeft:C,topRight:D,bottomLeft:E,bottomRight:F,midLeft:G,midRight:H,midTop:p,midBottom:i,middle:t,middleAt:function(a){return function(b){return["PositionAt",a,b]}},topLeftAt:function(a){return function(b){return["PositionTL",a,b]}},topRightAt:function(a){return function(b){return["PositionTR",a,b]}},bottomLeftAt:function(a){return function(b){return["PositionBL",a,b]}},bottomRightAt:function(a){return function(b){return["PositionBR",a,b]}},absolute:function(a){return["Absolute",
-a]},relative:function(a){return["Relative",a]},width:function(a){return function(b){var d=b[2];switch(d[0]){case "EImage":case "EVideo":return l(b[2],a,b[4]*a/b[3],b[5],b[6],b[7]);case "EText":return d=Value.getTextSize(a,b[4],d[2]),l(b[2],a,d[1],b[5],b[6],b[7])}return l(b[2],a,b[4],b[5],b[6],b[7])}},height:function(a){return function(b){switch(b[2][0]){case "EImage":case "EVideo":return l(b[2],b[3]*a/b[4],a,b[5],b[6],b[7])}return l(b[2],b[3],a,b[5],b[6],b[7])}},size:function(a){return function(b){return function(d){return l(d[2],
-a,b,d[5],d[6],d[7])}}},opacity:function(a){return function(b){return l(b[2],b[3],b[4],a,b[6],b[7])}},color:function(a){return function(b){return l(b[2],b[3],b[4],b[5],Just(a),b[7])}},link:function(a){return function(b){return l(b[2],b[3],b[4],b[5],b[6],Just(Foreign.JavaScript.castStringToJSString(a)))}},widthOf:e,heightOf:u,sizeOf:function(a){return["Tuple2",~~a[3],~~a[4]]},text:function(a){var b=Value.getTextSize(0,0,a);return d(c("left")(a),b[0],b[1])},asText:function(a){var a=Value.show(a),b=Value.getTextSize(0,
-0,a);return d(c("left")(a),b[0],b[1])},plainText:function(a){var a=Value.toText(a),b=Value.getTextSize(0,0,a);return d(c("left")(a),b[0],b[1])},centeredText:function(a){var b=Value.getTextSize(0,0,a);return d(c("center")(a),b[0],b[1])},justifiedText:function(a){var b=Value.getTextSize(0,0,a);return d(c("justify")(a),b[0],b[1])},rightedText:function(a){var b=Value.getTextSize(0,0,a);return d(c("right")(a),b[0],b[1])},image:q,images:function(a){var b=Elm.Input(s(0)(0)),a=Elm.Lift(function(a){var a=
-Foreign.JavaScript.castStringToJSString(a),d=new Image;d.onload=function(){console.log("loaded");Dispatcher.notify(b.id,q(this.width)(this.height)(a))};d.src=a},[a]);return Elm.Lift(function(a){return function(){return a}},[b,a])},video:function(a){return function(b){return function(c){return d(["EVideo",Foreign.JavaScript.castStringToJSString(c)],a,b)}}},fittedImage:function(a){return function(b){return function(c){return d(["EFittedImage",Foreign.JavaScript.castStringToJSString(c)],a,b)}}},flow:function(a){return function(c){var i;
-i=map(e)(c);a:{switch(a[0]){case "DLeft":i=sum(i);break a;case "DRight":i=sum(i);break a}i=maximum(i)}var g;g=map(u)(c);a:{switch(a[0]){case "DDown":g=sum(g);break a;case "DUp":g=sum(g);break a}g=maximum(g)}return d(b(a)(c),i,g)}},above:function(a){return function(c){return d(b(r)(["Cons",a,["Cons",c,["Nil"]]]),max(~~a[3])(~~c[3]),~~a[4]+~~c[4])}},below:function(a){return function(c){return d(b(r)(["Cons",c,["Cons",a,["Nil"]]]),max(~~a[3])(~~c[3]),~~a[4]+~~c[4])}},beside:function(a){return function(c){return d(b(m)(["Cons",
-a,["Cons",c,["Nil"]]]),~~a[3]+~~c[3],max(~~a[4])(~~c[4]))}},layers:function(a){return d(b(v)(a),maximum(map(e)(a)),maximum(map(u)(a)))},collage:function(a){return function(b){return function(c){return d(["ECollage",a,b,Value.groupForms(c)],a,b)}}},spacer:s,container:function(a){return function(b){return function(c){return function(e){return d(["EContainer",c,e],a,b)}}}},line:a,segment:function(b){return function(d){return a(["Cons",b,["Cons",d,["Nil"]]])}},polygon:h,rect:function(a){return function(b){return function(d){return h(["Cons",
-["Tuple2",0-a/2,0-b/2],["Cons",["Tuple2",0-a/2,b/2],["Cons",["Tuple2",a/2,b/2],["Cons",["Tuple2",a/2,0-b/2],["Nil"]]]]])(d)}}},oval:k,circle:function(a){return k(2*a)(2*a)},ngon:function(a){return function(b){return function(d){var c=toFloat(a),e=map(function(a){return["Tuple2",b*cos(2*(pi/c)*a),b*sin(2*(pi/c)*a)]}),i=a-1,g=["Nil"];if(0<=i){do g=["Cons",i,g];while(0<i--)}return h(e(g))(d)}}},solid:function(a){return function(b){return f(0)(1)(["Tuple2",0,0])(n(w)(a)(b))}},dotted:function(a){return function(b){return f(0)(1)(["Tuple2",
-0,0])(n(y)(a)(b))}},dashed:function(a){return function(b){return f(0)(1)(["Tuple2",0,0])(n(z)(a)(b))}},customLine:function(a){return function(b){return function(d){return f(0)(1)(["Tuple2",0,0])(n(["Custom",Foreign.JavaScript.castListToJSArray(a)])(b)(d))}}},filled:function(a){return function(b){return f(0)(1)(b[2])(j(A)(a)(b))}},outlined:function(a){return function(b){return f(0)(1)(b[2])(j(B)(a)(b))}},customOutline:function(a){return function(b){return function(d){return f(0)(1)(d[2])(j(["CustomOutline",
-Foreign.JavaScript.castListToJSArray(a)])(b)(d))}}},textured:function(a){return function(b){return f(0)(1)(b[2])(j(["Textured",a])(null)(b))}},sprite:function(a){return function(b){return function(d){return function(c){return f(0)(1)(c)(["FImage",b,d,Foreign.JavaScript.castStringToJSString(a)])}}}},toForm:function(a){return function(b){return f(0)(1)(a)(["FElement",b])}},rotate:function(a){return function(b){a:{switch(b[0]){case "Form":var d=b[2],c=b[3],e=b[4],b=f(a+b[1])(d)(c)(e);break a}throw"Non-exhaustive pattern match in case";
-}return b}},scale:function(a){return function(b){return f(b[1])(a*b[2])(b[3])(b[4])}},move:function(a){return function(b){return function(d){var c;a:{switch(d[0]){case "Form":c=d[1];var e=d[2],i=d[3],d=d[4];switch(i[0]){case "Tuple2":var g=i[1],i=i[2];c=f(c)(e)(["Tuple2",a+g,b+i])(d);break a}}throw"Non-exhaustive pattern match in case";}return c}}},isWithin:Collage.insideForm}}();
-var Text=function(){function g(a){return Value.toText(a)}var c=function(a){return function(b){return"<"+a+' style="padding:0;margin:0">'+b+"</"+a+">"}},b=function(a,b){return function(c){return"<span style='"+a+":"+b+"'>"+c+"</span>"}},a=function(a){a=Foreign.JavaScript.castStringToJSString(a);return b("font-family",a)},h=c("h1"),f=b("font-style","italic"),c=c("b"),n=b("text-decoration","underline"),j=b("text-decoration","overline"),l=b("text-decoration","line-through");return{fromString:g,toText:g,
-header:h,height:function(a){return b("font-size",a+"em")},italic:f,bold:c,underline:n,overline:j,strikeThrough:l,monospace:a("monospace"),typeface:a,color:function(a){return b("color",ElmCode.Graphics.Color.extract(a))},link:function(a){return function(b){return"<a href='"+g(a)+"'>"+b+"</a>"}}}}(),Render=function(){function g(a){a=document.createElement(a);a.style.padding="0";a.style.margin="0";return a}function c(a){return a}function b(a){a.style.styleFloat="left";a.style.cssFloat="left";return a}
-function a(a){a.style.position="absolute";return a}function h(a,b,c){for(var f=g("div"),l=c.length;l--;){var j=a(b(c[l]));f.appendChild(j)}return f}function f(a){switch(a[0]){case "Absolute":return a[1]+"px";case "Relative":return 100*a[1]+"%"}}function n(a,b){b.style.position="absolute";b.style.margin="auto";switch(a[0]){case "Position":"Far"!==a[1][0]&&(b.style.left=0);"Near"!==a[1][0]&&(b.style.right=0);"Far"!==a[2][0]&&(b.style.top=0);"Near"!==a[2][0]&&(b.style.bottom=0);break;case "PositionAt":b.style.top=
-f(a[2]);b.style.left=f(a[1]);var c="translate("+-elem[3]/2+"px,"+-elem[4]/2+"px)";b.style.transform=c;b.style.msTransform=c;b.style.MozTransform=c;b.style.webkitTransform=c;b.style.OTransform=c;break;default:c=a[0].slice(-2),b.style["T"===c[0]?"top":"bottom"]=f(a[2]),b.style["L"===c[1]?"left":"right"]=f(a[1])}}function j(d){var e={};switch(d[2][0]){case "EText":var e=d[2][1],f=d[2][2],l=g("div");l.innerHTML=f;l.style.textAlign=e;e=l;break;case "EImage":e=d[2][1];f=g("img");f.src=e;f.name=e;f.style.display=
-"block";e=f;break;case "EVideo":l=d[2][1];e=g("video");e.controls="controls";f=g("source");f.src=l;l=l.split(".");f.type="video/"+l[l.length-1];e.appendChild(f);e.style.display="block";break;case "EFittedImage":var s=d[3],k=d[4],e=d[2][1],m=g("canvas");m.style.display="block";m.style.width=s+"px";m.style.height=k+"px";m.width=s;m.height=k;m.innerHTML="Your browser does not support the canvas element.";var r=g("img");r.onload=function(){if(m.getContext){var a=m.getContext("2d"),b=0,d=0,c=this.width,
-e=this.height;s/k>this.width/this.height?(e=this.width*k/s,d=(this.height-e)/2):(c=this.height*s/k,b=(this.width-c)/2);a.drawImage(r,b,d,c,e,0,0,m.width,m.height)}};r.src=e;e=m;break;case "EFlow":a:{e=d[2][2];switch(d[2][1][0]){case "DDown":e=e.slice(0).reverse();case "DUp":e=h(c,j,e);break a;case "DRight":e=e.slice(0).reverse();case "DLeft":e=h(b,j,e);break a;case "DOut":e=e.slice(0).reverse();case "DIn":e=h(a,j,e);break a}e=void 0}break;case "ECollage":e=Collage.collage(d[2][1],d[2][2],d[2][3]);
-break;case "EEmpty":e=g("div");break;case "EContainer":f=d[2][1];e=j(d[2][2]);n(f,e);f=g("div");f.style.position="relative";f.style.overflow="hidden";f.appendChild(e);e=f;break;case "EHtml":e=d[2][1];"button"!==e.type&&(f=Value.getExcess(e),d[3]-=f[0],d[4]-=f[1]);break;case "EExternalHtml":e=g("div"),e.appendChild(d[2][1])}e.id=d[1];e.style.width=~~d[3]+"px";e.style.height=~~d[4]+"px";1!==d[5]&&(e.style.opacity=d[5]);"Just"===d[6][0]&&(e.style.backgroundColor=ElmCode.Graphics.Color.extract(d[6][1]));
-return"Just"===d[7][0]?(f=g("a"),f.href=d[7][1],f.appendChild(e),f):e}function l(d,e,g){"A"===d.tagName&&(d=d.firstChild);if(e[1]!==g[1]){if(e[2][0]!==g[2][0])return d.parentNode.replaceChild(j(g),d);var f=g[2],h=e[2];switch(f[0]){case "EText":f[1]!==h[1]&&(d.style.textAlign=f[1]);f[2]!==h[2]&&(d.innerHTML=f[2]);break;case "EImage":f[1]!==h[1]&&(d.src=f[1]);break;case "EVideo":case "EFittedImage":if(!Value.eq(f,h)||g[3]!==e[3]||g[4]!==e[4])return d.parentNode.replaceChild(j(g),d);break;case "ECollage":if(f[1]!==
-h[1]||f[2]!==h[2]||f[3].length!==h[3].length)return d.parentNode.replaceChild(j(g),d);Collage.updateCollage(d,h[3],f[3]);break;case "EFlow":if(f[1]!==h[1])return d.parentNode.replaceChild(j(g),d);var k=f[2],m=d.childNodes;if(k.length!==m.length)return d.parentNode.replaceChild(j(g),d);var h=h[2],r={};switch(f[1][0]){case "DDown":case "DUp":r=c;break;case "DRight":case "DLeft":r=b;break;case "DOut":case "DIn":r=a}for(f=m.length;f--;)l(m[f],h[f],k[f]),r(m[f]);break;case "EContainer":l(d.childNodes[0],
-h[2],f[2]);n(f[1],d.childNodes[0]);break;case "EHtml":g[1]!==e[1]&&(k=j(g),d.parentNode.replaceChild(k,d),d=k);"button"!==k.type&&(f=Value.getExcess(d),g[3]-=f[0],g[4]-=f[1]);break;case "EExternalHtml":g[1]!==e[1]&&d.parentNode.replaceChild(j(g),d)}g[3]!==e[3]&&(d.style.width=~~g[3]+"px");g[4]!==e[4]&&(d.style.height=~~g[4]+"px");g[5]!==e[5]&&(d.style.opacity=g[5]);2===g[6].length&&(f=ElmCode.Graphics.Color.extract(g[6][1]),f!==d.style.backgroundColor&&(d.style.backgroundColor=f));if(2===g[7].length&&
-(1===e[7].length||g[7][1]!==e[7][1]))d.parentNode.href=g[7][1];g[1]=e[1]}}return{render:j,update:l,addTo:function(a,b){a.appendChild(b)},newElement:g,flowWith:h,goIn:a}}(),Elm=function(){var g=function(a,b,c){for(var g=a.kids,f=g.length;f--;)g[f].recv(b,c,a.id)},c=function(a){this.id=Guid.guid();this.value=a;this.kids=[];this.defaultNumberOfKids=0;this.recv=function(a,b,c){if(b=b===this.id)this.value=c;g(this,a,b);return b};Dispatcher.inputs.push(this)},b=function(a,b){this.id=Guid.guid();this.value=
-null;this.kids=[];this.count=0;this.changed=!1;b.reverse();this.recalc=function(){for(var c=a,e=b.length;e--;)c=c(b[e].value);this.value=c};this.recalc();this.recv=function(a,c){this.count+=1;c&&(this.changed=!0);this.count==b.length&&(this.changed&&this.recalc(),g(this,a,this.changed),this.changed=!1,this.count=0)};for(var c=b.length;c--;)b[c].kids.push(this)},a=function(a,b,c,f){this.id=Guid.guid();this.value=c?b(f.value):b;this.kids=[];this.recv=function(b,c){c&&(this.value=a(f.value)(this.value));
-g(this,b,c)};f.kids.push(this)},h=function(a,b,c){this.id=Guid.guid();this.value=a(c.value)?b:c.value;this.kids=[];this.recv=function(b,d){var f=d&&!a(c.value);f&&(this.value=c.value);g(this,b,f)};c.kids.push(this)},f=function(a){this.id=Guid.guid();this.value=a.value;this.kids=[];this.recv=function(b,c){var f=c&&!eq(this.value,a.value);f&&(this.value=a.value);g(this,b,f)};a.kids.push(this)},n=function(a){return function(c){return function(e){e=new b(function(a){return function(b){return[a,b]}},[a,
-e]);e=new h(function(a){return a[0]},[!0,c],e);return new b(function(a){return a[1]},[e])}}},j=function(a,b){this.id=Guid.guid();this.value=b.value;this.kids=[];this.count=0;this.changed=!1;this.recv=function(c,f,h){h===a.id&&(this.changed=f);this.count+=1;2==this.count&&(this.changed&&(this.value=b.value),g(this,c,this.changed),this.count=0,this.changed=!1)};a.kids.push(this);b.kids.push(this)};return{Input:function(a){return new c(a)},Lift:function(a,c){return new b(a,c)},Fold:function(b,c,e){return new a(b,
-c,!1,e)},Fold1:function(b,c,e){return new a(b,c,!0,e)},keepIf:function(a){return function(b){return function(c){return new h(function(b){return!a(b)},b,c)}}},dropIf:function(a){return function(b){return function(c){return new h(a,b,c)}}},keepWhen:function(a){return n(new b(function(a){return!a},[a]))},dropWhen:n,dropRepeats:function(a){return new f(a)},sampleOn:function(a){return function(b){return new j(a,b)}}}}(),Dispatcher=function(){function g(a){if(!a.hasOwnProperty("defaultNumberOfKids"))return!0;
-var b=a.kids.length;if(0==b)return!1;if(b>a.defaultNumberOfKids)return!0;for(var c=!1;b--;)c=c||g(a.kids[b]);return c}var c=null,b=0,a=[],h=null;return{initialize:function(){c=ElmCode.main();c.hasOwnProperty("recv")||(c=Elm.Input(c));h=c.value;for(var b=[],n=a.length;n--;)g(a[n])&&b.push(a[n]);a=b;document.getElementById("content").appendChild(Render.render(h));b=document.getElementById("widthChecker").offsetWidth;b!==window.innerWidth&&Dispatcher.notify(Window.dimensions.id,Value.Tuple(b,window.innerHeight));
-c=Elm.Lift(function(a){var b=document.getElementById("content");Render.update(b.firstChild,h,a);return h=a},[c])},notify:function(c,g){b+=1;for(var h=!1,l=a.length;l--;)h=a[l].recv(b,c,g)||h;return h},inputs:a}}(),Signal=function(){function g(a){var b=Value.getSize(a);return["Element",Guid.guid(),["EHtml",a],b[0],b[1],1,Nothing,Nothing]}function c(a){for(var b=["Nil"],c=a.length;c--;)b=["Cons",a[c],b];return b}var b;b=document.addEventListener?function(a,b,c){a.addEventListener(b,c,!1)}:function(a,
-b,c){a.attachEvent("on"+b,c)};var a,h=function(a){var b=0,c=0;a||(a=window.event);if(a.pageX||a.pageY)b=a.pageX,c=a.pageY;else if(a.clientX||a.clientY)b=a.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,c=a.clientY+document.body.scrollTop+document.documentElement.scrollTop;return Value.Tuple(b,c)},f=Elm.Input(Value.Tuple(0,0));f.defaultNumberOfKids=2;a=Elm.Lift(function(a){return a[1]},[f]);a.defaultNumberOfKids=0;var n=Elm.Lift(function(a){return a[2]},[f]);n.defaultNumberOfKids=
-0;var j=Elm.Input(!1),l=Elm.Input(!1),d=Elm.Input(Value.Tuple());b(document,"click",function(a){var b=Dispatcher.notify(l.id,!0),c=Dispatcher.notify(d.id,Value.Tuple());Dispatcher.notify(l.id,!1);!b&&!c&&this.removeEventListener("click",arguments.callee,!1)});b(document,"mousedown",function(a){Dispatcher.notify(j.id,!0)||this.removeEventListener("mousedown",arguments.callee,!1)});b(document,"mouseup",function(a){Dispatcher.notify(j.id,!1)||this.removeEventListener("mouseup",arguments.callee,!1)});
-b(document,"mousemove",function(a){Dispatcher.notify(f.id,h(a))||this.removeEventListener("mousemove",arguments.callee,!1)});a={position:f,x:a,y:n,isClicked:l,isDown:j,clicks:d,isClickedOn:function(a){var a=Render.render(a),c=Elm.Input(!1);b(a,"click",function(){Dispatcher.notify(c.id,!0);Dispatcher.notify(c.id,!1)});return Value.Tuple(g(a),c)}};var e=Elm.Input(Value.Tuple(window.innerWidth,window.innerHeight));e.defaultNumberOfKids=2;n=Elm.Lift(function(a){return a[1]},[e]);n.defaultNumberOfKids=
-0;var u=Elm.Lift(function(a){return a[2]},[e]);u.defaultNumberOfKids=0;b(window,"resize",function(a){var b=document.getElementById("widthChecker").offsetWidth;Dispatcher.notify(e.id,Value.Tuple(b,window.innerHeight))||this.removeEventListener("resize",arguments.callee,!1)});var n={dimensions:e,width:n,height:u},q=function(a,b){return"Nil"===b[0]?b:b[1]===a?b[2]:["Cons",b[1],q(a,b[2])]},s=Elm.Input(["Nil"]),k=Elm.Input(["Nothing"]);b(document,"keydown",function(a){var b;a:{for(b=s.value;"Nil"!==b[0];){if(b[1]===
-a.keyCode){b=!0;break a}b=b[2]}b=!1}b||Dispatcher.notify(s.id,["Cons",a.keyCode,s.value])||this.removeEventListener("keydown",arguments.callee,!1)});b(document,"keyup",function(a){var b=q(a.keyCode,s.value);Dispatcher.notify(s.id,b)||this.removeEventListener("keyup",arguments.callee,!1)});b(window,"blur",function(a){Dispatcher.notify(s.id,["Nil"])||this.removeEventListener("blur",arguments.callee,!1)});b(document,"keypress",function(a){var b=Dispatcher.notify(k.id,["Just",a.charCode||a.keyCode]);
-Dispatcher.notify(k.id,["Nothing"]);b||this.removeEventListener("keypress",arguments.callee,!1)});var u={Raw:{keysDown:s,charPressed:k}},m;m=function(a){return function(b){var d=Elm.Input(["Waiting"]),e={};window.XMLHttpRequest?e=new XMLHttpRequest:window.ActiveXObject&&(e=new ActiveXObject("Microsoft.XMLHTTP"));e.onreadystatechange=function(){4===e.readyState&&Dispatcher.notify(d.id,200===e.status?["Success",c(e.responseText)]:["Failure",e.status,c(e.statusText)])};e.open(a,Value.toText(b),!0);e.send(null);
-return d}};var r=function(a){return function(b){var d=Elm.Input(["Nothing"]),b=Elm.Lift(function(b){if("Just"!==b[0]){try{Dispatcher.notify(d.id,["Nothing"])}catch(e){}return[]}try{Dispatcher.notify(d.id,["Just",["Waiting"]])}catch(g){d.value=["Just",["Waiting"]]}var f={};window.XMLHttpRequest?f=new XMLHttpRequest:window.ActiveXObject&&(f=new ActiveXObject("Microsoft.XMLHTTP"));f.onreadystatechange=function(){4===f.readyState&&Dispatcher.notify(d.id,["Just",200===f.status?["Success",c(f.responseText)]:
-["Failure",f.status,c(f.statusText)]])};f.open(a,Value.toText(b[1]),!0);f.send(null);return[]},[b]);return Elm.Lift(function(a){return function(){return a}},[d,b])}};m={get:m("GET"),post:m("POST"),gets:r("GET"),posts:r("POST")};var v=function(a,d){a.placeholder=Foreign.JavaScript.castStringToJSString(d);var e=Elm.Input(["Nil"]);b(a,"keyup",function(){Dispatcher.notify(e.id,c(a.value));a.focus()});a.style.padding="1px";return Value.Tuple(g(a),e)},p=function(a){a=document.createElement(a);a.style.padding=
-"0";a.style.margin="0";return a},t=function(a){for(var c=p("select"),d=[];"Cons"===a[0];){var e=p("option"),f=Text.toText(a[1][1]);e.value=f;e.innerHTML=f;c.appendChild(e);d.push(a[1][2]);a=a[2]}var h=Elm.Input(d[0]);b(c,"change",function(){Dispatcher.notify(h.id,d[c.selectedIndex])});return Value.Tuple(g(c),h)};return{addListener:b,Mouse:a,Keyboard:u,Time:{every:function(a){var a=1E3*a,b=Elm.Input(0),c=0;setInterval(function(){c+=a;Dispatcher.notify(b.id,c/1E3)},a);return b},after:function(a){var a=
-1E3*a,b=Elm.Input(!1);setTimeout(function(){Dispatcher.notify(b.id,!0)},a);return b},before:function(a){var a=1E3*a,b=Elm.Input(!0);setTimeout(function(){Dispatcher.notify(b.id,!1)},a);return b}},Window:n,HTTP:m,Random:{inRange:function(a){return function(b){return Elm.Input(Math.floor(Math.random()*(b-a+1))+a)}},randomize:function(a){return function(b){return function(c){return Elm.Lift(function(){return Math.floor(Math.random()*(b-a+1))+a},[c])}}}},Input:{textArea:function(a){return function(b){var c=
-p("textarea");c.rows=b;c.cols=a;return v(c,"")}},textField:function(a){var b=p("input");b.type="text";return v(b,a)},password:function(a){var b=p("input");b.type="password";return v(b,a)},checkbox:function(a){var c=p("input");c.type="checkbox";c.checked=a;var d=Elm.Input(a);b(c,"change",function(){Dispatcher.notify(d.id,c.checked)});return Value.Tuple(g(c),d)},dropDown:t,stringDropDown:function(a){return t(List.map(function(a){return Value.Tuple(a,a)})(a))},button:function(a){var c=p("input");c.type=
-"button";c.value=Foreign.JavaScript.castStringToJSString(a);var d=Elm.Input(!1);b(c,"click",function(){Dispatcher.notify(d.id,!0);Dispatcher.notify(d.id,!1)});return Value.Tuple(g(c),d)}},constant:function(a){return Elm.Input(a)},lift:function(a){return function(b){return Elm.Lift(a,[b])}},lift2:function(a){return function(b){return function(c){return Elm.Lift(a,[b,c])}}},lift3:function(a){return function(b){return function(c){return function(d){return Elm.Lift(a,[b,c,d])}}}},lift4:function(a){return function(b){return function(c){return function(d){return function(e){return Elm.Lift(a,
-[b,c,d,e])}}}}},foldp:function(a){return function(b){return function(c){return Elm.Fold(a,b,c)}}},foldp_:function(a){return function(b){return function(c){return Elm.Fold1(a,b,c)}}},foldp1:function(a){return function(b){return Elm.Fold1(a,function(a){return a},b)}},count:function(a){return Elm.Fold(function(){return function(a){return a+1}},0,a)},keepIf:Elm.keepIf,dropIf:Elm.dropIf,keepWhen:Elm.keepWhen,dropWhen:Elm.dropWhen,dropRepeats:Elm.dropRepeats,sampleOn:Elm.sampleOn}}(),Prelude=function(){var g=
-function(c){return function(b){var a=c%b,a=0==c?0:0<b?0<=c?a:a+b:-g(-c)(-b);return a==b?0:a}};return{id:function(c){return c},not:function(c){return!c},fst:function(c){return c[1]},snd:function(c){return c[2]},rem:function(c){return function(b){return c%b}},div:function(c){return function(b){return~~(c/b)}},compare:function(c){return function(b){c="object"===typeof c?toText(c):c;b="object"===typeof b?toText(b):b;return[c===b?"EQ":c<b?"LT":"GT"]}},toFloat:function(c){return c},round:function(c){return Math.round(c)},
-floor:function(c){return Math.floor(c)},ceiling:function(c){return Math.ceil(c)},truncate:function(c){return~~c},sqrt:Math.sqrt,abs:Math.abs,pi:Math.PI,e:Math.E,sin:Math.sin,cos:Math.cos,tan:Math.tan,asin:Math.asin,acos:Math.acos,atan:Math.atan,mod:g,min:function(c){return function(b){return Math.min(c,b)}},max:function(c){return function(b){return Math.max(c,b)}},flip:function(c){return function(b){return function(a){return c(a)(b)}}},clamp:function(c){return function(b){return function(a){return Math.min(b,
-Math.max(c,a))}}},curry:function(c){return function(b){return function(a){return c(["Tuple2",b,a])}}},uncurry:function(c){return function(b){if("Tuple2"!==b[0])throw"Function was uncurry'd but was not given a pair.";return c(b[1])(b[2])}},logBase:function(c){return function(b){return Math.log(b)/Math.log(c)}},Just:Data.Maybe.Just,Nothing:Data.Maybe.Nothing,maybe:Data.Maybe.maybe,map:Data.List.map,filter:Data.List.filter,head:Data.List.head,tail:Data.List.tail,last:Data.List.last,length:Data.List.length,
-reverse:Data.List.reverse,foldr:Data.List.foldr,foldr1:Data.List.foldr1,foldl:Data.List.foldl,foldl1:Data.List.foldl1,and:Data.List.and,or:Data.List.or,forall:Data.List.forall,exists:Data.List.exists,sum:Data.List.sum,product:Data.List.product,concat:Data.List.concat,concatMap:Data.List.concatMap,maximum:Data.List.maximum,minimum:Data.List.minimum,scanl:Data.List.scanl,scanl1:Data.List.scanl1,take:Data.List.take,drop:Data.List.drop,lift:Signal.lift,lift2:Signal.lift2,lift3:Signal.lift3,lift4:Signal.lift4,
-foldp:Signal.foldp,foldp1:Signal.foldp1,foldp_:Signal.foldp_,constant:Signal.constant,count:Signal.count,keepIf:Signal.keepIf,dropIf:Signal.dropIf,keepWhen:Signal.keepWhen,dropWhen:Signal.dropWhen,dropRepeats:Signal.dropRepeats,sampleOn:Signal.sampleOn}}(),eq=Value.eq;Signal.addListener(document,"elm_log",function(g){console.log(g.value)});Signal.addListener(document,"elm_title",function(g){document.title=g.value});
-Signal.addListener(document,"elm_redirect",function(g){0<g.value.length&&(window.location=g.value)});var includeGlobal=this;
-(function(){var g=function(b){for(var a in b)if("Internal"!==a)try{includeGlobal[a]=b[a]}catch(c){"length"===a&&(includeGlobal.execScript("var length;"),length=b[a])}},c=function(b){return function(a){includeGlobal[b]=includeGlobal[b]||{};for(var c in a)"Internal"!==c&&(includeGlobal[b][c]=a[c])}};g(Element);g(Text);color=Element.color;height=Element.height;show=Value.show;g(ElmCode.Graphics.Color);g(ElmCode.Graphics.Element);c("Time")(Signal.Time);c("Mouse")(Signal.Mouse);c("Keyboard")(Signal.Keyboard);
-c("Window")(Signal.Window);c("HTTP")(Signal.HTTP);c("Input")(Signal.Input);c("Random")(Signal.Random)})();ElmCode=ElmCode||{};ElmCode.Data=Data;ElmCode.Signal=Signal;ElmCode.Data.List=List;ElmCode.Foreign=Foreign;ElmCode.Prelude=Prelude;ElmCode.Graphics.Text=Text;
diff --git a/elm-runtime-0.5.0.js b/elm-runtime-0.5.0.js
new file mode 100644
--- /dev/null
+++ b/elm-runtime-0.5.0.js
@@ -0,0 +1,123 @@
+var Guid=function(){var e=0;return{guid:function(){return e+=1}}}(),Elm=Elm||{};
+Elm.JavaScript=function(){function e(a){for(var b=["Nil"],k=a.length;k--;)b=["Cons",a[k],b];return b}function a(a){for(var b=[];"Cons"===a[0];)b.push(a[1]),a=a[2];return b}function d(a){return a.slice(1)}function j(a){return["Tuple"+a.length].concat(a)}return{castJSBoolToBool:function(a){return a},castBoolToJSBool:function(a){return a},castJSNumberToFloat:function(a){return a},castFloatToJSNumber:function(a){return a},castJSNumberToInt:function(a){return~~a},castIntToJSNumber:function(a){return a},
+Experimental:{castJSElementToElement:function(a){return function(b){return function(k){return["Element",Guid.guid(),["EExternalHtml",k],a,b,1,Nothing,Nothing]}}},castElementToJSElement:function(a){return Render.render(a)}},castJSArrayToList:e,castListToJSArray:a,castJSStringToString:e,castStringToJSString:function(d){return"string"===typeof d?d:a(d).join("")},castTupleToJSTuple2:d,castTupleToJSTuple3:d,castTupleToJSTuple4:d,castTupleToJSTuple5:d,castJSTupleToTuple2:j,castJSTupleToTuple3:j,castJSTupleToTuple4:j,
+castJSTupleToTuple5:j}}();var Elm=Elm||{},JSjson=JSON;
+Elm.JSON=function(){function e(b,a){return function(g){return function(h){var c=j.castStringToJSString(g);return h[1].hasOwnProperty(c)&&(h=h[1][c],h[0]===b)?h[1]:a}}}function a(b){return function(a){function g(b){switch(b[0]){case "JsonNull":return null;case "JsonString":return j.castStringToJSString(b[1]);case "JsonObject":var c={},b=b[1][1],i;for(i in b)c[i]=g(b[i]);return c;case "JsonArray":c=j.castListToJSArray(b[1]);for(i=c.length;i--;)c[i]=g(c[i]);return c;default:return b[1]}}return JSjson.stringify(g(["JsonObject",
+a]),null,j.castStringToJSString(b))}}function d(b){function a(b){switch(typeof b){case "string":return["JsonString",j.castJSStringToString(b)];case "number":return["JsonNumber",j.castJSNumberToFloat(b)];case "boolean":return["JsonBool",j.castJSBoolToBool(b)];case "object":if(null===b)return["JsonNull"];for(var c in b)b[c]=a(b[c]);return b instanceof Array?["JsonArray",j.castJSArrayToList(b)]:["JsonObject",["JSON",b]]}}var b=JSjson.parse(b),g;for(g in b)b[g]=a(b[g]);return["JSON",b]}var j=Elm.JavaScript,
+f=["JSON",{}];return{empty:f,singleton:function(b){return function(a){var g={};g[j.castStringToJSString(b)]=a;return["JSON",g]}},insert:function(b){return function(a){return function(g){var g=g[1],h={},c;for(c in g)h[c]=g[c];h[j.castStringToJSString(b)]=a;return["JSON",h]}}},lookup:function(b){return function(a){var g=j.castStringToJSString(b);return a[1].hasOwnProperty(g)?Just(a[1][g]):Nothing}},findString:e("JsonString",["Nil"]),findObject:e("JsonObject",f),findArray:e("JsonArray",["Nil"]),findWithDefault:function(b){return function(a){return function(g){var h=
+j.castStringToJSString(a);return g[1].hasOwnProperty(h)?g[1][h]:b}}},remove:function(b){return function(a){var a=a[1],g={},h;for(h in a)g[h]=a[h];delete g[j.castStringToJSString(b)];return["JSON",g]}},toPrettyJSString:a,toJSString:a(""),fromJSString:d,toPrettyString:function(b){return function(d){return j.castJSStringToString(a(b)(d))}},toString:function(b){return j.castJSStringToString(a("")(b))},fromString:function(b){return d(j.castStringToJSString(b))},toList:function(b){var b=b[1],a=[],g;for(g in b)a.push(Value.Tuple(j.castJSStringToString(g),
+b[g]));return j.castJSArrayToList(a)},fromList:function(b){for(var b=j.castListToJSArray(b),a={},g=b.length;g--;)a[j.castStringToJSString(b[g][1])]=b[g][2];return["JSON",a]},JsonString:function(b){return["JsonString",b]},JsonNumber:function(b){return["JsonNumber",b]},JsonBool:function(b){return["JsonBool",b]},JsonNull:["JsonNull"],JsonArray:function(b){return["JsonArray",b]},JsonObject:function(b){return["JsonObject",b]}}}();
+var Value=function(){function e(b){if(0==b.length)return b;for(var b=b.replace(/"/g,"&#34;").replace(/'/g,"&#39;").replace(/</g,"&#60;").replace(/>/g,"&#62;").replace(/\n/g,"<br/>"),b=b.split("<br/>"),a=b.length;a--;){var g=b,h=a,c;c=b[a];if(0!=c.length){c=c.split("");" "==c[0]&&(c[0]="&nbsp;");for(var i=c.length;--i;)" "==c[i][0]&&" "==c[i-1]&&(c[i-1]+=c[i],c[i]="");for(i=c.length;i--;)if(1<c[i].length&&" "==c[i][0]){for(var t=c[i].split(""),d=t.length-2;0<=d;d-=2)t[d]="&nbsp;";c[i]=t.join("")}c=
+c.join("");c=" "===c[c.length-1]?c.slice(0,-1)+"&nbsp;":c}g[h]=c}return b.join("<br/>")}var a=function(b,d){if("object"===typeof b){if(b===d)return!0;if(b.length!==d.length)return!1;for(var g=b.length;g--;)if(!a(b[g],d[g]))return!1;return!0}return b===d},d=function(b){if("boolean"===typeof b)return b?"True":"False";if("number"!==typeof b){if("string"===typeof b&&2>b.length)return"'"+b+"'";if(b[0]){if("Tuple"===b[0].substring(0,5)){for(var a="",g=b.length;--g;)a=","+d(b[g])+a;","===a[0]&&(a=a.substring(1));
+return"("+a+")"}if("Cons"===b[0])for(var g="string"===typeof b[1]?'"':"]",h="string"===typeof b[1]?"":",",c="string"===typeof b[1]?function(c){return c}:d,a=("string"===typeof b[1]?'"':"[")+c(b[1]),b=b[2];;)if("Cons"===b[0])a+=h+c(b[1]),b=b[2];else return a+g;else{if("Nil"===b[0])return"[]";if("JSON"===b[0])return"(JSON.fromList "+d(Elm.JSON.toList(b))+")";if("RBNode"===b[0]||"RBEmpty"===b[0])return"(Map.fromList "+d(Elm.Dict.fold(function(c){return function(b){return function(a){return["Cons",["Tuple2",
+c,b],a]}}})(["Nil"])(b))+")";a="";for(g=b.length;--g;)a=" "+d(b[g])+a;a=b[0]+a;return 1<b.length?"("+a+")":a}}}return b+""},j=function(b){for(var a=["Nil"],d=b.length;d--;)a=["Cons",b[d],a];return a},f;f=document.addEventListener?function(b,a,d){b.addEventListener(a,d,!1)}:function(b,a,d){b.attachEvent("on"+a,d)};return{eq:a,str:j,show:function(b){return j(d(b))},Tuple:function(){var b=arguments.length,a=Array(b+1);for(a[0]="Tuple"+arguments.length;b--;)a[b+1]=arguments[b];return a},append:function(b,
+a){if("string"===typeof b&&"string"===typeof a)return b.concat(a);if("Nil"===b[0])return a;for(var d=["Cons",b[1],["Nil"]],h=d,b=b[2];"Cons"===b[0];)h[2]=["Cons",b[1],["Nil"]],b=b[2],h=h[2];h[2]=a;return d},listToArray:function(b){for(var a=[];"Cons"===b[0];)a.push(b[1]),b=b[2];return a},toText:function(b){if("string"===typeof b)return e(b);for(var a=[];"Cons"===b[0];)a.push(b[1]),b=b[2];return e(a.join(""))},properEscape:e,getTextSize:function(b,a,d){var h=document.createElement("div");h.innerHTML=
+d;h.style.textAlign="left";0<b&&(h.style.width=b+"px");h.style.visibility="hidden";h.style.styleFloat="left";h.style.cssFloat="left";document.body.appendChild(h);d=window.getComputedStyle(h);b=d.getPropertyValue("width").slice(0,-2)-0;d=d.getPropertyValue("height").slice(0,-2)-0;document.body.removeChild(h);delete h;return[Math.ceil(b),Math.ceil(Math.max(a,d))]},getSize:function(b){b=b.cloneNode(!0);b.style.visibility="hidden";b.style.styleFloat="left";b.style.cssFloat="left";document.body.appendChild(b);
+var a=b.offsetWidth,d=b.offsetHeight;document.body.removeChild(b);delete b;return[a,d]},getExcess:function(b){b=b.cloneNode(!0);b.style.visibility="hidden";b.style.styleFloat="left";b.style.cssFloat="left";document.body.appendChild(b);var a=b.offsetWidth,d=b.offsetHeight,h=window.getComputedStyle(b),c=h.getPropertyValue("width").slice(0,-2)-0,h=h.getPropertyValue("height").slice(0,-2)-0;document.body.removeChild(b);delete b;return[a-c,d-h]},groupForms:function(a){for(var a=Elm.JavaScript.castListToJSArray(a),
+d=[],g=[],h=a.length;h--;){var c=a[h];switch(c[4][0]){case "FElement":0<g.length&&(d.push(g),g=[]);d.push(c);break;default:g.push(c)}}0<g.length&&d.push(g);return d},wrap:function(a){var d=Value.getSize(a);return["Element",Guid.guid(),["EHtml",a],d[0],d[1],1,Nothing,Nothing]},addListener:f}}(),Elm=Elm||{};
+Elm.List=function(){function e(a){return function(b){if("Nil"===b[0])return b;"Cons"!==b[0]&&c("map");for(var i=["Cons",a(b[1]),["Nil"]],d=i,b=b[2];"Cons"===b[0];)d[2]=["Cons",a(b[1]),["Nil"]],b=b[2],d=d[2];return i}}function a(a){return function(b){return function(i){var d=b;if("Nil"===i[0])return d;for("Cons"!==i[0]&&c("foldl");"Cons"===i[0];)d=a(i[1])(d),i=i[2];return d}}}function d(a){return function(b){return function(i){var d=b;if("Nil"===i[0])return d;"Cons"!==i[0]&&c("foldr");for(var h=[];"Cons"===
+i[0];)h.push(i[1]),i=i[2];for(i=h.length;i--;)d=a(h[i])(d);return d}}}function j(c){return function(b){var i;"Cons"!==b[0]?i=void 0:(i=b[1],b=b[2],i=a(c)(i)(b));return i}}function f(a){return function(b){return function(i){if("Nil"===i[0])return["Cons",b,["Nil"]];"Cons"!==i[0]&&c("scanl");for(var d=[b];"Cons"===i[0];)b=a(i[1])(b),d.push(b),i=i[2];for(var i=["Nil"],h=d.length;h--;)i=["Cons",d[h],i];return i}}}function b(c){return function(a){a:{for(var i=[function(c){return"Nil"!==c[0]?void 0:["Tuple2",
+["Nil"],["Nil"]]},function(a){if("Cons"===a[0]){var i=a[1],a=a[2];var d=b(c)(a);"Tuple2"!==d[0]?i=void 0:(a=d[1],d=d[2],i=c(i)?["Tuple2",["Cons",i,a],d]:["Tuple2",a,["Cons",i,d]]);return i}}],d=i.length;d--;){var h=i[d](a);if(void 0!==h){a=h;break a}}a=void 0}return a}}function k(c){a:{for(var a=[function(c){return"Nil"!==c[0]?void 0:["Tuple2",["Nil"],["Nil"]]},function(c){if("Cons"!==c[0])c=void 0;else if(c=["Tuple2",c[1],k(c[2])],"Tuple2"!==c[0]||"Tuple2"!==c[1][0])c=void 0;else var a=c[1][1],b=
+c[1][2],c="Tuple2"!==c[2][0]?void 0:["Tuple2",["Cons",a,c[2][1]],["Cons",b,c[2][2]]];return c}],b=a.length;b--;){var i=a[b](c);if(void 0!==i){c=i;break a}}c=void 0}return c}function g(c){return function(a){a:{for(var b=[function(c){return"Nil"!==c[0]?void 0:["Nil"]},function(c){if("Cons"===c[0]){var a=c[1];return"Nil"!==c[2][0]?void 0:["Cons",a,["Nil"]]}},function(a){if("Cons"===a[0]){var b=a[1];if("Cons"===a[2][0]){var i=a[2][1],a=a[2][2];return["Cons",b,["Cons",c,g(c)(["Cons",i,a])]]}}}],i=b.length;i--;){var d=
+b[i](a);if(void 0!==d){a=d;break a}}a=void 0}return a}}function h(c){return function(a){a:{for(var b=[function(c){return"Nil"!==c[0]?void 0:["Nil"]},function(c){if("Cons"===c[0]){var a=c[1];return"Nil"!==c[2][0]?void 0:a}},function(a){if("Cons"===a[0]){var b=a[1];if("Cons"===a[2][0]){var i=a[2][1],a=a[2][2];return Value.append(b,Value.append(c,h(c)(["Cons",i,a])))}}}],i=b.length;i--;){var d=b[i](a);if(void 0!==d){a=d;break a}}a=void 0}return a}}var c=function(c){throw"Function '"+c+"' expecting a list!";
+},i=a(function(c){return function(a){return["Cons",c,a]}})(["Nil"]),t=d(function(c){return function(a){return Value.append(c,a)}})(["Nil"]),m=a(function(c){return function(a){return c&&a}})(!0),r=a(function(c){return function(a){return c||a}})(!1),n=a(function(c){return function(a){return c+a}})(0),l=a(function(c){return function(a){return c*a}})(1),v=j(function(c){return function(a){return Math.max(c,a)}}),s=j(function(c){return function(a){return Math.min(c,a)}});return{head:function(c){if("Cons"!==
+c[0])throw"Error: 'head' only accepts lists of length greater than one.";return c[1]},tail:function(c){if("Cons"!==c[0])throw"Error: 'tail' only accepts lists of length greater than one.";return c[2]},last:function(c){if("Cons"!==c[0])throw"Error: 'last' only accepts lists of length greater than one.";for(var a=c[1];"Cons"===c[0];)a=c[1],c=c[2];return a},map:e,foldl:a,foldr:d,foldl1:j,foldr1:function(a){return function(b){if("Nil"===b[0])throw"'foldr1' requires an non-empty list.";"Cons"!==b[0]&&
+c("foldr1");for(var i=[];"Cons"===b[0];)i.push(b[1]),b=b[2];for(var b=i.pop(),d=i.length;d--;)b=a(i[d])(b);return b}},scanl:f,scanl1:function(c){return function(a){if("Cons"!==a[0])throw"Error: 'scanl1' requires a list of at least length 1.";return f(c)(a[1])(a[2])}},filter:function(a){return function(b){if("Nil"===b[0])return b;"Cons"!==b[0]&&c("filter");for(var i=[];"Cons"===b[0];)a(b[1])&&i.push(b[1]),b=b[2];for(var b=["Nil"],d=i.length;d--;)b=["Cons",i[d],b];return b}},length:function(c){for(var a=
+0;"Cons"===c[0];)a+=1,c=c[2];return a},reverse:i,concat:t,concatMap:function(c){return function(a){return t(e(c)(a))}},and:m,or:r,all:function(c){return a(function(a){return function(b){return b&&c(a)}})(!0)},any:function(c){return a(function(a){return function(b){return b||c(a)}})(!1)},sum:n,product:l,maximum:v,minimum:s,partition:b,zipWith:function(a){return function(b){return function(i){if("Nil"===b[0]||"Nil"===i[0])return["Nil"];("Cons"!==b[0]||"Cons"!==i[0])&&c("zipWith");for(var d=[];"Cons"===
+b[0]&&"Cons"===i[0];)d.push(a(b[1])(i[1])),b=b[2],i=i[2];for(var i=["Nil"],h=d.length;h--;)i=["Cons",d[h],i];return i}}},zip:function(a){return function(b){if("Nil"===a[0]||"Nil"===b[0])return["Nil"];("Cons"!==a[0]||"Cons"!==b[0])&&c("zip");for(var i=[];"Cons"===a[0]&&"Cons"===b[0];)i.push(["Tuple2",a[1],b[1]]),a=a[2],b=b[2];for(var b=["Nil"],d=i.length;d--;)b=["Cons",i[d],b];return b}},unzip:k,intersperse:g,intercalate:h,sort:function(a){if("Nil"===a[0])return a;"Cons"!==a[0]&&c("sort");for(var b=
+[];"Cons"===a[0];)b.push(a[1]),a=a[2];b.sort(function(c,a){return c-a});for(var a=["Nil"],i=b.length;i--;)a=["Cons",b[i],a];return a},take:function(a){return function(b){if(0>=a)return["Nil"];if("Nil"===b[0])return b;"Cons"!==b[0]&&c("take");var i=["Cons",b[1],["Nil"]],d=i,b=b[2];for(--a;"Cons"===b[0]&&0<a;)d[2]=["Cons",b[1],["Nil"]],d=d[2],b=b[2],--a;return i}},drop:function(a){return function(b){if("Nil"===b[0])return b;for("Cons"!==b[0]&&c("drop");"Cons"===b[0]&&0<a;)b=b[2],--a;return b}}}}();
+Elm=Elm||{};
+Elm.Maybe=function(){function e(a){return function(e){return"Just"===a[0]?["Cons",a[1],e]:e}}function a(a){return function(e){return function(f){var b=a(e);return"Just"===b[0]?["Cons",b[1],f]:f}}}return{Just:function(a){return["Just",a]},Nothing:["Nothing"],catMaybes:Elm.List.foldr(e)(["Nil"]),isJust:function(a){return"Just"===a[0]},isNothing:function(a){return"Nothing"===a[0]},fromMaybe:function(a){return function(e){return"Just"===e[0]?e[1]:a}},consMaybe:e,mapMaybe:function(d){return Elm.List.foldr(a(d))(["Nil"])},maybe:function(a){return function(e){return function(f){return"Just"===
+f[0]?e(f[1]):a}}}}}();
+(function(){for(var e in Elm)this[e]=Elm[e];if(Elm.Dict)throw"Module name collision, 'Dict' is already defined.";Elm.Dict=function(){function a(a){return function(c){return function(b){return function(i){return function(d){return["RBNode",a,c,b,i,d]}}}}}function d(a){return function(){switch(a[0]){case "RBEmpty":return z(Value.str("(min RBEmpty) is not defined"));case "RBNode":switch(a[4][0]){case "RBEmpty":return["Tuple2",a[2],a[3]]}return d(a[4])}throw"Non-exhaustive pattern match in case";}()}
+function e(a){return function(c){var b;a:{switch(c[0]){case "RBEmpty":b=Nothing;break a;case "RBNode":b=function(){switch(compare(a)(c[2])[0]){case "EQ":return Just(c[3]);case "GT":return e(a)(c[5]);case "LT":return e(a)(c[4])}throw"Non-exhaustive pattern match in case";}();break a}throw"Non-exhaustive pattern match in case";}return b}}function f(a){return function(c){return function(b){var i;a:{switch(b[0]){case "RBEmpty":i=a;break a;case "RBNode":i=function(){switch(compare(c)(b[2])[0]){case "EQ":return b[3];
+case "GT":return f(a)(c)(b[5]);case "LT":return f(a)(c)(b[4])}throw"Non-exhaustive pattern match in case";}();break a}throw"Non-exhaustive pattern match in case";}return i}}}function b(a){return function(c){return A(e(a)(c))}}function k(c){a:{switch(c[0]){case "RBNode":switch(c[5][0]){case "RBNode":c=a(c[1])(c[5][2])(c[5][3])(a(x)(c[2])(c[3])(c[4])(c[5][4]))(c[5][5]);break a}}c=z(Value.str("rotateLeft of a node without enough children"))}return c}function g(c){a:{switch(c[0]){case "RBNode":switch(c[4][0]){case "RBNode":c=
+a(c[1])(c[4][2])(c[4][3])(c[4][4])(a(x)(c[2])(c[3])(c[4][5])(c[5]));break a}}c=z(Value.str("rotateRight of a node without enough children"))}return c}function h(c){a:{switch(c[0]){case "Black":c=x;break a;case "Red":c=C;break a}throw"Non-exhaustive pattern match in case";}return c}function c(c){a:{switch(c[0]){case "RBNode":switch(c[4][0]){case "RBNode":switch(c[5][0]){case "RBNode":c=a(h(c[1]))(c[2])(c[3])(a(h(c[4][1]))(c[4][2])(c[4][3])(c[4][4])(c[4][5]))(a(h(c[5][1]))(c[5][2])(c[5][3])(c[5][4])(c[5][5]));
+break a}}}c=z(Value.str("color_flip called on a RBEmpty or RBNode with a RBEmpty child"))}return c}function i(a){a:switch(a[0]){case "RBNode":switch(a[5][0]){case "RBNode":switch(a[5][1][0]){case "Red":a=k(a);break a}}}a:switch(a[0]){case "RBNode":switch(a[4][0]){case "RBNode":switch(a[4][1][0]){case "Red":switch(a[4][4][0]){case "RBNode":switch(a[4][4][1][0]){case "Red":a=g(a);break a}}}}}a:switch(a[0]){case "RBNode":switch(a[4][0]){case "RBNode":switch(a[4][1][0]){case "Red":switch(a[5][0]){case "RBNode":switch(a[5][1][0]){case "Red":a=
+c(a);break a}}}}}return a}function t(c){a:switch(c[0]){case "RBNode":switch(c[1][0]){case "Red":c=a(C)(c[2])(c[3])(c[4])(c[5]);break a}}return c}function m(c){return function(b){return function(d){var h=function(d){var t;a:{switch(d[0]){case "RBEmpty":t=a(x)(c)(b)(y)(y);break a;case "RBNode":t=function(){switch(compare(c)(d[2])[0]){case "EQ":return a(d[1])(d[2])(b)(d[4])(d[5]);case "GT":return a(d[1])(d[2])(d[3])(d[4])(h(d[5]));case "LT":return a(d[1])(d[2])(d[3])(h(d[4]))(d[5])}throw"Non-exhaustive pattern match in case";
+}();t=i(t);break a}throw"Non-exhaustive pattern match in case";}return t};return t(h(d))}}}function r(c){a:{switch(c[0]){case "RBNode":switch(c[4][0]){case "RBNode":switch(c[4][1][0]){case "Red":c=!0;break a}}}c=!1}return c}function n(c){a:{switch(c[0]){case "RBNode":switch(c[4][0]){case "RBNode":switch(c[4][4][0]){case "RBNode":switch(c[4][4][1][0]){case "Red":c=!0;break a}}}}c=!1}return c}function l(b){if(not(r(b))&&not(n(b))){b=c(b);a:switch(b[0]){case "RBNode":b:switch(b[5][0]){case "RBNode":switch(b[5][4][0]){case "RBNode":switch(b[5][4][1][0]){case "Red":b=
+c(k(a(b[1])(b[2])(b[3])(b[4])(g(b[5]))));break b}}}break a}}return b}function v(b){return function(h){var e;a:{switch(h[0]){case "RBEmpty":e=y;break a;case "RBNode":if("LT"===compare(b)(h[2])[0]){e=l(h);b:{switch(e[0]){case "RBEmpty":e=z(Value.str("delLT on RBEmpty"));break b;case "RBNode":e=i(a(e[1])(e[2])(e[3])(del(e[4]))(e[5]));break b}break}}else{h=r(h)?g(h):h;b:{switch(h[0]){case "RBNode":switch(h[5][0]){case "RBEmpty":h=eq(b,h[2]);break b}}h=!1}if(h)e=y;else{var h=not,j;b:{switch(e[0]){case "RBNode":switch(e[5][0]){case "RBNode":switch(e[5][1][0]){case "Red":j=
+!0;break b}}}j=!1}if(h=h(j)){h=not;b:{switch(e[0]){case "RBNode":switch(e[5][0]){case "RBNode":switch(e[5][4][0]){case "RBNode":switch(e[5][4][1][0]){case "Red":j=!0;break b}}}}j=!1}h=h(j)}h&&(e=c(e),e=n(e)?c(g(e)):e);b:{switch(e[0]){case "RBNode":h=eq(b,e[2]);break b}h=!1}if(h)b:{switch(e[0]){case "RBEmpty":e=z(Value.str("delEQ called on a RBEmpty"));break b;case "RBNode":j=d(e[5]);c:{switch(j[0]){case "Tuple2":h=j[1];break c}break}c:{switch(j[0]){case "Tuple2":j=j[2];break c}break}var h=a(e[1])(h)(j)(e[4]),
+f=function(c){a:{switch(c[0]){case "RBNode":switch(c[4][0]){case "RBEmpty":c=y;break a}}c=l(c);b:{switch(c[0]){case "RBEmpty":c=y;break b;case "RBNode":c=i(a(c[1])(c[2])(c[3])(f(c[4]))(c[5]));break b}throw"Non-exhaustive pattern match in case";}}return c};e=t(f(e[5]));e=i(h(e));break b}break}else b:{switch(e[0]){case "RBEmpty":e=z(Value.str("delGT called on a RBEmpty"));break b;case "RBNode":e=i(a(e[1])(e[2])(e[3])(e[4])(del(e[5])));break b}break}}}break a}throw"Non-exhaustive pattern match in case";
+}return t(e)}}function s(c){return function(b){a:{switch(b[0]){case "RBEmpty":b=y;break a;case "RBNode":b=a(b[1])(b[2])(c(b[3]))(s(c)(b[4]))(s(c)(b[5]));break a}throw"Non-exhaustive pattern match in case";}return b}}function p(c){return function(a){return function(b){a:{switch(b[0]){case "RBEmpty":b=a;break a;case "RBNode":b=p(c)(c(b[2])(b[3])(p(c)(a)(b[4])))(b[5]);break a}throw"Non-exhaustive pattern match in case";}return b}}}function q(c){return function(a){return function(b){a:{switch(b[0]){case "RBEmpty":b=
+a;break a;case "RBNode":b=q(c)(c(b[2])(b[3])(q(c)(a)(b[5])))(b[4]);break a}throw"Non-exhaustive pattern match in case";}return b}}}var u=[],w;for(w in Elm.Prelude)0<=u.indexOf(w)||(this[w]=Elm.Prelude[w]);var A=Elm.Maybe.isJust,x=["Red"],C=["Black"],y=["RBEmpty"],B=y,z=console.log;return{empty:B,lookup:e,findWithDefault:f,member:b,insert:m,singleton:function(c){return function(a){return m(c)(a)(y)}},remove:v,map:s,foldl:p,foldr:q,union:function(c){return function(a){return p(m)(a)(c)}},intersect:function(c){return function(a){return p(function(c){return function(i){return function(d){return b(c)(a)?
+m(c)(i)(d):d}}})(B)(c)}},diff:function(c){return function(a){return p(function(c){return function(){return function(a){return v(c)(a)}}})(c)(a)}},keys:function(c){return p(function(c){return function(){return function(a){return["Cons",c,a]}}})(["Nil"])(c)},values:function(c){return p(function(){return function(c){return function(a){return["Cons",c,a]}}})(["Nil"])(c)},toList:function(c){return p(function(c){return function(a){return function(b){return["Cons",["Tuple2",c,a],b]}}})(["Nil"])(c)},fromList:function(c){return List.foldl(uncurry(m))(B)(c)}}}()})();
+(function(){for(var e in Elm)this[e]=Elm[e];Elm.Set=function(){var a=[],d;for(d in Elm.Prelude)0<=a.indexOf(d)||(this[d]=Elm.Prelude[d]);a=Dict.empty;d=Dict.remove;var e=Dict.member,f=Dict.union,b=Dict.intersect,k=Dict.diff,g=Dict.keys,h=List.foldl(function(c){return function(a){return Dict.insert(c)(["Tuple0"])(a)}})(a);return{empty:a,singleton:function(c){return Dict.singleton(c)(["Tuple0"])},insert:function(c){return Dict.insert(c)(["Tuple0"])},remove:d,member:e,union:f,intersect:b,diff:k,toList:g,
+fromList:h,foldl:function(c){return Dict.foldl(function(a){return function(){return function(b){return c(a)(b)}}})},foldr:function(c){return Dict.foldr(function(a){return function(){return function(b){return c(a)(b)}}})},map:function(c){return function(a){a=g(a);return h(List.map(c)(a))}}}}()})();Elm=Elm||{};
+Elm.Char=function(){function e(a,b){return function(d){d=d.charCodeAt(0);return a<=d&&d<=b}}var a=e(48,57),d=e(97,102),j=e(65,70);return{fromCode:function(a){return String.fromCharCode(a)},toCode:function(a){return a.charCodeAt(0)},toUpper:function(a){return a.toUpperCase()},toLower:function(a){return a.toLowerCase()},toLocaleUpper:function(a){return a.toLocaleUpperCase()},toLocaleLower:function(a){return a.toLocaleLowerCase()},isLower:e(97,122),isUpper:e(65,90),isDigit:a,isOctDigit:e(48,55),isHexDigit:function(e){return a(e)||
+d(e)||j(e)}}}();var String={toText:Value.toText,properEscape:Value.properEscape},Elm=Elm||{};
+Elm.Color=function(){return{rgba:function(e){return function(a){return function(d){return function(j){return["Color",e,a,d,j]}}}},rgb:function(e){return function(a){return function(d){return["Color",e,a,d,1]}}},red:["Color",255,0,0,1],green:["Color",0,255,0,1],blue:["Color",0,0,255,1],yellow:["Color",255,255,0,1],cyan:["Color",0,255,255,1],magenta:["Color",255,0,255,1],black:["Color",0,0,0,1],white:["Color",255,255,255,1],gray:["Color",128,128,128,1],grey:["Color",128,128,128,1],complement:function(e){var a,
+d=e[1]/255;a=e[2]/255;var j=e[3]/255,e=Math.max(d,a,j),f=Math.min(d,a,j),f=e-f,b=0;0===f?b=0:e===d?b=(a-j)/f%6:e===a?b=(j-d)/f+2:e===j&&(b=(d-a)/f+4);a=60*b;var d=e*(0===e?0:f/e),b=(a+180)%360/60,k=d*(1-Math.abs(b%2-1)),f=j=a=0;0<=b&&1>b?(a=d,j=k,f=0):1<=b&&2>b?(a=k,j=d,f=0):2<=b&&3>b?(a=0,j=d,f=k):3<=b&&4>b?(a=0,j=k,f=d):4<=b&&5>b?(a=k,j=0,f=d):5<=b&&6>b&&(a=d,j=0,f=k);e-=d;return["Color",Math.round(255*(a+e)),Math.round(255*(j+e)),Math.round(255*(f+e)),1]},extract:function(e){return 1===e[4]?"rgb("+
+e[1]+","+e[2]+","+e[3]+")":"rgba("+e[1]+","+e[2]+","+e[3]+","+e[4]+")"}}}();
+var Collage=function(){function e(a,c){var b=c.length-1;if(!(0>=b))for(a.moveTo(c[b][1],c[b][2]);b--;)a.lineTo(c[b][1],c[b][2])}function a(a,c,b,d){0===a.length&&(a=[8,4]);var e=d.length-1;if(!(0>=e)){var g=d[e][1],j=d[e][2],l=0,f=0,k=0,p=0,q=0,u=0,w=a.length,A=!0,x=a[0];for(c.moveTo(g,j);e--;){l=d[e][1];f=d[e][2];k=l-g;p=f-j;for(q=Math.sqrt(k*k+p*p);x<=q;)g+=k*x/q,j+=p*x/q,c[A?"lineTo":"moveTo"](g,j),k=l-g,p=f-j,q=Math.sqrt(k*k+p*p),A=!A,u=(u+1)%w,x=a[u];0<q&&(c[A?"lineTo":"moveTo"](l,f),x-=q);g=
+l;j=f}}c.strokeStyle=Elm.Color.extract(b);c.stroke()}function d(b,c,i,d,j){c.clearRect(0,0,i,d);for(i=j.length;i--;){var f=j[i],n=b,d=c,l=f[1],k=f[2],s=f[3][1],p=f[3][2],f=f[4];d.save();(0!==s||0!==p)&&d.translate(s,p);l!==~~l&&d.rotate(2*Math.PI*l);1!==k&&d.scale(k,k);d.beginPath();switch(f[0]){case "FLine":a:switch(n=d,l=f,f=l[3][1],l[1][0]){case "Solid":l=l[2];e(n,f);n.strokeStyle=Elm.Color.extract(l);n.stroke();break;case "Dotted":a([3,3],n,l[2],f);break a;case "Dashed":a([8,4],n,l[2],f);break a;
+case "Custom":a(l[1][1],n,l[2],f)}break;case "FShape":a:switch(s=n,k=d,n=f[1],l=f[2],f=f[3][1],n[0]){case "Filled":n=k;e(n,f);n.fillStyle=Elm.Color.extract(l);n.fill();break a;case "Outlined":n=k;e(n,f);n.strokeStyle=Elm.Color.extract(l);n.stroke();break a;case "Textured":l=s;n=n[1];s=new Image;s.src=g.castStringToJSString(n);s.onload=l;e(k,f);k.fillStyle=k.createPattern(s,"repeat");k.fill();break a;case "CustomOutline":a(n[1],k,l,f)}break;case "FImage":l=d,k=f[1],s=f[2],f=f[3],p=new Image,p.onload=
+n,p.src=g.castStringToJSString(f),l.drawImage(p,-k/2,-s/2,k,s)}d.restore()}}function j(a,c,b){var e=Render.newElement("canvas");e.style.width=~~a+"px";e.style.height=~~c+"px";e.style.display="block";e.width=~~a;e.height=~~c;if(e.getContext){var g=e.getContext("2d"),a=e.width,c=e.height;d(function(){d(this,g,a,c,b)},g,a,c,b);return e}e.innerHTML="Your browser does not support the canvas element.";return e}function f(a,c,b,d,e,g,j){var f=Render.render(j),b="translate("+(e-j[3]/2)+"px,"+(g-j[4]/2)+"px) "+
+(1===d?"":"scale("+d+","+d+")")+" "+(b===~~b?"":"rotate("+360*b+"deg)");f.style.transform=b;f.style.msTransform=b;f.style.MozTransform=b;f.style.webkitTransform=b;f.style.OTransform=b;b=Render.newElement("div");Render.addTo(b,f);b.style.width=~~a+"px";b.style.height=~~c+"px";b.style.overflow="hidden";return b}function b(a,c,b){if(!Value.eq(b,c)){var e=a.style.width.slice(0,-2)-0,g=a.style.height.slice(0,-2)-0;if("object"===typeof b[0]){if("object"===typeof c[0]&&a.getContext){var k=a.getContext("2d");
+return d(function(){d(this,k,e,g,b)},k,e,g,b)}c=j(e,g,b);c.style.position="absolute";return a.parentNode.replaceChild(c,a)}c=f(e,g,b[1],b[2],b[3][1],b[3][2],b[4][1]);c.style.position="absolute";return a.parentNode.replaceChild(c,a)}}function k(a,c,b,d,e){var g=0,j,f=(a[1]-d[1])/b,a=(a[2]-d[2])/b;0!==c&&(c*=-2*Math.PI,b=f*Math.cos(c)-a*Math.sin(c),a=f*Math.sin(c)+a*Math.cos(c),f=b);if(0===e.length)return!1;j=e[0];for(b=e.length-1;b--;){c=e[b];d=j[1];j=j[2];var k=c[1],s=c[2];if(j<s)var p=j,q=s;else p=
+s,q=j;if(d<k)var u=d,w=k;else u=k,w=d;p<a&&a<=q&&f<=w&&(f<=u||f<=(a-j)*(k-d)/(s-j)+d)&&++g;j=c}return 1===g%2}var g=Elm.JavaScript;return{collage:function(a,c,b){if(0===b.length)return j(a,c,[]);for(var d=Array(b.length),e=b.length;e--;){var g=b[e];d[e]="string"===typeof g[0]?f(a,c,g[1],g[2],g[3][1],g[3][2],g[4][1]):j(a,c,g)}return 1===b.length?d[0]:Render.flowWith(Render.goIn,function(c){return c},d)},updateCollage:function(a,c,d){if(1===d.length)return b(a,c[0],d[0]);for(var a=a.childNodes,e=a.length,
+g=e;g--;)b(a[e-g-1],c[g],d[g])},insideForm:function(a){return function(c){var b=a[1],d=a[2];if(6>c.length){var e=c[3][1],g=c[3][2],j=0,f=c[2];switch(c[4][0]){case "FShape":for(var v=c[4][3][1],s=v.length;--s;)var p=v[s],j=Math.max(j,p[1]*p[1]+p[2]*p[2]);j*=f*f;break;case "FImage":v=f*c[4][1]/2;f=f*c[4][2]/2;j=v*v+f*f;break;case "FElement":v=f*c[4][1][3]/2,f=f*c[4][1][4]/2,j=v*v+f*f}c.push(function(a,c){var b=a-e,d=c-g;return b*b+d*d<j+1})}if(!c[5](b,d))return!1;var q,u;switch(c[4][0]){case "FShape":return k(a,
+c[1],c[2],c[3],c[4][3][1]);case "FLine":return!1;case "FImage":q=c[4][1]/2;u=c[4][2]/2;break;case "FElement":q=c[4][1][3]/2,u=c[4][1][4]/2}return k(a,c[1],c[2],c[3],[[null,q,u],[null,-q,u],[null,-q,-u],[null,q,-u],[null,q,u]])}}}}(),Elm=Elm||{};
+Elm.Graphics=function(){function e(a){return function(c){return["Position",a,c]}}function a(a){return function(c){return["EText",a,c]}}function d(a){return function(c){return["EFlow",a,l.castListToJSArray(c)]}}function j(a){return["Line",l.castListToJSArray(a)]}function f(a){return function(c){var b=l.castListToJSArray(a);0<b.length&&b.push(b[0]);return["Shape",b,c]}}function b(a){return function(c){return function(b){return function(d){return["Form",a,c,b,d]}}}}function k(a){return function(c){return function(b){return["FLine",
+a,c,b]}}}function g(a){return function(c){return function(b){return["FShape",a,c,b]}}}function h(a,c,b,d,i,e){return["Element",Guid.guid(),a,c,b,d,i,e]}function c(a,c,b){return["Element",Guid.guid(),a,c,b,1,Nothing,Nothing]}function i(a){return~~a[3]}function t(a){return~~a[4]}function m(a){return function(b){return function(d){return c(["EImage",l.castStringToJSString(d)],a,b)}}}function r(a){return function(b){return c(A,a,b)}}function n(a){return function(c){return function(b){var d=map(function(b){return["Tuple2",
+a/2*cos(2*(pi/50)*b),c/2*sin(2*(pi/50)*b)]}),i=49,e=["Nil"];if(0<=i){do e=["Cons",i,e];while(0<i--)}return f(d(e))(b)}}}var l=Elm.JavaScript,v=["DRight"],s=["DDown"],p=["DOut"],q=["Near"],u=["Mid"],w=["Far"],A=["EEmpty"],x=["Solid"],C=["Dotted"],y=["Dashed"],B=["Filled"],z=["Outlined"],D=e(q)(q),E=e(w)(q),F=e(q)(w),G=e(w)(w),H=e(q)(u),I=e(w)(u),q=e(u)(q),w=e(u)(w),u=e(u)(u);return{left:["DLeft"],right:v,down:s,up:["DUp"],inward:["DIn"],outward:p,topLeft:D,topRight:E,bottomLeft:F,bottomRight:G,midLeft:H,
+midRight:I,midTop:q,midBottom:w,middle:u,middleAt:function(a){return function(c){return["PositionAt",a,c]}},topLeftAt:function(a){return function(c){return["PositionTL",a,c]}},topRightAt:function(a){return function(c){return["PositionTR",a,c]}},bottomLeftAt:function(a){return function(c){return["PositionBL",a,c]}},bottomRightAt:function(a){return function(c){return["PositionBR",a,c]}},absolute:function(a){return["Absolute",a]},relative:function(a){return["Relative",a]},width:function(a){return function(c){var b=
+c[2];switch(b[0]){case "EImage":case "EVideo":return h(c[2],a,c[4]*a/c[3],c[5],c[6],c[7]);case "EText":return b=Value.getTextSize(a,c[4],b[2]),h(c[2],a,b[1],c[5],c[6],c[7])}return h(c[2],a,c[4],c[5],c[6],c[7])}},height:function(a){return function(c){switch(c[2][0]){case "EImage":case "EVideo":return h(c[2],c[3]*a/c[4],a,c[5],c[6],c[7])}return h(c[2],c[3],a,c[5],c[6],c[7])}},size:function(c){return function(a){return function(b){return h(b[2],c,a,b[5],b[6],b[7])}}},opacity:function(c){return function(a){return h(a[2],
+a[3],a[4],c,a[6],a[7])}},color:function(c){return function(a){return h(a[2],a[3],a[4],a[5],Just(c),a[7])}},link:function(a){return function(c){return h(c[2],c[3],c[4],c[5],c[6],Just(l.castStringToJSString(a)))}},widthOf:i,heightOf:t,sizeOf:function(c){return["Tuple2",~~c[3],~~c[4]]},text:function(b){var d=Value.getTextSize(0,0,b);return c(a("left")(b),d[0],d[1])},asText:function(b){var b=monospace(Value.toText(Value.show(b))),d=Value.getTextSize(0,0,b);return c(a("left")(b),d[0],d[1])},plainText:function(b){var b=
+Value.toText(b),d=Value.getTextSize(0,0,b);return c(a("left")(b),d[0],d[1])},centeredText:function(b){var d=Value.getTextSize(0,0,b);return c(a("center")(b),d[0],d[1])},justifiedText:function(b){var d=Value.getTextSize(0,0,b);return c(a("justify")(b),d[0],d[1])},rightedText:function(b){var d=Value.getTextSize(0,0,b);return c(a("right")(b),d[0],d[1])},image:m,images:function(c){var a=Elm.Signal.constant(r(0)(0)),c=Elm.Signal.lift(function(c){var c=l.castStringToJSString(c),b=new Image;b.onload=function(){Dispatcher.notify(a.id,
+m(this.width)(this.height)(c))};b.src=c})(c);return Elm.Signal.lift2(function(c){return function(){return c}})(a)(c)},video:function(a){return function(b){return function(d){return c(["EVideo",l.castStringToJSString(d)],a,b)}}},fittedImage:function(a){return function(b){return function(d){return c(["EFittedImage",l.castStringToJSString(d)],a,b)}}},flow:function(a){return function(b){var e;e=map(i)(b);a:{switch(a[0]){case "DLeft":e=sum(e);break a;case "DRight":e=sum(e);break a}e=maximum(e)}var h;h=
+map(t)(b);a:{switch(a[0]){case "DDown":h=sum(h);break a;case "DUp":h=sum(h);break a}h=maximum(h)}return c(d(a)(b),e,h)}},above:function(a){return function(b){return c(d(s)(["Cons",a,["Cons",b,["Nil"]]]),max(~~a[3])(~~b[3]),~~a[4]+~~b[4])}},below:function(a){return function(b){return c(d(s)(["Cons",b,["Cons",a,["Nil"]]]),max(~~a[3])(~~b[3]),~~a[4]+~~b[4])}},beside:function(a){return function(b){return c(d(v)(["Cons",a,["Cons",b,["Nil"]]]),~~a[3]+~~b[3],max(~~a[4])(~~b[4]))}},layers:function(a){return c(d(p)(a),
+maximum(map(i)(a)),maximum(map(t)(a)))},collage:function(a){return function(b){return function(d){return c(["ECollage",a,b,Value.groupForms(d)],a,b)}}},spacer:r,container:function(a){return function(b){return function(d){return function(e){return c(["EContainer",d,e],a,b)}}}},line:j,segment:function(a){return function(c){return j(["Cons",a,["Cons",c,["Nil"]]])}},polygon:f,rect:function(a){return function(c){return function(b){return f(["Cons",["Tuple2",0-a/2,0-c/2],["Cons",["Tuple2",0-a/2,c/2],["Cons",
+["Tuple2",a/2,c/2],["Cons",["Tuple2",a/2,0-c/2],["Nil"]]]]])(b)}}},oval:n,circle:function(a){return n(2*a)(2*a)},ngon:function(a){return function(c){return function(b){var d=toFloat(a),e=map(function(a){return["Tuple2",c*cos(2*(pi/d)*a),c*sin(2*(pi/d)*a)]}),i=a-1,h=["Nil"];if(0<=i){do h=["Cons",i,h];while(0<i--)}return f(e(h))(b)}}},solid:function(a){return function(c){return b(0)(1)(["Tuple2",0,0])(k(x)(a)(c))}},dotted:function(a){return function(c){return b(0)(1)(["Tuple2",0,0])(k(C)(a)(c))}},dashed:function(a){return function(c){return b(0)(1)(["Tuple2",
+0,0])(k(y)(a)(c))}},customLine:function(a){return function(c){return function(d){return b(0)(1)(["Tuple2",0,0])(k(["Custom",l.castListToJSArray(a)])(c)(d))}}},filled:function(a){return function(c){return b(0)(1)(c[2])(g(B)(a)(c))}},outlined:function(a){return function(c){return b(0)(1)(c[2])(g(z)(a)(c))}},customOutline:function(a){return function(c){return function(d){return b(0)(1)(d[2])(g(["CustomOutline",l.castListToJSArray(a)])(c)(d))}}},textured:function(a){return function(c){return b(0)(1)(c[2])(g(["Textured",
+a])(null)(c))}},sprite:function(a){return function(c){return function(d){return function(e){return b(0)(1)(e)(["FImage",c,d,l.castStringToJSString(a)])}}}},toForm:function(a){return function(c){return b(0)(1)(a)(["FElement",c])}},rotate:function(a){return function(c){a:{switch(c[0]){case "Form":var d=c[2],e=c[3],i=c[4],c=b(a+c[1])(d)(e)(i);break a}throw"Non-exhaustive pattern match in case";}return c}},scale:function(a){return function(c){return b(c[1])(a*c[2])(c[3])(c[4])}},move:function(a){return function(c){return function(d){var e;
+a:{switch(d[0]){case "Form":e=d[1];var i=d[2],h=d[3],d=d[4];switch(h[0]){case "Tuple2":var g=h[1],h=h[2];e=b(e)(i)(["Tuple2",a+g,c+h])(d);break a}}throw"Non-exhaustive pattern match in case";}return e}}},isWithin:Collage.insideForm}}();Elm=Elm||{};
+Elm.Text=function(){function e(a){return Value.toText(a)}var a=function(a){return function(b){return"<"+a+' style="padding:0;margin:0">'+b+"</"+a+">"}},d=function(a,b){return function(d){return"<span style='"+a+":"+b+"'>"+d+"</span>"}},j=function(a){a=Elm.JavaScript.castStringToJSString(a);return d("font-family",a)},f=a("h1"),b=d("font-style","italic"),a=a("b"),k=d("text-decoration","underline"),g=d("text-decoration","overline"),h=d("text-decoration","line-through");return{fromString:e,toText:e,header:f,
+height:function(a){return d("font-size",a+"em")},italic:b,bold:a,underline:k,overline:g,strikeThrough:h,monospace:j("monospace"),typeface:j,color:function(a){return d("color",Elm.Color.extract(a))},link:function(a){return function(b){return"<a href='"+e(a)+"'>"+b+"</a>"}}}}();
+var Render=function(){function e(a){a=document.createElement(a);a.style.padding="0";a.style.margin="0";return a}function a(a){return a}function d(a){a.style.styleFloat="left";a.style.cssFloat="left";return a}function j(a){a.style.position="absolute";return a}function f(a,b,d){for(var h=e("div"),g=d.length;g--;){var j=a(b(d[g]));h.appendChild(j)}return h}function b(a){switch(a[0]){case "Absolute":return a[1]+"px";case "Relative":return 100*a[1]+"%"}}function k(a,d){d.style.position="absolute";d.style.margin=
+"auto";switch(a[0]){case "Position":"Far"!==a[1][0]&&(d.style.left=0);"Near"!==a[1][0]&&(d.style.right=0);"Far"!==a[2][0]&&(d.style.top=0);"Near"!==a[2][0]&&(d.style.bottom=0);break;case "PositionAt":d.style.top=b(a[2]);d.style.left=b(a[1]);var e="translate("+-elem[3]/2+"px,"+-elem[4]/2+"px)";d.style.transform=e;d.style.msTransform=e;d.style.MozTransform=e;d.style.webkitTransform=e;d.style.OTransform=e;break;default:e=a[0].slice(-2),d.style["T"===e[0]?"top":"bottom"]=b(a[2]),d.style["L"===e[1]?"left":
+"right"]=b(a[1])}}function g(c){var b={};switch(c[2][0]){case "EText":var b=c[2][1],h=c[2][2],m=e("div");m.innerHTML=h;m.style.textAlign=b;b=m;break;case "EImage":b=c[2][1];h=e("img");h.src=b;h.name=b;h.style.display="block";b=h;break;case "EVideo":m=c[2][1];b=e("video");b.controls="controls";h=e("source");h.src=m;m=m.split(".");h.type="video/"+m[m.length-1];b.appendChild(h);b.style.display="block";break;case "EFittedImage":var r=c[3],n=c[4],b=c[2][1],l=e("canvas");l.style.display="block";l.style.width=
+r+"px";l.style.height=n+"px";l.width=r;l.height=n;l.innerHTML="Your browser does not support the canvas element.";var v=e("img");v.onload=function(){if(l.getContext){var a=l.getContext("2d"),b=0,c=0,d=this.width,e=this.height;r/n>this.width/this.height?(e=this.width*n/r,c=(this.height-e)/2):(d=this.height*r/n,b=(this.width-d)/2);a.drawImage(v,b,c,d,e,0,0,l.width,l.height)}};v.src=b;b=l;break;case "EFlow":a:{b=c[2][2];switch(c[2][1][0]){case "DDown":b=b.slice(0).reverse();case "DUp":b=f(a,g,b);break a;
+case "DRight":b=b.slice(0).reverse();case "DLeft":b=f(d,g,b);break a;case "DOut":b=b.slice(0).reverse();case "DIn":b=f(j,g,b);break a}b=void 0}break;case "ECollage":b=Collage.collage(c[2][1],c[2][2],c[2][3]);break;case "EEmpty":b=e("div");break;case "EContainer":h=c[2][1];b=g(c[2][2]);k(h,b);h=e("div");h.style.position="relative";h.style.overflow="hidden";h.appendChild(b);b=h;break;case "EHtml":b=c[2][1];"button"!==b.type&&(h=Value.getExcess(b),c[3]-=h[0],c[4]-=h[1]);break;case "EExternalHtml":b=
+e("div"),b.appendChild(c[2][1])}b.id=c[1];b.style.width=~~c[3]+"px";b.style.height=~~c[4]+"px";1!==c[5]&&(b.style.opacity=c[5]);"Just"===c[6][0]&&(b.style.backgroundColor=Elm.Color.extract(c[6][1]));return"Just"===c[7][0]?(h=e("a"),h.href=c[7][1],h.appendChild(b),h):b}function h(b,e,f){"A"===b.tagName&&(b=b.firstChild);if(e[1]!==f[1]){if(e[2][0]!==f[2][0])return b.parentNode.replaceChild(g(f),b);var m=f[2],r=e[2];switch(m[0]){case "EText":m[1]!==r[1]&&(b.style.textAlign=m[1]);m[2]!==r[2]&&(b.innerHTML=
+m[2]);break;case "EImage":m[1]!==r[1]&&(b.src=m[1]);break;case "EVideo":case "EFittedImage":if(!Value.eq(m,r)||f[3]!==e[3]||f[4]!==e[4])return b.parentNode.replaceChild(g(f),b);break;case "ECollage":if(m[1]!==r[1]||m[2]!==r[2]||m[3].length!==r[3].length)return b.parentNode.replaceChild(g(f),b);Collage.updateCollage(b,r[3],m[3]);break;case "EFlow":if(m[1]!==r[1])return b.parentNode.replaceChild(g(f),b);var n=m[2],l=b.childNodes;if(n.length!==l.length)return b.parentNode.replaceChild(g(f),b);var r=
+r[2],v={};switch(m[1][0]){case "DDown":case "DUp":v=a;break;case "DRight":case "DLeft":v=d;break;case "DOut":case "DIn":v=j}for(m=l.length;m--;)h(l[m],r[m],n[m]),v(l[m]);break;case "EContainer":h(b.childNodes[0],r[2],m[2]);k(m[1],b.childNodes[0]);break;case "EHtml":f[1]!==e[1]&&(n=g(f),b.parentNode.replaceChild(n,b),b=n);"button"!==n.type&&(m=Value.getExcess(b),f[3]-=m[0],f[4]-=m[1]);break;case "EExternalHtml":f[1]!==e[1]&&b.parentNode.replaceChild(g(f),b)}f[3]!==e[3]&&(b.style.width=~~f[3]+"px");
+f[4]!==e[4]&&(b.style.height=~~f[4]+"px");f[5]!==e[5]&&(b.style.opacity=f[5]);2===f[6].length&&(m=Elm.Color.extract(f[6][1]),m!==b.style.backgroundColor&&(b.style.backgroundColor=m));if(2===f[7].length&&(1===e[7].length||f[7][1]!==e[7][1]))b.parentNode.href=f[7][1];f[1]=e[1]}}return{render:g,update:h,addTo:function(a,b){a.appendChild(b)},newElement:e,flowWith:f,goIn:j}}(),Elm=Elm||{};
+Elm.Signal=function(){var e=function(a,b,d){for(var e=a.kids,g=e.length;g--;)e[g].recv(b,d,a.id)},a=function(a){this.id=Guid.guid();this.value=a;this.kids=[];this.defaultNumberOfKids=0;this.recv=function(a,b,d){if(b=b===this.id)this.value=d;e(this,a,b);return b};Dispatcher.inputs.push(this)},d=function(a,b){this.id=Guid.guid();this.value=null;this.kids=[];this.count=0;this.changed=!1;b.reverse();this.recalc=function(){for(var d=a,e=b.length;e--;)d=d(b[e].value);this.value=d};this.recalc();this.recv=
+function(a,d){this.count+=1;d&&(this.changed=!0);this.count==b.length&&(this.changed&&this.recalc(),e(this,a,this.changed),this.changed=!1,this.count=0)};for(var d=b.length;d--;)b[d].kids.push(this)},j=function(a,b,d,g){this.id=Guid.guid();this.value=d?b(g.value):b;this.kids=[];this.recv=function(b,c){c&&(this.value=a(g.value)(this.value));e(this,b,c)};g.kids.push(this)},f=function(a,b,d){this.id=Guid.guid();this.value=a(d.value)?b:d.value;this.kids=[];this.recv=function(b,c){var g=c&&!a(d.value);
+g&&(this.value=d.value);e(this,b,g)};d.kids.push(this)},b=function(a){this.id=Guid.guid();this.value=a.value;this.kids=[];this.recv=function(b,d){var g=d&&!eq(this.value,a.value);g&&(this.value=a.value);e(this,b,g)};a.kids.push(this)},k=function(a){return function(b){return function(e){e=new d(function(a){return function(b){return[a,b]}},[a,e]);e=new f(function(a){return a[0]},[!0,b],e);return new d(function(a){return a[1]},[e])}}},g=function(a,b){this.id=Guid.guid();this.value=b.value;this.kids=
+[];this.count=0;this.changed=!1;this.recv=function(d,g,f){f===a.id&&(this.changed=g);this.count+=1;2==this.count&&(this.changed&&(this.value=b.value),e(this,d,this.changed),this.count=0,this.changed=!1)};a.kids.push(this);b.kids.push(this)};return{constant:function(b){return new a(b)},lift:function(a){return function(b){return new d(a,[b])}},lift2:function(a){return function(b){return function(e){return new d(a,[b,e])}}},lift3:function(a){return function(b){return function(e){return function(g){return new d(a,
+[b,e,g])}}}},lift4:function(a){return function(b){return function(e){return function(g){return function(f){return new d(a,[b,e,g,f])}}}}},foldp:function(a){return function(b){return function(d){return new j(a,b,!1,d)}}},foldp_:function(a){return function(b){return function(d){return new j(a,b,!0,d)}}},foldp1:function(a){return function(b){return new j(a,function(a){return a},!0,b)}},count:function(a){return new j(function(){return function(a){return a+1}},0,!1,a)},keepIf:function(a){return function(b){return function(d){return new f(function(b){return!a(b)},
+b,d)}}},dropIf:function(a){return function(b){return function(d){return new f(a,b,d)}}},keepWhen:function(a){return k(new d(function(a){return!a},[a]))},dropWhen:k,dropRepeats:function(a){return new b(a)},sampleOn:function(a){return function(b){return new g(a,b)}}}}();
+var Dispatcher=function(){function e(a){if(!a.hasOwnProperty("defaultNumberOfKids"))return!0;var d=a.kids.length;if(0==d)return!1;if(d>a.defaultNumberOfKids)return!0;for(var g=!1;d--;)g=g||e(a.kids[d]);return g}var a=null,d=0,j=[],f=null;return{initialize:function(){a=Elm.main();a.hasOwnProperty("recv")||(a=Elm.Signal.constant(a));f=a.value;for(var b=[],d=j.length;d--;)e(j[d])&&b.push(j[d]);j=b;document.getElementById("content").appendChild(Render.render(f));b=document.getElementById("widthChecker").offsetWidth;
+b!==window.innerWidth&&Dispatcher.notify(Window.dimensions.id,Value.Tuple(b,window.innerHeight));a=Elm.Signal.lift(function(a){var b=document.getElementById("content");Render.update(b.firstChild,f,a);return f=a})(a)},notify:function(a,e){d+=1;for(var g=!1,f=j.length;f--;)g=j[f].recv(d,a,e)||g;return g},inputs:j}}();
+Elm.HTTP=function(){function e(a){return function(b){return function(d){return function(c){return{"0":"Request",length:1,verb:f.castStringToJSString(a),url:f.castStringToJSString(b),data:null===d?null:f.castStringToJSString(d),headers:c}}}}}function a(a){return e("GET")(a)(null)(["Nil"])}function d(a){return function(d){Dispatcher.notify(a.id,["Waiting"]);var e=null;window.XMLHttpRequest?e=new XMLHttpRequest:window.ActiveXObject&&(e=new ActiveXObject("Microsoft.XMLHTTP"));e.onreadystatechange=function(){4===
+e.readyState&&Dispatcher.notify(a.id,200===e.status?["Success",b(e.responseText)]:["Failure",e.status,b(e.statusText)])};e.open(d.verb,d.url,!0);Elm.List.map(function(a){e.setRequestHeader(f.castStringToJSString(a[1]),f.castStringToJSString(a[2]))})(d.headers);e.send(d.data);return null}}function j(a){var b=Elm.Signal.constant(["Waiting"]),a=Elm.Signal.lift(d(b))(a);return Elm.Signal.lift2(function(a){return function(){return a}})(b)(a)}var f=Elm.JavaScript,b=Elm.JavaScript.castJSStringToString;return{get:a,
+post:function(a){return function(b){return e("POST")(a)(b)(["Nil"])}},request:e,send:j,sendGet:function(b){return j(Elm.Signal.lift(a)(b))}}}();
+Elm.Input=function(){var e=Elm.JavaScript,a=Elm.JavaScript.castJSStringToString,d=function(b,d){b.placeholder=e.castStringToJSString(d);var g=Elm.Signal.constant(["Nil"]);Value.addListener(b,"keyup",function(){Dispatcher.notify(g.id,a(b.value));b.focus()});b.style.padding="1px";return Value.Tuple(Value.wrap(b),g)},j=function(a){a=document.createElement(a);a.style.padding="0";a.style.margin="0";return a},f=function(a){for(var d=j("select"),e=[];"Cons"===a[0];){var f=j("option"),c=Value.toText(a[1][1]);
+f.value=c;f.innerHTML=c;d.appendChild(f);e.push(a[1][2]);a=a[2]}var i=Elm.Signal.constant(e[0]);Value.addListener(d,"change",function(){Dispatcher.notify(i.id,e[d.selectedIndex])});return Value.Tuple(Value.wrap(d),i)};return{textArea:function(a){return function(e){var f=j("textarea");f.rows=e;f.cols=a;return d(f,"")}},textField:function(a){var e=j("input");e.type="text";return d(e,a)},password:function(a){var e=j("input");e.type="password";return d(e,a)},checkbox:function(a){var d=j("input");d.type=
+"checkbox";d.checked=a;var e=Elm.Signal.constant(a);Value.addListener(d,"change",function(){Dispatcher.notify(e.id,d.checked)});return Value.Tuple(Value.wrap(d),e)},dropDown:f,stringDropDown:function(a){return f(Elm.List.map(function(a){return Value.Tuple(a,a)})(a))},button:function(a){var d=j("input");d.type="button";d.value=e.castStringToJSString(a);var f=Elm.Signal.constant(!1);Value.addListener(d,"click",function(){Dispatcher.notify(f.id,!0);Dispatcher.notify(f.id,!1)});return Value.Tuple(Value.wrap(d),
+f)}}}();
+Elm.Keyboard={Raw:function(){function e(a,d){return"Nil"===d[0]?d:d[1]===a?d[2]:["Cons",d[1],e(a,d[2])]}var a=Elm.Signal.constant(["Nil"]),d=Elm.Signal.constant(["Nothing"]);Value.addListener(document,"keydown",function(d){var e;a:{for(e=a.value;"Nil"!==e[0];){if(e[1]===d.keyCode){e=!0;break a}e=e[2]}e=!1}e||Dispatcher.notify(a.id,["Cons",d.keyCode,a.value])||this.removeEventListener("keydown",arguments.callee,!1)});Value.addListener(document,"keyup",function(d){var f=e(d.keyCode,a.value);Dispatcher.notify(a.id,
+f)||this.removeEventListener("keyup",arguments.callee,!1)});Value.addListener(window,"blur",function(d){Dispatcher.notify(a.id,["Nil"])||this.removeEventListener("blur",arguments.callee,!1)});Value.addListener(document,"keypress",function(a){var e=Dispatcher.notify(d.id,["Just",a.charCode||a.keyCode]);Dispatcher.notify(d.id,["Nothing"]);e||this.removeEventListener("keypress",arguments.callee,!1)});return{keysDown:a,charPressed:d}}()};
+Elm.Mouse=function(){function e(a){var b=0,c=0;a||(a=window.event);if(a.pageX||a.pageY)b=a.pageX,c=a.pageY;else if(a.clientX||a.clientY)b=a.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,c=a.clientY+document.body.scrollTop+document.documentElement.scrollTop;return Value.Tuple(b,c)}var a=Elm.Signal.constant(Value.Tuple(0,0));a.defaultNumberOfKids=2;var d=Elm.Signal.lift(function(a){return a[1]})(a);d.defaultNumberOfKids=0;var j=Elm.Signal.lift(function(a){return a[2]})(a);j.defaultNumberOfKids=
+0;var f=Elm.Signal.constant(!1),b=Elm.Signal.constant(!1),k=Elm.Signal.constant(Value.Tuple());Value.addListener(document,"click",function(a){var d=Dispatcher.notify(b.id,!0),c=Dispatcher.notify(k.id,Value.Tuple());Dispatcher.notify(b.id,!1);!d&&!c&&this.removeEventListener("click",arguments.callee,!1)});Value.addListener(document,"mousedown",function(a){Dispatcher.notify(f.id,!0)||this.removeEventListener("mousedown",arguments.callee,!1)});Value.addListener(document,"mouseup",function(a){Dispatcher.notify(f.id,
+!1)||this.removeEventListener("mouseup",arguments.callee,!1)});Value.addListener(document,"mousemove",function(b){Dispatcher.notify(a.id,e(b))||this.removeEventListener("mousemove",arguments.callee,!1)});return{position:a,x:d,y:j,isClicked:b,isDown:f,clicks:k,isClickedOn:function(a){var a=Render.render(a),b=Elm.Signal.constant(!1);Value.addListener(a,"click",function(){Dispatcher.notify(b.id,!0);Dispatcher.notify(b.id,!1)});return Value.Tuple(Value.wrap(a),b)}}}();
+Elm.Random=function(){return{inRange:function(e){return function(a){return Elm.Signal.constant(Math.floor(Math.random()*(a-e+1))+e)}},randomize:function(e){return function(a){return function(d){return Elm.Signal.lift(function(){return Math.floor(Math.random()*(a-e+1))+e})(d)}}}}}();
+Elm.Time=function(){return{every:function(e){var e=1E3*e,a=Elm.Signal.constant(0),d=0;setInterval(function(){d+=e;Dispatcher.notify(a.id,d/1E3)},e);return a},after:function(e){var e=1E3*e,a=Elm.Signal.constant(!1);setTimeout(function(){Dispatcher.notify(a.id,!0)},e);return a},before:function(e){var e=1E3*e,a=Elm.Signal.constant(!0);setTimeout(function(){Dispatcher.notify(a.id,!1)},e);return a}}}();
+Elm.Window=function(){var e=Elm.Signal.constant(Value.Tuple(window.innerWidth,window.innerHeight));e.defaultNumberOfKids=2;var a=Elm.Signal.lift(function(a){return a[1]})(e);a.defaultNumberOfKids=0;var d=Elm.Signal.lift(function(a){return a[2]})(e);d.defaultNumberOfKids=0;Value.addListener(window,"resize",function(a){var d=document.getElementById("widthChecker").offsetWidth;Dispatcher.notify(e.id,Value.Tuple(d,window.innerHeight))||this.removeEventListener("resize",arguments.callee,!1)});return{dimensions:e,
+width:a,height:d}}();Value.addListener(document,"elm_log",function(e){console.log(e.value)});Value.addListener(document,"elm_title",function(e){document.title=e.value});Value.addListener(document,"elm_redirect",function(e){0<e.value.length&&(window.location=e.value)});Elm=Elm||{};
+Elm.Prelude=function(){var e=function(a){return function(d){var j=a%d,j=0==a?0:0<d?0<=a?j:j+d:-e(-a)(-d);return j==d?0:j}};return{eq:Value.eq,id:function(a){return a},not:function(a){return!a},fst:function(a){return a[1]},snd:function(a){return a[2]},rem:function(a){return function(d){return a%d}},div:function(a){return function(d){return~~(a/d)}},compare:function(a){return function(d){a="object"===typeof a?toText(a):a;d="object"===typeof d?toText(d):d;return[a===d?"EQ":a<d?"LT":"GT"]}},toFloat:function(a){return a},
+round:function(a){return Math.round(a)},floor:function(a){return Math.floor(a)},ceiling:function(a){return Math.ceil(a)},truncate:function(a){return~~a},readInt:function(a){var a=JavaScript.castStringToJSString(a),d=a.length;if(0===d)return Nothing;var e=0;if("-"==a[0]){if(1===d)return Nothing;e=1}for(;e<d;++e)if(!Char.isDigit(a[e]))return Nothing;return Just(parseInt(a))},readFloat:function(a){var a=JavaScript.castStringToJSString(a),d=a.length;if(0===d)return Nothing;var e=0;if("-"==a[0]){if(1===
+d)return Nothing;e=1}for(var f=0;e<d;++e)if(!Char.isDigit(a[e])){if("."===a[e]&&(f+=1,1>=f))continue;return Nothing}return Just(parseFloat(a))},sqrt:Math.sqrt,abs:Math.abs,pi:Math.PI,e:Math.E,sin:Math.sin,cos:Math.cos,tan:Math.tan,asin:Math.asin,acos:Math.acos,atan:Math.atan,atan2:function(a){return function(d){return Math.atan2(a,d)}},mod:e,min:function(a){return function(d){return Math.min(a,d)}},max:function(a){return function(d){return Math.max(a,d)}},flip:function(a){return function(d){return function(e){return a(e)(d)}}},
+clamp:function(a){return function(d){return function(e){return Math.min(d,Math.max(a,e))}}},curry:function(a){return function(d){return function(e){return a(["Tuple2",d,e])}}},uncurry:function(a){return function(d){if("Tuple2"!==d[0])throw"Function was uncurry'd but was not given a pair.";return a(d[1])(d[2])}},logBase:function(a){return function(d){return Math.log(d)/Math.log(a)}},Just:Elm.Maybe.Just,Nothing:Elm.Maybe.Nothing,maybe:Elm.Maybe.maybe,map:Elm.List.map,filter:Elm.List.filter,head:Elm.List.head,
+tail:Elm.List.tail,last:Elm.List.last,length:Elm.List.length,reverse:Elm.List.reverse,foldr:Elm.List.foldr,foldr1:Elm.List.foldr1,foldl:Elm.List.foldl,foldl1:Elm.List.foldl1,and:Elm.List.and,or:Elm.List.or,all:Elm.List.all,any:Elm.List.any,sum:Elm.List.sum,product:Elm.List.product,concat:Elm.List.concat,concatMap:Elm.List.concatMap,maximum:Elm.List.maximum,minimum:Elm.List.minimum,scanl:Elm.List.scanl,scanl1:Elm.List.scanl1,take:Elm.List.take,drop:Elm.List.drop,zip:Elm.List.zip,unzip:Elm.List.unzip,
+lift:Elm.Signal.lift,lift2:Elm.Signal.lift2,lift3:Elm.Signal.lift3,lift4:Elm.Signal.lift4,foldp:Elm.Signal.foldp,foldp1:Elm.Signal.foldp1,foldp_:Elm.Signal.foldp_,constant:Elm.Signal.constant,count:Elm.Signal.count,keepIf:Elm.Signal.keepIf,dropIf:Elm.Signal.dropIf,keepWhen:Elm.Signal.keepWhen,dropWhen:Elm.Signal.dropWhen,dropRepeats:Elm.Signal.dropRepeats,sampleOn:Elm.Signal.sampleOn}}();
+(function(){var e=function(a){for(var d in a)Elm.Prelude[d]=a[d]};e(Elm.Color);e(Elm.Text);e(Elm.Graphics);show=Value.show})();
+(function(){for(var e in Elm)this[e]=Elm[e];Elm.Automaton=function(){function a(a){return["Automaton",a]}function d(a){return["DragFrom",a]}function e(b){return function(c){var d;a:{switch(b[0]){case "Automaton":d=b[1];break a}throw"Non-exhaustive pattern match in case";}var f;a:{switch(c[0]){case "Automaton":f=c[1];break a}throw"Non-exhaustive pattern match in case";}return a(function(a){var a=d(a),b;a:{switch(a[0]){case "Tuple2":b=a[1];break a}throw"Non-exhaustive pattern match in case";}a:{switch(a[0]){case "Tuple2":a=
+a[2];break a}throw"Non-exhaustive pattern match in case";}var c=f(b);a:{switch(c[0]){case "Tuple2":b=c[1];break a}throw"Non-exhaustive pattern match in case";}a:{switch(c[0]){case "Tuple2":c=c[2];break a}throw"Non-exhaustive pattern match in case";}return["Tuple2",b,e(a)(c)]})}}function f(b){return a(function(a){var c=unzip(map(function(b){a:{switch(b[0]){case "Automaton":b=b[1](a);break a}throw"Non-exhaustive pattern match in case";}return b})(b)),d;a:{switch(c[0]){case "Tuple2":d=c[1];break a}throw"Non-exhaustive pattern match in case";
+}a:{switch(c[0]){case "Tuple2":c=c[2];break a}throw"Non-exhaustive pattern match in case";}return["Tuple2",d,f(c)]})}function b(c){return a(function(a){return["Tuple2",c(a),b(c)]})}function k(b){return function(c){return a(function(a){a=c(a)(b);return["Tuple2",a,k(a)(c)]})}}function g(b){return function(c){return a(function(a){var d=c(a)(b);a:{switch(d[0]){case "Tuple2":a=d[1];break a}throw"Non-exhaustive pattern match in case";}a:{switch(d[0]){case "Tuple2":d=d[2];break a}throw"Non-exhaustive pattern match in case";
+}return["Tuple2",a,g(d)(c)]})}}function h(a){return function(b){a:{switch(a[0]){case "Tuple2":b:{switch(b[0]){case "Tuple2":b=["Tuple2",a[1]-b[1],a[2]-b[2]];break b}break}break a}throw"Non-exhaustive pattern match in case";}return b}}function c(a){return function(b){var c;a:{switch(a[0]){case "Tuple2":b:{switch(b[0]){case "Tuple2":var e=function(a){return["Tuple2",b[2],["Tuple2",a,b[2]]]};c=function(){switch(b[1][0]){case "DragFrom":var c;a[1]?c=["Tuple2",uncurry(move)(h(a[2])(b[1][1]))(b[2]),["Tuple2",
+d(b[1][1]),b[2]]]:(c=uncurry(move)(h(a[2])(b[1][1]))(b[2]),c=["Tuple2",c,["Tuple2",m,c]]);return c;case "Ignore":return e(a[1]?r:m);case "Listen":return e(not(a[1])?m:isWithin(a[2])(b[2])?d(a[2]):r)}throw"Non-exhaustive pattern match in case";}();break b}break}break a}throw"Non-exhaustive pattern match in case";}return c}}var i=[],t;for(t in Elm.Prelude)0<=i.indexOf(t)||(this[t]=Elm.Prelude[t]);var m=["Listen"],r=["Ignore"],i=k(0)(function(){return function(a){return 1+a}});return{Automaton:a,run:function(a){return function(b){a:{switch(a[0]){case "Automaton":b=
+lift(fst)(foldp_(function(a){return function(b){a:{switch(b[0]){case "Tuple2":switch(b[2][0]){case "Automaton":b=b[2][1](a);break a}}throw"Non-exhaustive pattern match in case";}return b}})(a[1])(b));break a}throw"Non-exhaustive pattern match in case";}return b}},step:function(a){return function(b){a:{switch(a[0]){case "Automaton":b=a[1](b);break a}throw"Non-exhaustive pattern match in case";}return b}},composeAuto:e,combine:f,pure:b,init:k,init_:g,count:i,Listen:m,Ignore:r,DragFrom:d,vecSub:h,stepDrag:c,
+draggable:function(a){return g(["Tuple2",m,a])(c)}}}()})();
diff --git a/src/Ast.hs b/src/Ast.hs
--- a/src/Ast.hs
+++ b/src/Ast.hs
@@ -13,6 +13,7 @@
 
 type Imports = [(String, ImportMethod)]
 data ImportMethod = As String | Hiding [String] | Importing [String]
+                    deriving (Eq,Ord)
 
 
 data Pattern = PData String [Pattern] | PVar String | PAnything
diff --git a/src/Compiler.hs b/src/Compiler.hs
--- a/src/Compiler.hs
+++ b/src/Compiler.hs
@@ -101,10 +101,10 @@
 toFilePath modul = map (\c -> if c == '.' then '/' else c) modul ++ ".elm"
 
 builtInModules =
-    concat [ map ("Data."++)     [ "List", "Char", "Maybe" ]
-           , map ("Signal."++)   [ "Mouse", "Keyboard.Raw"
-                                 , "Window", "Time", "HTTP", "Input", "Random" ]
-           , map ("Graphics."++) [ "Element", "Text", "Color" ]
-           , map ("Foreign.JavaScript"++) [ "", "JSON", "Experimental" ]
-           , [ "Prelude" ]
+    concat [ [ "List", "Char", "Maybe", "Dict", "Set", "Automaton" ]
+           , [ "Signal", "Mouse", "Keyboard.Raw"
+             , "Window", "Time", "HTTP", "Input", "Random" ]
+           , [ "Graphics", "Text", "Color" ]
+           , map ("JavaScript"++) [ "", "Experimental" ]
+           , [ "Prelude", "JSON" ]
            ]
diff --git a/src/Gen/Cases.hs b/src/Gen/Cases.hs
--- a/src/Gen/Cases.hs
+++ b/src/Gen/Cases.hs
@@ -1,16 +1,15 @@
 
-module Cases (caseToMatch, Match (..), Clause (..)) where
+module Cases (caseToMatch, Match (..), Clause (..), matchSubst) where
 
 import Control.Arrow (first)
 import Control.Monad (liftM,foldM)
-import Data.List (groupBy,sortBy)
+import Data.List (groupBy,sortBy,lookup)
+import Data.Maybe (fromMaybe)
 
 import Ast
 import Guid
 import Substitute
 
-import System.IO.Unsafe
-
 caseToMatch patterns = do
   v <- newVar
   match [v] (map (first (:[])) patterns) Fail
@@ -27,6 +26,16 @@
 
 data Clause = Clause String [String] Match
               deriving Show
+
+matchSubst :: [(String,String)] -> Match -> Match
+matchSubst _ Break = Break
+matchSubst _ Fail = Fail
+matchSubst pairs (Seq ms) = Seq (map (matchSubst pairs) ms)
+matchSubst pairs (Other e) =
+    Other $ foldr ($) e $ map (\(x,y) -> subst x (Var y)) pairs
+matchSubst pairs (Match n cs m) = Match (varSubst n) (map clauseSubst cs) (matchSubst pairs m)
+    where clauseSubst (Clause c vs m) = Clause c (map varSubst vs) (matchSubst pairs m)
+          varSubst v = fromMaybe v (lookup v pairs)
 
 isCon (PData _ _ : _, _) = True
 isCon _                  = False
diff --git a/src/Gen/CompileToJS.hs b/src/Gen/CompileToJS.hs
--- a/src/Gen/CompileToJS.hs
+++ b/src/Gen/CompileToJS.hs
@@ -19,20 +19,24 @@
 showErr err = mainEquals $ "text(monospace(" ++ msg ++ "))"
     where msg = show . concatMap (++"<br>") . lines $ err
 
+indent = concatMap f
+    where f '\n' = "\n "
+          f c = [c]
+
 parens s  = "(" ++ s ++ ")"
 braces s  = "{" ++ s ++ "}"
 jsList ss = "["++ intercalate "," ss ++"]"
-jsFunc args body = "function(" ++ args ++ "){" ++ body ++ "}"
+jsFunc args body = "function(" ++ args ++ "){" ++ indent body ++ "}"
 assign x e = "\nvar " ++ x ++ "=" ++ e ++ ";"
 ret e = "\nreturn "++ e ++";"
 iff a b c = a ++ "?" ++ b ++ ":" ++ c
 
-mainEquals s = globalAssign "ElmCode.main" (jsFunc "" (ret s))
+mainEquals s = globalAssign "Elm.main" (jsFunc "" (ret s))
 globalAssign m s = "\n" ++ m ++ "=" ++ s ++ ";"
 
 tryBlock escapees names e = 
-    concat [ "\ntry{\n" ++ e ++ "\n\n} catch (e) {"
-           , "ElmCode.main=function() {"
+    concat [ "\ntry{\n" ++ e ++ "\n} catch (e) {"
+           , "Elm.main=function() {"
 	   , "var msg = ('<br/><h2>Your browser may not be supported. " ++
              "Are you using a modern browser?</h2>' +" ++
              " '<br/><span style=\"color:grey\">Runtime Error in " ++
@@ -42,22 +46,27 @@
            , "};}"
            ]
     where msg | escapees /= [] = concat [ "<br/><br/>The problem may stem from an improper usage of:<br/>"
-                                        ,  intercalate ", " escapees ]
+                                        ,  intercalate ", " $ map (concatMap escape) escapees ]
               | otherwise = ""
+          escape '\'' = "\\'"
+          escape '"' = "\\\""
+          escape c = [c]
 
+
 jsModule (escapees, Module names exports imports stmts) =
     tryBlock escapees (tail modNames) $ concat
-           [ concatMap (\n -> globalAssign n $ n ++ " || {}") .
+           [ "\nfor(var i in Elm) { this[i] = Elm[i]; }"
+           , concatMap (\n -> globalAssign n $ n ++ " || {}") .
              map (intercalate ".") . drop 2 . inits $
              take (length modNames - 1) modNames
            , "\nif (" ++ modName ++ ") throw \"Module name collision, '" ++
              intercalate "." (tail modNames) ++ "' is already defined.\"; "
            , globalAssign modName $ jsFunc "" (includes ++body++ export) ++ "()"
            , mainEquals $ modName ++ ".main" ]
-        where modNames = if null names then ["ElmCode", "Main"]
-                                       else  "ElmCode" : names
+        where modNames = if null names then ["Elm", "Main"]
+                                       else  "Elm" : names
               modName  = intercalate "." modNames
-              includes = concatMap jsImport $ map (first ("ElmCode."++)) imports
+              includes = concatMap jsImport $ map (first ("Elm."++)) imports
               body = stmtsToJS stmts
               export = getExports exports stmts
               exps = if null exports then ["main"] else exports
@@ -81,14 +90,13 @@
      jsImport' (modul, how)
   
 jsImport' (modul, As name) = assign name modul
-jsImport' (modul, Importing []) = jsImport' (modul, Hiding [])
 jsImport' (modul, Importing vs) =
     concatMap (\v -> assign v $ modul ++ "." ++ v) vs
 jsImport' (modul, Hiding vs) =
     concat [ assign "hiddenVars" . jsList $ map (\v -> "'" ++ v ++ "'") vs
            , "\nfor(var i in " ++ modul ++ "){"
-           , "\nif (hiddenVars.indexOf(i) >= 0) continue;"
-           , globalAssign "this[i]" $ modul ++ "[i]"
+           , indent $ "\nif (hiddenVars.indexOf(i) >= 0) continue;"
+           , indent $ globalAssign "this[i]" $ modul ++ "[i]"
            , "}" ]
 
 stmtsToJS :: [Statement] -> String
@@ -103,13 +111,13 @@
 stmtToJS :: Statement -> String
 stmtToJS (Def name [] e) = assign name (toJS e)
 stmtToJS (Def name (a:as) e) = "\nfunction " ++ name ++ parens a ++
-                               braces (ret . toJS $ foldr Lambda e as) ++ ";"
+                               braces (indent . ret . toJS $ foldr Lambda e as) ++ ";"
 stmtToJS (Datatype _ _ tcs) = concatMap (stmtToJS . toDef) tcs
     where toDef (name,args) = Def name vars $ Data (derename name) (map Var vars)
               where vars = map (('a':) . show) [1..length args]
 stmtToJS (ImportEvent js base elm _) =
-    concat [ "\nvar " ++ elm ++ " = Elm.Input(" ++ toJS base ++ ");"
-           , "\nSignal.addListener(document, '" ++ js
+    concat [ "\nvar " ++ elm ++ " = Elm.Signal.constant(" ++ toJS base ++ ");"
+           , "\nValue.addListener(document, '" ++ js
            , "', function(e) { Dispatcher.notify(" ++ elm
            , ".id, e.value); });" ]
 stmtToJS (ExportEvent js elm _) =
@@ -163,36 +171,31 @@
           toDef (Definition x [] e) = assign x `liftM` toJS' e
           toDef (Definition f (a:as) e) = do
             out <- toJS' $ foldr Lambda e as
-            return $ "\nfunction " ++ f ++ parens a ++ braces (ret out) ++ ";"
+            return $ "\nfunction " ++ f ++ parens a ++ braces (indent $ ret out) ++ ";"
 
 caseToJS e ps = do
   match <- caseToMatch ps
-  var <- liftM (\n -> "case" ++ show n) guid
-  matches <- matchToJS var match
   e' <- toJS' e
-  return $ concat [ "function(", var, "){"
-                  , case match of { Match name _ _ -> assign name var ; _ -> "" }
-                  , matches
-                  , "}", parens e' ]
+  (match',stmt) <- case (match,e) of
+                     (Match name _ _, Var x) -> return (matchSubst [(name,x)] match, "")
+                     (Match name _ _, _    ) -> return (match, assign name e')
+                     _ -> liftM (\n -> (match, e')) guid
+  matches <- matchToJS match'
+  return $ concat [ "function(){", stmt, matches, "}()" ]
 
-matchToJS v (Match name clauses def) = do
+matchToJS (Match name clauses def) = do
   cases <- concat `liftM` mapM (clauseToJS name) clauses
-  finally <- matchToJS v def
-  return $ concat [ "\nswitch(", name, "[0]){", cases, "\n}", finally ]
-matchToJS _ Fail  = return "\nthrow \"Non-exhaustive pattern match in case\";"
-matchToJS _ Break = return "break;"
-matchToJS _ (Other e) = ret `liftM` toJS' e
-matchToJS v (Seq ms) = concat `liftM` mapM (matchToJS v) ms
+  finally <- matchToJS def
+  return $ concat [ "\nswitch(", name, "[0]){", indent cases, "\n}", finally ]
+matchToJS Fail  = return "\nthrow \"Non-exhaustive pattern match in case\";"
+matchToJS Break = return "break;"
+matchToJS (Other e) = ret `liftM` toJS' e
+matchToJS (Seq ms) = concat `liftM` mapM matchToJS ms
 
 clauseToJS var (Clause name vars e) = do
-  s <- matchToJS var e
-  return $ concat [ "\ncase ", show name, ":"
-                  , defs
-                  , s ]
-        where toDef v n = v ++ "=" ++ var ++ "[" ++ show n ++ "]"
-              defs = case vars of [] -> ""
-                                  _ -> ("\nvar "++) . (++";") . intercalate "," $
-                                         zipWith toDef vars [ 1 .. length vars ]
+  let vars' = map (\n -> var ++ "[" ++ show n ++ "]") [ 1 .. length vars ]
+  s <- matchToJS $ matchSubst (zip vars vars') e
+  return $ concat [ "\ncase ", show name, ":", s ]
 
 jsNil         = "[\"Nil\"]"
 jsCons  e1 e2 = jsList [ show "Cons", e1, e2 ]
@@ -215,6 +218,8 @@
                     ">"  -> "(compare(" ++ e1 ++ ")(" ++ e2 ++ ")[0] === 'GT')"
                     "<=" -> "function() { var ord = compare(" ++ e1 ++ ")(" ++ e2 ++ ")[0]; return ord === 'LT' || ord === 'EQ'; }()"
                     ">=" -> "function() { var ord = compare(" ++ e1 ++ ")(" ++ e2 ++ ")[0]; return ord === 'GT' || ord === 'EQ'; }()"
+                    ">>>" -> "composeAuto(" ++ e1 ++ ")(" ++ e2 ++ ")"
+                    "<<<" -> "composeAuto(" ++ e2 ++ ")(" ++ e1 ++ ")"
                     _    -> parens (e1 ++ (o:p) ++ e2)
 
 append e1 e2 = "Value.append" ++ parens (e1 ++ "," ++ e2)
diff --git a/src/Gen/GenerateHtml.hs b/src/Gen/GenerateHtml.hs
--- a/src/Gen/GenerateHtml.hs
+++ b/src/Gen/GenerateHtml.hs
@@ -22,15 +22,7 @@
 
 css = H.style ! A.type_ "text/css" $ preEscapedToMarkup
       ("html,head,body { padding:0; margin:0; }\
-       \body { font-family: helvetica, arial, sans-serif; }\
-       \a:link {text-decoration: none}\
-       \a:visited {text-decoration: none}\
-       \a:active {text-decoration: none}\
-       \a:hover {text-decoration: underline; color: #ff8f12;}" :: String)
-{--
-       \hyphens: auto; -moz-hyphens: auto;\
-       \ -webkit-hyphens: auto; -ms-hyphens: auto; }\
---}
+       \body { font-family: helvetica, arial, sans-serif; }" :: String)
 
 data JSStyle = Minified | Readable
 
diff --git a/src/Language/Elm.hs b/src/Language/Elm.hs
--- a/src/Language/Elm.hs
+++ b/src/Language/Elm.hs
@@ -28,7 +28,10 @@
 import qualified Data.Text as TS
 import qualified Data.Text.Lazy as TL
 
-runtimeLocation = getDataFileName ("elm-runtime-" ++ showVersion version ++ ".js")
+-- |The absolute path to Elm's runtime system.
+runtimeLocation :: IO FilePath
+runtimeLocation =
+    getDataFileName ("elm-runtime-" ++ showVersion version ++ ".js")
 
 class ElmSource a where
   -- |This function compiles Elm code to three separate parts: HTML, CSS,
diff --git a/src/Parse/ParseExpr.hs b/src/Parse/ParseExpr.hs
--- a/src/Parse/ParseExpr.hs
+++ b/src/Parse/ParseExpr.hs
@@ -58,6 +58,10 @@
 parensTerm = parens $ choice
              [ do op <- anyOp
                   return . Lambda "x" . Lambda "y" $ Binop op (Var "x") (Var "y")
+             , do let comma = char ',' <?> "comma ','"
+                  commas <- comma >> many (whitespace >> comma)
+                  let vars = map (('v':) . show) [ 0 .. length commas + 1 ]
+                  return $ foldr Lambda (tuple $ map Var vars) (vars)
              , do es <- commaSep expr
                   return $ case es of { [e] -> e; _ -> tuple es }
              ]
@@ -90,18 +94,21 @@
                 e <- expr
                 return $ makeLambda pats e
 
-letExpr = do
-  reserved "let"
-  brace <- optionMaybe . try $ do
-             whitespace
+defSet = do
+  brace <- optionMaybe $ do
              char '{' <?> "a set of definitions { x = ... ; y = ... }"
+  whitespace
   case brace of
-    Nothing -> do whitespace; ds <- assignExpr
-                  whitespace; reserved "in"; whitespace; Let ds <$> expr
-    Just '{' -> do whitespace ; dss <- semiSep1 assignExpr ; whitespace
+    Nothing  -> assignExpr
+    Just '{' -> do dss <- semiSep1 assignExpr
+                   whitespace
                    string "}" <?> "closing bracket '}'"
-                   whitespace; reserved "in"; whitespace; e <- expr
-                   return $ Let (concat dss) e
+                   return (concat dss)
+letExpr = do
+  reserved "let" ; whitespace
+  defs <- defSet
+  whitespace ; reserved "in" ; whitespace
+  Let defs <$> expr
 
 caseExpr = do
   reserved "case"; whitespace; e <- expr; whitespace; reserved "of"; whitespace
diff --git a/src/Parse/ParseModules.hs b/src/Parse/ParseModules.hs
--- a/src/Parse/ParseModules.hs
+++ b/src/Parse/ParseModules.hs
@@ -28,8 +28,8 @@
   reserved "import"
   whitespace
   name <- intercalate "." <$> dotSep1 capVar
-  method <- option (Importing []) $ try (whitespace >>
-                                         (as' <|> hiding' <|> importing'))
+  method <- option (Hiding []) $ try (whitespace >>
+                                      (as' <|> hiding' <|> importing'))
   return (name, method)
 
 
diff --git a/src/Parse/ParseTypes.hs b/src/Parse/ParseTypes.hs
--- a/src/Parse/ParseTypes.hs
+++ b/src/Parse/ParseTypes.hs
@@ -33,7 +33,9 @@
 typeUnambiguous = typeList <|> typeTuple
 
 typeSimple :: (Monad m) => ParsecT [Char] u m ParseType
-typeSimple = VarPT <$> var
+typeSimple = dealias <$> var
+    where dealias "String" = listPT (VarPT "Char")
+          dealias v = VarPT v
 
 typeApp :: (Monad m) => ParsecT [Char] u m ParseType
 typeApp = do name <- capVar <?> "type constructor"
@@ -50,7 +52,8 @@
               Nothing -> return t1
 
 typeConstructor :: (Monad m) => ParsecT [Char] u m (String, [ParseType])
-typeConstructor = (,) <$> (capVar <?> "another type constructor") <*> spacePrefix (typeSimple <|> typeUnambiguous)
+typeConstructor = (,) <$> (capVar <?> "another type constructor")
+                      <*> spacePrefix (typeSimple <|> typeUnambiguous)
 
 datatype :: (Monad m) => ParsecT [Char] u m Statement
 datatype = do
diff --git a/src/Parse/Patterns.hs b/src/Parse/Patterns.hs
--- a/src/Parse/Patterns.hs
+++ b/src/Parse/Patterns.hs
@@ -2,7 +2,7 @@
 
 import Ast
 import Data.Char (isUpper)
-import Control.Applicative ((<$>))
+import Control.Applicative ((<$>),(<*>))
 import Control.Monad
 import Text.Parsec
 import ParseLib
@@ -11,8 +11,7 @@
 patternBasic =
     choice [ char '_' >> return PAnything
            , do x@(c:_) <- var
-                if isUpper c then PData x <$> spacePrefix patternTerm
-                             else return $ PVar x
+                return $ if isUpper c then PData x [] else PVar x
            ]
 
 patternTuple :: Monad m => ParsecT [Char] u m Pattern
@@ -25,8 +24,11 @@
 patternTerm :: Monad m => ParsecT [Char] u m Pattern
 patternTerm = patternTuple <|> patternList <|> patternBasic <?> "pattern"
 
+patternConstructor :: Monad m => ParsecT [Char] u m Pattern
+patternConstructor = PData <$> capVar <*> spacePrefix patternTerm
+
 patternExpr :: Monad m => ParsecT [Char] u m Pattern
-patternExpr = foldr1 pcons <$> consSep1 patternTerm <?> "pattern"
+patternExpr = foldr1 pcons <$> consSep1 (patternConstructor <|> patternTerm) <?> "pattern"
 
 
 makeLambda pats body = foldr Lambda (makeBody pats body) (map getName pats)
diff --git a/src/Types/Constrain.hs b/src/Types/Constrain.hs
--- a/src/Types/Constrain.hs
+++ b/src/Types/Constrain.hs
@@ -3,7 +3,7 @@
 
 import Ast
 import Types
-import Data.List (foldl')
+import Data.List (foldl',sort,group,isPrefixOf,intercalate,isSuffixOf)
 import qualified Data.Set as Set
 import qualified Data.Map as Map
 import Control.Arrow (second)
@@ -20,15 +20,41 @@
 unionA = Map.unionWith (++)
 unionsA = Map.unionsWith (++)
 
-constrain hints (Module _ _ _ stmts) = do
-    (ass,css,schemess) <- unzip3 `liftM` mapM stmtGen stmts
-    allHints <-  liftM (Map.fromList . (++ concat schemess)) hints
-    let insert as n = do v <- guid; return $ Map.insertWith' (\_ x -> x) n [v] as
-    assumptions <- foldM insert (unionsA ass) $ map fst (concat schemess)
-    let cs = let f k s vs = map (\v -> Context k $ v :<<: s) vs in
-             concat . Map.elems $ Map.intersectionWithKey f allHints assumptions
-    let escapees = Map.keys $ Map.difference assumptions allHints
-    return . (,) escapees $ cs ++ Set.toList (Set.unions css)
+getAliases imports hints = hints ++ concatMap aliasesFrom imports'
+    where imports' = map head . group $ sort imports
+          aliasesFrom (name,method) =
+              case method of
+                As alias -> concatMap (findAlias name alias) hints
+                Hiding [] -> concatMap (findAlias name "") hints
+                _ -> []
+          findAlias mName' mAlias (name,tipe) =
+              let mName = mName' ++ "." in
+              case mName `isPrefixOf` name of
+                True  -> [ (mAlias ++ drop (length mName) name, tipe) ]
+                False -> []
+
+findAmbiguous hints hints' assumptions continue =
+    let potentialDups = map head . filter (\g -> length g > 1) . group $ sort hints'
+        dups = filter (\k -> Map.member k assumptions) potentialDups
+    in  case dups of
+          n:_ -> return . Left $ "Error: Ambiguous occurrence of '" ++ n ++ "' could refer to " ++
+                                 intercalate ", " (filter (isSuffixOf n) hints)
+          _ -> continue
+
+constrain typeHints (Module _ _ imports stmts) = do
+  (ass,css,schemess) <- unzip3 `liftM` mapM stmtGen stmts
+  hints <- typeHints
+  let aliasHints = getAliases (imports ++ extraImports) hints
+  let allHints = Map.fromList (aliasHints ++ concat schemess)
+  assumptions <- foldM insert (unionsA ass) $ map fst (concat schemess)
+  findAmbiguous (map fst hints) (map fst aliasHints) assumptions $
+                do let cs = let f k s vs = map (\v -> Context k $ v :<<: s) vs in
+                            concat . Map.elems $ Map.intersectionWithKey f allHints assumptions
+                   let escapees = Map.keys $ Map.difference assumptions allHints
+                   return . Right . (,) escapees $ cs ++ Set.toList (Set.unions css)
+      where extraImports =
+                map (\n -> (n, Hiding [])) ["List","Signal","Text","Graphics","Color"]
+            insert as n = do v <- guid; return $ Map.insertWith' (\_ x -> x) n [v] as
 
 gen :: Expr -> GuidCounter (Map.Map String [X], Set.Set (Context String Constraint), Type)
 
diff --git a/src/Types/Hints.hs b/src/Types/Hints.hs
--- a/src/Types/Hints.hs
+++ b/src/Types/Hints.hs
@@ -7,43 +7,45 @@
 import Types.Substitutions (rescheme)
 
 
---------  Text and Elements  --------
+prefix pre xs = map (first (\x -> pre ++ "." ++ x)) xs
 
-str2elem = hasType (string ==> element) [ "plainText" ]
+--------  Text and Elements  --------
 
 textToText = [ "header", "italic", "bold", "underline"
              , "overline", "strikeThrough", "monospace" ]
 
 textAttrs = [ "toText" -: string ==> text
-            , "typeface" -: string ==> text ==> text
-            , "link"   -:: string ==> a ==> a
+            , "Text.typeface" -: string ==> text ==> text
+            , "Text.link"   -:: string ==> text ==> text
             , numScheme (\t -> t ==> text ==> text) "Text.height"
-            ] ++ hasType (text ==> text) textToText
+            ] ++ prefix "Text" (hasType (text ==> text) textToText)
 
-elements = let iee = int ==> element ==> element in
-           [ "flow"    -: direction ==> listOf element ==> element
-           , "layers"  -: listOf element ==> element
-           , "text"    -: text ==> element
-           , "image"   -: int ==> int ==> string ==> element
-           , "video"   -: int ==> int ==> string ==> element
-           , "opacity" -: float ==> element ==> element
-           , "width"   -: iee
-           , "height"  -: iee
-           , "size"    -: int ==> iee
-           , "widthOf" -: element ==> int
-           , "heightOf"-: element ==> int
-           , "sizeOf"  -: element ==> pairOf int
-           , "color"   -: color ==> element ==> element
-           , "container" -: int ==> int ==> position ==> element ==> element
-           , "spacer" -: int ==> int ==> element
-           , "rightedText"  -: text ==> element
-           , "centeredText"  -: text ==> element
-           , "justifiedText" -: text ==> element
-           , "asText" -:: a ==> element 
-           , "show" -:: a ==> text
-           , "collage" -: int ==> int ==> listOf form ==> element
-           , "fittedImage" -: int ==> int ==> string ==> element
-           ]
+elements =
+    let iee = int ==> element ==> element in
+      [ "plainText" -: string ==> element
+      , "link"   -:: string ==> element ==> element
+      , "flow"    -: direction ==> listOf element ==> element
+      , "layers"  -: listOf element ==> element
+      , "text"    -: text ==> element
+      , "image"   -: int ==> int ==> string ==> element
+      , "video"   -: int ==> int ==> string ==> element
+      , "opacity" -: float ==> element ==> element
+      , "width"   -: iee
+      , "height"  -: iee
+      , "size"    -: int ==> iee
+      , "widthOf" -: element ==> int
+      , "heightOf"-: element ==> int
+      , "sizeOf"  -: element ==> pairOf int
+      , "color"   -: color ==> element ==> element
+      , "container" -: int ==> int ==> position ==> element ==> element
+      , "spacer" -: int ==> int ==> element
+      , "rightedText"  -: text ==> element
+      , "centeredText"  -: text ==> element
+      , "justifiedText" -: text ==> element
+      , "asText" -:: a ==> element 
+      , "collage" -: int ==> int ==> listOf form ==> element
+      , "fittedImage" -: int ==> int ==> string ==> element
+      ]
 
 directions = hasType direction ["up","down","left","right","inward","outward"]
 positions =
@@ -52,10 +54,6 @@
     hasType (location ==> location ==> position)
                 ["topLeftAt","bottomLeftAt","middleAt","topRightAt","bottomRightAt"] ++
     [ "absolute" -: int ==> location, "relative" -: float ==> location ]
-colors = [ numScheme (\n -> n ==> n ==> n ==> color) "rgb"
-         , numScheme (\n -> n ==> n ==> n ==> n ==> color) "rgba"
-         ] ++ hasType color ["red","green","blue","black","white"
-                            ,"yellow","cyan","magenta","grey","gray"]
 
 lineTypes = [ numScheme (\n -> listOf (pairOf n) ==> line) "line"
             , numScheme (\n -> pairOf n ==> pairOf n ==> line) "segment"
@@ -79,6 +77,16 @@
            , numScheme (\n -> pairOf n ==> form ==> bool) "isWithin"
            ]
 
+graphicsElement = prefix "Graphics"
+                  (concat [elements,directions,positions,lineTypes,shapes,collages])
+graphicsColor = prefix "Color" clrs
+    where clrs = [ numScheme (\n -> n ==> n ==> n ==> color) "rgb"
+                 , numScheme (\n -> n ==> n ==> n ==> n ==> color) "rgba"
+                 , "complement" -: color ==> color
+                 ] ++ hasType color ["red","green","blue","black","white"
+                                    ,"yellow","cyan","magenta","grey","gray"]
+
+
 --------  Foreign  --------
 
 casts =
@@ -107,16 +115,28 @@
   , "castListToJSArray"   -:: listOf a ==> jsArray a
   ]
 
-json =
+javascript = prefix "JavaScript" (concat [casts,polyCasts])
+
+json = prefix "JSON"
   [ "JsonString" -: string ==> jsonValue
   , "JsonBool"   -: bool   ==> jsonValue
   , "JsonNull"   -: jsonValue
   , "JsonArray"  -: listOf jsonValue ==> jsonValue
   , "JsonObject" -: jsonObject ==> jsonValue
   , numScheme (\n -> n ==> jsonValue) "JsonNumber"
-  , "toPrettyString" -: string ==> jsonObject ==> string
+  , "toString"   -: jsonObject ==> string
+  , "fromString" -: string ==> jsonObject
+  , "lookup"     -: string ==> jsonObject ==> maybeOf jsonValue
+  , "findObject" -: string ==> jsonObject ==> jsonObject
+  , "findArray"  -: string ==> jsonObject ==> listOf jsonObject
+  , "findString" -: string ==> jsonObject ==> string
+  , "findWithDefault" -:: jsonValue ==> string ==> jsonObject ==> jsonValue
+  , "toPrettyString"   -: string ==> jsonObject ==> string
   , "toPrettyJSString" -: string ==> jsonObject ==> jsString
-  , "toJSString" -: jsonObject ==> jsString
+  , "toList"   -: jsonObject ==> listOf (tupleOf [string,jsonValue])
+  , "fromList" -: listOf (tupleOf [string,jsonValue]) ==> jsonObject
+  , "toJSString"   -: jsonObject ==> jsString
+  , "fromJSString" -: jsString ==> jsonObject
   ]
 
 
@@ -126,7 +146,7 @@
     where fn = foldr1 (==>)
           ts = map VarT [1..n]
 
-signals =
+signals = prefix "Signal"
     [ sig 1 "constant"
     , sig 2 "lift" 
     , sig 3 "lift2"
@@ -135,35 +155,51 @@
     , "foldp"     -:: (a ==> b ==> b) ==> b ==> signalOf a ==> signalOf b
     , "foldp1"    -:: (a ==> a ==> a) ==> signalOf a ==> signalOf a
     , "foldp'"    -:: (a ==> b ==> b) ==> (a ==> b) ==> signalOf a ==> signalOf b
-    , "randomize" -:: int ==> int ==> signalOf a ==> signalOf int
     , "count"     -:: signalOf a ==> signalOf int
     , "keepIf"    -:: (a==>bool) ==> a ==> signalOf a ==> signalOf a
     , "dropIf"    -:: (a==>bool) ==> a ==> signalOf a ==> signalOf a
-    , "keepWhen"  -:: signalOf bool ==>a==> signalOf a ==> signalOf a
-    , "dropWhen"  -:: signalOf bool ==>a==> signalOf a ==> signalOf a
+    , "keepWhen"  -:: signalOf bool ==> a ==> signalOf a ==> signalOf a
+    , "dropWhen"  -:: signalOf bool ==> a ==> signalOf a ==> signalOf a
     , "dropRepeats" -:: signalOf a ==> signalOf a
     , "sampleOn" -:: signalOf a ==> signalOf b ==> signalOf b
     ]
 
+http = prefix "HTTP"
+  [ "send"     -:: signalOf (request a) ==> signalOf (response string)
+  , "sendGet"  -:: signalOf string ==> signalOf (response string)
+  , "get"      -:  string ==> request string
+  , "post"     -:  string ==> string ==> request string
+  , "request"  -:  string ==> string ==> string ==> listOf (pairOf string) ==> request string
+  , "Waiting"  -:: response a
+  , "Failure"  -:: int ==> string ==> response a
+  , "Success"  -:: a ==> response a ]
+    where request  t = ADT "Request"  [t]
+          response t = ADT "Response" [t]
+
 concreteSignals = 
-  [ "keysDown"    -: signalOf (listOf int)
-  , "charPressed" -: signalOf (maybeOf int)
-  , "inRange"     -: int ==> int ==> signalOf int
-  , timeScheme "every"  (\t -> t ==> signalOf t)
-  , timeScheme "before" (\t -> t ==> signalOf bool)
-  , timeScheme "after"  (\t -> t ==> signalOf bool)
-  , "dimensions"  -: signalOf point
-  , "position"    -: signalOf point
-  , "x"           -: signalOf int
-  , "y"           -: signalOf int
-  , "isDown"      -: signalOf bool
-  , "isClicked"   -: signalOf bool
-  , "textField"   -: string ==> tupleOf [element, signalOf string]
-  , "password"    -: string ==> tupleOf [element, signalOf string]
-  , "textArea"    -: int ==> int ==> tupleOf [element, signalOf string]
-  , "checkBox"    -: bool ==> tupleOf [element, signalOf bool]
-  , "button"      -: string ==> tupleOf [element, signalOf bool]
-  , "stringDropDown" -: listOf string ==> tupleOf [element, signalOf string]
+  [ "Keyboard.Raw.keysDown"    -: signalOf (listOf int)
+  , "Keyboard.Raw.charPressed" -: signalOf (maybeOf int)
+  , "Random.inRange"     -: int ==> int ==> signalOf int
+  , "Random.randomize"   -:: int ==> int ==> signalOf a ==> signalOf int
+  , timeScheme "Time.every"  (\t -> t ==> signalOf t)
+  , timeScheme "Time.before" (\t -> t ==> signalOf bool)
+  , timeScheme "Time.after"  (\t -> t ==> signalOf bool)
+  , "Window.dimensions" -: signalOf point
+  , "Window.width"      -: signalOf int
+  , "Window.height"     -: signalOf int
+  , "Mouse.position"    -: signalOf point
+  , "Mouse.x"           -: signalOf int
+  , "Mouse.y"           -: signalOf int
+  , "Mouse.isDown"      -: signalOf bool
+  , "Mouse.isClicked"   -: signalOf bool
+  , "Mouse.clicks"      -: signalOf (tupleOf [])
+  , "Input.textField"   -: string ==> tupleOf [element, signalOf string]
+  , "Input.password"    -: string ==> tupleOf [element, signalOf string]
+  , "Input.textArea"    -: int ==> int ==> tupleOf [element, signalOf string]
+  , "Input.checkBox"    -: bool ==> tupleOf [element, signalOf bool]
+  , "Input.button"      -: string ==> tupleOf [element, signalOf bool]
+  , "Input.stringDropDown" -: listOf string ==> tupleOf [element, signalOf string]
+  , "Input.dropDown"    -:: listOf (tupleOf [string,a]) ==> tupleOf [element, signalOf a]
   ]
 
 --------  Math and Binops  --------
@@ -189,7 +225,10 @@
   hasType (float ==> float) ["sin","cos","tan","asin","acos","atan","sqrt"] ++
   hasType float ["pi","e"] ++
   hasType (int ==> float) ["toFloat","castIntToFloat"] ++
-  hasType (float ==> int) ["round","floor","ceiling","truncate"]
+  hasType (float ==> int) ["round","floor","ceiling","truncate"] ++
+  [ "show" -:: a ==> string
+  , "readInt" -: string ==> maybeOf int
+  , "readFloat" -: string ==> maybeOf float ]
 
 bools =
   [ "not" -: bool ==> bool ] ++
@@ -199,6 +238,14 @@
     , Forall [0,1] [ Context "`compare'" $ VarT 0 :<: comparable ] (VarT 0 ==> VarT 0 ==> VarT 1) )
   ]
 
+chars = prefix "Char" (classify ++ convert1 ++ convert2)
+  where classify = hasType (char ==> bool)
+                   ["isDigit","isOctDigit","isHexDigit","isUpper","isLower"]
+        convert1 =  hasType (char ==> char)
+                    ["toUpper","toLower","toLocaleUpper","toLocaleLower"]
+        convert2 = [ "toCode" -: char ==> int, "fromCode" -: int ==> char ]
+  
+
 --------  Polymorphic Functions  --------
 
 [a,b,c] = map VarT [1,2,3]
@@ -226,7 +273,7 @@
 tuple n = ("Tuple" ++ show n, Forall [1..n] [] $ foldr (==>) (tupleOf vs) vs)
     where vs = map VarT [1..n]
 
-lists =
+lists = prefix "List"
   [ "and"  -:: listOf bool ==> bool
   , "or"   -:: listOf bool ==> bool
   , numScheme (\n -> listOf n ==> listOf n) "sort"
@@ -237,8 +284,8 @@
   , "foldr1"  -:: (a ==> a ==> a) ==> listOf a ==> a
   , "foldl1"  -:: (a ==> a ==> a) ==> listOf a ==> a
   , "scanl1"  -:: (a ==> a ==> a) ==> listOf a ==> a
-  , "forall"  -:: (a ==> bool) ==> listOf a ==> bool
-  , "exists"  -:: (a ==> bool) ==> listOf a ==> bool
+  , "all"     -:: (a ==> bool) ==> listOf a ==> bool
+  , "any"     -:: (a ==> bool) ==> listOf a ==> bool
   , "reverse" -:: listOf a ==> listOf a
   , "take"    -:: int ==> listOf a ==> listOf a
   , "drop"    -:: int ==> listOf a ==> listOf a
@@ -259,7 +306,7 @@
   ] ++ map (numScheme (\n -> listOf n ==> n)) [ "sum", "product"
                                               , "maximum", "minimum" ]
 
-maybeFuncs =
+maybeFuncs = prefix "Maybe"
   [ "maybe" -:: b ==> (a ==> b) ==> maybeOf a ==> b
   , "isJust" -:: maybeOf a ==> bool
   , "isNothing" -:: maybeOf a ==> bool
@@ -269,11 +316,66 @@
   , "catMaybes" -:: (a ==> maybeOf b) ==> listOf a ==> listOf b
   ]
 
+dictionary =
+  let dict k v = ADT "Dict" [k,v] in
+  prefix "Dict"
+    [ "empty" -:: dict a b
+    , "singleton" -:: a ==> b ==> dict a b
+    , "insert" -:: a ==> b ==> dict a b ==> dict a b
+    , "remove" -:: a ==> dict a b ==> dict a b
+    , "member" -:: a ==> dict a b ==> bool
+    , "lookup" -:: a ==> dict a b ==> maybeOf b
+    , "findWithDefault" -:: b ==> a ==> dict a b ==> b
+    , "intersect" -:: dict a b ==> dict a c ==> dict a b
+    , "union" -:: dict a b ==> dict a b ==> dict a b
+    , "diff"  -:: dict a b ==> dict a c ==> dict a b
+    , "map"   -:: (b ==> c) ==> dict a b ==> dict a c
+    , "foldl" -:: (a ==> b ==> c ==> c) ==> c ==> dict a b ==> c
+    , "foldr" -:: (a ==> b ==> c ==> c) ==> c ==> dict a b ==> c
+    , "keys"  -:: dict a b ==> listOf a
+    , "values"   -:: dict a b ==> listOf b
+    , "toList"   -:: dict a b ==> listOf (tupleOf [a,b])
+    , "fromList" -:: listOf (tupleOf [a,b]) ==> dict a b
+    ]
+
+sets =
+  let set v = ADT "Set" [v] in
+  prefix "Set"
+    [ "empty" -:: set a
+    , "singleton" -:: a ==> set a
+    , "insert" -:: a ==> set a ==> set a
+    , "remove" -:: a ==> set a ==> set a
+    , "member" -:: a ==> set a ==> bool
+    , "intersect" -:: set a ==> set a ==> set a
+    , "union" -:: set a ==> set a ==> set a
+    , "diff"  -:: set a ==> set a ==> set a
+    , "map"   -:: (a ==> b) ==> set a ==> set b
+    , "foldl" -:: (a ==> b ==> b) ==> b ==> set a ==> b
+    , "foldr" -:: (a ==> b ==> b) ==> b ==> set a ==> b
+    , "toList"   -:: set a ==> listOf a
+    , "fromList" -:: listOf a ==> set a
+    ]
+
+automaton =
+  let auto a b = ADT "Automaton" [a,b] in
+  prefix "Automaton"
+    [ "pure"    -:: (a ==> b) ==> auto a b
+    , "init"    -:: b ==> (a ==> b ==> b) ==> auto a b
+    , "init'"   -:: c ==> (a ==> c ==> tupleOf [b,c]) ==> auto a b
+    , ">>>"     -:: auto a b ==> auto b c ==> auto a c
+    , "<<<"     -:: auto b c ==> auto a b ==> auto a c
+    , "combine" -:: listOf (auto a b) ==> auto a (listOf b)
+    , "run"     -:: auto a b ==> signalOf a ==> signalOf b
+    , "step"    -:: auto a b ==> a ==> tupleOf [b,auto a b]
+    , "count"   -:: auto a int
+    , "draggable" -:: form ==> auto (tupleOf [bool,point]) form
+    ]
+
 --------  Everything  --------
 
 hints = mapM (\(n,s) -> (,) n `liftM` rescheme s) hs
-    where hs = concat [ funcs, lists, signals, math, bools, str2elem, textAttrs
-                      , elements, directions, colors, lineTypes, shapes
-                      , concreteSignals, casts, polyCasts, json, maybeFuncs
-                      , positions, collages
+    where hs = concat [ funcs, lists, signals, math, bools, textAttrs
+                      , graphicsElement, graphicsColor
+                      , concreteSignals, javascript, json, maybeFuncs
+                      , http, dictionary, sets, automaton
                       ]
diff --git a/src/Types/Substitutions.hs b/src/Types/Substitutions.hs
--- a/src/Types/Substitutions.hs
+++ b/src/Types/Substitutions.hs
@@ -2,7 +2,7 @@
 module Types.Substitutions (cSub
                            ,tSub
                            ,cSubNoContext
-                           ,cFreeVars
+                           ,hasVarC
                            ,freeVars
                            ,schemeSub
                            ,concretize
@@ -17,14 +17,19 @@
 import Types
 
 force x = x `deepseq` x
+a ++++ b = foldl' (\tl hd -> hd : tl) b a
+map' f xs = map (\x -> let v = f x in v `seq` v) xs
 
 instance (NFData a) => NFData (Context c a) where
   rnf (Context _ a) = a `deepseq` ()
 
+instance NFData Scheme where
+  rnf (Forall vs cs t) = vs `deepseq` cs `deepseq` t `deepseq` ()
+
 instance NFData Constraint where
   rnf (t1 :=: t2) = t1 `deepseq` t2 `deepseq` ()
-  rnf (t :<: _)   = t `deepseq` ()
-  rnf (t :<<: _)  = t `deepseq` ()
+  rnf (t1 :<: t2) = t1 `deepseq` t2 `deepseq` ()
+  rnf (t :<<: s)  = t `deepseq` s `deepseq` ()
 
 instance NFData Type where
   rnf (LambdaT t1 t2) = t1 `deepseq` t2 `deepseq` ()
@@ -32,63 +37,80 @@
   rnf t = t `seq` ()
 
 tSub k v t@(VarT x) = if k == x then v else t
-tSub k v (LambdaT t1 t2) = force $ LambdaT (tSub k v t1) (tSub k v t2)
-tSub k v (ADT name ts) = ADT name (map (force . tSub k v) ts)
+tSub k v (LambdaT t1 t2) = tSub k v t1 `seq` tSub k v t2 `seq` LambdaT (tSub k v t1) (tSub k v t2)
+tSub k v (ADT name ts) = map' (tSub k v) ts `seq` ADT name (map' (tSub k v) ts)
 tSub k v (Super ts) = Super ts
 
 schemeSubHelp k s c t1 t2 relation = do
-  (t1',cs1) <- f1 ; (t2',cs2) <- f2
-  return (Context c (relation t1' t2') : cs1 ++ cs2)
-    where f1 | hasVar k t1 = do (v, cs) <- concretize s; return (tSub k v t1, cs)
-             | otherwise = return (t1, [])
-          f2 | hasVar k t2 = do (v, cs) <- concretize s; return (tSub k v t2, cs)
-             | otherwise = return (t2, [])
+  (t1',cs1) <- f t1
+  (t2',cs2) <- f t2
+  return $ Context c (relation t1' t2') : cs1 ++++ cs2
+    where f t | hasVar k t = do (v, cs) <- concretize s; return (tSub k v t, cs)
+              | otherwise  = return (t, [])
 
-schemeSub k s (Context ctx (t1 :=: t2)) = schemeSubHelp k s ctx t1 t2 (:=:)
-schemeSub k s (Context ctx (t1 :<: t2)) = schemeSubHelp k s ctx t1 t2 (:<:)
-schemeSub k s (Context ctx c@(x :<<: Forall cxs ccs ctipe))
-    | k `elem` cxs || k `notElem` cFreeVars c = return [Context ctx c]
-    | otherwise = do
-          Forall xs cs tipe <- rescheme s
-          let constraints = (map (cSub k tipe) $ cs ++ ccs)
-          let c' = x :<<: Forall (cxs ++ xs) constraints (tSub k tipe ctipe)
-          return [ Context ctx c' ]
+schemeSub k s (Context ctx (t1 :=: t2)) = t1 `seq` t2 `seq` schemeSubHelp k s ctx t1 t2 (:=:)
+schemeSub k s (Context ctx (t1 :<: t2)) = t1 `seq` t2 `seq` schemeSubHelp k s ctx t1 t2 (:<:)
+schemeSub k s c@(Context ctx (x :<<: Forall cxs ccs ctipe)) =
+    if not $ hasVarC k c then return [c]
+    else do
+      Forall xs cs tipe <- rescheme s
+      let constraints = map' (cSub k tipe) $ cs ++ ccs
+      let c' = x :<<: Forall (cxs ++ xs) constraints (tSub k tipe ctipe)
+      return [ Context ctx c' ]
 
 hasVar v (VarT x) = v == x
-hasVar v (LambdaT t1 t2) = hasVar v t1 || hasVar v t2
-hasVar v (ADT _ ts) = any (hasVar v) ts
+hasVar v (LambdaT t1 t2) = force (hasVar v t1 || hasVar v t2)
+hasVar v (ADT _ ts) = force $ any (hasVar v) ts
 hasVar v (Super _ ) = False
 
-cSub k v (Context ctx c) = Context ctx (cSubNoContext k v c)
+cSub k v (Context ctx c) = out `deepseq` out
+    where out = Context ctx (cSubNoContext' k v c)
 
-cSubNoContext k v (t1 :=: t2) = force $ tSub k v t1 :=: tSub k v t2
-cSubNoContext k v (t :<: super) = force $ tSub k v t :<: super
-cSubNoContext k v (x :<<: poly@(Forall vs cs tipe)) = force $ x :<<: poly'
+cSubNoContext k v c = c' `deepseq` c'
+    where c' = cSubNoContext' k v c
+
+cSubNoContext' k v (t1 :=: t2) = let { t1' = tSub k v $! t1 ; t2' = tSub k v $! t2 } in
+                                 t1' `seq` t2' `seq` t1' :=: t2'
+cSubNoContext' k v (t :<: super) = let t' = tSub k v t in t' `seq` t' :<: super
+cSubNoContext' k v (x :<<: poly@(Forall vs cs tipe)) = (x :<<: poly')
     where poly' | k `elem` vs = poly
-                | otherwise = let cs' = map (cSub k v) cs in
-                              Forall vs cs' (tSub k v tipe)
+                | otherwise = let tipe' = tSub k v tipe in
+                              tipe' `deepseq` Forall vs (map' (cSub k v) cs) tipe'
 
 concretize (Forall xs cs t) = do
-  pairs <- mapM (\x -> liftM ((,) x) guid) xs
-  return ( foldl' (\t'  (k,v) -> tSub k (VarT v) t') t pairs
-         , foldl' (\cs' (k,v) -> map (cSub k $ VarT v) cs') cs pairs )
+  pairs <- zip xs `liftM` mapM (const guid) xs
+  let tipe = foldl' (\t' (k,v) -> tSub k (VarT v) $! t') t pairs
+  let f c = foldl' (\c (k,v) -> cSub k (VarT v) $! c) c $! pairs
+  let cs' = f `seq` map' f cs
+  tipe `deepseq` cs' `deepseq` return (tipe, cs')
 
 rescheme :: Scheme -> GuidCounter Scheme
 rescheme (Forall xs cs t) = do
-  pairs <- mapM (\x -> liftM ((,) x) guid) xs
-  let tipe = foldl' (\t'  (k,v) -> tSub k (VarT v) t') t pairs
-  let cs'  = foldl' (\cs' (k,v) -> map (cSub k $ VarT v) cs') cs pairs
-  return $ Forall (map snd pairs) cs' tipe
+  pairs <- zip xs `liftM` mapM (const guid) xs
+  let tipe = foldl' (\t' (k,v) -> tSub k (VarT v) $! t') t pairs
+  let fs = map (\(k,v) -> cSub k (VarT v)) pairs
+  let cs' = map (\c -> foldl' (\c f -> f $! c) c fs) cs
+  tipe `deepseq` cs' `deepseq` (return $ Forall (map' snd pairs) cs' tipe)
 
-freeVars (VarT v) = [v]
-freeVars (LambdaT t1 t2) = freeVars t1 ++ freeVars t2
-freeVars (ADT _ ts) = concatMap freeVars ts
-freeVars (Super _ ) = []
+freeVars t = let fs = freeVars' t in fs `deepseq` fs
 
-cFreeVars (t1 :=: t2) = freeVars t1 ++ freeVars t2
-cFreeVars (t1 :<: t2) = freeVars t1 ++ freeVars t2
-cFreeVars (x :<<: Forall xs cs t) = filter (`notElem` xs) frees
-    where frees = concatMap (\(Context _ c) -> cFreeVars c) cs ++ freeVars t
+freeVars' (VarT v) = [v]
+freeVars' (LambdaT t1 t2) = freeVars' t1 ++++ freeVars' t2
+freeVars' (ADT _ ts) = concatMap freeVars' ts
+freeVars' (Super _ ) = []
+
+cFreeVars c = let fs = cFreeVars' c in fs `deepseq` fs
+
+cFreeVars' (t1 :=: t2) = freeVars' t1 ++++ freeVars' t2
+cFreeVars' (t1 :<: t2) = freeVars' t1 ++++ freeVars' t2
+cFreeVars' (x :<<: Forall xs cs t) = filter (`notElem` xs) frees
+    where frees = concatMap (\(Context _ c) -> cFreeVars' c) cs ++++ freeVars' t
+
+
+hasVarC x (Context _ (t1 :=: t2)) = hasVar x t1 || hasVar x t2
+hasVarC x (Context _ (t1 :<: t2)) = hasVar x t1 || hasVar x t2
+hasVarC x (Context _ (y :<<: Forall xs cs t)) = x == y || hasVar x t || inCs
+    where inCs = x `notElem` xs && any (hasVarC x) cs
 
 decontext (Context _ c) = c
 
diff --git a/src/Types/Unify.hs b/src/Types/Unify.hs
--- a/src/Types/Unify.hs
+++ b/src/Types/Unify.hs
@@ -11,17 +11,22 @@
 import Types.Constrain
 import Types.Substitutions
 
+import Control.DeepSeq (deepseq)
 --import System.IO.Unsafe
 
 prints xs v = v --} unsafePerformIO (putStrLn "----------" >> mapM print xs) `seq` v
 
 unify hints modul = run $ do
-  (escapees, cs) <- constrain hints modul
-  subs <- solver cs Map.empty
-  prints cs $ return ((,) escapees `liftM` subs)
+  constraints <- constrain hints modul
+  case constraints of
+    Left msg -> return (Left msg)
+    Right (escapees, cs) ->
+        do subs <- solver cs Map.empty
+           return ((,) escapees `liftM` subs)
 
 eq ctx t1 t2 = Context ctx (t1 :=: t2)
 
+
 solver [] subs = prints (Map.toList subs) $ return $ Right subs
 
 --------  Destruct Type-constructors  --------
@@ -43,21 +48,26 @@
                  setXY t = Map.insert x t . Map.insert y t
              in  case Set.toList ts of
                    []  -> unionError ctx xts yts
-                   [t] -> solver (map (cSub x t . cSub y t) cs) $ setXY t subs
+                   [t] -> let cs1 = map (\c -> cSub y t c `seq` cSub x t (cSub y t c)) cs in
+                          cs1 `seq` solver cs1 (setXY t subs)
                    _   -> solver cs $ setXY (Super ts) subs
           (Just (Super xts), _) ->
-              solver (map (cSub y (VarT x)) cs) $ Map.insert y (VarT x) subs
+              let cs2 = map (cSub y (VarT x)) cs in
+              cs2 `seq` solver cs2 $ Map.insert y (VarT x) subs
           (_, _) ->
-              solver (map (cSub x (VarT y)) cs) $ Map.insert x (VarT y) subs
+              let cs3 = map (cSub x (VarT y)) cs in
+              cs3 `deepseq` solver cs3 $ Map.insert x (VarT y) subs
 solver (Context ctx (VarT x :=: t) : cs) subs = do
   if x `occursIn` t then occursError ctx (VarT x) t else
       (case Map.lookup x subs of
-         Nothing -> solver (map (cSub x t) cs) . Map.map (tSub x t) $ Map.insert x t subs
+         Nothing -> let cs4 = map (cSub x t) cs in
+                    cs4 `deepseq` (solver cs4 . Map.map (tSub x t) $ Map.insert x t subs)
          Just (Super ts) ->
              let ts' = Set.intersection ts (Set.singleton t) in
              case Set.toList ts' of
                []   -> solver (Context ctx (t :<: Super ts) : cs) subs
-               [t'] -> solver (map (cSub x t') cs) $ Map.insert x t' subs
+               [t'] -> let cs5 = map (cSub x t) cs in
+                       cs5 `seq` solver cs5 $ Map.insert x t' subs
                _    -> solver cs $ Map.insert x (Super ts') subs
          Just t' -> solver (Context ctx (t' :=: t) : cs) subs
       )
@@ -91,13 +101,13 @@
     | otherwise = subtypeError ctx t (Super ts)
 
 solver (Context ctx (x :<<: s) : cs) subs
-    | any (\(Context _ c) -> x `elem` cFreeVars c) cs =
-        do cs' <- concat `liftM` mapM (schemeSub x s) cs
-           prints cs' $ solver cs' subs
+    | any (hasVarC x) cs =
+        do cs6 <- concat `liftM` mapM (schemeSub x s) cs
+           solver cs6 subs
     | otherwise =
-        do (t,cs') <- concretize s
-           let cs'' = (cs ++ Context ctx (VarT x :=: t) : map (extendCtx ctx) cs')
-           prints cs'' $ solver cs'' subs
+        do (t,cs7) <- concretize s
+           let cs'' = (cs ++ Context ctx (VarT x :=: t) : map (extendCtx ctx) cs7)
+           solver cs'' subs
 
 
 occursError ctx t1 t2 =
