@@ -1,2996 +0,0 @@
2−var Guid = function() {
4− var guid = function() { counter += 1; return counter; };
8−Elm.JavaScript = function() {
9− function castJSBoolToBool(b) { return b; }
10− function castBoolToJSBool(b) { return b; }
12− function castJSNumberToFloat(n) { return n; }
13− function castFloatToJSNumber(n) { return n; }
15− function castJSNumberToInt(n) { return ~~n; }
16− function castIntToJSNumber(n) { return n; }
18− function castJSElementToElement(w) {
20− return function(node) {
21− return ["Element",Guid.guid(),
22− ["EExternalHtml",node],
23− w,h,1,Nothing,Nothing];
27− function castElementToJSElement(elem) { return Render.render(elem); }
29− function castJSArrayToList(arr) {
31− for (var i = arr.length; i--; ) {
32− list = [ "Cons", arr[i], list ];
36− function castListToJSArray(list) {
38− while (list[0] === "Cons") {
45− var castJSStringToString = castJSArrayToList;
46− function castStringToJSString(str) {
47− if (typeof str === "string") return str;
48− return castListToJSArray(str).join('');
51− function fromTuple(t) { return t.slice(1); }
52− function toTuple(a) { return ["Tuple" + a.length].concat(a); }
54− return {castJSBoolToBool:castJSBoolToBool,
55− castBoolToJSBool:castBoolToJSBool,
56− castJSNumberToFloat:castJSNumberToFloat,
57− castFloatToJSNumber:castFloatToJSNumber,
58− castJSNumberToInt:castJSNumberToInt,
59− castIntToJSNumber:castIntToJSNumber,
60− Experimental : {castJSElementToElement:castJSElementToElement,
61− castElementToJSElement:castElementToJSElement},
62− castJSArrayToList:castJSArrayToList,
63− castListToJSArray:castListToJSArray,
64− castJSStringToString:castJSStringToString,
65− castStringToJSString:castStringToJSString,
66− castTupleToJSTuple2:fromTuple,
67− castTupleToJSTuple3:fromTuple,
68− castTupleToJSTuple4:fromTuple,
69− castTupleToJSTuple5:fromTuple,
70− castJSTupleToTuple2:toTuple,
71− castJSTupleToTuple3:toTuple,
72− castJSTupleToTuple4:toTuple,
73− castJSTupleToTuple5:toTuple
78−Elm.JSON = function() {
79− var JS = Elm.JavaScript;
80− var empty = ['JSON',{}];
81− function singleton(k) { return function(v) {
83− obj[JS.castStringToJSString(k)] = v;
84− return ['JSON', obj ];
87− function insert(k) { return function(v) { return function(inObj) {
93− outObj[JS.castStringToJSString(k)] = v;
94− return ['JSON', outObj ];
98− function lookup(key) { return function(obj) {
99− var k = JS.castStringToJSString(key);
100− return obj[1].hasOwnProperty(k) ? Just(obj[1][k]) : Nothing ;
103− function lookupWithDefault(base) { return function(key) { return function(obj) {
104− var k = JS.castStringToJSString(key);
105− return obj[1].hasOwnProperty(k) ? obj[1][k] : base ;
109− function remove(k) { return function(inObj) {
112− for (var i in obj) {
115− delete outObj[JS.castStringToJSString(k)];
116− return ['JSON', outObj];
120− function JsonString(v) { return [ "JsonString", v ]; }
121− function JsonNumber(v) { return [ "JsonNumber", v ]; }
122− function JsonBool(v) { return [ "JsonBool", v ]; }
123− var JsonNull = [ "JsonNull" ];
124− function JsonArray(v) { return [ "JsonArray", v ]; }
125− function JsonObject(v) { return [ "JsonObject", v ]; }
127− function toList(json) {
130− for (var i in obj) {
131− arr.push(Value.Tuple(JS.castJSStringToString(i), obj[i]));
133− return JS.castJSArrayToList(arr);
135− function fromList(list) {
136− var arr = JS.castListToJSArray(list);
138− for (var i = arr.length; i--; ) {
139− obj[JS.castStringToJSString(arr[i][1])] = arr[i][2];
141− return [ "JSON", obj ];
144− function toPrettyJSString(sep) { return function (obj) {
145− function fromValue(v) {
147− case 'JsonNull' : return null;
148− case 'JsonString' : return JS.castStringToJSString(v[1]);
152− for (var i in from) {
153− o[i] = fromValue(from[i]);
157− var a = JS.castListToJSArray(v[1]);
158− for (var i = a.length; i--; ) {
159− a[i] = fromValue(a[i]);
166− return JSON.stringify(fromValue([ 'JsonObject', obj ]), null, JS.castStringToJSString(sep));
169− function fromJSString(str) {
170− var obj = JSON.parse(str);
171− function toValue(v) {
173− case 'string' : return [ "JsonString", JS.castJSStringToString(v) ];
174− case 'number' : return [ "JsonNumber", JS.castJSNumberToFloat(v) ];
175− case 'boolean' : return [ "JsonBool", JS.castJSBoolToBool(v) ];
177− if (v === null) return [ "JsonNull" ];
179− v[i] = toValue(v[i]);
181− if (v instanceof Array) return [ "JsonArray", JS.castJSArrayToList(v) ];
182− return [ "JsonObject", [ "JSON", v ] ];
185− for (var i in obj) {
186− obj[i] = toValue(obj[i]);
188− return ['JSON',obj];
190− return {empty : empty,
191− singleton : singleton,
194− findWithDefault : lookupWithDefault,
196− toPrettyJSString : toPrettyJSString,
197− toJSString : toPrettyJSString(''),
198− fromJSString : fromJSString,
199− toPrettyString : function(sep) { return function(v) {
200− return JS.castJSStringToString(toPrettyJSString(sep)(v)); }; },
201− toString : function(v) { return JS.castJSStringToString(toPrettyJSString('')(v)); },
202− fromString : function(v) { return fromJSString(JS.castStringToJSString(v)); },
204− fromList : fromList,
205− JsonString : JsonString,
206− JsonNumber : JsonNumber,
207− JsonBool : JsonBool,
208− JsonNull : JsonNull,
209− JsonArray : JsonArray,
210− JsonObject : JsonObject
213−var Value = function(){
215− var eq = function(x,y) {
216− if (typeof x === "object") {
217− if (x === y) return true;
218− if (x.length !== y.length) return false;
219− for (var i = x.length; i--; ) {
220− if (!eq(x[i],y[i])) return false;
227− var Tuple = function() {
228− var len = arguments.length;
229− var arr = new Array(len+1);
230− arr[0] = "Tuple" + arguments.length;
231− for (var i = len; i--; ) {
232− arr[i+1] = arguments[i];
237− var listToArray = function(list) {
239− while (list[0] === "Cons") {
246− function makeSpaces(s) {
247− if (s.length == 0) { return s; }
248− var arr = s.split('');
249− if (arr[0] == ' ') { arr[0] = " " }
250− for (var i = arr.length; --i; ) {
251− if (arr[i][0] == ' ' && arr[i-1] == ' ') {
252− arr[i-1] = arr[i-1] + arr[i];
256− for (var i = arr.length; i--; ) {
257− if (arr[i].length > 1 && arr[i][0] == ' ') {
258− var spaces = arr[i].split('');
259− for (var j = spaces.length - 2; j >= 0; j -= 2) {
260− spaces[j] = ' ';
262− arr[i] = spaces.join('');
265− return arr.join('');
268− function properEscape(str) {
269− if (str.length == 0) return str;
270− str = str //.replace(/&/g, "&")
271− .replace(/"/g, /*"*/ """)
272− .replace(/'/g, /*'*/ "'")
273− .replace(/</g, "<")
274− .replace(/>/g, ">")
275− .replace(/\n/g, "<br/>");
276− var arr = str.split('<br/>');
277− for (var i = arr.length; i--; ) {
278− arr[i] = makeSpaces(arr[i]);
280− return arr.join('<br/>');
283− var toText = function(elmList) {
284− if (typeof elmList === "string") return properEscape(elmList);
286− while (elmList[0] === "Cons") {
288− elmList = elmList[2];
290− return properEscape(a.join(''));
293− function getTextSize(w,h,txt) {
294− var t = document.createElement('div');
296− t.style.textAlign = 'left';
297− if (w > 0) { t.style.width = w + "px"; }
299− t.style.visibility = "hidden";
300− t.style.styleFloat = "left";
301− t.style.cssFloat = "left";
303− document.body.appendChild(t);
304− var cStyle = window.getComputedStyle(t);
305− var realW = cStyle.getPropertyValue("width").slice(0,-2) - 0;
306− var realH = cStyle.getPropertyValue("height").slice(0,-2) - 0;
307− document.body.removeChild(t);
309− return [Math.ceil(realW),Math.ceil(Math.max(h,realH))];
312− function getSize(e) {
313− var t = e.cloneNode(true);
315− t.style.visibility = "hidden";
316− t.style.styleFloat = "left";
317− t.style.cssFloat = "left";
319− document.body.appendChild(t);
320− var w = t.offsetWidth;
321− var h = t.offsetHeight;
322− document.body.removeChild(t);
327− function getExcess(e) {
328− var t = e.cloneNode(true);
330− t.style.visibility = "hidden";
331− t.style.styleFloat = "left";
332− t.style.cssFloat = "left";
334− document.body.appendChild(t);
335− var ow = t.offsetWidth;
336− var oh = t.offsetHeight;
337− var cStyle = window.getComputedStyle(t);
338− var w = cStyle.getPropertyValue("width").slice(0,-2) - 0;
339− var h = cStyle.getPropertyValue("height").slice(0,-2) - 0;
340− document.body.removeChild(t);
346− function groupForms(forms) {
347− forms = Elm.JavaScript.castListToJSArray(forms);
350− for (var i = forms.length; i--; ) {
354− if (arr.length > 0) {
364− if (arr.length > 0) groups.push(arr);
368− var toString = function(v) {
369− if (typeof v === "boolean") {
370− return v ? "True" : "False";
371− } else if (typeof v === "number") {
373− } else if (typeof v === "string" && v.length < 2) {
376− if (v[0].substring(0,5) === "Tuple") {
378− for (var i = v.length; --i; ) {
379− output = "," + toString(v[i]) + output;
381− if (output[0] === ",") output = output.substring(1);
382− return "("+output+")";
383− } else if (v[0] === "Cons") {
384− var start = (typeof v[1] === "string") ? '"' : "[";
385− var end = (typeof v[1] === "string") ? '"' : "]";
386− var div = (typeof v[1] === "string") ? "" : ",";
387− var f = (typeof v[1] === "string") ? function(x){return x} : toString;
388− var output = start + f(v[1]);
391− if (v[0] === "Cons") {
392− output += div + f(v[1]);
395− return output + end;
398− } else if (v[0] === "Nil") {
400− } else if (v[0] === "JSON") {
401− return "(JSON.fromList " + toString(ElmJSON.toList(v)) + ")";
402− } else if (v[0] === "RBNode" || v[0] === "RBEmpty") {
403− function cons(k){ return function(v) { return function(acc) { return ["Cons",["Tuple2",k,v],acc]; }; }; }
404− return "(Map.fromList " + toString(Elm.Dict.fold(cons)(["Nil"])(v)) + ")";
407− for (var i = v.length; --i; ) {
408− output = " " + toString(v[i]) + output
410− output = v[0] + output;
411− return (v.length > 1) ? "(" + output + ")" : output;
416− var show = function(v) { return str(toString(v)); };
417− var append = function(xs,ys) {
418− if (typeof xs === "string" && typeof ys === "string") {
419− return xs.concat(ys);
421− if (xs[0] === "Nil") {
424− var root = ["Cons", xs[1], ["Nil"]];
427− while (xs[0]==="Cons") {
428− curr[2] = ["Cons", xs[1], ["Nil"]];
436− var str = function(s) {
438− for (var i = s.length; i--; ) {
439− out = ["Cons", s[i], out];
444− function wrap(elem) {
445− var p = Value.getSize(elem);
446− return ["Element", Guid.guid(), ["EHtml",elem],
447− p[0], p[1], 1, Nothing, Nothing];
449− var addListener = function() {
450− if(document.addEventListener) {
451− return function(element, event, handler) {
452− element.addEventListener(event, handler, false);
455− return function(element, event, handler) {
456− element.attachEvent('on' + event, handler);
466− listToArray:listToArray,
468− properEscape : properEscape,
469− getTextSize : getTextSize,
471− getExcess : getExcess,
472− groupForms : groupForms,
474− addListener : addListener
476−}();var Elm = Elm || {};
477−Elm.List = function() {
479− var throwError = function(f) {
480− throw "Function '" + f + "' expecting a list!";
483− function length(xs) {
485− while (xs[0] === "Cons") {
491− var reverse = foldl(function(x_72) {
492− return function(y_73) {
493− return["Cons", x_72, y_73]
496− var concat = foldr(function(x_74) {
497− return function(y_75) {
498− return Value.append(x_74, y_75)
501− var and = foldl(function(x_77) {
502− return function(y_78) {
506− var or = foldl(function(x_79) {
507− return function(y_80) {
511− var sum = foldl(function(x_89) {
512− return function(y_90) {
516− var product = foldl(function(x_91) {
517− return function(y_92) {
521− var maximum = foldl1(function(x) { return function(y) { return Math.max(x,y) } });
522− var minimum = foldl1(function(x) { return function(y) { return Math.min(x,y) } });
524− if (v[0] !== "Cons") {
525− throw "Error: 'head' only accepts lists of length greater than one.";
530− if (v[0] !== "Cons") {
531− throw "Error: 'tail' only accepts lists of length greater than one.";
536− if (v[0] !== "Cons") {
537− throw "Error: 'last' only accepts lists of length greater than one.";
540− while (v[0] === "Cons") {
547− return function(xs) {
548− if (xs[0] === "Nil") { return xs; }
549− if (xs[0] !== "Cons") { throwError('map'); }
550− var root = ["Cons", f(xs[1]), ["Nil"]];
553− while (xs[0]==="Cons") {
554− curr[2] = ["Cons", f(xs[1]), ["Nil"]];
562− return function(b) {
563− return function(xs) {
565− if (xs[0] === "Nil") { return acc; }
566− if (xs[0] !== "Cons") { throwError('foldl'); }
567− while (xs[0] === "Cons") {
568− acc = f(xs[1])(acc);
576− return function(b) {
577− return function(xs) {
579− if (xs[0] === "Nil") { return acc; }
580− if (xs[0] !== "Cons") { throwError('foldr'); }
582− while (xs[0] === "Cons") {
586− for (var i = arr.length; i--; ) {
587− acc = f(arr[i])(acc);
593− function foldl1(f_49) {
594− return function(_temp_50) {
595− return function(v) {
596− if("Cons" !== v[0]) {
601− return foldl(f_49)(x_51)(xs_52)
606− function foldr1(f) {
607− return function(xs) {
608− if (xs[0] === "Nil") { throw "'foldr1' requires an non-empty list." }
609− if (xs[0] !== "Cons") { throwError('foldr1'); }
611− while (xs[0] === "Cons") {
615− var acc = arr.pop();
616− for (var i = arr.length; i--; ) {
617− acc = f(arr[i])(acc);
623− return function(b) {
624− return function(xs) {
625− if (xs[0] === "Nil") { return ["Cons",b,["Nil"]]; }
626− if (xs[0] !== "Cons") { throwError('scanl'); }
628− while (xs[0] === "Cons") {
634− for (var i = arr.length; i--; ) {
635− out = ["Cons", arr[i], out];
641− function scanl1(f) {
642− return function(xs) {
643− if (xs[0] !== "Cons") {
644− throw "Error: 'scanl1' requires a list of at least length 1.";
646− return scanl(f)(xs[1])(xs[2]);
649− function filter(pred) {
650− return function(xs) {
651− if (xs[0] === "Nil") { return xs; }
652− if (xs[0] !== "Cons") { throwError('filter'); }
654− while (xs[0] === "Cons") {
655− if (pred(xs[1])) { arr.push(xs[1]); }
659− for (var i = arr.length; i--; ) {
660− out = ["Cons", arr[i], out];
665− function concatMap(f_76) {
666− return function(x) {
667− return concat(map(f_76)(x))
670− function all(pred) {
671− return foldl(function(x) { return function(acc) {
672− return acc && pred(x);
675− function any(pred) {
676− return foldl(function(x) { return function(acc) {
677− return acc || pred(x);
680− function partition(pred_93) {
681− return function(lst_94) {
684− var c = [function(v) {
685− if("Nil" !== v[0]) {
688− return["Tuple2", ["Nil"], ["Nil"]]
691− if("Cons" !== v[0]) {
696− return function(v) {
697− if("Tuple2" !== v[0]) {
702− return pred_93(x_95) ? ["Tuple2", ["Cons", x_95, as_97], bs_98] : ["Tuple2", as_97, ["Cons", x_95, bs_98]]
704− }(partition(pred_93)(xs_96))
707− for(var i = c.length;i--;) {
709− if(r !== undefined) {
716− function zipWith(f) {
717− return function(listA) {
718− return function(listB) {
719− if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
720− if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zipWith'); }
722− while (listA[0] === "Cons" && listB[0] === "Cons") {
723− arr.push(f(listA[1])(listB[1]));
728− for (var i = arr.length; i--; ) {
729− out = ["Cons", arr[i], out];
735− function zip(listA) {
736− return function(listB) {
737− if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
738− if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zip'); }
740− while (listA[0] === "Cons" && listB[0] === "Cons") {
741− arr.push(["Tuple2", listA[1], listB[1]]);
746− for (var i = arr.length; i--; ) {
747− out = ["Cons", arr[i], out];
752− function unzip(pairs_112) {
755− var c = [function(v) {
756− if("Nil" !== v[0]) {
759− return["Tuple2", ["Nil"], ["Nil"]]
762− if("Cons" !== v[0]) {
767− return function(v) {
768− if("Tuple2" !== v[0]) {
771− if("Tuple2" !== v[1][0]) {
774− var x_115 = v[1][1];
775− var y_116 = v[1][2];
776− if("Tuple2" !== v[2][0]) {
779− var xs_117 = v[2][1];
780− var ys_118 = v[2][2];
781− return["Tuple2", ["Cons", x_115, xs_117], ["Cons", y_116, ys_118]]
785− }(["Tuple2", p_113, unzip(ps_114)])
788− for(var i = c.length;i--;) {
790− if(r !== undefined) {
796− function intersperse(sep_119) {
797− return function(xs_120) {
800− var c = [function(v) {
801− if("Nil" !== v[0]) {
807− if("Cons" !== v[0]) {
811− if("Nil" !== v[2][0]) {
814− return["Cons", a_124, ["Nil"]]
818− if("Cons" !== v[0]) {
822− if("Cons" !== v[2][0]) {
825− var b_122 = v[2][1];
826− var cs_123 = v[2][2];
827− return["Cons", a_121, ["Cons", sep_119, intersperse(sep_119)(["Cons", b_122, cs_123])]]
831− for(var i = c.length;i--;) {
833− if(r !== undefined) {
840− function intercalate(sep_125) {
841− return function(xs_126) {
844− var c = [function(v) {
845− if("Nil" !== v[0]) {
851− if("Cons" !== v[0]) {
855− if("Nil" !== v[2][0]) {
862− if("Cons" !== v[0]) {
866− if("Cons" !== v[2][0]) {
869− var b_128 = v[2][1];
870− var cs_129 = v[2][2];
871− return Value.append(a_127, Value.append(sep_125, intercalate(sep_125)(["Cons", b_128, cs_129])))
875− for(var i = c.length;i--;) {
877− if(r !== undefined) {
885− if (xs[0] === "Nil") { return xs; }
886− if (xs[0] !== "Cons") { throwError('sort'); }
888− while (xs[0] === "Cons") {
892− arr.sort(function(a,b) { return a - b});
894− for (var i = arr.length; i--; ) {
895− out = [ "Cons", arr[i], out ];
899− function take(n) { return function(xs) {
900− if (n <= 0) { return ["Nil"]; }
901− if (xs[0] === "Nil") { return xs; }
902− if (xs[0] !== "Cons") { throwError('take'); }
903− var out = [ "Cons", xs[1], ["Nil"] ];
907− while (xs[0] === "Cons" && n > 0) {
908− temp[2] = [ "Cons", xs[1], ["Nil"] ];
916− function drop(n) { return function(xs) {
917− if (xs[0] === "Nil") { return xs; }
918− if (xs[0] !== "Cons") { throwError('drop'); }
919− while (xs[0] === "Cons" && n > 0) {
940− concatMap:concatMap,
949− partition:partition,
953− intersperse:intersperse,
954− intercalate:intercalate,
958−}();try{if(Elm.Dict)throw "Module name collision, 'Dict' is already defined.";Elm.Dict=function(){try{if(!(Elm.Prelude instanceof Object))throw 'module not found'}catch(e){throw "Module 'Prelude' is missing. Compile with --make flag or load missing module in a separate JavaScript file."};var hiddenVars=[];for(var i in Elm.Prelude){if(hiddenVars.indexOf(i)>=0)continue;this[i]=Elm.Prelude[i]};try{if(!(Elm.Data.Maybe instanceof Object))throw 'module not found'}catch(e){throw "Module 'Data.Maybe' is missing. Compile with --make flag or load missing module in a separate JavaScript file."};var isJust=Elm.Data.Maybe.isJust,Red_0=["Red"],Black_1=["Black"]
959−function RBNode_2(a1){return function(a2){return function(a3){return function(a4){return function(a5){return ["RBNode",a1,a2,a3,a4,a5]}}}}};var RBEmpty_3=["RBEmpty"],raise_4=console.log,empty_5=RBEmpty_3
960−function equal_pathLen_6(t_46){return function(){function path_numBlacks_47(t_48){return function(){switch(t_48[0]){case"RBEmpty":return 1;case"RBNode":return function(){var bl_52=path_numBlacks_47(t_48[4]),br_53=path_numBlacks_47(t_48[5]);return((not(eq(bl_52,br_53))||(eq(bl_52,-1)||eq(br_53,-1)))?-1:(bl_52+(eq(t_48[1],Red_0)?0:1)))}()};throw "Non-exhaustive pattern match in case"}()};return not(eq(-1,path_numBlacks_47(t_46)))}()}
961−function rootBlack_7(t_54){return function(){switch(t_54[0]){case"RBEmpty":return true;case"RBNode":switch(t_54[1][0]){case"Black":return true};break};return false}()}
962−function redBlack_children_8(t_55){return function(){switch(t_55[0]){case"RBEmpty":return true;case"RBNode":switch(t_55[1][0]){case"Red":switch(t_55[4][0]){case"RBNode":switch(t_55[4][1][0]){case"Red":return false};break};switch(t_55[5][0]){case"RBNode":switch(t_55[5][1][0]){case"Red":return false};break};break};return(redBlack_children_8(t_55[4])&&redBlack_children_8(t_55[5]))};throw "Non-exhaustive pattern match in case"}()}
963−function findExtreme_9(f_58){return function(t_59){return function(){switch(t_59[0]){case"RBEmpty":return Nothing;case"RBNode":return function(){var case6=findExtreme_9(f_58)(f_58(["Tuple2",t_59[4],t_59[5]]));switch(case6[0]){case"Just":return Just(case6[1]);case"Nothing":return Just(t_59[2])};throw "Non-exhaustive pattern match in case"}()};throw "Non-exhaustive pattern match in case"}()}}
964−function findminRbt_10(t_65){return findExtreme_9(fst)(t_65)}
965−function findmaxRbt_11(t_66){return findExtreme_9(snd)(t_66)}
966−function optionRelation_12(f_67){return function(u_68){return function(xo_69){return function(yo_70){return function(){var case0=["Tuple2",xo_69,yo_70];switch(case0[0]){case"Tuple2":switch(case0[1][0]){case"Nothing":return u_68};switch(case0[2][0]){case"Nothing":return u_68};switch(case0[1][0]){case"Just":switch(case0[2][0]){case"Just":return f_67(case0[1][1])(case0[2][1])};break};break};throw "Non-exhaustive pattern match in case"}()}}}}
967−function olt_13(xo_73){return function(yo_74){return optionRelation_12(function(x_75){return function(y_76){return(compare(x_75)(y_76)[0]==='LT')}})(true)(xo_73)(yo_74)}}
968−function olte_14(xo_77){return function(yo_78){return optionRelation_12(function(x_79){return function(y_80){return function(){var ord=compare(x_79)(y_80)[0];return ord==='LT'||ord==='EQ'}()}})(true)(xo_77)(yo_78)}}
969−function ordered_15(t_81){return function(){switch(t_81[0]){case"RBEmpty":return true;case"RBNode":return function(){var Tuple2$lmaxrmin_87=["Tuple2",findmaxRbt_11(t_81[4]),findminRbt_10(t_81[5])],lmax_88=function(){switch(Tuple2$lmaxrmin_87[0]){case"Tuple2":return Tuple2$lmaxrmin_87[1]};throw "Non-exhaustive pattern match in case"}(),rmin_89=function(){switch(Tuple2$lmaxrmin_87[0]){case"Tuple2":return Tuple2$lmaxrmin_87[2]};throw "Non-exhaustive pattern match in case"}();return(olte_14(lmax_88)(Just(t_81[2]))&&(olte_14(Just(t_81[2]))(rmin_89)&&(ordered_15(t_81[4])&&ordered_15(t_81[5]))))}()};throw "Non-exhaustive pattern match in case"}()}
970−function leftLeaning_16(t_94){return function(){switch(t_94[0]){case"RBEmpty":return true;case"RBNode":switch(t_94[4][0]){case"RBEmpty":switch(t_94[5][0]){case"RBNode":switch(t_94[5][1][0]){case"Red":return false};break};break;case"RBNode":switch(t_94[4][1][0]){case"Black":switch(t_94[5][0]){case"RBNode":switch(t_94[5][1][0]){case"Red":return false};break};break};break};return(leftLeaning_16(t_94[4])&&leftLeaning_16(t_94[5]))};throw "Non-exhaustive pattern match in case"}()}
971−function invariants_hold_17(t_97){return(ordered_15(t_97)&&(rootBlack_7(t_97)&&(redBlack_children_8(t_97)&&(equal_pathLen_6(t_97)&&leftLeaning_16(t_97)))))}
972−function min_18(t_98){return function(){switch(t_98[0]){case"RBEmpty":return console.log(Value.str("(min RBEmpty) is not defined"));case"RBNode":switch(t_98[4][0]){case"RBEmpty":return ["Tuple2",t_98[2],t_98[3]]};return min_18(t_98[4])};throw "Non-exhaustive pattern match in case"}()}
973−function max_19(t_102){return function(){switch(t_102[0]){case"RBEmpty":return console.log(Value.str("(max RBEmpty) is not defined"));case"RBNode":switch(t_102[5][0]){case"RBEmpty":return ["Tuple2",t_102[2],t_102[3]]};return max_19(t_102[5])};throw "Non-exhaustive pattern match in case"}()}
974−function lookup_20(k_106){return function(t_107){return function(){switch(t_107[0]){case"RBEmpty":return Nothing;case"RBNode":return function(){var case6=compare(k_106)(t_107[2]);switch(case6[0]){case"EQ":return Just(t_107[3]);case"GT":return lookup_20(k_106)(t_107[5]);case"LT":return lookup_20(k_106)(t_107[4])};throw "Non-exhaustive pattern match in case"}()};throw "Non-exhaustive pattern match in case"}()}}
975−function member_21(k_112){return function(t_113){return isJust(lookup_20(k_112)(t_113))}}
976−function rotateLeft_22(t_114){return function(){switch(t_114[0]){case"RBNode":switch(t_114[5][0]){case"RBNode":return RBNode_2(t_114[1])(t_114[5][2])(t_114[5][3])(RBNode_2(Red_0)(t_114[2])(t_114[3])(t_114[4])(t_114[5][4]))(t_114[5][5])};break};return raise_4(Value.str("rotateLeft of a node without enough children"))}()}
977−function rotateRight_23(t_124){return function(){switch(t_124[0]){case"RBNode":switch(t_124[4][0]){case"RBNode":return RBNode_2(t_124[1])(t_124[4][2])(t_124[4][3])(t_124[4][4])(RBNode_2(Red_0)(t_124[2])(t_124[3])(t_124[4][5])(t_124[5]))};break};return raise_4(Value.str("rotateRight of a node without enough children"))}()}
978−function rotateLeftIfNeeded_24(t_134){return function(){switch(t_134[0]){case"RBNode":switch(t_134[5][0]){case"RBNode":switch(t_134[5][1][0]){case"Red":return rotateLeft_22(t_134)};break};break};return t_134}()}
979−function rotateRightIfNeeded_25(t_135){return function(){switch(t_135[0]){case"RBNode":switch(t_135[4][0]){case"RBNode":switch(t_135[4][1][0]){case"Red":switch(t_135[4][4][0]){case"RBNode":switch(t_135[4][4][1][0]){case"Red":return rotateRight_23(t_135)};break};break};break};break};return t_135}()}
980−function otherColor_26(c_136){return function(){switch(c_136[0]){case"Black":return Red_0;case"Red":return Black_1};throw "Non-exhaustive pattern match in case"}()}
981−function color_flip_27(t_137){return function(){switch(t_137[0]){case"RBNode":switch(t_137[4][0]){case"RBNode":switch(t_137[5][0]){case"RBNode":return RBNode_2(otherColor_26(t_137[1]))(t_137[2])(t_137[3])(RBNode_2(otherColor_26(t_137[4][1]))(t_137[4][2])(t_137[4][3])(t_137[4][4])(t_137[4][5]))(RBNode_2(otherColor_26(t_137[5][1]))(t_137[5][2])(t_137[5][3])(t_137[5][4])(t_137[5][5]))};break};break};return raise_4(Value.str("color_flip called on a RBEmpty or RBNode with a RBEmpty child"))}()}
982−function color_flipIfNeeded_28(t_151){return function(){switch(t_151[0]){case"RBNode":switch(t_151[4][0]){case"RBNode":switch(t_151[4][1][0]){case"Red":switch(t_151[5][0]){case"RBNode":switch(t_151[5][1][0]){case"Red":return color_flip_27(t_151)};break};break};break};break};return t_151}()}
983−function fixUp_29(t_152){return color_flipIfNeeded_28(rotateRightIfNeeded_25(rotateLeftIfNeeded_24(t_152)))}
984−function ensureBlackRoot_30(t_153){return function(){switch(t_153[0]){case"RBNode":switch(t_153[1][0]){case"Red":return RBNode_2(Black_1)(t_153[2])(t_153[3])(t_153[4])(t_153[5])};break};return t_153}()}
985−function insert_31(k_158){return function(v_159){return function(t_160){return function(){function ins_161(t_162){return function(){switch(t_162[0]){case"RBEmpty":return RBNode_2(Red_0)(k_158)(v_159)(RBEmpty_3)(RBEmpty_3);case"RBNode":return function(){var h_168=function(){var case6=compare(k_158)(t_162[2]);switch(case6[0]){case"EQ":return RBNode_2(t_162[1])(t_162[2])(v_159)(t_162[4])(t_162[5]);case"GT":return RBNode_2(t_162[1])(t_162[2])(t_162[3])(t_162[4])(ins_161(t_162[5]));case"LT":return RBNode_2(t_162[1])(t_162[2])(t_162[3])(ins_161(t_162[4]))(t_162[5])};throw "Non-exhaustive pattern match in case"}();return fixUp_29(h_168)}()};throw "Non-exhaustive pattern match in case"}()};return(not(invariants_hold_17(t_160))?raise_4(Value.str("invariants broken before insert")):function(){var new_t_169=ensureBlackRoot_30(ins_161(t_160));return(not(invariants_hold_17(new_t_169))?raise_4(Value.str("invariants broken after insert")):new_t_169)}())}()}}}
986−function singleton_32(k_170){return function(v_171){return insert_31(k_170)(v_171)(RBEmpty_3)}}
987−function isRed_33(t_172){return function(){switch(t_172[0]){case"RBNode":switch(t_172[1][0]){case"Red":return true};break};return false}()}
988−function isRedLeft_34(t_173){return function(){switch(t_173[0]){case"RBNode":switch(t_173[4][0]){case"RBNode":switch(t_173[4][1][0]){case"Red":return true};break};break};return false}()}
989−function isRedLeftLeft_35(t_174){return function(){switch(t_174[0]){case"RBNode":switch(t_174[4][0]){case"RBNode":switch(t_174[4][4][0]){case"RBNode":switch(t_174[4][4][1][0]){case"Red":return true};break};break};break};return false}()}
990−function isRedRight_36(t_175){return function(){switch(t_175[0]){case"RBNode":switch(t_175[5][0]){case"RBNode":switch(t_175[5][1][0]){case"Red":return true};break};break};return false}()}
991−function isRedRightLeft_37(t_176){return function(){switch(t_176[0]){case"RBNode":switch(t_176[5][0]){case"RBNode":switch(t_176[5][4][0]){case"RBNode":switch(t_176[5][4][1][0]){case"Red":return true};break};break};break};return false}()}
992−function moveRedLeft_38(t_177){return function(){var t__178=color_flip_27(t_177);return function(){switch(t__178[0]){case"RBNode":return function(){switch(t__178[5][0]){case"RBNode":switch(t__178[5][4][0]){case"RBNode":switch(t__178[5][4][1][0]){case"Red":return color_flip_27(rotateLeft_22(RBNode_2(t__178[1])(t__178[2])(t__178[3])(t__178[4])(rotateRight_23(t__178[5]))))};break};break};return t__178}()};return t__178}()}()}
993−function moveRedRight_39(t_184){return function(){var t__185=color_flip_27(t_184);return(isRedLeftLeft_35(t__185)?color_flip_27(rotateRight_23(t__185)):t__185)}()}
994−function moveRedLeftIfNeeded_40(t_186){return((not(isRedLeft_34(t_186))&¬(isRedLeftLeft_35(t_186)))?moveRedLeft_38(t_186):t_186)}
995−function moveRedRightIfNeeded_41(t_187){return((not(isRedRight_36(t_187))&¬(isRedRightLeft_37(t_187)))?moveRedRight_39(t_187):t_187)}
996−function deleteMin_42(t_188){return function(){function del_189(t_190){return function(){switch(t_190[0]){case"RBNode":switch(t_190[4][0]){case"RBEmpty":return RBEmpty_3};break};return function(){var t__191=moveRedLeftIfNeeded_40(t_190);return function(){switch(t__191[0]){case"RBEmpty":return RBEmpty_3;case"RBNode":return fixUp_29(RBNode_2(t__191[1])(t__191[2])(t__191[3])(del_189(t__191[4]))(t__191[5]))};throw "Non-exhaustive pattern match in case"}()}()}()};return ensureBlackRoot_30(del_189(t_188))}()}
997−function deleteMax_43(t_197){return function(){function del_198(t_199){return function(){var t__200=(isRedLeft_34(t_199)?rotateRight_23(t_199):t_199);return function(){switch(t__200[0]){case"RBNode":switch(t__200[5][0]){case"RBEmpty":return RBEmpty_3};break};return function(){var t___201=moveRedRightIfNeeded_41(t__200);return function(){switch(t___201[0]){case"RBEmpty":return RBEmpty_3;case"RBNode":return fixUp_29(RBNode_2(t___201[1])(t___201[2])(t___201[3])(t___201[4])(del_198(t___201[5])))};throw "Non-exhaustive pattern match in case"}()}()}()}()};return ensureBlackRoot_30(del_198(t_197))}()}
998−function remove_44(k_207){return function(t_208){return function(){function eq_and_noRightNode_209(t_215){return function(){switch(t_215[0]){case"RBNode":switch(t_215[5][0]){case"RBEmpty":return eq(k_207,t_215[2])};break};return false}()}
999−function eq_210(t_217){return function(){switch(t_217[0]){case"RBNode":return eq(k_207,t_217[2])};return false}()}
1000−function delLT_211(t_219){return function(){var t__220=moveRedLeftIfNeeded_40(t_219);return function(){switch(t__220[0]){case"RBEmpty":return raise_4(Value.str("delLT on RBEmpty"));case"RBNode":return fixUp_29(RBNode_2(t__220[1])(t__220[2])(t__220[3])(del_214(t__220[4]))(t__220[5]))};throw "Non-exhaustive pattern match in case"}()}()}
1001−function delEQ_212(t_226){return function(){switch(t_226[0]){case"RBEmpty":return raise_4(Value.str("delEQ called on a RBEmpty"));case"RBNode":return function(){var Tuple2$k_v__230=min_18(t_226[5]),k__231=function(){switch(Tuple2$k_v__230[0]){case"Tuple2":return Tuple2$k_v__230[1]};throw "Non-exhaustive pattern match in case"}(),v__232=function(){switch(Tuple2$k_v__230[0]){case"Tuple2":return Tuple2$k_v__230[2]};throw "Non-exhaustive pattern match in case"}();return fixUp_29(RBNode_2(t_226[1])(k__231)(v__232)(t_226[4])(deleteMin_42(t_226[5])))}()};throw "Non-exhaustive pattern match in case"}()}
1002−function delGT_213(t_237){return function(){switch(t_237[0]){case"RBEmpty":return raise_4(Value.str("delGT called on a RBEmpty"));case"RBNode":return fixUp_29(RBNode_2(t_237[1])(t_237[2])(t_237[3])(t_237[4])(del_214(t_237[5])))};throw "Non-exhaustive pattern match in case"}()}
1003−function del_214(t_243){return function(){switch(t_243[0]){case"RBEmpty":return RBEmpty_3;case"RBNode":return((compare(k_207)(t_243[2])[0]==='LT')?delLT_211(t_243):function(){var t__245=(isRedLeft_34(t_243)?rotateRight_23(t_243):t_243);return(eq_and_noRightNode_209(t__245)?RBEmpty_3:function(){var t_246=moveRedRightIfNeeded_41(t_246);return(eq_210(t_246)?delEQ_212(t_246):delGT_213(t_246))}())}())};throw "Non-exhaustive pattern match in case"}()};return(not(invariants_hold_17(t_208))?raise_4(Value.str("invariants broken before remove")):function(){var t__247=ensureBlackRoot_30(del_214(t_208));return(invariants_hold_17(t__247)?t__247:raise_4(Value.str("invariants broken after remove")))}())}()}}
1004−function fold_45(f_248){return function(acc_249){return function(t_250){return function(){switch(t_250[0]){case"RBEmpty":return acc_249;case"RBNode":return fold_45(f_248)(f_248(t_250[2])(t_250[3])(fold_45(f_248)(acc_249)(t_250[4])))(t_250[5])};throw "Non-exhaustive pattern match in case"}()}}};return {empty:empty_5,lookup:lookup_20,member:member_21,insert:insert_31,singleton:singleton_32,remove:remove_44,fold:fold_45}}();Elm.main=function(){return Elm.Dict.main}}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 Dict module:<br/>'+e+'<br/><br/>The problem may stem from an improper usage of:<br/>EQ, GT, LT, console.log, fst, snd</span>');document.body.innerHTML=Text.monospace(msg);throw e}}try{if(Elm.Set)throw "Module name collision, 'Set' is already defined.";Elm.Set=function(){try{if(!(Elm.Prelude instanceof Object))throw 'module not found'}catch(e){throw "Module 'Prelude' is missing. Compile with --make flag or load missing module in a separate JavaScript file."};var hiddenVars=[];for(var i in Elm.Prelude){if(hiddenVars.indexOf(i)>=0)continue;this[i]=Elm.Prelude[i]};try{if(!(Elm.Dict instanceof Object))throw 'module not found'}catch(e){throw "Module 'Dict' is missing. Compile with --make flag or load missing module in a separate JavaScript file."};var Dict=Elm.Dict,empty_0=Dict.empty,remove_3=Dict.remove,member_4=Dict.member
1005−function singleton_1(k_5){return Dict.singleton(k_5)(["Tuple0"])}
1006−function insert_2(k_6){return Dict.insert(k_6)(["Tuple0"])};return {empty:empty_0,singleton:singleton_1,insert:insert_2,remove:remove_3,member:member_4}}();Elm.main=function(){return Elm.Set.main}}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 Set module:<br/>'+e+'<br/><br/>The problem may stem from an improper usage of:<br/>Dict.empty, Dict.insert, Dict.member, Dict.remove, Dict.singleton</span>');document.body.innerHTML=Text.monospace(msg);throw e}}
1007−var Elm = Elm || {};
1008−Elm.Char = function() {
1009− function isBetween(lo,hi) { return function(chr) {
1010− var c = chr.charCodeAt(0);
1011− return lo <= c && c <= hi;
1014− var isDigit = isBetween('0'.charCodeAt(0),'9'.charCodeAt(0));
1015− var chk1 = isBetween('a'.charCodeAt(0),'f'.charCodeAt(0));
1016− var chk2 = isBetween('A'.charCodeAt(0),'F'.charCodeAt(0));
1018− return {fromCode : function(c) { return String.fromCharCode(c); },
1019− toCode : function(c) { return c.charCodeAt(0); },
1020− toUpper : function(c) { return c.toUpperCase(); },
1021− toLower : function(c) { return c.toLowerCase(); },
1022− toLocaleUpper : function(c) { return c.toLocaleUpperCase(); },
1023− toLocaleLower : function(c) { return c.toLocaleLowerCase(); },
1024− isLower : isBetween('a'.charCodeAt(0),'z'.charCodeAt(0)),
1025− isUpper : isBetween('A'.charCodeAt(0),'Z'.charCodeAt(0)),
1027− isOctDigit : isBetween('0'.charCodeAt(0),'7'.charCodeAt(0)),
1028− isHexDigit : function(c) { return isDigit(c) || chk1(c) || chk2(c); }
1032−var Elm = Elm || {};
1033−Elm.Maybe = function() {
1034− function consMaybe(x) { return function(xs) {
1035− if (x[0] === "Just") return ["Cons", x[1], xs];
1039− function fromMaybe(b) { return function(m) {
1040− if (m[0] === "Just") return m[1];
1044− function mapCons(f) { return function(y) { return function(xs) {
1046− if (x[0] === "Just") return ["Cons", x[1], xs];
1051− function maybe(b) { return function(f) { return function(m) {
1052− if (m[0] === "Just") return f(m[1]);
1058− return {Just : function(x) { return ["Just",x]; },
1059− Nothing : ["Nothing"],
1060− catMaybes : Elm.List.foldr(consMaybe)(["Nil"]),
1061− isJust : function(m) { return m[0] === "Just"; },
1062− isNothing : function(m) { return m[0] === "Nothing"; },
1063− fromMaybe : fromMaybe,
1064− consMaybe : consMaybe,
1065− mapMaybe : function(f) { return Elm.List.foldr(mapCons(f))(["Nil"]); },
1071−var String = function() {
1073− function append(s1) { return function(s2) {
1074− return s1.concat(s2);
1077− function map(f) { return function(s) {
1078− for (var i = s.length; i--; ) { s[i] = f(s[i]); }
1082− function intercalate(sep) { return function(ss) {
1083− return Value.listToArray(ss).join(sep);
1086− function intersperse(sep) { return function(s) {
1087− return s.split("").join(sep);
1091− function foldl(f) { return function(b) { return function(s) {
1093− for (var i = 0, len = s.length; i < len; ++i) { acc = f(s[i])(acc); }
1098− function foldr(f) { return function(b) { return function(s) {
1100− for (var i = s.length; i--; ) { acc = f(s[i])(acc); }
1106− function concatMap(f) { return function(s) {
1107− var a = s.split("");
1108− for (var i = a.length; i--; ) { a[i] = f(a[i]); }
1113− function forall(pred) { return function(s) {
1114− for (var i = s.length; i--; ) { if (!pred(s[i])) {return false}; }
1118− function exists(pred) { return function(s) {
1119− for (var i = s.length; i--; ) { if (pred(s[i])) {return true}; }
1124− return {cons : append,
1126− head : function(s) { return s[0]; },
1127− last : function(s) { return s[s.length-1]; },
1128− tail : function(s) { return s.slice(1); },
1129− length : function(s) { return s.length; },
1131− intercalate : intercalate,
1132− intersperse : intersperse,
1133− reverse : function(s) { return s.split("").reverse().join(""); },
1134− toLower : function(s) { return s.toLowerCase(); },
1135− toUpper : function(s) { return s.toUpperCase(); },
1138− concat : function(ss) { return Value.listToArray(ss).join(""); },
1139− concatMap : concatMap,
1145− toText : Value.toText,
1146− properEscape : Value.properEscape
1151−var String = {toText:Value.toText, properEscape:Value.properEscape};
1152−var Elm = Elm || {};
1153−Elm.Graphics = Elm.Graphics || {};
1154−Elm.Graphics.Color = function() {
1155− function Color_0(a1) {
1156− return function(a2) {
1157− return function(a3) {
1158− return function(a4) {
1159− return["Color", a1, a2, a3, a4]
1164− var rgba_1 = Color_0;
1165− var red_3 = ["Color",255,0,0,1];
1166− var green_4 = ["Color",0,255,0,1];
1167− var blue_5 = ["Color",0,0,255,1];
1168− var yellow_6 = ["Color",255,255,0,1];
1169− var cyan_7 = ["Color",0,255,255,1];
1170− var magenta_8 = ["Color",255,0,255,1];
1171− var black_9 = ["Color",0,0,0,1];
1172− var white_10 = ["Color",255,255,255,1];
1173− var gray_11 = ["Color",128,128,128,1];
1174− var grey_12 = ["Color",128,128,128,1];
1175− function rgb_2(r_13) {
1176− return function(g_14) {
1177− return function(b_15) {
1178− return ["Color",r_13,g_14,b_15,1]
1182− function extract(c) {
1183− if (c[4] === 1) { return 'rgb(' + c[1] + ',' + c[2] + ',' + c[3] + ')'; }
1184− return 'rgba(' + c[1] + ',' + c[2] + ',' + c[3] + ',' + c[4] + ')';
1186− return{rgba:rgba_1, rgb:rgb_2, red:red_3, green:green_4, blue:blue_5, yellow:yellow_6, cyan:cyan_7, magenta:magenta_8, black:black_9, white:white_10, gray:gray_11, grey:grey_12,extract:extract}
1188−var Collage = function() {
1190−var JS = Elm.JavaScript;
1192−function tracePoints(ctx,points) {
1193− var i = points.length - 1;
1194− if (i <= 0) return;
1195− ctx.moveTo(points[i][1], points[i][2]);
1196− while (i--) { ctx.lineTo(points[i][1], points[i][2]); }
1199−function solid(ctx,color,points) {
1200− tracePoints(ctx,points);
1201− ctx.strokeStyle = Elm.Graphics.Color.extract(color);
1205−function filled(ctx,color,points) {
1206− tracePoints(ctx,points);
1207− ctx.fillStyle = Elm.Graphics.Color.extract(color);
1211−function textured(redo,ctx,src,points) {
1212− var img = new Image();
1213− img.src = JS.castStringToJSString(src);
1216− tracePoints(ctx,points);
1217− ctx.fillStyle = ctx.createPattern(img,'repeat');
1221−function customLine(pattern,ctx,color,points) {
1222− if (pattern.length === 0) { pattern = [8,4]; }
1223− customLineHelp(ctx, pattern, points);
1224− ctx.strokeStyle = Elm.Graphics.Color.extract(color);
1228−var customLineHelp = function(ctx, pattern, points) {
1229− var i = points.length - 1;
1230− if (i <= 0) return;
1231− var x0 = points[i][1], y0 = points[i][2];
1232− var x1=0, y1=0, dx=0, dy=0, remaining=0, nx=0, ny=0;
1233− var pindex = 0, plen = pattern.length;
1234− var draw = true, segmentLength = pattern[0];
1237− x1 = points[i][1]; y1 = points[i][2];
1238− dx = x1 - x0; dy = y1 - y0;
1239− remaining = Math.sqrt(dx * dx + dy * dy);
1240− while (segmentLength <= remaining) {
1241− x0 += dx * segmentLength / remaining;
1242− y0 += dy * segmentLength / remaining;
1243− ctx[draw ? 'lineTo' : 'moveTo'](x0, y0);
1244− // update starting position
1245− dx = x1 - x0; dy = y1 - y0;
1246− remaining = Math.sqrt(dx * dx + dy * dy);
1249− pindex = (pindex + 1) % plen;
1250− segmentLength = pattern[pindex];
1252− if (remaining > 0) {
1253− ctx[draw ? 'lineTo' : 'moveTo'](x1, y1);
1254− segmentLength -= remaining;
1260−function drawLine(ctx,form) {
1261− var points = form[3][1];
1262− switch(form[1][0]) {
1263− case "Solid" : return solid(ctx,form[2],points);
1264− case "Dotted": return customLine([3,3],ctx,form[2],points);
1265− case "Dashed": return customLine([8,4],ctx,form[2],points);
1266− case "Custom": return customLine(form[1][1],ctx,form[2],points);
1270−function drawShape(redo,ctx,shapeStyle,color,points) {
1271− switch(shapeStyle[0]) {
1272− case "Filled": return filled(ctx,color,points);
1273− case "Outlined": return solid(ctx,color,points);
1274− case "Textured": return textured(redo,ctx,shapeStyle[1],points);
1275− case "CustomOutline":
1276− return customLine(shapeStyle[1],ctx,color,points);
1280−function drawImage(redo,ctx,w,h,src) {
1281− var img = new Image();
1283− img.src = JS.castStringToJSString(src);
1284− ctx.drawImage(img,-w/2,-h/2,w,h);
1287−function renderForm(redo,ctx,theta,scale,x,y,form) {
1289− if (x !== 0 || y !== 0) ctx.translate(x,y);
1290− if (theta !== ~~theta) ctx.rotate(2*Math.PI*theta);
1291− if (scale !== 1) ctx.scale(scale,scale);
1294− case "FLine": drawLine(ctx,form); break;
1295− case "FShape": drawShape(redo,ctx,form[1],form[2],form[3][1]); break;
1296− case "FImage": drawImage(redo,ctx,form[1],form[2],form[3]); break;
1301−function renderForms(redo,ctx,w,h,forms) {
1302− ctx.clearRect(0,0,w,h);
1303− for (var i = forms.length; i--; ) {
1305− renderForm(redo,ctx,f[1],f[2],f[3][1],f[3][2],f[4]);
1309−function collageForms(w,h,forms) {
1310− var canvas = Render.newElement('canvas');
1311− canvas.style.width = (~~w) + 'px';
1312− canvas.style.height = (~~h) + 'px';
1313− canvas.style.display = "block";
1314− canvas.width = ~~w;
1315− canvas.height = ~~h;
1316− if (canvas.getContext) {
1317− var ctx = canvas.getContext('2d');
1318− var w = canvas.width, h = canvas.height;
1319− function redo() { renderForms(this,ctx,w,h,forms); }
1320− renderForms(redo,ctx,w,h,forms);
1323− canvas.innerHTML = "Your browser does not support the canvas element.";
1327−function collageElement(w,h,theta,scale,x,y,elem) {
1328− var e = Render.render(elem);
1329− var t = "translate(" + (x - elem[3] / 2) + "px,"+ (y - elem[4] / 2) + "px)";
1330− var r = theta === (~~theta) ? "" : "rotate(" + theta*360 + "deg)";
1331− var s = scale === 1 ? "" : "scale(" + scale + "," + scale + ")";
1332− var transforms = t + " " + s + " " + r;
1333− e.style.transform = transforms;
1334− e.style.msTransform = transforms;
1335− e.style.MozTransform = transforms;
1336− e.style.webkitTransform = transforms;
1337− e.style.OTransform = transforms;
1338− var div = Render.newElement('div');
1339− Render.addTo(div,e);
1340− div.style.width = (~~w) + "px";
1341− div.style.height = (~~h) + "px";
1342− div.style.overflow = "hidden";
1346−function collage(w,h,formss) {
1347− if (formss.length === 0) { return collageForms(w,h,[]); }
1348− var elems = new Array(formss.length);
1349− for (var i = formss.length; i--; ) {
1351− if (typeof f[0] === "string") {
1352− elems[i] = collageElement(w,h,f[1],f[2],f[3][1],f[3][2],f[4][1]);
1354− elems[i] = collageForms(w,h,f);
1357− if (formss.length === 1) { return elems[0]; }
1358− return Render.flowWith(Render.goIn,function(x){return x},elems);
1361−function updateFormSet(node,currSet,nextSet) {
1362− if (Value.eq(nextSet,currSet)) return;
1363− var w = node.style.width.slice(0,-2) - 0;
1364− var h = node.style.height.slice(0,-2) - 0;
1365− if (typeof nextSet[0] === "object") {
1366− if (typeof currSet[0] === "object") {
1367− if (node.getContext) {
1368− var ctx = node.getContext('2d');
1369− function redo() { renderForms(this,ctx,w,h,nextSet); }
1370− return renderForms(redo,ctx,w,h,nextSet);
1373− var newNode = collageForms(w,h,nextSet);
1374− newNode.style.position = 'absolute';
1375− return node.parentNode.replaceChild(newNode,node);
1378− var newNode = collageElement(w,h,f[1],f[2],f[3][1],f[3][2],f[4][1]);
1379− newNode.style.position = 'absolute';
1380− return node.parentNode.replaceChild(newNode,node);
1383−// assumes that the form sets are the same length.
1384−function updateCollage(node,currs,nexts) {
1385− if (nexts.length === 1) {
1386− return updateFormSet(node,currs[0],nexts[0]);
1388− var kids = node.childNodes;
1389− var len = kids.length;
1390− for (var i = len; i--; ) {
1391− updateFormSet(kids[len-i-1], currs[i], nexts[i]);
1395−function style(clr,n,list) {
1397− '<span style="font-size:100%;color:' + clr + ';">' + n + '</span>',
1401−function insideForm(point) { return function(form) {
1402− if (!inBoundsOf(point[1],point[2],form)) return false;
1404− switch (form[4][0]) {
1405− case "FShape": return insideShape(point,form[1],form[2],form[3],form[4][3][1]);
1406− case "FLine": return false;
1408− hw = form[4][1] / 2;
1409− hh = form[4][2] / 2;
1412− hw = form[4][1][3] / 2;
1413− hh = form[4][1][4] / 2;
1416− return insideShape(point,form[1],form[2],form[3],
1425−function inBoundsOf(px,py,form) {
1426− if (form.length < 6) {
1427− var fx = form[3][1], fy = form[3][2];
1428− var radiusSquared = 0;
1429− var scale = form[2];
1430− switch (form[4][0]) {
1432− var points = form[4][3][1];
1433− for (var i = points.length; --i; ) {
1435− radiusSquared = Math.max(radiusSquared, p[1]*p[1] + p[2]*p[2]);
1437− radiusSquared *= scale * scale;
1442− var x = scale * form[4][1] / 2;
1443− var y = scale * form[4][2] / 2;
1444− radiusSquared = x*x + y*y;
1447− var x = scale * form[4][1][3] / 2;
1448− var y = scale * form[4][1][4] / 2;
1449− radiusSquared = x*x + y*y;
1452− form.push(function(px,py) {
1455− return dx*dx + dy*dy < radiusSquared + 1;
1458− return form[5](px,py);
1461−function insideShape(point,theta,scale,pos,points) {
1463− var list = ["Nil"];
1466− var x = (point[1] - pos[1]) / scale;
1467− var y = (point[2] - pos[2]) / scale;
1469− var t = -2 * Math.PI * theta;
1470− var nx = x * Math.cos(t) - y * Math.sin(t);
1471− y = x * Math.sin(t) + y * Math.cos(t);
1475− if (points.length === 0) { return false; }
1477− for (var i = points.length - 1; i--; ) {
1479− var p1x = p1[1], p1y = p1[2], p2x = p2[1], p2y = p2[2];
1481− if (p1y < p2y) {var ymin=p1y, ymax=p2y;} else {var ymin=p2y, ymax=p1y;}
1482− if (p1x < p2x) {var xmin=p1x, xmax=p2x;} else {var xmin=p2x, xmax=p1x;}
1484− if (ymin < y && y <= ymax && x <= xmax) {
1485− if (x <= xmin || x <= ((y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x)) {
1491− return (counter % 2) === 1;
1494−return {collage:collage, updateCollage:updateCollage, insideForm:insideForm};
1496−}();var Elm = Elm || {};
1497−Elm.Graphics = Elm.Graphics || {};
1498−Elm.Graphics.Element = function() {
1499− var JS = Elm.JavaScript;
1500− var DLeft_0 = ["DLeft"];
1501− var DRight_1 = ["DRight"];
1502− var DUp_2 = ["DUp"];
1503− var DDown_3 = ["DDown"];
1504− var DIn_4 = ["DIn"];
1505− var DOut_5 = ["DOut"];
1506− function Absolute_12(a1) {
1507− return["Absolute", a1]
1509− function Relative_13(a1) {
1510− return["Relative", a1]
1512− var Near_14 = ["Near"];
1513− var Mid_15 = ["Mid"];
1514− var Far_16 = ["Far"];
1515− function Position_17(a1) {
1516− return function(a2) {
1517− return["Position", a1, a2]
1520− function PositionTL_18(a1) {
1521− return function(a2) {
1522− return["PositionTL", a1, a2]
1525− function PositionTR_19(a1) {
1526− return function(a2) {
1527− return["PositionTR", a1, a2]
1530− function PositionBL_20(a1) {
1531− return function(a2) {
1532− return["PositionBL", a1, a2]
1535− function PositionBR_21(a1) {
1536− return function(a2) {
1537− return["PositionBR", a1, a2]
1540− function Element_37(id,e,w,h,o,c,l) {
1541− return["Element", id, e, w, h, o, c, l ]
1543− function EText_39(a1) {
1544− return function(a2) {
1545− return["EText", a1, a2]
1548− function EImage_40(a1) {
1549− return["EImage", JS.castStringToJSString(a1)]
1551− function EVideo_41(a1) {
1552− return["EVideo", JS.castStringToJSString(a1)]
1554− function EFittedImage_42(a1) {
1555− return["EFittedImage", JS.castStringToJSString(a1)]
1557− function EFlow_43(a1) {
1558− return function(a2) {
1559− return["EFlow", a1, JS.castListToJSArray(a2)]
1562− function ECollage_44(a1) {
1563− return function(a2) {
1564− return function(a3) {
1565− return["ECollage", a1, a2, Value.groupForms(a3)]
1569− var EEmpty_45 = ["EEmpty"];
1570− function EContainer_46(a1) {
1571− return function(a2) {
1572− return["EContainer", a1, a2]
1575− var Solid_68 = ["Solid"];
1576− var Dotted_69 = ["Dotted"];
1577− var Dashed_70 = ["Dashed"];
1578− function Custom_71(a1) {
1579− return["Custom", JS.castListToJSArray(a1)]
1581− var Filled_72 = ["Filled"];
1582− var Outlined_73 = ["Outlined"];
1583− function CustomOutline_74(a1) {
1584− return["CustomOutline", JS.castListToJSArray(a1)]
1586− function Line_75(a1) {
1587− return["Line", JS.castListToJSArray(a1)]
1589− function Shape_78(a1) {
1590− return function(a2) {
1591− var points = JS.castListToJSArray(a1);
1592− if (points.length > 0) { points.push(points[0]); }
1593− return["Shape", points, a2];
1596− function Form_84(a1) {
1597− return function(a2) {
1598− return function(a3) {
1599− return function(a4) {
1600− return["Form", a1, a2, a3, a4]
1605− function FLine_85(a1) {
1606− return function(a2) {
1607− return function(a3) {
1608− return["FLine", a1, a2, a3]
1612− function FShape_86(a1) {
1613− return function(a2) {
1614− return function(a3) {
1615− return["FShape", a1, a2, a3]
1619− function FImage_87(a1) {
1620− return function(a2) {
1621− return function(a3) {
1622− return["FImage", a1, a2, JS.castStringToJSString(a3)]
1626− function FElement_88(a1) {
1627− return["FElement", a1]
1629− var left_6 = DLeft_0;
1630− var right_7 = DRight_1;
1631− var down_8 = DDown_3;
1633− var inward_10 = DIn_4;
1634− var outward_11 = DOut_5;
1635− var topLeft_22 = Position_17(Near_14)(Near_14);
1636− var topRight_23 = Position_17(Far_16)(Near_14);
1637− var bottomLeft_24 = Position_17(Near_14)(Far_16);
1638− var bottomRight_25 = Position_17(Far_16)(Far_16);
1639− var midLeft_26 = Position_17(Near_14)(Mid_15);
1640− var midRight_27 = Position_17(Far_16)(Mid_15);
1641− var midTop_28 = Position_17(Mid_15)(Near_14);
1642− var midBottom_29 = Position_17(Mid_15)(Far_16);
1643− var middle_30 = Position_17(Mid_15)(Mid_15);
1644− function middleAt(a1) {
1645− return function(a2) {
1646− return["PositionAt", a1, a2]
1649− var topLeftAt_31 = PositionTL_18;
1650− var topRightAt_32 = PositionTR_19;
1651− var bottomLeftAt_33 = PositionBL_20;
1652− var bottomRightAt_34 = PositionBR_21;
1653− var absolute_35 = Absolute_12;
1654− var relative_36 = Relative_13;
1655− function newElement_38(e,w,h,o,c,l) { return Element_37(Guid.guid(),e,w,h,o,c,l); }
1656− function basicNewElement(e,w,h) { return Element_37(Guid.guid(),e,w,h,1,Nothing,Nothing); }
1657− var line_76 = Line_75;
1658− var polygon_79 = Shape_78;
1659− function sprite_96(src) {
1660− return function(w) {
1661− return function(h) {
1662− return function(pos) {
1663− return Form_84(0)(1)(pos)(FImage_87(w)(h)(src))
1668− function toForm_97(pos) {
1669− return function(e) {
1670− return Form_84(0)(1)(pos)(FElement_88(e))
1673− function width_47(w__101) {
1674− return function(e) {
1679− return newElement_38(e[2],w__101,e[4] * w__101 / e[3], e[5], e[6], e[7]);
1681− var p = Value.getTextSize(w__101,e[4],be[2]);
1682− return newElement_38(e[2], w__101, p[1], e[5], e[6], e[7]);
1684− return newElement_38(e[2], w__101, e[4], e[5], e[6], e[7]);
1687− function height_48(h__108) {
1688− return function(e) {
1693− return newElement_38(e[2], e[3] * h__108 / e[4], h__108, e[5], e[6], e[7]);
1695− return newElement_38(e[2], e[3], h__108, e[5], e[6], e[7]);
1698− function size_49(w) {
1699− return function(h) {
1700− return function(e) {
1701− return newElement_38(e[2], w, h, e[5], e[6], e[7]);
1705− function opacity_50(o) {
1706− return function(e) {
1707− return newElement_38(e[2], e[3], e[4], o, e[6], e[7]);
1710− function color_51(c) {
1711− return function(e) {
1712− return newElement_38(e[2], e[3], e[4], e[5], Just(c), e[7]);
1715− function link(lnk) {
1716− return function(e) {
1717− return newElement_38(e[2], e[3], e[4], e[5], e[6], Just(JS.castStringToJSString(lnk)));
1720− function widthOf_52(e) { return ~~e[3]; }
1721− function heightOf_53(e) { return ~~e[4]; }
1722− function sizeOf_54(e) { return["Tuple2", ~~e[3], ~~e[4]] }
1723− function text_56(txt) {
1724− var p = Value.getTextSize(0,0,txt);
1725− return basicNewElement(EText_39("left")(txt), p[0], p[1])
1727− function plainText(str) {
1728− var txt = Value.toText(str);
1729− var p = Value.getTextSize(0,0,txt);
1730− return basicNewElement(EText_39("left")(txt),p[0],p[1])
1732− function asText(v) {
1733− var txt = monospace(Value.toText(Value.show(v)));
1734− var p = Value.getTextSize(0,0,txt);
1735− return basicNewElement(EText_39("left")(txt),p[0],p[1])
1737− function centeredText(txt) {
1738− var p = Value.getTextSize(0,0,txt);
1739− return basicNewElement(EText_39("center")(txt),p[0],p[1])
1741− function justifiedText(txt) {
1742− var p = Value.getTextSize(0,0,txt);
1743− return basicNewElement(EText_39("justify")(txt),p[0],p[1])
1745− function rightedText(txt) {
1746− var p = Value.getTextSize(0,0,txt);
1747− return basicNewElement(EText_39("right")(txt),p[0],p[1])
1749− function image_57(w) {
1750− return function(h) {
1751− return function(src) {
1752− return basicNewElement(EImage_40(src),w,h)
1756− function images(srcs) {
1757− var pics = Elm.Signal.constant(spacer_66(0)(0));
1758− var update = Elm.Signal.lift(function(src) {
1759− src = JS.castStringToJSString(src);
1760− var img = new Image();
1761− img.onload = function() {
1762− Dispatcher.notify(pics.id,
1763− image_57(this.width)(this.height)(src));
1767− function f(x) { return function(y) { return x; } }
1768− var combine = Elm.Signal.lift2(f)(pics)(update);
1771− function video_58(w) {
1772− return function(h) {
1773− return function(src) {
1774− return basicNewElement(EVideo_41(src),w,h)
1778− function fittedImage_59(w_147) {
1779− return function(h_148) {
1780− return function(s_149) {
1781− return basicNewElement(EFittedImage_42(s_149),w_147,h_148)
1785− function flow_60(dir_150) {
1786− return function(es_151) {
1787− return function() {
1788− var w_152 = function() {
1789− var ws_154 = map(widthOf_52)(es_151);
1790− return function(case1) {
1794− return sum(ws_154);
1798− return maximum(ws_154)
1801− var h_153 = function() {
1802− var hs_155 = map(heightOf_53)(es_151);
1803− return function(case3) {
1807− return sum(hs_155);
1811− return maximum(hs_155)
1814− return basicNewElement(EFlow_43(dir_150)(es_151), w_152, h_153)
1818− function above_61(e1_156) {
1819− return function(e2_157) {
1820− return basicNewElement(EFlow_43(DDown_3)(["Cons", e1_156, ["Cons", e2_157, ["Nil"]]]), max(widthOf_52(e1_156))(widthOf_52(e2_157)), heightOf_53(e1_156) + heightOf_53(e2_157))
1823− function below_62(e1_158) {
1824− return function(e2_159) {
1825− return basicNewElement(EFlow_43(DDown_3)(["Cons", e2_159, ["Cons", e1_158, ["Nil"]]]), max(widthOf_52(e1_158))(widthOf_52(e2_159)), heightOf_53(e1_158) + heightOf_53(e2_159))
1828− function beside_63(e1_160) {
1829− return function(e2_161) {
1830− return basicNewElement(EFlow_43(DRight_1)(["Cons", e1_160, ["Cons", e2_161, ["Nil"]]]), widthOf_52(e1_160) + widthOf_52(e2_161), max(heightOf_53(e1_160))(heightOf_53(e2_161)))
1833− function layers_64(es_162) {
1834− return basicNewElement(EFlow_43(DOut_5)(es_162), maximum(map(widthOf_52)(es_162)), maximum(map(heightOf_53)(es_162)))
1836− function collage_65(w_163) {
1837− return function(h_164) {
1838− return function(forms_165) {
1839− return basicNewElement(ECollage_44(w_163)(h_164)(forms_165),w_163,h_164)
1843− function spacer_66(w_166) {
1844− return function(h_167) {
1845− return basicNewElement(EEmpty_45,w_166,h_167)
1848− function container_67(w_169) {
1849− return function(h_170) {
1850− return function(pos_168) {
1851− return function(e_171) {
1852− return basicNewElement(EContainer_46(pos_168)(e_171),w_169,h_170)
1857− function segment_77(p1_172) {
1858− return function(p2_173) {
1859− return Line_75(["Cons", p1_172, ["Cons", p2_173, ["Nil"]]])
1862− function rect_80(w_174) {
1863− return function(h_175) {
1864− return function(pos_176) {
1865− return Shape_78(["Cons", ["Tuple2", 0 - w_174 / 2, 0 - h_175 / 2],
1866− ["Cons", ["Tuple2", 0 - w_174 / 2, h_175 / 2],
1867− ["Cons", ["Tuple2", w_174 / 2, h_175 / 2],
1868− ["Cons", ["Tuple2", w_174 / 2, 0 - h_175 / 2], ["Nil"]]]]])(pos_176)
1872− function oval_81(w_177) {
1873− return function(h_178) {
1874− return function(pos_179) {
1875− return function() {
1877− return function() {
1878− function f_181(i_182) {
1879− return["Tuple2", w_177 / 2 * cos(2 * (pi / n_180) * i_182), h_178 / 2 * sin(2 * (pi / n_180) * i_182)]
1881− return Shape_78(map(f_181)(function() {
1883− var hi = n_180 - 1;
1887− var lst = ["Cons", hi, lst]
1897− function circle_82(r_183) {
1898− return oval_81(2 * r_183)(2 * r_183)
1900− function ngon_83(n_184) {
1901− return function(r_185) {
1902− return function(pos_186) {
1903− return function() {
1904− var m_187 = toFloat(n_184);
1905− return function() {
1906− function f_188(i_189) {
1907− return["Tuple2", r_185 * cos(2 * (pi / m_187) * i_189), r_185 * sin(2 * (pi / m_187) * i_189)]
1909− return Shape_78(map(f_188)(function() {
1911− var hi = n_184 - 1;
1915− var lst = ["Cons", hi, lst]
1925− function solid_89(clr_190) {
1926− return function(ln_191) {
1927− return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Solid_68)(clr_190)(ln_191))
1930− function dotted_90(clr_192) {
1931− return function(ln_193) {
1932− return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Dotted_69)(clr_192)(ln_193))
1935− function dashed_91(clr_194) {
1936− return function(ln_195) {
1937− return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Dashed_70)(clr_194)(ln_195))
1940− function customLine_92(pattern_196) {
1941− return function(clr_197) {
1942− return function(ln_198) {
1943− return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Custom_71(pattern_196))(clr_197)(ln_198))
1947− function filled_93(clr) {
1948− return function(shape) {
1949− return Form_84(0)(1)(shape[2])(FShape_86(Filled_72)(clr)(shape));
1952− function outlined_94(clr) {
1953− return function(shape) {
1954− return Form_84(0)(1)(shape[2])(FShape_86(Outlined_73)(clr)(shape));
1957− function customOutline_95(pattern) {
1958− return function(clr) {
1959− return function(shape) {
1960− return Form_84(0)(1)(shape[2])(FShape_86(CustomOutline_74(pattern))(clr)(shape));
1964− function textured(src) {
1965− return function(shape) {
1966− return Form_84(0)(1)(shape[2])(FShape_86(["Textured",src])(null)(shape));
1969− function rotate_98(t_212) {
1970− return function(Form$thetascaleposform_213) {
1971− return function(case5) {
1975− var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1976− return Form_84(t_212 + case1)(case2)(case3)(case4)
1978− throw"Non-exhaustive pattern match in case";
1979− }(Form$thetascaleposform_213)
1982− function scale_99(s) {
1983− return function(form) {
1984− return Form_84(form[1])(s * form[2])(form[3])(form[4])
1987− function move_100(x_224) {
1988− return function(y_225) {
1989− return function(Form$thetascaleTuple2$pxpyform_226) {
1990− return function(case7) {
1994− var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1997− var case5 = case3[1], case6 = case3[2];
1998− return Form_84(case1)(case2)(["Tuple2", x_224 + case5, y_225 + case6])(case4)
2002− throw"Non-exhaustive pattern match in case";
2003− }(Form$thetascaleTuple2$pxpyform_226)
2007− return{left:left_6, right:right_7, down:down_8, up:up_9, inward:inward_10, outward:outward_11, topLeft:topLeft_22, topRight:topRight_23, bottomLeft:bottomLeft_24, bottomRight:bottomRight_25, midLeft:midLeft_26, midRight:midRight_27, midTop:midTop_28, midBottom:midBottom_29, middle:middle_30, middleAt:middleAt, topLeftAt:topLeftAt_31, topRightAt:topRightAt_32, bottomLeftAt:bottomLeftAt_33, bottomRightAt:bottomRightAt_34, absolute:absolute_35, relative:relative_36, width:width_47, height:height_48, size:size_49, opacity:opacity_50,
2008− color:color_51, link:link, widthOf:widthOf_52, heightOf:heightOf_53, sizeOf:sizeOf_54, text:text_56, asText:asText, plainText:plainText, centeredText:centeredText, justifiedText:justifiedText, rightedText:rightedText, image:image_57, images:images, video:video_58, fittedImage:fittedImage_59, flow:flow_60, above:above_61, below:below_62, beside:beside_63, layers:layers_64, collage:collage_65, spacer:spacer_66, container:container_67, line:line_76, segment:segment_77, polygon:polygon_79, rect:rect_80, oval:oval_81, circle:circle_82, ngon:ngon_83, solid:solid_89, dotted:dotted_90, dashed:dashed_91, customLine:customLine_92, filled:filled_93,
2009− outlined:outlined_94, customOutline:customOutline_95, textured:textured, sprite:sprite_96, toForm:toForm_97, rotate:rotate_98, scale:scale_99, move:move_100,
2010− isWithin: Collage.insideForm}
2012−var Text = function() {
2013− function fromString(s) { return Value.toText(s); }
2015− var addTag = function(tag) { return function(text) {
2016− return '<' + tag + ' style="padding:0;margin:0">' + text + '</' + tag + '>';
2019− var addStyle = function(style, value) { return function(text) {
2020− return "<span style='" + style + ":" + value + "'>" + text + "</span>";
2024− var typeface = function(name) {
2025− name = Elm.JavaScript.castStringToJSString(name);
2026− return addStyle('font-family', name);
2028− var size = function(px) {
2029− return addStyle('font-size', px + 'px');
2031− var header = addTag('h1');
2032− var height = function(h) { return addStyle('font-size', h+'em'); }
2033− var italic = addStyle('font-style', 'italic');
2034− var bold = addTag('b');
2035− var color = function(c) {
2036− return addStyle('color', Elm.Graphics.Color.extract(c));
2038− var underline = addStyle('text-decoration', 'underline');
2039− var overline = addStyle('text-decoration', 'overline');
2040− var strikeThrough = addStyle('text-decoration', 'line-through');
2041− var link = function(href) { return function(text) {
2042− return "<a href='" + fromString(href) + "'>" + text + "</a>";
2046− return {fromString : fromString,
2047− toText: fromString,
2052− underline : underline,
2053− overline : overline,
2054− strikeThrough : strikeThrough,
2055− monospace : typeface('monospace'),
2056− typeface : typeface,
2061−var Elm = Elm || {};
2062−Elm.Graphics.Text = Text;
2064−var Render = function(){
2066−function newElement(elementType) {
2067− var e = document.createElement(elementType);
2068− e.style.padding = "0";
2069− e.style.margin = "0";
2073−function addTo(container, elem) {
2074− container.appendChild(elem);
2077−function makeText(pos,txt) {
2078− var e = newElement('div');
2080− e.style.textAlign = pos;
2084−function image(src) {
2085− var img = newElement('img');
2088− img.style.display = "block";
2092−function fittedImage(w,h,src) {
2093− var canvas = newElement('canvas');
2094− canvas.style.display = "block";
2095− canvas.style.width = w + 'px';
2096− canvas.style.height = h + 'px';
2099− canvas.innerHTML = "Your browser does not support the canvas element.";
2101− var img = newElement('img');
2102− img.onload = function() {
2103− if (canvas.getContext) {
2104− var ctx = canvas.getContext('2d');
2105− var sx = 0, sy = 0, sWidth = this.width, sHeight = this.height;
2106− if (w / h > this.width / this.height) {
2107− sHeight = this.width * h / w;
2108− sy = (this.height - sHeight) / 2;
2110− sWidth = this.height * w / h;
2111− sx = (this.width - sWidth) / 2;
2113− ctx.drawImage(img, sx, sy, sWidth, sHeight,
2114− 0,0, canvas.width, canvas.height);
2121−var video = function(src) {
2122− var e = newElement('video');
2123− e.controls = "controls";
2124− var source = newElement('source');
2126− var segs = src.split('.');
2127− source.type = "video/" + segs[segs.length-1];
2129− e.style.display = "block";
2133−function divify(e) {
2134− var div = newElement('div');
2138−function goDown(e) {
2139− return e //.tagName === "DIV" ? e : divify(e);
2141−function goRight(e) {
2142− e.style.styleFloat = "left";
2143− e.style.cssFloat = "left";
2147− e.style.position = 'absolute';
2150−function flowWith(f, prep, elist) {
2151− var container = newElement('div');
2152− for (var i = elist.length; i--; ) {
2153− addTo(container, f(prep(elist[i])));
2158−function flow(dir,elist) {
2160− case "DDown": elist = elist.slice(0).reverse();
2161− case "DUp": return flowWith(goDown,render,elist);
2162− case "DRight": elist = elist.slice(0).reverse();
2163− case "DLeft": return flowWith(goRight,render,elist);
2164− case "DOut": elist = elist.slice(0).reverse();
2165− case "DIn": return flowWith(goIn,render,elist);
2169−function toPos(pos) {
2171− case "Absolute": return pos[1] + "px";
2172− case "Relative": return (pos[1] * 100) + "%";
2176−function setPos(pos,e) {
2177− e.style.position = 'absolute';
2178− e.style.margin = 'auto';
2181− if (pos[1][0] !== "Far") e.style.left = 0;
2182− if (pos[1][0] !== "Near") e.style.right = 0;
2183− if (pos[2][0] !== "Far") e.style.top = 0;
2184− if (pos[2][0] !== "Near") e.style.bottom = 0;
2187− e.style.top = toPos(pos[2]);
2188− e.style.left = toPos(pos[1]);
2189− var shift = "translate(" + (-elem[3]/2) + "px," + (-elem[4]/2) + "px)";
2190− e.style.transform = shift;
2191− e.style.msTransform = shift;
2192− e.style.MozTransform = shift;
2193− e.style.webkitTransform = shift;
2194− e.style.OTransform = shift;
2197− var p = pos[0].slice(-2);
2198− e.style[p[0] === "T" ? 'top' : 'bottom'] = toPos(pos[2]);
2199− e.style[p[1] === "L" ? 'left' : 'right'] = toPos(pos[1]);
2203−function container(pos,elem) {
2204− var e = render(elem);
2206− var div = newElement('div');
2207− div.style.position = "relative";
2208− div.style.overflow = "hidden";
2213−function render(elem) {
2215− switch(elem[2][0]) {
2216− case "EText": e = makeText(elem[2][1],elem[2][2]); break;
2217− case "EImage": e = image(elem[2][1]); break;
2218− case "EVideo": e = video(elem[2][1]); break;
2219− case "EFittedImage": e = fittedImage(elem[3],elem[4],elem[2][1]); break;
2220− case "EFlow": e = flow(elem[2][1][0],elem[2][2]); break;
2221− case "ECollage": e = Collage.collage(elem[2][1],elem[2][2],elem[2][3]); break;
2222− case "EEmpty": e = newElement('div'); break;
2223− case "EContainer": e = container(elem[2][1],elem[2][2]); break;
2226− if (e.type !== 'button') {
2227− var p = Value.getExcess(e);
2232− case "EExternalHtml":
2233− e = newElement('div');
2234− addTo(e, elem[2][1]);
2238− e.style.width = (~~elem[3]) + 'px';
2239− e.style.height = (~~elem[4]) + 'px';
2240− if (elem[5] !== 1) { e.style.opacity = elem[5]; }
2241− if (elem[6][0] === "Just") {
2242− e.style.backgroundColor = Elm.Graphics.Color.extract(elem[6][1]);
2244− if (elem[7][0] === "Just") {
2245− var a = newElement('a');
2246− a.href = elem[7][1];
2253−function update(node,curr,next) {
2254− if (node.tagName === 'A') { node = node.firstChild; }
2255− if (curr[1] === next[1]) return;
2256− if (curr[2][0] !== next[2][0]) {
2257− return node.parentNode.replaceChild(render(next),node);
2259− var nextE = next[2], currE = curr[2];
2262− if (nextE[1] !== currE[1]) node.style.textAlign = nextE[1];
2263− if (nextE[2] !== currE[2]) node.innerHTML = nextE[2];
2266− if (nextE[1] !== currE[1]) node.src = nextE[1];
2269− case "EFittedImage":
2270− if (!Value.eq(nextE,currE) || next[3]!==curr[3] || next[4]!==curr[4]) {
2271− return node.parentNode.replaceChild(render(next),node);
2275− if (nextE[1] !== currE[1] || nextE[2] !== currE[2] || nextE[3].length !== currE[3].length) {
2276− return node.parentNode.replaceChild(render(next),node);
2278− Collage.updateCollage(node,currE[3],nextE[3]);
2281− if (nextE[1] !== currE[1]) {
2282− return node.parentNode.replaceChild(render(next),node);
2284− var nexts = nextE[2];
2285− var kids = node.childNodes;
2286− if (nexts.length !== kids.length) {
2287− return node.parentNode.replaceChild(render(next),node);
2289− var currs = currE[2];
2291− switch(nextE[1][0]) {
2292− case "DDown": case "DUp": goDir = goDown; break;
2293− case "DRight": case "DLeft": goDir = goRight; break;
2294− case "DOut": case "DIn": goDir = goIn; break;
2296− for (var i = kids.length; i-- ;) {
2297− update(kids[i],currs[i],nexts[i]);
2302− update(node.childNodes[0],currE[2],nextE[2]);
2303− setPos(nextE[1],node.childNodes[0]);
2308− if (next[1] !== curr[1]) {
2309− var e = render(next);
2310− node.parentNode.replaceChild(e,node);
2313− if (e.type !== 'button') {
2314− var p = Value.getExcess(node);
2319− case "EExternalHtml":
2320− if (next[1] !== curr[1])
2321− node.parentNode.replaceChild(render(next),node);
2324− if (next[3] !== curr[3]) node.style.width = (~~next[3]) + 'px';
2325− if (next[4] !== curr[4]) node.style.height = (~~next[4]) + 'px';
2326− if (next[5] !== curr[5]) node.style.opacity = next[5];
2327− if (next[6].length === 2) {
2328− var clr = Elm.Graphics.Color.extract(next[6][1]);
2329− if (clr !== node.style.backgroundColor) node.style.backgroundColor = clr;
2331− if (next[7].length === 2) {
2332− if (curr[7].length === 1 || next[7][1] !== curr[7][1]) node.parentNode.href = next[7][1];
2337−return {render:render,update:update,addTo:addTo,newElement:newElement,flowWith:flowWith,goIn:goIn};
2340−var Elm = Elm || {};
2341−Elm.Signal = function() {
2342− var send = function(node, timestep, changed) {
2343− var kids = node.kids;
2344− for (var i = kids.length; i--; ) {
2345− kids[i].recv(timestep, changed, node.id);
2348− var input = function(base) {
2349− this.id = Guid.guid();
2352− this.defaultNumberOfKids = 0;
2353− this.recv = function(timestep, eid, v) {
2354− var changed = eid === this.id;
2355− if (changed) { this.value = v; }
2356− send(this, timestep, changed);
2359− Dispatcher.inputs.push(this);
2361− var lift = function(func,args) {
2362− this.id = Guid.guid();
2366− this.changed = false;
2369− this.recalc = function() {
2371− for (var i = args.length; i--; ) {
2372− f = f(args[i].value);
2378− this.recv = function(timestep, changed, parentID) {
2380− if (changed) { this.changed = true; }
2381− if (this.count == args.length) {
2382− if (this.changed) { this.recalc() }
2383− send(this, timestep, this.changed);
2384− this.changed = false;
2388− for (var i = args.length; i--; ) {
2389− args[i].kids.push(this);
2392− var fold = function(func,base,baseIsFunc,input) {
2393− this.id = Guid.guid();
2394− this.value = baseIsFunc ? base(input.value) : base;
2396− this.recv = function(timestep, changed, parentID) {
2397− if (changed) { this.value = func(input.value)(this.value); }
2398− send(this, timestep, changed);
2400− input.kids.push(this);
2403− var dropIf = function(pred,base,input) {
2404− this.id = Guid.guid();
2405− this.value = pred(input.value) ? base : input.value;
2407− this.recv = function(timestep, changed, parentID) {
2408− var chng = changed && !pred(input.value);
2409− if (chng) { this.value = input.value; }
2410− send(this, timestep, chng);
2412− input.kids.push(this);
2414− var dropRepeats = function(input) {
2415− this.id = Guid.guid();
2416− this.value = input.value;
2418− this.recv = function(timestep, changed, parentID) {
2419− var chng = changed && !eq(this.value,input.value);
2420− if (chng) { this.value = input.value; }
2421− send(this, timestep, chng);
2423− input.kids.push(this);
2426− var dropWhen = function(s1) { return function(b) { return function(s2) {
2427− var pairs = new lift(function(x){return function(y){return [x,y];};},[s1,s2]);
2428− var dropped = new dropIf(function(p){return p[0];},[true,b],pairs);
2429− return new lift(function(p){return p[1];},[dropped]); }; };
2432− var sampleOn = function(s1,s2) {
2433− this.id = Guid.guid();
2434− this.value = s2.value;
2437− this.changed = false;
2439− this.recv = function(timestep, changed, parentID) {
2440− if (parentID === s1.id) this.changed = changed;
2442− if (this.count == 2) {
2443− if (this.changed) { this.value = s2.value; }
2444− send(this, timestep, this.changed);
2446− this.changed = false;
2449− s1.kids.push(this);
2450− s2.kids.push(this);
2454− constant : function(v) { return new input(v); },
2455− lift : function(f){return function(e){return new lift(f,[e]);};},
2456− lift2 : function(f) { return function(e1) { return function(e2) {
2457− return new lift(f, [e1,e2]); }; }; },
2458− lift3 : function(f) { return function(e1) { return function(e2) {
2459− return function(e3){return new lift(f,[e1,e2,e3]);};};};},
2460− lift4 : function(f) { return function(e1) { return function(e2) {
2461− return function(e3) { return function(e4) {
2462− return new lift(f, [e1,e2,e3,e4]); }; }; }; }; },
2463− foldp : function(f) { return function(b) { return function(e) {
2464− return new fold(f,b,false,e); }; }; },
2465− foldp_ : function(f) { return function(b) { return function(e) {
2466− return new fold(f,b,true,e); }; }; },
2467− foldp1 : function(f) { return function(e) {
2468− return new fold(f,function(x){return x;},true,e); }; },
2469− count : function(sig) {
2470− var incr = function(_){return function(c){return c+1;};};
2471− return new fold(incr,0,false,sig) },
2472− keepIf : function(pred) { return function(base) { return function(sig) {
2473− return new dropIf(function(x) { return !pred(x)},base,sig); }; }; },
2474− dropIf : function(pred) { return function(base) { return function(sig) {
2475− return new dropIf(pred,base,sig); }; }; },
2476− keepWhen : function(s) { return dropWhen(new lift(function(b){return !b;},[s])); },
2477− dropWhen : dropWhen,
2478− dropRepeats : function(s) { return new dropRepeats(s);},
2479− sampleOn : function(s1){return function(s2){return new sampleOn(s1,s2);};}
2482−var Dispatcher = function() {
2483− var program = null;
2486− var currentElement = null;
2488− var initialize = function() {
2489− program = Elm.main();
2490− if (!program.hasOwnProperty('recv')) {
2491− program = Elm.Signal.constant(program);
2494− currentElement = program.value;
2495− filterDeadInputs();
2497− var content = document.getElementById('content');
2498− content.appendChild(Render.render(currentElement));
2499− var w = document.getElementById('widthChecker').offsetWidth;
2500− if (w !== window.innerWidth) {
2501− Dispatcher.notify(Window.dimensions.id, Value.Tuple(w, window.innerHeight));
2503− program = Elm.Signal.lift(function(value) {
2504− var content = document.getElementById('content');
2505− Render.update(content.firstChild,currentElement,value);
2506− currentElement = value;
2510− var notify = function(id, v) {
2512− //console.log(timestep);
2513− var hasListener = false;
2514− for (var i = inputs.length; i--; ) {
2515− hasListener = inputs[i].recv(timestep, id, v) || hasListener;
2517− return hasListener;
2520− function isAlive(input) {
2521− if (!input.hasOwnProperty('defaultNumberOfKids')) return true;
2522− var len = input.kids.length;
2523− if (len == 0) return false;
2524− if (len > input.defaultNumberOfKids) return true;
2526− for (var i = len; i--; ) {
2527− alive = alive || isAlive(input.kids[i]);
2531− function filterDeadInputs() {
2533− for (var i = inputs.length; i--; ) {
2534− if (isAlive(inputs[i])) temp.push(inputs[i]);
2539− return {initialize:initialize, notify:notify, inputs:inputs};
2540−}();Elm.HTTP = function() {
2541− var JS = Elm.JavaScript;
2542− var toElmString = Elm.JavaScript.castJSStringToString;
2543− function request(verb) { return function(url) { return function(data) {
2544− return function(headers) {
2545− return {0 : "Request",
2547− verb : JS.castStringToJSString(verb),
2548− url : JS.castStringToJSString(url),
2549− data : data === null ? null : JS.castStringToJSString(data),
2550− headers : headers }; }; }; };
2552− function get(url) { return request("GET")(url)(null)(["Nil"]); }
2553− function post(url) { return function(data) {
2554− return request("POST")(url)(data)(["Nil"]); }; }
2556− function sendReq(responses) { return function(req) {
2557− Dispatcher.notify(responses.id,["Waiting"]);
2558− var request = null;
2559− if (window.XMLHttpRequest) {
2560− request = new XMLHttpRequest();
2561− } else if (window.ActiveXObject) {
2562− request = new ActiveXObject("Microsoft.XMLHTTP");
2564− request.onreadystatechange = function(e) {
2565− if (request.readyState === 4) {
2568− request.status === 200
2569− ? ["Success", toElmString(request.responseText)]
2570− : ["Failure", request.status, toElmString(request.statusText)]);
2573− request.open(req.verb, req.url, true);
2574− Elm.List.map(function(pair) {
2575− request.setRequestHeader(
2576− JS.castStringToJSString(pair[1]),
2577− JS.castStringToJSString(pair[2]));
2579− request.send(req.data);
2584− function send(requests) {
2585− var responses = Elm.Signal.constant(["Waiting"]);
2586− var sender = Elm.Signal.lift(sendReq(responses))(requests);
2587− function f(x) { return function(y) { return x; } }
2588− var combine = Elm.Signal.lift2(f)(responses)(sender);
2596− sendGet : function(urls){return send(Elm.Signal.lift(get)(urls));}
2600−Elm.Input = function() {
2601− var JS = Elm.JavaScript;
2602− var toElmString = Elm.JavaScript.castJSStringToString;
2603− var newTextInput = function(elem, ghostText) {
2604− elem.placeholder = JS.castStringToJSString(ghostText);
2605− var str = Elm.Signal.constant(["Nil"]);
2606− Value.addListener(elem, 'keyup', function(e) {
2607− Dispatcher.notify(str.id, toElmString(elem.value));
2610− elem.style.padding = "1px";
2611− return Value.Tuple(Value.wrap(elem), str);
2613− var newElement = function(name) {
2614− var e = document.createElement(name);
2615− e.style.padding = "0";
2616− e.style.margin = "0";
2619− var textArea = function(cols) { return function(rows) {
2620− var textarea = newElement('textarea');
2621− textarea.rows = rows;
2622− textarea.cols = cols;
2623− return newTextInput(textarea, "");
2626− var textField = function(ghostText) {
2627− var field = newElement('input');
2628− field.type = 'text';
2629− return newTextInput(field, ghostText);
2631− var password = function(ghostText) {
2632− var field = newElement('input');
2633− field.type = 'password';
2634− return newTextInput(field, ghostText);
2636− var checkbox = function(checked) {
2637− var box = newElement('input');
2638− box.type = 'checkbox';
2639− box.checked = checked;
2640− var status = Elm.Signal.constant(checked);
2641− Value.addListener(box, 'change', function(e) {
2642− Dispatcher.notify(status.id, box.checked);
2644− return Value.Tuple(Value.wrap(box), status);
2646− var dropDown = function(options) {
2647− var slct = newElement('select');
2649− while (options[0] === "Cons") {
2650− var opt = newElement('option');
2651− var str = Text.toText(options[1][1]);
2653− opt.innerHTML = str;
2654− slct.appendChild(opt);
2655− opts.push(options[1][2]);
2656− options = options[2];
2658− var status = Elm.Signal.constant(opts[0]);
2659− Value.addListener(slct, 'change', function(e) {
2660− Dispatcher.notify(status.id, opts[slct.selectedIndex]);
2662− return Value.Tuple(Value.wrap(slct), status);
2664− var stringDropDown = function(opts) {
2665− return dropDown(Elm.List.map (function(x) {return Value.Tuple(x,x);}) (opts));
2667− var button = function(name) {
2668− var b = newElement('input');
2670− b.value = JS.castStringToJSString(name);
2671− var press = Elm.Signal.constant(false);
2672− Value.addListener(b, 'click', function(e) {
2673− Dispatcher.notify(press.id, true);
2674− Dispatcher.notify(press.id, false);
2676− return Value.Tuple(Value.wrap(b),press);
2678− return {textArea:textArea, textField:textField,
2679− password:password, checkbox:checkbox,
2680− dropDown:dropDown, stringDropDown:stringDropDown,
2684−Elm.Keyboard = { Raw : function() {
2685− var keysDown = Elm.Signal.constant(["Nil"]);
2686− var charPressed = Elm.Signal.constant(["Nothing"]);
2687− function remove(x,xs) {
2688− if (xs[0] === "Nil") return xs;
2689− if (xs[1] === x) return xs[2];
2690− return ["Cons", xs[1], remove(x,xs[2])];
2692− function has(x,xs) {
2693− while (xs[0] !== "Nil") {
2694− if (xs[1] === x) return true;
2699− Value.addListener(document, 'keydown', function(e) {
2700− if (has(e.keyCode, keysDown.value)) return;
2701− var hasListener = Dispatcher.notify(keysDown.id, ["Cons", e.keyCode, keysDown.value]);
2703− this.removeEventListener('keydown',arguments.callee,false);
2705− Value.addListener(document, 'keyup', function(e) {
2706− var codes = remove(e.keyCode, keysDown.value);
2707− var hasListener = Dispatcher.notify(keysDown.id, codes);
2709− this.removeEventListener('keyup',arguments.callee,false);
2711− Value.addListener(window, 'blur', function(e) {
2712− var hasListener = Dispatcher.notify(keysDown.id, ["Nil"]);
2714− this.removeEventListener('blur',arguments.callee,false);
2716− Value.addListener(document, 'keypress', function(e) {
2717− var hasListener = Dispatcher.notify(charPressed.id, ["Just",e.charCode || e.keyCode]);
2718− Dispatcher.notify(charPressed.id, ["Nothing"]);
2720− this.removeEventListener('keypress',arguments.callee,false);
2722− return {keysDown:keysDown,
2723− charPressed:charPressed};
2726−Elm.Mouse = function() {
2727− var position = Elm.Signal.constant(Value.Tuple(0,0));
2728− position.defaultNumberOfKids = 2;
2730− var x = Elm.Signal.lift(function(p){return p[1];})(position);
2731− x.defaultNumberOfKids = 0;
2732− var y = Elm.Signal.lift(function(p){return p[2];})(position);
2733− y.defaultNumberOfKids = 0;
2735− var isDown = Elm.Signal.constant(false);
2736− var isClicked = Elm.Signal.constant(false);
2737− var clicks = Elm.Signal.constant(Value.Tuple());
2739− function getXY(e) {
2742− if (!e) var e = window.event;
2743− if (e.pageX || e.pageY) {
2746− } else if (e.clientX || e.clientY) {
2747− posx = e.clientX + document.body.scrollLeft +
2748− document.documentElement.scrollLeft;
2749− posy = e.clientY + document.body.scrollTop +
2750− document.documentElement.scrollTop;
2752− return Value.Tuple(posx, posy);
2755− Value.addListener(document, 'click', function(e) {
2756− var hasListener1 = Dispatcher.notify(isClicked.id, true);
2757− var hasListener2 = Dispatcher.notify(clicks.id, Value.Tuple());
2758− Dispatcher.notify(isClicked.id, false);
2759− if (!hasListener1 && !hasListener2)
2760− this.removeEventListener('click',arguments.callee,false);
2762− Value.addListener(document, 'mousedown', function(e) {
2763− var hasListener = Dispatcher.notify(isDown.id, true);
2765− this.removeEventListener('mousedown',arguments.callee,false);
2767− Value.addListener(document, 'mouseup', function(e) {
2768− var hasListener = Dispatcher.notify(isDown.id, false);
2770− this.removeEventListener('mouseup',arguments.callee,false);
2772− Value.addListener(document, 'mousemove', function(e) {
2773− var hasListener = Dispatcher.notify(position.id, getXY(e));
2775− this.removeEventListener('mousemove',arguments.callee,false);
2777− var clickedOn = function(elem) {
2778− var node = Render.render(elem);
2779− var click = Elm.Signal.constant(false);
2780− Value.addListener(node, 'click', function(e) {
2781− Dispatcher.notify(click.id, true);
2782− Dispatcher.notify(click.id, false);
2784− return Value.Tuple(Value.wrap(node), click);
2786− return {position: position,
2789− isClicked: isClicked,
2792− isClickedOn: clickedOn
2795−Elm.Random = function() {
2796− var inRange = function(min) { return function(max) {
2797− return Elm.Signal.constant(Math.floor(Math.random() * (max-min+1)) + min);
2800− var randomize = function(min) { return function(max) { return function(signal) {
2801− function f(x) { return Math.floor(Math.random() * (max-min+1)) + min; }
2802− return Elm.Signal.lift(f)(signal);
2806− return { inRange:inRange, randomize:randomize };
2807−}();Elm.Time = function() {
2808− var every = function(t) {
2810− var clock = Elm.Signal.constant(0);
2812− setInterval(function() {
2814− Dispatcher.notify(clock.id, time/1000);
2818− var after = function(t) {
2820− var thread = Elm.Signal.constant(false);
2821− setTimeout(function() { Dispatcher.notify(thread.id, true); }, t);
2824− var before = function(t) {
2826− var thread = Elm.Signal.constant(true);
2827− setTimeout(function() { Dispatcher.notify(thread.id, false); }, t);
2830− return {every:every,after:after,before:before};
2831−}();Elm.Window = function() {
2832− var dimensions = Elm.Signal.constant(Value.Tuple(window.innerWidth,
2833− window.innerHeight));
2834− dimensions.defaultNumberOfKids = 2;
2836− var width = Elm.Signal.lift(function(p){return p[1];})(dimensions);
2837− width.defaultNumberOfKids = 0;
2838− var height = Elm.Signal.lift(function(p){return p[2];})(dimensions);
2839− height.defaultNumberOfKids = 0;
2841− Value.addListener(window, 'resize', function(e) {
2842− var w = document.getElementById('widthChecker').offsetWidth;
2843− var hasListener = Dispatcher.notify(dimensions.id,
2844− Value.Tuple(w, window.innerHeight));
2846− this.removeEventListener('resize',arguments.callee,false);
2848− return {dimensions:dimensions,width:width,height:height};
2851−Value.addListener(document, 'elm_log', function(e) { console.log(e.value); });
2852−Value.addListener(document, 'elm_title', function(e) {document.title = e.value;});
2853−Value.addListener(document, 'elm_redirect', function(e) {
2854− if (e.value.length > 0) { window.location = e.value; }
2857−var Elm = Elm || {};
2858−Elm.Prelude = function() {
2859− var mod = function(x) { return function(y) {
2861− var m = x==0 ? 0 : (y>0 ? (x>=0 ? r : r+y) : -mod(-x)(-y));
2862− return m == y ? 0 : m;
2865− var min = function(x) { return function(y) { return Math.min(x,y); }; };
2866− var max = function(x) { return function(y) { return Math.max(x,y); }; };
2868− var flip=function(f){return function(x){return function(y){return f(y)(x);};};};
2869− var clamp = function(lo) { return function(hi) {
2870− return function(x) { return Math.min(hi, Math.max(lo, x)); };
2873− var curry = function(f) { return function(x) { return function(y) {
2874− return f(["Tuple2",x,y]); }; };
2876− var uncurry = function(f) { return function(p) {
2877− if (p[0] !== "Tuple2") {
2878− throw "Function was uncurry'd but was not given a pair.";
2880− return f(p[1])(p[2]); };
2883− var logBase=function(b){return function(x){return Math.log(x)/Math.log(b);};};
2885− return {eq : Value.eq,
2886− id : function(x) { return x; },
2887− not : function(b) { return !b; },
2888− fst : function(p) { return p[1]; },
2889− snd : function(p) { return p[2]; },
2890− rem : function(x) { return function(y) { return x % y; }; },
2891− div : function(x) { return function(y) { return ~~(x / y); }; },
2892− compare : function(x) { return function (y) {
2893− x = (typeof x === "object") ? toText(x) : x;
2894− y = (typeof y === "object") ? toText(y) : y;
2895− return [ x === y ? 'EQ' : (x < y ? 'LT' : 'GT') ];
2898− toFloat : function(x) { return x; },
2899− round : function(n) { return Math.round(n); },
2900− floor : function(n) { return Math.floor(n); },
2901− ceiling : function(n) { return Math.ceil(n); },
2902− truncate : function(n) { return ~~n; },
2913− atan2 : function(y) { return function(x) { return Math.atan2(y,x); }; },
2922− Just : Elm.Maybe.Just,
2923− Nothing : Elm.Maybe.Nothing,
2924− maybe : Elm.Maybe.maybe,
2925− map : Elm.List.map,
2926− filter : Elm.List.filter,
2927− head : Elm.List.head,
2928− tail : Elm.List.tail,
2929− last : Elm.List.last,
2930− length : Elm.List.length,
2931− reverse : Elm.List.reverse,
2932− foldr : Elm.List.foldr,
2933− foldr1 : Elm.List.foldr1,
2934− foldl : Elm.List.foldl,
2935− foldl1 : Elm.List.foldl1,
2936− and : Elm.List.and,
2938− all : Elm.List.all,
2939− any : Elm.List.any,
2940− sum : Elm.List.sum,
2941− product : Elm.List.product,
2942− concat : Elm.List.concat,
2943− concatMap : Elm.List.concatMap,
2944− maximum : Elm.List.maximum,
2945− minimum : Elm.List.minimum,
2946− scanl : Elm.List.scanl,
2947− scanl1 : Elm.List.scanl1,
2948− take : Elm.List.take,
2949− drop : Elm.List.drop,
2950− zip : Elm.List.zip,
2951− unzip : Elm.List.unzip,
2952− lift : Elm.Signal.lift,
2953− lift2 : Elm.Signal.lift2,
2954− lift3 : Elm.Signal.lift3,
2955− lift4 : Elm.Signal.lift4,
2956− foldp : Elm.Signal.foldp,
2957− foldp1 : Elm.Signal.foldp1,
2958− foldp_ : Elm.Signal.foldp_,
2959− constant : Elm.Signal.constant,
2960− count : Elm.Signal.count,
2961− keepIf : Elm.Signal.keepIf,
2962− dropIf : Elm.Signal.dropIf,
2963− keepWhen : Elm.Signal.keepWhen,
2964− dropWhen : Elm.Signal.dropWhen,
2965− dropRepeats : Elm.Signal.dropRepeats,
2966− sampleOn : Elm.Signal.sampleOn
2972− var include = function(library) {
2973− for (var i in library) {
2974− Elm.Prelude[i] = library[i];
2977− include (Elm.Graphics.Color);
2978− include (Elm.Graphics.Text);
2979− include (Elm.Graphics.Element);
2984−try{if(Elm.Automaton)throw "Module name collision, 'Automaton' is already defined.";Elm.Automaton=function(){try{if(!(Elm.Prelude instanceof Object))throw 'module not found'}catch(e){throw "Module 'Prelude' is missing. Compile with --make flag or load missing module in a separate JavaScript file."};var hiddenVars=[];for(var i in Elm.Prelude){if(hiddenVars.indexOf(i)>=0)continue;this[i]=Elm.Prelude[i]};try{if(!(Elm.Data.List instanceof Object))throw 'module not found'}catch(e){throw "Module 'Data.List' is missing. Compile with --make flag or load missing module in a separate JavaScript file."};var unzip=Elm.Data.List.unzip
2985−function Automaton_0(a1){return ["Automaton",a1]};var Listen_9=["Listen"],Ignore_10=["Ignore"]
2986−function DragFrom_11(a1){return ["DragFrom",a1]};var count_8=init_6(0)(function(__75){return function(c_76){return(1+c_76)}})
2987−function run_1(Automaton$m0_15){return function(input_16){return function(){switch(Automaton$m0_15[0]){case"Automaton":return lift(fst)(foldp_(function(a_18){return function(Tuple2$bAutomaton$m_19){return function(){switch(Tuple2$bAutomaton$m_19[0]){case"Tuple2":switch(Tuple2$bAutomaton$m_19[2][0]){case"Automaton":return Tuple2$bAutomaton$m_19[2][1](a_18)};break};throw "Non-exhaustive pattern match in case"}()}})(Automaton$m0_15[1])(input_16))};throw "Non-exhaustive pattern match in case"}()}}
2988−function step_2(a_22){return function(Automaton$m_23){return function(){switch(Automaton$m_23[0]){case"Automaton":return Automaton$m_23[1](a_22)};throw "Non-exhaustive pattern match in case"}()}}
2989−function composeAuto_3(a1_25){return function(a2_26){return function(){var Automaton$m1_27=a1_25,m1_28=function(){switch(Automaton$m1_27[0]){case"Automaton":return Automaton$m1_27[1]};throw "Non-exhaustive pattern match in case"}(),Automaton$m2_29=a2_26,m2_30=function(){switch(Automaton$m2_29[0]){case"Automaton":return Automaton$m2_29[1]};throw "Non-exhaustive pattern match in case"}();return Automaton_0(function(a_33){return function(){var Tuple2$bm1__34=m1_28(a_33),b_35=function(){switch(Tuple2$bm1__34[0]){case"Tuple2":return Tuple2$bm1__34[1]};throw "Non-exhaustive pattern match in case"}(),m1__36=function(){switch(Tuple2$bm1__34[0]){case"Tuple2":return Tuple2$bm1__34[2]};throw "Non-exhaustive pattern match in case"}();return function(){var Tuple2$cm2__41=m2_30(b_35),c_42=function(){switch(Tuple2$cm2__41[0]){case"Tuple2":return Tuple2$cm2__41[1]};throw "Non-exhaustive pattern match in case"}(),m2__43=function(){switch(Tuple2$cm2__41[0]){case"Tuple2":return Tuple2$cm2__41[2]};throw "Non-exhaustive pattern match in case"}();return ["Tuple2",c_42,composeAuto_3(m1__36)(m2__43)]}()}()})}()}}
2990−function combine_4(autos_48){return Automaton_0(function(a_49){return function(){var Tuple2$bsautos__50=unzip(map(function(Automaton$m_53){return function(){switch(Automaton$m_53[0]){case"Automaton":return Automaton$m_53[1](a_49)};throw "Non-exhaustive pattern match in case"}()})(autos_48)),bs_51=function(){switch(Tuple2$bsautos__50[0]){case"Tuple2":return Tuple2$bsautos__50[1]};throw "Non-exhaustive pattern match in case"}(),autos__52=function(){switch(Tuple2$bsautos__50[0]){case"Tuple2":return Tuple2$bsautos__50[2]};throw "Non-exhaustive pattern match in case"}();return ["Tuple2",bs_51,combine_4(autos__52)]}()})}
2991−function pure_5(f_59){return Automaton_0(function(x_60){return ["Tuple2",f_59(x_60),pure_5(f_59)]})}
2992−function init_6(s_61){return function(step_62){return Automaton_0(function(a_63){return function(){var s__64=step_62(a_63)(s_61);return ["Tuple2",s__64,init_6(s__64)(step_62)]}()})}}
2993−function init__7(s_65){return function(step_66){return Automaton_0(function(a_67){return function(){var Tuple2$bs__68=step_66(a_67)(s_65),b_69=function(){switch(Tuple2$bs__68[0]){case"Tuple2":return Tuple2$bs__68[1]};throw "Non-exhaustive pattern match in case"}(),s__70=function(){switch(Tuple2$bs__68[0]){case"Tuple2":return Tuple2$bs__68[2]};throw "Non-exhaustive pattern match in case"}();return ["Tuple2",b_69,init__7(s__70)(step_66)]}()})}}
2994−function vecSub_12(Tuple2$x1y1_77){return function(Tuple2$x2y2_78){return function(){switch(Tuple2$x1y1_77[0]){case"Tuple2":return function(){switch(Tuple2$x2y2_78[0]){case"Tuple2":return ["Tuple2",(Tuple2$x1y1_77[1]-Tuple2$x2y2_78[1]),(Tuple2$x1y1_77[2]-Tuple2$x2y2_78[2])]};throw "Non-exhaustive pattern match in case"}()};throw "Non-exhaustive pattern match in case"}()}}
2995−function stepDrag_13(Tuple2$presspos_83){return function(Tuple2$dsform_84){return function(){switch(Tuple2$presspos_83[0]){case"Tuple2":return function(){switch(Tuple2$dsform_84[0]){case"Tuple2":return function(){function wrap_89(ds__90){return ["Tuple2",Tuple2$dsform_84[2],["Tuple2",ds__90,Tuple2$dsform_84[2]]]};return function(){switch(Tuple2$dsform_84[1][0]){case"DragFrom":return(Tuple2$presspos_83[1]?["Tuple2",uncurry(move)(vecSub_12(Tuple2$presspos_83[2])(Tuple2$dsform_84[1][1]))(Tuple2$dsform_84[2]),["Tuple2",DragFrom_11(Tuple2$dsform_84[1][1]),Tuple2$dsform_84[2]]]:function(){var form__92=uncurry(move)(vecSub_12(Tuple2$presspos_83[2])(Tuple2$dsform_84[1][1]))(Tuple2$dsform_84[2]);return ["Tuple2",form__92,["Tuple2",Listen_9,form__92]]}());case"Ignore":return wrap_89((Tuple2$presspos_83[1]?Ignore_10:Listen_9));case"Listen":return wrap_89((not(Tuple2$presspos_83[1])?Listen_9:(isWithin(Tuple2$presspos_83[2])(Tuple2$dsform_84[2])?DragFrom_11(Tuple2$presspos_83[2]):Ignore_10)))};throw "Non-exhaustive pattern match in case"}()}()};throw "Non-exhaustive pattern match in case"}()};throw "Non-exhaustive pattern match in case"}()}}
2996−function dragForm_14(form_93){return init__7(["Tuple2",Listen_9,form_93])(stepDrag_13)};return {Automaton:Automaton_0,run:run_1,step:step_2,composeAuto:composeAuto_3,combine:combine_4,pure:pure_5,init:init_6,init_:init__7,count:count_8,Listen:Listen_9,Ignore:Ignore_10,DragFrom:DragFrom_11,vecSub:vecSub_12,stepDrag:stepDrag_13,dragForm:dragForm_14}}();Elm.main=function(){return Elm.Automaton.main}}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 Automaton module:<br/>'+e+'<br/><br/>The problem may stem from an improper usage of:<br/>fst, unzip</span>');document.body.innerHTML=Text.monospace(msg);throw e}}