@@ -0,0 +1,5251 @@
1+<!DOCTYPE html>
2+<html>
3+<head>
4+<meta charset="UTF-8">
5+<meta name="viewport" content="width=device-width, initial-scale=1">
6+<title>LynxJS-Elm</title>
7+<style>
8+*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
9+body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; }
10+</style>
11+</head>
12+<body>
13+<script>
14+
15+// LynxJS PAPI-to-DOM polyfill for browser preview
16+(function() {
17+ var eventMap = {
18+ 'tap': 'click',
19+ 'longpress': 'contextmenu',
20+ 'touchstart': 'touchstart',
21+ 'touchmove': 'touchmove',
22+ 'touchend': 'touchend',
23+ 'touchcancel': 'touchcancel',
24+ 'input': 'input'
25+ };
26+
27+ var g = typeof globalThis !== 'undefined' ? globalThis : window;
28+
29+ function makeEl(domTag, lynxTag) {
30+ var el = document.createElement(domTag);
31+ el.setAttribute('data-lynx-tag', lynxTag);
32+ return el;
33+ }
34+
35+ g.__CreatePage = function() {
36+ var page = document.createElement('div');
37+ page.id = 'lynx-page';
38+ document.body.appendChild(page);
39+ return page;
40+ };
41+
42+ g.__CreateView = function() { return makeEl('div', 'view'); };
43+ g.__CreateText = function() { return makeEl('span', 'text'); };
44+ g.__CreateImage = function() { return makeEl('img', 'image'); };
45+
46+ g.__CreateRawText = function(text) {
47+ var el = document.createElement('span');
48+ el.setAttribute('data-lynx-tag', 'raw-text');
49+ el.textContent = text;
50+ return el;
51+ };
52+
53+ g.__AppendElement = function(parent, child) {
54+ parent.appendChild(child);
55+ };
56+
57+ g.__RemoveElement = function(parent, child) {
58+ parent.removeChild(child);
59+ };
60+
61+ g.__ReplaceElement = function(parent, newEl, oldEl) {
62+ parent.replaceChild(newEl, oldEl);
63+ };
64+
65+ g.__InsertElementBefore = function(parent, child, ref) {
66+ parent.insertBefore(child, ref);
67+ };
68+
69+ g.__SetAttribute = function(el, key, value) {
70+ if (key === 'text') {
71+ el.textContent = value;
72+ } else if (key === 'src' && el.tagName === 'IMG') {
73+ el.src = value;
74+ } else {
75+ el.setAttribute(key, value);
76+ }
77+ };
78+
79+ g.__AddEvent = function(el, bindingName, eventName, handler) {
80+ var domEvent = eventMap[eventName] || eventName;
81+ var fn = typeof handler === 'function' ? handler : handler.value;
82+ el.addEventListener(domEvent, function(e) { fn(e); });
83+ };
84+
85+ g.__SetInlineStyles = function(el, styles) {
86+ Object.assign(el.style, styles);
87+ };
88+
89+ g.__GetChildren = function(el) {
90+ return Array.from(el.children);
91+ };
92+
93+ g.__GetParent = function(el) {
94+ return el.parentNode;
95+ };
96+
97+ g.__FlushElementTree = function() {};
98+
99+ // Set up root page so _Browser_newPage() finds it
100+ g.page = g.__CreatePage();
101+})();
102+
103+</script>
104+<script>
105+(function(scope){
106+'use strict';
107+
108+function F(arity, fun, wrapper) {
109+ wrapper.a = arity;
110+ wrapper.f = fun;
111+ return wrapper;
112+}
113+
114+function F2(fun) {
115+ return F(2, fun, function(a) { return function(b) { return fun(a,b); }; })
116+}
117+function F3(fun) {
118+ return F(3, fun, function(a) {
119+ return function(b) { return function(c) { return fun(a, b, c); }; };
120+ });
121+}
122+function F4(fun) {
123+ return F(4, fun, function(a) { return function(b) { return function(c) {
124+ return function(d) { return fun(a, b, c, d); }; }; };
125+ });
126+}
127+function F5(fun) {
128+ return F(5, fun, function(a) { return function(b) { return function(c) {
129+ return function(d) { return function(e) { return fun(a, b, c, d, e); }; }; }; };
130+ });
131+}
132+function F6(fun) {
133+ return F(6, fun, function(a) { return function(b) { return function(c) {
134+ return function(d) { return function(e) { return function(f) {
135+ return fun(a, b, c, d, e, f); }; }; }; }; };
136+ });
137+}
138+function F7(fun) {
139+ return F(7, fun, function(a) { return function(b) { return function(c) {
140+ return function(d) { return function(e) { return function(f) {
141+ return function(g) { return fun(a, b, c, d, e, f, g); }; }; }; }; }; };
142+ });
143+}
144+function F8(fun) {
145+ return F(8, fun, function(a) { return function(b) { return function(c) {
146+ return function(d) { return function(e) { return function(f) {
147+ return function(g) { return function(h) {
148+ return fun(a, b, c, d, e, f, g, h); }; }; }; }; }; }; };
149+ });
150+}
151+function F9(fun) {
152+ return F(9, fun, function(a) { return function(b) { return function(c) {
153+ return function(d) { return function(e) { return function(f) {
154+ return function(g) { return function(h) { return function(i) {
155+ return fun(a, b, c, d, e, f, g, h, i); }; }; }; }; }; }; }; };
156+ });
157+}
158+
159+function A2(fun, a, b) {
160+ return fun.a === 2 ? fun.f(a, b) : fun(a)(b);
161+}
162+function A3(fun, a, b, c) {
163+ return fun.a === 3 ? fun.f(a, b, c) : fun(a)(b)(c);
164+}
165+function A4(fun, a, b, c, d) {
166+ return fun.a === 4 ? fun.f(a, b, c, d) : fun(a)(b)(c)(d);
167+}
168+function A5(fun, a, b, c, d, e) {
169+ return fun.a === 5 ? fun.f(a, b, c, d, e) : fun(a)(b)(c)(d)(e);
170+}
171+function A6(fun, a, b, c, d, e, f) {
172+ return fun.a === 6 ? fun.f(a, b, c, d, e, f) : fun(a)(b)(c)(d)(e)(f);
173+}
174+function A7(fun, a, b, c, d, e, f, g) {
175+ return fun.a === 7 ? fun.f(a, b, c, d, e, f, g) : fun(a)(b)(c)(d)(e)(f)(g);
176+}
177+function A8(fun, a, b, c, d, e, f, g, h) {
178+ return fun.a === 8 ? fun.f(a, b, c, d, e, f, g, h) : fun(a)(b)(c)(d)(e)(f)(g)(h);
179+}
180+function A9(fun, a, b, c, d, e, f, g, h, i) {
181+ return fun.a === 9 ? fun.f(a, b, c, d, e, f, g, h, i) : fun(a)(b)(c)(d)(e)(f)(g)(h)(i);
182+}
183+
184+console.warn('Compiled in DEV mode. Follow the advice at https://elm-lang.org/0.19.1/optimize for better performance and smaller assets.');
185+
186+
187+var _JsArray_empty = [];
188+
189+function _JsArray_singleton(value)
190+{
191+ return [value];
192+}
193+
194+function _JsArray_length(array)
195+{
196+ return array.length;
197+}
198+
199+var _JsArray_initialize = F3(function(size, offset, func)
200+{
201+ var result = new Array(size);
202+
203+ for (var i = 0; i < size; i++)
204+ {
205+ result[i] = func(offset + i);
206+ }
207+
208+ return result;
209+});
210+
211+var _JsArray_initializeFromList = F2(function (max, ls)
212+{
213+ var result = new Array(max);
214+
215+ for (var i = 0; i < max && ls.b; i++)
216+ {
217+ result[i] = ls.a;
218+ ls = ls.b;
219+ }
220+
221+ result.length = i;
222+ return _Utils_Tuple2(result, ls);
223+});
224+
225+var _JsArray_unsafeGet = F2(function(index, array)
226+{
227+ return array[index];
228+});
229+
230+var _JsArray_unsafeSet = F3(function(index, value, array)
231+{
232+ var length = array.length;
233+ var result = new Array(length);
234+
235+ for (var i = 0; i < length; i++)
236+ {
237+ result[i] = array[i];
238+ }
239+
240+ result[index] = value;
241+ return result;
242+});
243+
244+var _JsArray_push = F2(function(value, array)
245+{
246+ var length = array.length;
247+ var result = new Array(length + 1);
248+
249+ for (var i = 0; i < length; i++)
250+ {
251+ result[i] = array[i];
252+ }
253+
254+ result[length] = value;
255+ return result;
256+});
257+
258+var _JsArray_foldl = F3(function(func, acc, array)
259+{
260+ var length = array.length;
261+
262+ for (var i = 0; i < length; i++)
263+ {
264+ acc = A2(func, array[i], acc);
265+ }
266+
267+ return acc;
268+});
269+
270+var _JsArray_foldr = F3(function(func, acc, array)
271+{
272+ for (var i = array.length - 1; i >= 0; i--)
273+ {
274+ acc = A2(func, array[i], acc);
275+ }
276+
277+ return acc;
278+});
279+
280+var _JsArray_map = F2(function(func, array)
281+{
282+ var length = array.length;
283+ var result = new Array(length);
284+
285+ for (var i = 0; i < length; i++)
286+ {
287+ result[i] = func(array[i]);
288+ }
289+
290+ return result;
291+});
292+
293+var _JsArray_indexedMap = F3(function(func, offset, array)
294+{
295+ var length = array.length;
296+ var result = new Array(length);
297+
298+ for (var i = 0; i < length; i++)
299+ {
300+ result[i] = A2(func, offset + i, array[i]);
301+ }
302+
303+ return result;
304+});
305+
306+var _JsArray_slice = F3(function(from, to, array)
307+{
308+ return array.slice(from, to);
309+});
310+
311+var _JsArray_appendN = F3(function(n, dest, source)
312+{
313+ var destLen = dest.length;
314+ var itemsToCopy = n - destLen;
315+
316+ if (itemsToCopy > source.length)
317+ {
318+ itemsToCopy = source.length;
319+ }
320+
321+ var size = destLen + itemsToCopy;
322+ var result = new Array(size);
323+
324+ for (var i = 0; i < destLen; i++)
325+ {
326+ result[i] = dest[i];
327+ }
328+
329+ for (var i = 0; i < itemsToCopy; i++)
330+ {
331+ result[i + destLen] = source[i];
332+ }
333+
334+ return result;
335+});
336+
337+
338+
339+// LOG
340+
341+
342+var _Debug_log = F2(function(tag, value)
343+{
344+ console.log(tag + ': ' + _Debug_toString(value));
345+ return value;
346+});
347+
348+
349+// TODOS
350+
351+function _Debug_todo(moduleName, region)
352+{
353+ return function(message) {
354+ _Debug_crash(8, moduleName, region, message);
355+ };
356+}
357+
358+function _Debug_todoCase(moduleName, region, value)
359+{
360+ return function(message) {
361+ _Debug_crash(9, moduleName, region, value, message);
362+ };
363+}
364+
365+
366+// TO STRING
367+
368+
369+function _Debug_toString(value)
370+{
371+ return _Debug_toAnsiString(false, value);
372+}
373+
374+function _Debug_toAnsiString(ansi, value)
375+{
376+ if (typeof value === 'function')
377+ {
378+ return _Debug_internalColor(ansi, '<function>');
379+ }
380+
381+ if (typeof value === 'boolean')
382+ {
383+ return _Debug_ctorColor(ansi, value ? 'True' : 'False');
384+ }
385+
386+ if (typeof value === 'number')
387+ {
388+ return _Debug_numberColor(ansi, value + '');
389+ }
390+
391+ if (value instanceof String)
392+ {
393+ return _Debug_charColor(ansi, "'" + _Debug_addSlashes(value, true) + "'");
394+ }
395+
396+ if (typeof value === 'string')
397+ {
398+ return _Debug_stringColor(ansi, '"' + _Debug_addSlashes(value, false) + '"');
399+ }
400+
401+ if (typeof value === 'object' && '$' in value)
402+ {
403+ var tag = value.$;
404+
405+ if (typeof tag === 'number')
406+ {
407+ return _Debug_internalColor(ansi, '<internals>');
408+ }
409+
410+ if (tag[0] === '#')
411+ {
412+ var output = [];
413+ for (var k in value)
414+ {
415+ if (k === '$') continue;
416+ output.push(_Debug_toAnsiString(ansi, value[k]));
417+ }
418+ return '(' + output.join(',') + ')';
419+ }
420+
421+ if (tag === 'Set_elm_builtin')
422+ {
423+ return _Debug_ctorColor(ansi, 'Set')
424+ + _Debug_fadeColor(ansi, '.fromList') + ' '
425+ + _Debug_toAnsiString(ansi, $elm$core$Set$toList(value));
426+ }
427+
428+ if (tag === 'RBNode_elm_builtin' || tag === 'RBEmpty_elm_builtin')
429+ {
430+ return _Debug_ctorColor(ansi, 'Dict')
431+ + _Debug_fadeColor(ansi, '.fromList') + ' '
432+ + _Debug_toAnsiString(ansi, $elm$core$Dict$toList(value));
433+ }
434+
435+ if (tag === 'Array_elm_builtin')
436+ {
437+ return _Debug_ctorColor(ansi, 'Array')
438+ + _Debug_fadeColor(ansi, '.fromList') + ' '
439+ + _Debug_toAnsiString(ansi, $elm$core$Array$toList(value));
440+ }
441+
442+ if (tag === '::' || tag === '[]')
443+ {
444+ var output = '[';
445+
446+ value.b && (output += _Debug_toAnsiString(ansi, value.a), value = value.b)
447+
448+ for (; value.b; value = value.b) // WHILE_CONS
449+ {
450+ output += ',' + _Debug_toAnsiString(ansi, value.a);
451+ }
452+ return output + ']';
453+ }
454+
455+ var output = '';
456+ for (var i in value)
457+ {
458+ if (i === '$') continue;
459+ var str = _Debug_toAnsiString(ansi, value[i]);
460+ var c0 = str[0];
461+ var parenless = c0 === '{' || c0 === '(' || c0 === '[' || c0 === '<' || c0 === '"' || str.indexOf(' ') < 0;
462+ output += ' ' + (parenless ? str : '(' + str + ')');
463+ }
464+ return _Debug_ctorColor(ansi, tag) + output;
465+ }
466+
467+ if (typeof DataView === 'function' && value instanceof DataView)
468+ {
469+ return _Debug_stringColor(ansi, '<' + value.byteLength + ' bytes>');
470+ }
471+
472+ if (typeof File !== 'undefined' && value instanceof File)
473+ {
474+ return _Debug_internalColor(ansi, '<' + value.name + '>');
475+ }
476+
477+ if (typeof value === 'object')
478+ {
479+ var output = [];
480+ for (var key in value)
481+ {
482+ var field = key[0] === '_' ? key.slice(1) : key;
483+ output.push(_Debug_fadeColor(ansi, field) + ' = ' + _Debug_toAnsiString(ansi, value[key]));
484+ }
485+ if (output.length === 0)
486+ {
487+ return '{}';
488+ }
489+ return '{ ' + output.join(', ') + ' }';
490+ }
491+
492+ return _Debug_internalColor(ansi, '<internals>');
493+}
494+
495+function _Debug_addSlashes(str, isChar)
496+{
497+ var s = str
498+ .replace(/\\/g, '\\\\')
499+ .replace(/\n/g, '\\n')
500+ .replace(/\t/g, '\\t')
501+ .replace(/\r/g, '\\r')
502+ .replace(/\v/g, '\\v')
503+ .replace(/\0/g, '\\0');
504+
505+ if (isChar)
506+ {
507+ return s.replace(/\'/g, '\\\'');
508+ }
509+ else
510+ {
511+ return s.replace(/\"/g, '\\"');
512+ }
513+}
514+
515+function _Debug_ctorColor(ansi, string)
516+{
517+ return ansi ? '\x1b[96m' + string + '\x1b[0m' : string;
518+}
519+
520+function _Debug_numberColor(ansi, string)
521+{
522+ return ansi ? '\x1b[95m' + string + '\x1b[0m' : string;
523+}
524+
525+function _Debug_stringColor(ansi, string)
526+{
527+ return ansi ? '\x1b[93m' + string + '\x1b[0m' : string;
528+}
529+
530+function _Debug_charColor(ansi, string)
531+{
532+ return ansi ? '\x1b[92m' + string + '\x1b[0m' : string;
533+}
534+
535+function _Debug_fadeColor(ansi, string)
536+{
537+ return ansi ? '\x1b[37m' + string + '\x1b[0m' : string;
538+}
539+
540+function _Debug_internalColor(ansi, string)
541+{
542+ return ansi ? '\x1b[36m' + string + '\x1b[0m' : string;
543+}
544+
545+function _Debug_toHexDigit(n)
546+{
547+ return String.fromCharCode(n < 10 ? 48 + n : 55 + n);
548+}
549+
550+
551+// CRASH
552+
553+
554+
555+
556+function _Debug_crash(identifier, fact1, fact2, fact3, fact4)
557+{
558+ switch(identifier)
559+ {
560+ case 0:
561+ throw new Error('What node should I take over? In JavaScript I need something like:\n\n Elm.Main.init({\n node: document.getElementById("elm-node")\n })\n\nYou need to do this with any Browser.sandbox or Browser.element program.');
562+
563+ case 1:
564+ throw new Error('Browser.application programs cannot handle URLs like this:\n\n ' + document.location.href + '\n\nWhat is the root? The root of your file system? Try looking at this program with `elm reactor` or some other server.');
565+
566+ case 2:
567+ var jsonErrorString = fact1;
568+ throw new Error('Problem with the flags given to your Elm program on initialization.\n\n' + jsonErrorString);
569+
570+ case 3:
571+ var portName = fact1;
572+ throw new Error('There can only be one port named `' + portName + '`, but your program has multiple.');
573+
574+ case 4:
575+ var portName = fact1;
576+ var problem = fact2;
577+ throw new Error('Trying to send an unexpected type of value through port `' + portName + '`:\n' + problem);
578+
579+ case 5:
580+ throw new Error('Trying to use `(==)` on functions.\nThere is no way to know if functions are "the same" in the Elm sense.\nRead more about this at https://package.elm-lang.org/packages/elm/core/latest/Basics#== which describes why it is this way and what the better version will look like.');
581+
582+ case 6:
583+ var moduleName = fact1;
584+ throw new Error('Your page is loading multiple Elm scripts with a module named ' + moduleName + '. Maybe a duplicate script is getting loaded accidentally? If not, rename one of them so I know which is which!');
585+
586+ case 8:
587+ var moduleName = fact1;
588+ var region = fact2;
589+ var message = fact3;
590+ throw new Error('TODO in module `' + moduleName + '` ' + _Debug_regionToString(region) + '\n\n' + message);
591+
592+ case 9:
593+ var moduleName = fact1;
594+ var region = fact2;
595+ var value = fact3;
596+ var message = fact4;
597+ throw new Error(
598+ 'TODO in module `' + moduleName + '` from the `case` expression '
599+ + _Debug_regionToString(region) + '\n\nIt received the following value:\n\n '
600+ + _Debug_toString(value).replace('\n', '\n ')
601+ + '\n\nBut the branch that handles it says:\n\n ' + message.replace('\n', '\n ')
602+ );
603+
604+ case 10:
605+ throw new Error('Bug in https://github.com/elm/virtual-dom/issues');
606+
607+ case 11:
608+ throw new Error('Cannot perform mod 0. Division by zero error.');
609+ }
610+}
611+
612+function _Debug_regionToString(region)
613+{
614+ if (region.start.line === region.end.line)
615+ {
616+ return 'on line ' + region.start.line;
617+ }
618+ return 'on lines ' + region.start.line + ' through ' + region.end.line;
619+}
620+
621+
622+
623+// EQUALITY
624+
625+function _Utils_eq(x, y)
626+{
627+ for (
628+ var pair, stack = [], isEqual = _Utils_eqHelp(x, y, 0, stack);
629+ isEqual && (pair = stack.pop());
630+ isEqual = _Utils_eqHelp(pair.a, pair.b, 0, stack)
631+ )
632+ {}
633+
634+ return isEqual;
635+}
636+
637+function _Utils_eqHelp(x, y, depth, stack)
638+{
639+ if (x === y)
640+ {
641+ return true;
642+ }
643+
644+ if (typeof x !== 'object' || x === null || y === null)
645+ {
646+ typeof x === 'function' && _Debug_crash(5);
647+ return false;
648+ }
649+
650+ if (depth > 100)
651+ {
652+ stack.push(_Utils_Tuple2(x,y));
653+ return true;
654+ }
655+
656+ /**/
657+ if (x.$ === 'Set_elm_builtin')
658+ {
659+ x = $elm$core$Set$toList(x);
660+ y = $elm$core$Set$toList(y);
661+ }
662+ if (x.$ === 'RBNode_elm_builtin' || x.$ === 'RBEmpty_elm_builtin')
663+ {
664+ x = $elm$core$Dict$toList(x);
665+ y = $elm$core$Dict$toList(y);
666+ }
667+ //*/
668+
669+ /**_UNUSED/
670+ if (x.$ < 0)
671+ {
672+ x = $elm$core$Dict$toList(x);
673+ y = $elm$core$Dict$toList(y);
674+ }
675+ //*/
676+
677+ for (var key in x)
678+ {
679+ if (!_Utils_eqHelp(x[key], y[key], depth + 1, stack))
680+ {
681+ return false;
682+ }
683+ }
684+ return true;
685+}
686+
687+var _Utils_equal = F2(_Utils_eq);
688+var _Utils_notEqual = F2(function(a, b) { return !_Utils_eq(a,b); });
689+
690+
691+
692+// COMPARISONS
693+
694+// Code in Generate/JavaScript.hs, Basics.js, and List.js depends on
695+// the particular integer values assigned to LT, EQ, and GT.
696+
697+function _Utils_cmp(x, y, ord)
698+{
699+ if (typeof x !== 'object')
700+ {
701+ return x === y ? /*EQ*/ 0 : x < y ? /*LT*/ -1 : /*GT*/ 1;
702+ }
703+
704+ /**/
705+ if (x instanceof String)
706+ {
707+ var a = x.valueOf();
708+ var b = y.valueOf();
709+ return a === b ? 0 : a < b ? -1 : 1;
710+ }
711+ //*/
712+
713+ /**_UNUSED/
714+ if (typeof x.$ === 'undefined')
715+ //*/
716+ /**/
717+ if (x.$[0] === '#')
718+ //*/
719+ {
720+ return (ord = _Utils_cmp(x.a, y.a))
721+ ? ord
722+ : (ord = _Utils_cmp(x.b, y.b))
723+ ? ord
724+ : _Utils_cmp(x.c, y.c);
725+ }
726+
727+ // traverse conses until end of a list or a mismatch
728+ for (; x.b && y.b && !(ord = _Utils_cmp(x.a, y.a)); x = x.b, y = y.b) {} // WHILE_CONSES
729+ return ord || (x.b ? /*GT*/ 1 : y.b ? /*LT*/ -1 : /*EQ*/ 0);
730+}
731+
732+var _Utils_lt = F2(function(a, b) { return _Utils_cmp(a, b) < 0; });
733+var _Utils_le = F2(function(a, b) { return _Utils_cmp(a, b) < 1; });
734+var _Utils_gt = F2(function(a, b) { return _Utils_cmp(a, b) > 0; });
735+var _Utils_ge = F2(function(a, b) { return _Utils_cmp(a, b) >= 0; });
736+
737+var _Utils_compare = F2(function(x, y)
738+{
739+ var n = _Utils_cmp(x, y);
740+ return n < 0 ? $elm$core$Basics$LT : n ? $elm$core$Basics$GT : $elm$core$Basics$EQ;
741+});
742+
743+
744+// COMMON VALUES
745+
746+var _Utils_Tuple0 = { $: '#0' };
747+
748+function _Utils_Tuple2(a, b) { return { $: '#2', a: a, b: b }; }
749+
750+function _Utils_Tuple3(a, b, c) { return { $: '#3', a: a, b: b, c: c }; }
751+
752+function _Utils_chr(c) { return new String(c); }
753+
754+
755+// RECORDS
756+
757+function _Utils_update(oldRecord, updatedFields)
758+{
759+ var newRecord = {};
760+
761+ for (var key in oldRecord)
762+ {
763+ newRecord[key] = oldRecord[key];
764+ }
765+
766+ for (var key in updatedFields)
767+ {
768+ newRecord[key] = updatedFields[key];
769+ }
770+
771+ return newRecord;
772+}
773+
774+
775+// APPEND
776+
777+var _Utils_append = F2(_Utils_ap);
778+
779+function _Utils_ap(xs, ys)
780+{
781+ // append Strings
782+ if (typeof xs === 'string')
783+ {
784+ return xs + ys;
785+ }
786+
787+ // append Lists
788+ if (!xs.b)
789+ {
790+ return ys;
791+ }
792+ var root = _List_Cons(xs.a, ys);
793+ xs = xs.b
794+ for (var curr = root; xs.b; xs = xs.b) // WHILE_CONS
795+ {
796+ curr = curr.b = _List_Cons(xs.a, ys);
797+ }
798+ return root;
799+}
800+
801+
802+
803+var _List_Nil = { $: '[]' };
804+
805+function _List_Cons(hd, tl) { return { $: '::', a: hd, b: tl }; }
806+
807+
808+var _List_cons = F2(_List_Cons);
809+
810+function _List_fromArray(arr)
811+{
812+ var out = _List_Nil;
813+ for (var i = arr.length; i--; )
814+ {
815+ out = _List_Cons(arr[i], out);
816+ }
817+ return out;
818+}
819+
820+function _List_toArray(xs)
821+{
822+ for (var out = []; xs.b; xs = xs.b) // WHILE_CONS
823+ {
824+ out.push(xs.a);
825+ }
826+ return out;
827+}
828+
829+var _List_map2 = F3(function(f, xs, ys)
830+{
831+ for (var arr = []; xs.b && ys.b; xs = xs.b, ys = ys.b) // WHILE_CONSES
832+ {
833+ arr.push(A2(f, xs.a, ys.a));
834+ }
835+ return _List_fromArray(arr);
836+});
837+
838+var _List_map3 = F4(function(f, xs, ys, zs)
839+{
840+ for (var arr = []; xs.b && ys.b && zs.b; xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES
841+ {
842+ arr.push(A3(f, xs.a, ys.a, zs.a));
843+ }
844+ return _List_fromArray(arr);
845+});
846+
847+var _List_map4 = F5(function(f, ws, xs, ys, zs)
848+{
849+ for (var arr = []; ws.b && xs.b && ys.b && zs.b; ws = ws.b, xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES
850+ {
851+ arr.push(A4(f, ws.a, xs.a, ys.a, zs.a));
852+ }
853+ return _List_fromArray(arr);
854+});
855+
856+var _List_map5 = F6(function(f, vs, ws, xs, ys, zs)
857+{
858+ for (var arr = []; vs.b && ws.b && xs.b && ys.b && zs.b; vs = vs.b, ws = ws.b, xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES
859+ {
860+ arr.push(A5(f, vs.a, ws.a, xs.a, ys.a, zs.a));
861+ }
862+ return _List_fromArray(arr);
863+});
864+
865+var _List_sortBy = F2(function(f, xs)
866+{
867+ return _List_fromArray(_List_toArray(xs).sort(function(a, b) {
868+ return _Utils_cmp(f(a), f(b));
869+ }));
870+});
871+
872+var _List_sortWith = F2(function(f, xs)
873+{
874+ return _List_fromArray(_List_toArray(xs).sort(function(a, b) {
875+ var ord = A2(f, a, b);
876+ return ord === $elm$core$Basics$EQ ? 0 : ord === $elm$core$Basics$LT ? -1 : 1;
877+ }));
878+});
879+
880+
881+
882+// MATH
883+
884+var _Basics_add = F2(function(a, b) { return a + b; });
885+var _Basics_sub = F2(function(a, b) { return a - b; });
886+var _Basics_mul = F2(function(a, b) { return a * b; });
887+var _Basics_fdiv = F2(function(a, b) { return a / b; });
888+var _Basics_idiv = F2(function(a, b) { return (a / b) | 0; });
889+var _Basics_pow = F2(Math.pow);
890+
891+var _Basics_remainderBy = F2(function(b, a) { return a % b; });
892+
893+// https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/divmodnote-letter.pdf
894+var _Basics_modBy = F2(function(modulus, x)
895+{
896+ var answer = x % modulus;
897+ return modulus === 0
898+ ? _Debug_crash(11)
899+ :
900+ ((answer > 0 && modulus < 0) || (answer < 0 && modulus > 0))
901+ ? answer + modulus
902+ : answer;
903+});
904+
905+
906+// TRIGONOMETRY
907+
908+var _Basics_pi = Math.PI;
909+var _Basics_e = Math.E;
910+var _Basics_cos = Math.cos;
911+var _Basics_sin = Math.sin;
912+var _Basics_tan = Math.tan;
913+var _Basics_acos = Math.acos;
914+var _Basics_asin = Math.asin;
915+var _Basics_atan = Math.atan;
916+var _Basics_atan2 = F2(Math.atan2);
917+
918+
919+// MORE MATH
920+
921+function _Basics_toFloat(x) { return x; }
922+function _Basics_truncate(n) { return n | 0; }
923+function _Basics_isInfinite(n) { return n === Infinity || n === -Infinity; }
924+
925+var _Basics_ceiling = Math.ceil;
926+var _Basics_floor = Math.floor;
927+var _Basics_round = Math.round;
928+var _Basics_sqrt = Math.sqrt;
929+var _Basics_log = Math.log;
930+var _Basics_isNaN = isNaN;
931+
932+
933+// BOOLEANS
934+
935+function _Basics_not(bool) { return !bool; }
936+var _Basics_and = F2(function(a, b) { return a && b; });
937+var _Basics_or = F2(function(a, b) { return a || b; });
938+var _Basics_xor = F2(function(a, b) { return a !== b; });
939+
940+
941+
942+var _String_cons = F2(function(chr, str)
943+{
944+ return chr + str;
945+});
946+
947+function _String_uncons(string)
948+{
949+ var word = string.charCodeAt(0);
950+ return !isNaN(word)
951+ ? $elm$core$Maybe$Just(
952+ 0xD800 <= word && word <= 0xDBFF
953+ ? _Utils_Tuple2(_Utils_chr(string[0] + string[1]), string.slice(2))
954+ : _Utils_Tuple2(_Utils_chr(string[0]), string.slice(1))
955+ )
956+ : $elm$core$Maybe$Nothing;
957+}
958+
959+var _String_append = F2(function(a, b)
960+{
961+ return a + b;
962+});
963+
964+function _String_length(str)
965+{
966+ return str.length;
967+}
968+
969+var _String_map = F2(function(func, string)
970+{
971+ var len = string.length;
972+ var array = new Array(len);
973+ var i = 0;
974+ while (i < len)
975+ {
976+ var word = string.charCodeAt(i);
977+ if (0xD800 <= word && word <= 0xDBFF)
978+ {
979+ array[i] = func(_Utils_chr(string[i] + string[i+1]));
980+ i += 2;
981+ continue;
982+ }
983+ array[i] = func(_Utils_chr(string[i]));
984+ i++;
985+ }
986+ return array.join('');
987+});
988+
989+var _String_filter = F2(function(isGood, str)
990+{
991+ var arr = [];
992+ var len = str.length;
993+ var i = 0;
994+ while (i < len)
995+ {
996+ var char = str[i];
997+ var word = str.charCodeAt(i);
998+ i++;
999+ if (0xD800 <= word && word <= 0xDBFF)
1000+ {
1001+ char += str[i];
1002+ i++;
1003+ }
1004+
1005+ if (isGood(_Utils_chr(char)))
1006+ {
1007+ arr.push(char);
1008+ }
1009+ }
1010+ return arr.join('');
1011+});
1012+
1013+function _String_reverse(str)
1014+{
1015+ var len = str.length;
1016+ var arr = new Array(len);
1017+ var i = 0;
1018+ while (i < len)
1019+ {
1020+ var word = str.charCodeAt(i);
1021+ if (0xD800 <= word && word <= 0xDBFF)
1022+ {
1023+ arr[len - i] = str[i + 1];
1024+ i++;
1025+ arr[len - i] = str[i - 1];
1026+ i++;
1027+ }
1028+ else
1029+ {
1030+ arr[len - i] = str[i];
1031+ i++;
1032+ }
1033+ }
1034+ return arr.join('');
1035+}
1036+
1037+var _String_foldl = F3(function(func, state, string)
1038+{
1039+ var len = string.length;
1040+ var i = 0;
1041+ while (i < len)
1042+ {
1043+ var char = string[i];
1044+ var word = string.charCodeAt(i);
1045+ i++;
1046+ if (0xD800 <= word && word <= 0xDBFF)
1047+ {
1048+ char += string[i];
1049+ i++;
1050+ }
1051+ state = A2(func, _Utils_chr(char), state);
1052+ }
1053+ return state;
1054+});
1055+
1056+var _String_foldr = F3(function(func, state, string)
1057+{
1058+ var i = string.length;
1059+ while (i--)
1060+ {
1061+ var char = string[i];
1062+ var word = string.charCodeAt(i);
1063+ if (0xDC00 <= word && word <= 0xDFFF)
1064+ {
1065+ i--;
1066+ char = string[i] + char;
1067+ }
1068+ state = A2(func, _Utils_chr(char), state);
1069+ }
1070+ return state;
1071+});
1072+
1073+var _String_split = F2(function(sep, str)
1074+{
1075+ return str.split(sep);
1076+});
1077+
1078+var _String_join = F2(function(sep, strs)
1079+{
1080+ return strs.join(sep);
1081+});
1082+
1083+var _String_slice = F3(function(start, end, str) {
1084+ return str.slice(start, end);
1085+});
1086+
1087+function _String_trim(str)
1088+{
1089+ return str.trim();
1090+}
1091+
1092+function _String_trimLeft(str)
1093+{
1094+ return str.replace(/^\s+/, '');
1095+}
1096+
1097+function _String_trimRight(str)
1098+{
1099+ return str.replace(/\s+$/, '');
1100+}
1101+
1102+function _String_words(str)
1103+{
1104+ return _List_fromArray(str.trim().split(/\s+/g));
1105+}
1106+
1107+function _String_lines(str)
1108+{
1109+ return _List_fromArray(str.split(/\r\n|\r|\n/g));
1110+}
1111+
1112+function _String_toUpper(str)
1113+{
1114+ return str.toUpperCase();
1115+}
1116+
1117+function _String_toLower(str)
1118+{
1119+ return str.toLowerCase();
1120+}
1121+
1122+var _String_any = F2(function(isGood, string)
1123+{
1124+ var i = string.length;
1125+ while (i--)
1126+ {
1127+ var char = string[i];
1128+ var word = string.charCodeAt(i);
1129+ if (0xDC00 <= word && word <= 0xDFFF)
1130+ {
1131+ i--;
1132+ char = string[i] + char;
1133+ }
1134+ if (isGood(_Utils_chr(char)))
1135+ {
1136+ return true;
1137+ }
1138+ }
1139+ return false;
1140+});
1141+
1142+var _String_all = F2(function(isGood, string)
1143+{
1144+ var i = string.length;
1145+ while (i--)
1146+ {
1147+ var char = string[i];
1148+ var word = string.charCodeAt(i);
1149+ if (0xDC00 <= word && word <= 0xDFFF)
1150+ {
1151+ i--;
1152+ char = string[i] + char;
1153+ }
1154+ if (!isGood(_Utils_chr(char)))
1155+ {
1156+ return false;
1157+ }
1158+ }
1159+ return true;
1160+});
1161+
1162+var _String_contains = F2(function(sub, str)
1163+{
1164+ return str.indexOf(sub) > -1;
1165+});
1166+
1167+var _String_startsWith = F2(function(sub, str)
1168+{
1169+ return str.indexOf(sub) === 0;
1170+});
1171+
1172+var _String_endsWith = F2(function(sub, str)
1173+{
1174+ return str.length >= sub.length &&
1175+ str.lastIndexOf(sub) === str.length - sub.length;
1176+});
1177+
1178+var _String_indexes = F2(function(sub, str)
1179+{
1180+ var subLen = sub.length;
1181+
1182+ if (subLen < 1)
1183+ {
1184+ return _List_Nil;
1185+ }
1186+
1187+ var i = 0;
1188+ var is = [];
1189+
1190+ while ((i = str.indexOf(sub, i)) > -1)
1191+ {
1192+ is.push(i);
1193+ i = i + subLen;
1194+ }
1195+
1196+ return _List_fromArray(is);
1197+});
1198+
1199+
1200+// TO STRING
1201+
1202+function _String_fromNumber(number)
1203+{
1204+ return number + '';
1205+}
1206+
1207+
1208+// INT CONVERSIONS
1209+
1210+function _String_toInt(str)
1211+{
1212+ var total = 0;
1213+ var code0 = str.charCodeAt(0);
1214+ var start = code0 == 0x2B /* + */ || code0 == 0x2D /* - */ ? 1 : 0;
1215+
1216+ for (var i = start; i < str.length; ++i)
1217+ {
1218+ var code = str.charCodeAt(i);
1219+ if (code < 0x30 || 0x39 < code)
1220+ {
1221+ return $elm$core$Maybe$Nothing;
1222+ }
1223+ total = 10 * total + code - 0x30;
1224+ }
1225+
1226+ return i == start
1227+ ? $elm$core$Maybe$Nothing
1228+ : $elm$core$Maybe$Just(code0 == 0x2D ? -total : total);
1229+}
1230+
1231+
1232+// FLOAT CONVERSIONS
1233+
1234+function _String_toFloat(s)
1235+{
1236+ // check if it is a hex, octal, or binary number
1237+ if (s.length === 0 || /[\sxbo]/.test(s))
1238+ {
1239+ return $elm$core$Maybe$Nothing;
1240+ }
1241+ var n = +s;
1242+ // faster isNaN check
1243+ return n === n ? $elm$core$Maybe$Just(n) : $elm$core$Maybe$Nothing;
1244+}
1245+
1246+function _String_fromList(chars)
1247+{
1248+ return _List_toArray(chars).join('');
1249+}
1250+
1251+
1252+
1253+
1254+function _Char_toCode(char)
1255+{
1256+ var code = char.charCodeAt(0);
1257+ if (0xD800 <= code && code <= 0xDBFF)
1258+ {
1259+ return (code - 0xD800) * 0x400 + char.charCodeAt(1) - 0xDC00 + 0x10000
1260+ }
1261+ return code;
1262+}
1263+
1264+function _Char_fromCode(code)
1265+{
1266+ return _Utils_chr(
1267+ (code < 0 || 0x10FFFF < code)
1268+ ? '\uFFFD'
1269+ :
1270+ (code <= 0xFFFF)
1271+ ? String.fromCharCode(code)
1272+ :
1273+ (code -= 0x10000,
1274+ String.fromCharCode(Math.floor(code / 0x400) + 0xD800, code % 0x400 + 0xDC00)
1275+ )
1276+ );
1277+}
1278+
1279+function _Char_toUpper(char)
1280+{
1281+ return _Utils_chr(char.toUpperCase());
1282+}
1283+
1284+function _Char_toLower(char)
1285+{
1286+ return _Utils_chr(char.toLowerCase());
1287+}
1288+
1289+function _Char_toLocaleUpper(char)
1290+{
1291+ return _Utils_chr(char.toLocaleUpperCase());
1292+}
1293+
1294+function _Char_toLocaleLower(char)
1295+{
1296+ return _Utils_chr(char.toLocaleLowerCase());
1297+}
1298+
1299+
1300+
1301+/**/
1302+function _Json_errorToString(error)
1303+{
1304+ return $elm$json$Json$Decode$errorToString(error);
1305+}
1306+//*/
1307+
1308+
1309+// CORE DECODERS
1310+
1311+function _Json_succeed(msg)
1312+{
1313+ return {
1314+ $: 0,
1315+ a: msg
1316+ };
1317+}
1318+
1319+function _Json_fail(msg)
1320+{
1321+ return {
1322+ $: 1,
1323+ a: msg
1324+ };
1325+}
1326+
1327+function _Json_decodePrim(decoder)
1328+{
1329+ return { $: 2, b: decoder };
1330+}
1331+
1332+var _Json_decodeInt = _Json_decodePrim(function(value) {
1333+ return (typeof value !== 'number')
1334+ ? _Json_expecting('an INT', value)
1335+ :
1336+ (-2147483647 < value && value < 2147483647 && (value | 0) === value)
1337+ ? $elm$core$Result$Ok(value)
1338+ :
1339+ (isFinite(value) && !(value % 1))
1340+ ? $elm$core$Result$Ok(value)
1341+ : _Json_expecting('an INT', value);
1342+});
1343+
1344+var _Json_decodeBool = _Json_decodePrim(function(value) {
1345+ return (typeof value === 'boolean')
1346+ ? $elm$core$Result$Ok(value)
1347+ : _Json_expecting('a BOOL', value);
1348+});
1349+
1350+var _Json_decodeFloat = _Json_decodePrim(function(value) {
1351+ return (typeof value === 'number')
1352+ ? $elm$core$Result$Ok(value)
1353+ : _Json_expecting('a FLOAT', value);
1354+});
1355+
1356+var _Json_decodeValue = _Json_decodePrim(function(value) {
1357+ return $elm$core$Result$Ok(_Json_wrap(value));
1358+});
1359+
1360+var _Json_decodeString = _Json_decodePrim(function(value) {
1361+ return (typeof value === 'string')
1362+ ? $elm$core$Result$Ok(value)
1363+ : (value instanceof String)
1364+ ? $elm$core$Result$Ok(value + '')
1365+ : _Json_expecting('a STRING', value);
1366+});
1367+
1368+function _Json_decodeList(decoder) { return { $: 3, b: decoder }; }
1369+function _Json_decodeArray(decoder) { return { $: 4, b: decoder }; }
1370+
1371+function _Json_decodeNull(value) { return { $: 5, c: value }; }
1372+
1373+var _Json_decodeField = F2(function(field, decoder)
1374+{
1375+ return {
1376+ $: 6,
1377+ d: field,
1378+ b: decoder
1379+ };
1380+});
1381+
1382+var _Json_decodeIndex = F2(function(index, decoder)
1383+{
1384+ return {
1385+ $: 7,
1386+ e: index,
1387+ b: decoder
1388+ };
1389+});
1390+
1391+function _Json_decodeKeyValuePairs(decoder)
1392+{
1393+ return {
1394+ $: 8,
1395+ b: decoder
1396+ };
1397+}
1398+
1399+function _Json_mapMany(f, decoders)
1400+{
1401+ return {
1402+ $: 9,
1403+ f: f,
1404+ g: decoders
1405+ };
1406+}
1407+
1408+var _Json_andThen = F2(function(callback, decoder)
1409+{
1410+ return {
1411+ $: 10,
1412+ b: decoder,
1413+ h: callback
1414+ };
1415+});
1416+
1417+function _Json_oneOf(decoders)
1418+{
1419+ return {
1420+ $: 11,
1421+ g: decoders
1422+ };
1423+}
1424+
1425+
1426+// DECODING OBJECTS
1427+
1428+var _Json_map1 = F2(function(f, d1)
1429+{
1430+ return _Json_mapMany(f, [d1]);
1431+});
1432+
1433+var _Json_map2 = F3(function(f, d1, d2)
1434+{
1435+ return _Json_mapMany(f, [d1, d2]);
1436+});
1437+
1438+var _Json_map3 = F4(function(f, d1, d2, d3)
1439+{
1440+ return _Json_mapMany(f, [d1, d2, d3]);
1441+});
1442+
1443+var _Json_map4 = F5(function(f, d1, d2, d3, d4)
1444+{
1445+ return _Json_mapMany(f, [d1, d2, d3, d4]);
1446+});
1447+
1448+var _Json_map5 = F6(function(f, d1, d2, d3, d4, d5)
1449+{
1450+ return _Json_mapMany(f, [d1, d2, d3, d4, d5]);
1451+});
1452+
1453+var _Json_map6 = F7(function(f, d1, d2, d3, d4, d5, d6)
1454+{
1455+ return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6]);
1456+});
1457+
1458+var _Json_map7 = F8(function(f, d1, d2, d3, d4, d5, d6, d7)
1459+{
1460+ return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6, d7]);
1461+});
1462+
1463+var _Json_map8 = F9(function(f, d1, d2, d3, d4, d5, d6, d7, d8)
1464+{
1465+ return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6, d7, d8]);
1466+});
1467+
1468+
1469+// DECODE
1470+
1471+var _Json_runOnString = F2(function(decoder, string)
1472+{
1473+ try
1474+ {
1475+ var value = JSON.parse(string);
1476+ return _Json_runHelp(decoder, value);
1477+ }
1478+ catch (e)
1479+ {
1480+ return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, 'This is not valid JSON! ' + e.message, _Json_wrap(string)));
1481+ }
1482+});
1483+
1484+var _Json_run = F2(function(decoder, value)
1485+{
1486+ return _Json_runHelp(decoder, _Json_unwrap(value));
1487+});
1488+
1489+function _Json_runHelp(decoder, value)
1490+{
1491+ switch (decoder.$)
1492+ {
1493+ case 2:
1494+ return decoder.b(value);
1495+
1496+ case 5:
1497+ return (value === null)
1498+ ? $elm$core$Result$Ok(decoder.c)
1499+ : _Json_expecting('null', value);
1500+
1501+ case 3:
1502+ if (!_Json_isArray(value))
1503+ {
1504+ return _Json_expecting('a LIST', value);
1505+ }
1506+ return _Json_runArrayDecoder(decoder.b, value, _List_fromArray);
1507+
1508+ case 4:
1509+ if (!_Json_isArray(value))
1510+ {
1511+ return _Json_expecting('an ARRAY', value);
1512+ }
1513+ return _Json_runArrayDecoder(decoder.b, value, _Json_toElmArray);
1514+
1515+ case 6:
1516+ var field = decoder.d;
1517+ if (typeof value !== 'object' || value === null || !(field in value))
1518+ {
1519+ return _Json_expecting('an OBJECT with a field named `' + field + '`', value);
1520+ }
1521+ var result = _Json_runHelp(decoder.b, value[field]);
1522+ return ($elm$core$Result$isOk(result)) ? result : $elm$core$Result$Err(A2($elm$json$Json$Decode$Field, field, result.a));
1523+
1524+ case 7:
1525+ var index = decoder.e;
1526+ if (!_Json_isArray(value))
1527+ {
1528+ return _Json_expecting('an ARRAY', value);
1529+ }
1530+ if (index >= value.length)
1531+ {
1532+ return _Json_expecting('a LONGER array. Need index ' + index + ' but only see ' + value.length + ' entries', value);
1533+ }
1534+ var result = _Json_runHelp(decoder.b, value[index]);
1535+ return ($elm$core$Result$isOk(result)) ? result : $elm$core$Result$Err(A2($elm$json$Json$Decode$Index, index, result.a));
1536+
1537+ case 8:
1538+ if (typeof value !== 'object' || value === null || _Json_isArray(value))
1539+ {
1540+ return _Json_expecting('an OBJECT', value);
1541+ }
1542+
1543+ var keyValuePairs = _List_Nil;
1544+ // TODO test perf of Object.keys and switch when support is good enough
1545+ for (var key in value)
1546+ {
1547+ if (value.hasOwnProperty(key))
1548+ {
1549+ var result = _Json_runHelp(decoder.b, value[key]);
1550+ if (!$elm$core$Result$isOk(result))
1551+ {
1552+ return $elm$core$Result$Err(A2($elm$json$Json$Decode$Field, key, result.a));
1553+ }
1554+ keyValuePairs = _List_Cons(_Utils_Tuple2(key, result.a), keyValuePairs);
1555+ }
1556+ }
1557+ return $elm$core$Result$Ok($elm$core$List$reverse(keyValuePairs));
1558+
1559+ case 9:
1560+ var answer = decoder.f;
1561+ var decoders = decoder.g;
1562+ for (var i = 0; i < decoders.length; i++)
1563+ {
1564+ var result = _Json_runHelp(decoders[i], value);
1565+ if (!$elm$core$Result$isOk(result))
1566+ {
1567+ return result;
1568+ }
1569+ answer = answer(result.a);
1570+ }
1571+ return $elm$core$Result$Ok(answer);
1572+
1573+ case 10:
1574+ var result = _Json_runHelp(decoder.b, value);
1575+ return (!$elm$core$Result$isOk(result))
1576+ ? result
1577+ : _Json_runHelp(decoder.h(result.a), value);
1578+
1579+ case 11:
1580+ var errors = _List_Nil;
1581+ for (var temp = decoder.g; temp.b; temp = temp.b) // WHILE_CONS
1582+ {
1583+ var result = _Json_runHelp(temp.a, value);
1584+ if ($elm$core$Result$isOk(result))
1585+ {
1586+ return result;
1587+ }
1588+ errors = _List_Cons(result.a, errors);
1589+ }
1590+ return $elm$core$Result$Err($elm$json$Json$Decode$OneOf($elm$core$List$reverse(errors)));
1591+
1592+ case 1:
1593+ return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, decoder.a, _Json_wrap(value)));
1594+
1595+ case 0:
1596+ return $elm$core$Result$Ok(decoder.a);
1597+ }
1598+}
1599+
1600+function _Json_runArrayDecoder(decoder, value, toElmValue)
1601+{
1602+ var len = value.length;
1603+ var array = new Array(len);
1604+ for (var i = 0; i < len; i++)
1605+ {
1606+ var result = _Json_runHelp(decoder, value[i]);
1607+ if (!$elm$core$Result$isOk(result))
1608+ {
1609+ return $elm$core$Result$Err(A2($elm$json$Json$Decode$Index, i, result.a));
1610+ }
1611+ array[i] = result.a;
1612+ }
1613+ return $elm$core$Result$Ok(toElmValue(array));
1614+}
1615+
1616+function _Json_isArray(value)
1617+{
1618+ return Array.isArray(value) || (typeof FileList !== 'undefined' && value instanceof FileList);
1619+}
1620+
1621+function _Json_toElmArray(array)
1622+{
1623+ return A2($elm$core$Array$initialize, array.length, function(i) { return array[i]; });
1624+}
1625+
1626+function _Json_expecting(type, value)
1627+{
1628+ return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, 'Expecting ' + type, _Json_wrap(value)));
1629+}
1630+
1631+
1632+// EQUALITY
1633+
1634+function _Json_equality(x, y)
1635+{
1636+ if (x === y)
1637+ {
1638+ return true;
1639+ }
1640+
1641+ if (x.$ !== y.$)
1642+ {
1643+ return false;
1644+ }
1645+
1646+ switch (x.$)
1647+ {
1648+ case 0:
1649+ case 1:
1650+ return x.a === y.a;
1651+
1652+ case 2:
1653+ return x.b === y.b;
1654+
1655+ case 5:
1656+ return x.c === y.c;
1657+
1658+ case 3:
1659+ case 4:
1660+ case 8:
1661+ return _Json_equality(x.b, y.b);
1662+
1663+ case 6:
1664+ return x.d === y.d && _Json_equality(x.b, y.b);
1665+
1666+ case 7:
1667+ return x.e === y.e && _Json_equality(x.b, y.b);
1668+
1669+ case 9:
1670+ return x.f === y.f && _Json_listEquality(x.g, y.g);
1671+
1672+ case 10:
1673+ return x.h === y.h && _Json_equality(x.b, y.b);
1674+
1675+ case 11:
1676+ return _Json_listEquality(x.g, y.g);
1677+ }
1678+}
1679+
1680+function _Json_listEquality(aDecoders, bDecoders)
1681+{
1682+ var len = aDecoders.length;
1683+ if (len !== bDecoders.length)
1684+ {
1685+ return false;
1686+ }
1687+ for (var i = 0; i < len; i++)
1688+ {
1689+ if (!_Json_equality(aDecoders[i], bDecoders[i]))
1690+ {
1691+ return false;
1692+ }
1693+ }
1694+ return true;
1695+}
1696+
1697+
1698+// ENCODE
1699+
1700+var _Json_encode = F2(function(indentLevel, value)
1701+{
1702+ return JSON.stringify(_Json_unwrap(value), null, indentLevel) + '';
1703+});
1704+
1705+function _Json_wrap(value) { return { $: 0, a: value }; }
1706+function _Json_unwrap(value) { return value.a; }
1707+
1708+
1709+function _Json_emptyArray() { return []; }
1710+function _Json_emptyObject() { return {}; }
1711+
1712+var _Json_addField = F3(function(key, value, object)
1713+{
1714+ object[key] = _Json_unwrap(value);
1715+ return object;
1716+});
1717+
1718+function _Json_addEntry(func)
1719+{
1720+ return F2(function(entry, array)
1721+ {
1722+ array.push(_Json_unwrap(func(entry)));
1723+ return array;
1724+ });
1725+}
1726+
1727+var _Json_encodeNull = _Json_wrap(null);
1728+
1729+
1730+
1731+// TASKS
1732+
1733+function _Scheduler_succeed(value)
1734+{
1735+ return {
1736+ $: 0,
1737+ a: value
1738+ };
1739+}
1740+
1741+function _Scheduler_fail(error)
1742+{
1743+ return {
1744+ $: 1,
1745+ a: error
1746+ };
1747+}
1748+
1749+function _Scheduler_binding(callback)
1750+{
1751+ return {
1752+ $: 2,
1753+ b: callback,
1754+ c: null
1755+ };
1756+}
1757+
1758+var _Scheduler_andThen = F2(function(callback, task)
1759+{
1760+ return {
1761+ $: 3,
1762+ b: callback,
1763+ d: task
1764+ };
1765+});
1766+
1767+var _Scheduler_onError = F2(function(callback, task)
1768+{
1769+ return {
1770+ $: 4,
1771+ b: callback,
1772+ d: task
1773+ };
1774+});
1775+
1776+function _Scheduler_receive(callback)
1777+{
1778+ return {
1779+ $: 5,
1780+ b: callback
1781+ };
1782+}
1783+
1784+
1785+// PROCESSES
1786+
1787+var _Scheduler_guid = 0;
1788+
1789+function _Scheduler_rawSpawn(task)
1790+{
1791+ var proc = {
1792+ $: 0,
1793+ e: _Scheduler_guid++,
1794+ f: task,
1795+ g: null,
1796+ h: []
1797+ };
1798+
1799+ _Scheduler_enqueue(proc);
1800+
1801+ return proc;
1802+}
1803+
1804+function _Scheduler_spawn(task)
1805+{
1806+ return _Scheduler_binding(function(callback) {
1807+ callback(_Scheduler_succeed(_Scheduler_rawSpawn(task)));
1808+ });
1809+}
1810+
1811+function _Scheduler_rawSend(proc, msg)
1812+{
1813+ proc.h.push(msg);
1814+ _Scheduler_enqueue(proc);
1815+}
1816+
1817+var _Scheduler_send = F2(function(proc, msg)
1818+{
1819+ return _Scheduler_binding(function(callback) {
1820+ _Scheduler_rawSend(proc, msg);
1821+ callback(_Scheduler_succeed(_Utils_Tuple0));
1822+ });
1823+});
1824+
1825+function _Scheduler_kill(proc)
1826+{
1827+ return _Scheduler_binding(function(callback) {
1828+ var task = proc.f;
1829+ if (task.$ === 2 && task.c)
1830+ {
1831+ task.c();
1832+ }
1833+
1834+ proc.f = null;
1835+
1836+ callback(_Scheduler_succeed(_Utils_Tuple0));
1837+ });
1838+}
1839+
1840+
1841+/* STEP PROCESSES
1842+
1843+type alias Process =
1844+ { $ : tag
1845+ , id : unique_id
1846+ , root : Task
1847+ , stack : null | { $: SUCCEED | FAIL, a: callback, b: stack }
1848+ , mailbox : [msg]
1849+ }
1850+
1851+*/
1852+
1853+
1854+var _Scheduler_working = false;
1855+var _Scheduler_queue = [];
1856+
1857+
1858+function _Scheduler_enqueue(proc)
1859+{
1860+ _Scheduler_queue.push(proc);
1861+ if (_Scheduler_working)
1862+ {
1863+ return;
1864+ }
1865+ _Scheduler_working = true;
1866+ while (proc = _Scheduler_queue.shift())
1867+ {
1868+ _Scheduler_step(proc);
1869+ }
1870+ _Scheduler_working = false;
1871+}
1872+
1873+
1874+function _Scheduler_step(proc)
1875+{
1876+ while (proc.f)
1877+ {
1878+ var rootTag = proc.f.$;
1879+ if (rootTag === 0 || rootTag === 1)
1880+ {
1881+ while (proc.g && proc.g.$ !== rootTag)
1882+ {
1883+ proc.g = proc.g.i;
1884+ }
1885+ if (!proc.g)
1886+ {
1887+ return;
1888+ }
1889+ proc.f = proc.g.b(proc.f.a);
1890+ proc.g = proc.g.i;
1891+ }
1892+ else if (rootTag === 2)
1893+ {
1894+ proc.f.c = proc.f.b(function(newRoot) {
1895+ proc.f = newRoot;
1896+ _Scheduler_enqueue(proc);
1897+ });
1898+ return;
1899+ }
1900+ else if (rootTag === 5)
1901+ {
1902+ if (proc.h.length === 0)
1903+ {
1904+ return;
1905+ }
1906+ proc.f = proc.f.b(proc.h.shift());
1907+ }
1908+ else // if (rootTag === 3 || rootTag === 4)
1909+ {
1910+ proc.g = {
1911+ $: rootTag === 3 ? 0 : 1,
1912+ b: proc.f.b,
1913+ i: proc.g
1914+ };
1915+ proc.f = proc.f.d;
1916+ }
1917+ }
1918+}
1919+
1920+
1921+
1922+function _Process_sleep(time)
1923+{
1924+ return _Scheduler_binding(function(callback) {
1925+ var id = setTimeout(function() {
1926+ callback(_Scheduler_succeed(_Utils_Tuple0));
1927+ }, time);
1928+
1929+ return function() { clearTimeout(id); };
1930+ });
1931+}
1932+
1933+
1934+
1935+
1936+// PROGRAMS
1937+
1938+
1939+var _Platform_worker = F4(function(impl, flagDecoder, debugMetadata, args)
1940+{
1941+ return _Platform_initialize(
1942+ flagDecoder,
1943+ args,
1944+ impl.init,
1945+ impl.update,
1946+ impl.subscriptions,
1947+ function() { return function() {} }
1948+ );
1949+});
1950+
1951+
1952+
1953+// INITIALIZE A PROGRAM
1954+
1955+
1956+function _Platform_initialize(flagDecoder, args, init, update, subscriptions, stepperBuilder)
1957+{
1958+ var result = A2(_Json_run, flagDecoder, _Json_wrap(args ? args['flags'] : undefined));
1959+ $elm$core$Result$isOk(result) || _Debug_crash(2 /**/, _Json_errorToString(result.a) /**/);
1960+ var managers = {};
1961+ var initPair = init(result.a);
1962+ var model = initPair.a;
1963+ var stepper = stepperBuilder(sendToApp, model);
1964+ var ports = _Platform_setupEffects(managers, sendToApp);
1965+
1966+ function sendToApp(msg, viewMetadata)
1967+ {
1968+ var pair = A2(update, msg, model);
1969+ stepper(model = pair.a, viewMetadata);
1970+ _Platform_enqueueEffects(managers, pair.b, subscriptions(model));
1971+ }
1972+
1973+ _Platform_enqueueEffects(managers, initPair.b, subscriptions(model));
1974+
1975+ return ports ? { ports: ports } : {};
1976+}
1977+
1978+
1979+
1980+// TRACK PRELOADS
1981+//
1982+// This is used by code in elm/browser and elm/http
1983+// to register any HTTP requests that are triggered by init.
1984+//
1985+
1986+
1987+var _Platform_preload;
1988+
1989+
1990+function _Platform_registerPreload(url)
1991+{
1992+ _Platform_preload.add(url);
1993+}
1994+
1995+
1996+
1997+// EFFECT MANAGERS
1998+
1999+
2000+var _Platform_effectManagers = {};
2001+
2002+
2003+function _Platform_setupEffects(managers, sendToApp)
2004+{
2005+ var ports;
2006+
2007+ // setup all necessary effect managers
2008+ for (var key in _Platform_effectManagers)
2009+ {
2010+ var manager = _Platform_effectManagers[key];
2011+
2012+ if (manager.a)
2013+ {
2014+ ports = ports || {};
2015+ ports[key] = manager.a(key, sendToApp);
2016+ }
2017+
2018+ managers[key] = _Platform_instantiateManager(manager, sendToApp);
2019+ }
2020+
2021+ return ports;
2022+}
2023+
2024+
2025+function _Platform_createManager(init, onEffects, onSelfMsg, cmdMap, subMap)
2026+{
2027+ return {
2028+ b: init,
2029+ c: onEffects,
2030+ d: onSelfMsg,
2031+ e: cmdMap,
2032+ f: subMap
2033+ };
2034+}
2035+
2036+
2037+function _Platform_instantiateManager(info, sendToApp)
2038+{
2039+ var router = {
2040+ g: sendToApp,
2041+ h: undefined
2042+ };
2043+
2044+ var onEffects = info.c;
2045+ var onSelfMsg = info.d;
2046+ var cmdMap = info.e;
2047+ var subMap = info.f;
2048+
2049+ function loop(state)
2050+ {
2051+ return A2(_Scheduler_andThen, loop, _Scheduler_receive(function(msg)
2052+ {
2053+ var value = msg.a;
2054+
2055+ if (msg.$ === 0)
2056+ {
2057+ return A3(onSelfMsg, router, value, state);
2058+ }
2059+
2060+ return cmdMap && subMap
2061+ ? A4(onEffects, router, value.i, value.j, state)
2062+ : A3(onEffects, router, cmdMap ? value.i : value.j, state);
2063+ }));
2064+ }
2065+
2066+ return router.h = _Scheduler_rawSpawn(A2(_Scheduler_andThen, loop, info.b));
2067+}
2068+
2069+
2070+
2071+// ROUTING
2072+
2073+
2074+var _Platform_sendToApp = F2(function(router, msg)
2075+{
2076+ return _Scheduler_binding(function(callback)
2077+ {
2078+ router.g(msg);
2079+ callback(_Scheduler_succeed(_Utils_Tuple0));
2080+ });
2081+});
2082+
2083+
2084+var _Platform_sendToSelf = F2(function(router, msg)
2085+{
2086+ return A2(_Scheduler_send, router.h, {
2087+ $: 0,
2088+ a: msg
2089+ });
2090+});
2091+
2092+
2093+
2094+// BAGS
2095+
2096+
2097+function _Platform_leaf(home)
2098+{
2099+ return function(value)
2100+ {
2101+ return {
2102+ $: 1,
2103+ k: home,
2104+ l: value
2105+ };
2106+ };
2107+}
2108+
2109+
2110+function _Platform_batch(list)
2111+{
2112+ return {
2113+ $: 2,
2114+ m: list
2115+ };
2116+}
2117+
2118+
2119+var _Platform_map = F2(function(tagger, bag)
2120+{
2121+ return {
2122+ $: 3,
2123+ n: tagger,
2124+ o: bag
2125+ }
2126+});
2127+
2128+
2129+
2130+// PIPE BAGS INTO EFFECT MANAGERS
2131+//
2132+// Effects must be queued!
2133+//
2134+// Say your init contains a synchronous command, like Time.now or Time.here
2135+//
2136+// - This will produce a batch of effects (FX_1)
2137+// - The synchronous task triggers the subsequent `update` call
2138+// - This will produce a batch of effects (FX_2)
2139+//
2140+// If we just start dispatching FX_2, subscriptions from FX_2 can be processed
2141+// before subscriptions from FX_1. No good! Earlier versions of this code had
2142+// this problem, leading to these reports:
2143+//
2144+// https://github.com/elm/core/issues/980
2145+// https://github.com/elm/core/pull/981
2146+// https://github.com/elm/compiler/issues/1776
2147+//
2148+// The queue is necessary to avoid ordering issues for synchronous commands.
2149+
2150+
2151+// Why use true/false here? Why not just check the length of the queue?
2152+// The goal is to detect "are we currently dispatching effects?" If we
2153+// are, we need to bail and let the ongoing while loop handle things.
2154+//
2155+// Now say the queue has 1 element. When we dequeue the final element,
2156+// the queue will be empty, but we are still actively dispatching effects.
2157+// So you could get queue jumping in a really tricky category of cases.
2158+//
2159+var _Platform_effectsQueue = [];
2160+var _Platform_effectsActive = false;
2161+
2162+
2163+function _Platform_enqueueEffects(managers, cmdBag, subBag)
2164+{
2165+ _Platform_effectsQueue.push({ p: managers, q: cmdBag, r: subBag });
2166+
2167+ if (_Platform_effectsActive) return;
2168+
2169+ _Platform_effectsActive = true;
2170+ for (var fx; fx = _Platform_effectsQueue.shift(); )
2171+ {
2172+ _Platform_dispatchEffects(fx.p, fx.q, fx.r);
2173+ }
2174+ _Platform_effectsActive = false;
2175+}
2176+
2177+
2178+function _Platform_dispatchEffects(managers, cmdBag, subBag)
2179+{
2180+ var effectsDict = {};
2181+ _Platform_gatherEffects(true, cmdBag, effectsDict, null);
2182+ _Platform_gatherEffects(false, subBag, effectsDict, null);
2183+
2184+ for (var home in managers)
2185+ {
2186+ _Scheduler_rawSend(managers[home], {
2187+ $: 'fx',
2188+ a: effectsDict[home] || { i: _List_Nil, j: _List_Nil }
2189+ });
2190+ }
2191+}
2192+
2193+
2194+function _Platform_gatherEffects(isCmd, bag, effectsDict, taggers)
2195+{
2196+ switch (bag.$)
2197+ {
2198+ case 1:
2199+ var home = bag.k;
2200+ var effect = _Platform_toEffect(isCmd, home, taggers, bag.l);
2201+ effectsDict[home] = _Platform_insert(isCmd, effect, effectsDict[home]);
2202+ return;
2203+
2204+ case 2:
2205+ for (var list = bag.m; list.b; list = list.b) // WHILE_CONS
2206+ {
2207+ _Platform_gatherEffects(isCmd, list.a, effectsDict, taggers);
2208+ }
2209+ return;
2210+
2211+ case 3:
2212+ _Platform_gatherEffects(isCmd, bag.o, effectsDict, {
2213+ s: bag.n,
2214+ t: taggers
2215+ });
2216+ return;
2217+ }
2218+}
2219+
2220+
2221+function _Platform_toEffect(isCmd, home, taggers, value)
2222+{
2223+ function applyTaggers(x)
2224+ {
2225+ for (var temp = taggers; temp; temp = temp.t)
2226+ {
2227+ x = temp.s(x);
2228+ }
2229+ return x;
2230+ }
2231+
2232+ var map = isCmd
2233+ ? _Platform_effectManagers[home].e
2234+ : _Platform_effectManagers[home].f;
2235+
2236+ return A2(map, applyTaggers, value)
2237+}
2238+
2239+
2240+function _Platform_insert(isCmd, newEffect, effects)
2241+{
2242+ effects = effects || { i: _List_Nil, j: _List_Nil };
2243+
2244+ isCmd
2245+ ? (effects.i = _List_Cons(newEffect, effects.i))
2246+ : (effects.j = _List_Cons(newEffect, effects.j));
2247+
2248+ return effects;
2249+}
2250+
2251+
2252+
2253+// PORTS
2254+
2255+
2256+function _Platform_checkPortName(name)
2257+{
2258+ if (_Platform_effectManagers[name])
2259+ {
2260+ _Debug_crash(3, name)
2261+ }
2262+}
2263+
2264+
2265+
2266+// OUTGOING PORTS
2267+
2268+
2269+function _Platform_outgoingPort(name, converter)
2270+{
2271+ _Platform_checkPortName(name);
2272+ _Platform_effectManagers[name] = {
2273+ e: _Platform_outgoingPortMap,
2274+ u: converter,
2275+ a: _Platform_setupOutgoingPort
2276+ };
2277+ return _Platform_leaf(name);
2278+}
2279+
2280+
2281+var _Platform_outgoingPortMap = F2(function(tagger, value) { return value; });
2282+
2283+
2284+function _Platform_setupOutgoingPort(name)
2285+{
2286+ var subs = [];
2287+ var converter = _Platform_effectManagers[name].u;
2288+
2289+ // CREATE MANAGER
2290+
2291+ var init = _Process_sleep(0);
2292+
2293+ _Platform_effectManagers[name].b = init;
2294+ _Platform_effectManagers[name].c = F3(function(router, cmdList, state)
2295+ {
2296+ for ( ; cmdList.b; cmdList = cmdList.b) // WHILE_CONS
2297+ {
2298+ // grab a separate reference to subs in case unsubscribe is called
2299+ var currentSubs = subs;
2300+ var value = _Json_unwrap(converter(cmdList.a));
2301+ for (var i = 0; i < currentSubs.length; i++)
2302+ {
2303+ currentSubs[i](value);
2304+ }
2305+ }
2306+ return init;
2307+ });
2308+
2309+ // PUBLIC API
2310+
2311+ function subscribe(callback)
2312+ {
2313+ subs.push(callback);
2314+ }
2315+
2316+ function unsubscribe(callback)
2317+ {
2318+ // copy subs into a new array in case unsubscribe is called within a
2319+ // subscribed callback
2320+ subs = subs.slice();
2321+ var index = subs.indexOf(callback);
2322+ if (index >= 0)
2323+ {
2324+ subs.splice(index, 1);
2325+ }
2326+ }
2327+
2328+ return {
2329+ subscribe: subscribe,
2330+ unsubscribe: unsubscribe
2331+ };
2332+}
2333+
2334+
2335+
2336+// INCOMING PORTS
2337+
2338+
2339+function _Platform_incomingPort(name, converter)
2340+{
2341+ _Platform_checkPortName(name);
2342+ _Platform_effectManagers[name] = {
2343+ f: _Platform_incomingPortMap,
2344+ u: converter,
2345+ a: _Platform_setupIncomingPort
2346+ };
2347+ return _Platform_leaf(name);
2348+}
2349+
2350+
2351+var _Platform_incomingPortMap = F2(function(tagger, finalTagger)
2352+{
2353+ return function(value)
2354+ {
2355+ return tagger(finalTagger(value));
2356+ };
2357+});
2358+
2359+
2360+function _Platform_setupIncomingPort(name, sendToApp)
2361+{
2362+ var subs = _List_Nil;
2363+ var converter = _Platform_effectManagers[name].u;
2364+
2365+ // CREATE MANAGER
2366+
2367+ var init = _Scheduler_succeed(null);
2368+
2369+ _Platform_effectManagers[name].b = init;
2370+ _Platform_effectManagers[name].c = F3(function(router, subList, state)
2371+ {
2372+ subs = subList;
2373+ return init;
2374+ });
2375+
2376+ // PUBLIC API
2377+
2378+ function send(incomingValue)
2379+ {
2380+ var result = A2(_Json_run, converter, _Json_wrap(incomingValue));
2381+
2382+ $elm$core$Result$isOk(result) || _Debug_crash(4, name, result.a);
2383+
2384+ var value = result.a;
2385+ for (var temp = subs; temp.b; temp = temp.b) // WHILE_CONS
2386+ {
2387+ sendToApp(temp.a(value));
2388+ }
2389+ }
2390+
2391+ return { send: send };
2392+}
2393+
2394+
2395+
2396+// EXPORT ELM MODULES
2397+//
2398+// Have DEBUG and PROD versions so that we can (1) give nicer errors in
2399+// debug mode and (2) not pay for the bits needed for that in prod mode.
2400+//
2401+
2402+
2403+
2404+
2405+function _Platform_mergeExportsProd(obj, exports)
2406+{
2407+ for (var name in exports)
2408+ {
2409+ (name in obj)
2410+ ? (name == 'init')
2411+ ? _Debug_crash(6)
2412+ : _Platform_mergeExportsProd(obj[name], exports[name])
2413+ : (obj[name] = exports[name]);
2414+ }
2415+}
2416+
2417+
2418+function _Platform_export(exports)
2419+{
2420+ scope['Elm']
2421+ ? _Platform_mergeExportsDebug('Elm', scope['Elm'], exports)
2422+ : scope['Elm'] = exports;
2423+}
2424+
2425+
2426+function _Platform_mergeExportsDebug(moduleName, obj, exports)
2427+{
2428+ for (var name in exports)
2429+ {
2430+ (name in obj)
2431+ ? (name == 'init')
2432+ ? _Debug_crash(6, moduleName)
2433+ : _Platform_mergeExportsDebug(moduleName + '.' + name, obj[name], exports[name])
2434+ : (obj[name] = exports[name]);
2435+ }
2436+}
2437+
2438+
2439+
2440+var _Lynx_g = (typeof globalThis !== 'undefined' ? globalThis : scope);
2441+function _Lynx_papi(name) { return _Lynx_g['_' + '_' + name] || function() {}; }
2442+var _Lynx_createViewFn = _Lynx_papi('CreateView');
2443+var _Lynx_createTextFn = _Lynx_papi('CreateText');
2444+var _Lynx_createImageFn = _Lynx_papi('CreateImage');
2445+function _Lynx_createElement(tag) {
2446+ var pId = (_Lynx_g['native'] && _Lynx_g['native']['currentPageId']) || 0;
2447+ return (tag === 'text' ? _Lynx_createTextFn
2448+ : tag === 'image' ? _Lynx_createImageFn
2449+ : _Lynx_createViewFn)(pId);
2450+}
2451+var _Lynx_createRawText = _Lynx_papi('CreateRawText');
2452+var _Lynx_appendChild = _Lynx_papi('AppendElement');
2453+var _Lynx_removeElement = _Lynx_papi('RemoveElement');
2454+var _Lynx_replaceElement = _Lynx_papi('ReplaceElement');
2455+var _Lynx_insertBefore = _Lynx_papi('InsertElementBefore');
2456+var _Lynx_setAttribute = _Lynx_papi('SetAttribute');
2457+var _Lynx_getChildren = _Lynx_papi('GetChildren');
2458+var _Lynx_getParent = _Lynx_papi('GetParent');
2459+var _Lynx_addEvent = _Lynx_papi('AddEvent');
2460+var _Lynx_setInlineStyles = _Lynx_papi('SetInlineStyles');
2461+var _VirtualDom_elementMeta = new WeakMap();
2462+function _VirtualDom_getMeta(el) {
2463+ var meta = _VirtualDom_elementMeta.get(el);
2464+ if (!meta) { meta = {}; _VirtualDom_elementMeta.set(el, meta); }
2465+ return meta;
2466+}
2467+
2468+
2469+// HELPERS
2470+
2471+
2472+
2473+
2474+
2475+function _VirtualDom_appendChild(parent, child)
2476+{
2477+ _Lynx_appendChild(parent, child);
2478+}
2479+
2480+var _VirtualDom_init = F4(function(virtualNode, flagDecoder, debugMetadata, args)
2481+{
2482+ // NOTE: this function needs _Platform_export available to work
2483+ var rootPage = args['node'] || _Lynx_g['page'];
2484+ var tree = _VirtualDom_render(virtualNode, function() {});
2485+ _Lynx_appendChild(rootPage, tree);
2486+ return {};
2487+});
2488+
2489+
2490+
2491+// TEXT
2492+
2493+
2494+function _VirtualDom_text(string)
2495+{
2496+ return {
2497+ $: 0,
2498+ a: string
2499+ };
2500+}
2501+
2502+
2503+
2504+// NODE
2505+
2506+
2507+var _VirtualDom_nodeNS = F2(function(namespace, tag)
2508+{
2509+ return F2(function(factList, kidList)
2510+ {
2511+ for (var kids = [], descendantsCount = 0; kidList.b; kidList = kidList.b) // WHILE_CONS
2512+ {
2513+ var kid = kidList.a;
2514+ descendantsCount += (kid.b || 0);
2515+ kids.push(kid);
2516+ }
2517+ descendantsCount += kids.length;
2518+
2519+ return {
2520+ $: 1,
2521+ c: tag,
2522+ d: _VirtualDom_organizeFacts(factList),
2523+ e: kids,
2524+ f: namespace,
2525+ b: descendantsCount
2526+ };
2527+ });
2528+});
2529+
2530+
2531+var _VirtualDom_node = _VirtualDom_nodeNS(undefined);
2532+
2533+
2534+
2535+// KEYED NODE
2536+
2537+
2538+var _VirtualDom_keyedNodeNS = F2(function(namespace, tag)
2539+{
2540+ return F2(function(factList, kidList)
2541+ {
2542+ for (var kids = [], descendantsCount = 0; kidList.b; kidList = kidList.b) // WHILE_CONS
2543+ {
2544+ var kid = kidList.a;
2545+ descendantsCount += (kid.b.b || 0);
2546+ kids.push(kid);
2547+ }
2548+ descendantsCount += kids.length;
2549+
2550+ return {
2551+ $: 2,
2552+ c: tag,
2553+ d: _VirtualDom_organizeFacts(factList),
2554+ e: kids,
2555+ f: namespace,
2556+ b: descendantsCount
2557+ };
2558+ });
2559+});
2560+
2561+
2562+var _VirtualDom_keyedNode = _VirtualDom_keyedNodeNS(undefined);
2563+
2564+
2565+
2566+// CUSTOM
2567+
2568+
2569+function _VirtualDom_custom(factList, model, render, diff)
2570+{
2571+ return {
2572+ $: 3,
2573+ d: _VirtualDom_organizeFacts(factList),
2574+ g: model,
2575+ h: render,
2576+ i: diff
2577+ };
2578+}
2579+
2580+
2581+
2582+// MAP
2583+
2584+
2585+var _VirtualDom_map = F2(function(tagger, node)
2586+{
2587+ return {
2588+ $: 4,
2589+ j: tagger,
2590+ k: node,
2591+ b: 1 + (node.b || 0)
2592+ };
2593+});
2594+
2595+
2596+
2597+// LAZY
2598+
2599+
2600+function _VirtualDom_thunk(refs, thunk)
2601+{
2602+ return {
2603+ $: 5,
2604+ l: refs,
2605+ m: thunk,
2606+ k: undefined
2607+ };
2608+}
2609+
2610+var _VirtualDom_lazy = F2(function(func, a)
2611+{
2612+ return _VirtualDom_thunk([func, a], function() {
2613+ return func(a);
2614+ });
2615+});
2616+
2617+var _VirtualDom_lazy2 = F3(function(func, a, b)
2618+{
2619+ return _VirtualDom_thunk([func, a, b], function() {
2620+ return A2(func, a, b);
2621+ });
2622+});
2623+
2624+var _VirtualDom_lazy3 = F4(function(func, a, b, c)
2625+{
2626+ return _VirtualDom_thunk([func, a, b, c], function() {
2627+ return A3(func, a, b, c);
2628+ });
2629+});
2630+
2631+var _VirtualDom_lazy4 = F5(function(func, a, b, c, d)
2632+{
2633+ return _VirtualDom_thunk([func, a, b, c, d], function() {
2634+ return A4(func, a, b, c, d);
2635+ });
2636+});
2637+
2638+var _VirtualDom_lazy5 = F6(function(func, a, b, c, d, e)
2639+{
2640+ return _VirtualDom_thunk([func, a, b, c, d, e], function() {
2641+ return A5(func, a, b, c, d, e);
2642+ });
2643+});
2644+
2645+var _VirtualDom_lazy6 = F7(function(func, a, b, c, d, e, f)
2646+{
2647+ return _VirtualDom_thunk([func, a, b, c, d, e, f], function() {
2648+ return A6(func, a, b, c, d, e, f);
2649+ });
2650+});
2651+
2652+var _VirtualDom_lazy7 = F8(function(func, a, b, c, d, e, f, g)
2653+{
2654+ return _VirtualDom_thunk([func, a, b, c, d, e, f, g], function() {
2655+ return A7(func, a, b, c, d, e, f, g);
2656+ });
2657+});
2658+
2659+var _VirtualDom_lazy8 = F9(function(func, a, b, c, d, e, f, g, h)
2660+{
2661+ return _VirtualDom_thunk([func, a, b, c, d, e, f, g, h], function() {
2662+ return A8(func, a, b, c, d, e, f, g, h);
2663+ });
2664+});
2665+
2666+
2667+
2668+// FACTS
2669+
2670+
2671+var _VirtualDom_on = F2(function(key, handler)
2672+{
2673+ return {
2674+ $: 'a0',
2675+ n: key,
2676+ o: handler
2677+ };
2678+});
2679+var _VirtualDom_style = F2(function(key, value)
2680+{
2681+ return {
2682+ $: 'a1',
2683+ n: key,
2684+ o: value
2685+ };
2686+});
2687+var _VirtualDom_property = F2(function(key, value)
2688+{
2689+ return {
2690+ $: 'a2',
2691+ n: key,
2692+ o: value
2693+ };
2694+});
2695+var _VirtualDom_attribute = F2(function(key, value)
2696+{
2697+ return {
2698+ $: 'a3',
2699+ n: key,
2700+ o: value
2701+ };
2702+});
2703+var _VirtualDom_attributeNS = F3(function(namespace, key, value)
2704+{
2705+ return {
2706+ $: 'a4',
2707+ n: key,
2708+ o: { f: namespace, o: value }
2709+ };
2710+});
2711+
2712+
2713+
2714+// XSS ATTACK VECTOR CHECKS
2715+//
2716+// For some reason, tabs can appear in href protocols and it still works.
2717+// So '\tjava\tSCRIPT:alert("!!!")' and 'javascript:alert("!!!")' are the same
2718+// in practice. That is why _VirtualDom_RE_js and _VirtualDom_RE_js_html look
2719+// so freaky.
2720+//
2721+// Pulling the regular expressions out to the top level gives a slight speed
2722+// boost in small benchmarks (4-10%) but hoisting values to reduce allocation
2723+// can be unpredictable in large programs where JIT may have a harder time with
2724+// functions are not fully self-contained. The benefit is more that the js and
2725+// js_html ones are so weird that I prefer to see them near each other.
2726+
2727+
2728+
2729+
2730+
2731+function _VirtualDom_noScript(tag)
2732+{
2733+ return tag;
2734+}
2735+
2736+function _VirtualDom_noOnOrFormAction(key)
2737+{
2738+ return key;
2739+}
2740+
2741+function _VirtualDom_noInnerHtmlOrFormAction(key)
2742+{
2743+ return key;
2744+}
2745+
2746+function _VirtualDom_noJavaScriptUri(value)
2747+{
2748+ return value;
2749+}
2750+
2751+function _VirtualDom_noJavaScriptOrHtmlUri(value)
2752+{
2753+ return value;
2754+}
2755+
2756+function _VirtualDom_noJavaScriptOrHtmlJson(value)
2757+{
2758+ return value;
2759+}
2760+
2761+
2762+
2763+// MAP FACTS
2764+
2765+
2766+var _VirtualDom_mapAttribute = F2(function(func, attr)
2767+{
2768+ return (attr.$ === 'a0')
2769+ ? A2(_VirtualDom_on, attr.n, _VirtualDom_mapHandler(func, attr.o))
2770+ : attr;
2771+});
2772+
2773+function _VirtualDom_mapHandler(func, handler)
2774+{
2775+ var tag = $lynxjs_elm$virtual_dom$VirtualDom$toHandlerInt(handler);
2776+
2777+ // 0 = Normal
2778+ // 1 = MayStopPropagation
2779+ // 2 = MayPreventDefault
2780+ // 3 = Custom
2781+
2782+ return {
2783+ $: handler.$,
2784+ a:
2785+ !tag
2786+ ? A2($elm$json$Json$Decode$map, func, handler.a)
2787+ :
2788+ A3($elm$json$Json$Decode$map2,
2789+ tag < 3
2790+ ? _VirtualDom_mapEventTuple
2791+ : _VirtualDom_mapEventRecord,
2792+ $elm$json$Json$Decode$succeed(func),
2793+ handler.a
2794+ )
2795+ };
2796+}
2797+
2798+var _VirtualDom_mapEventTuple = F2(function(func, tuple)
2799+{
2800+ return _Utils_Tuple2(func(tuple.a), tuple.b);
2801+});
2802+
2803+var _VirtualDom_mapEventRecord = F2(function(func, record)
2804+{
2805+ return {
2806+ message: func(record.message),
2807+ stopPropagation: record.stopPropagation,
2808+ preventDefault: record.preventDefault
2809+ }
2810+});
2811+
2812+
2813+
2814+// ORGANIZE FACTS
2815+
2816+
2817+function _VirtualDom_organizeFacts(factList)
2818+{
2819+ for (var facts = {}; factList.b; factList = factList.b) // WHILE_CONS
2820+ {
2821+ var entry = factList.a;
2822+
2823+ var tag = entry.$;
2824+ var key = entry.n;
2825+ var value = entry.o;
2826+
2827+ if (tag === 'a2')
2828+ {
2829+ (key === 'className')
2830+ ? _VirtualDom_addClass(facts, key, _Json_unwrap(value))
2831+ : facts[key] = _Json_unwrap(value);
2832+
2833+ continue;
2834+ }
2835+
2836+ var subFacts = facts[tag] || (facts[tag] = {});
2837+ (tag === 'a3' && key === 'class')
2838+ ? _VirtualDom_addClass(subFacts, key, value)
2839+ : subFacts[key] = value;
2840+ }
2841+
2842+ return facts;
2843+}
2844+
2845+function _VirtualDom_addClass(object, key, newClass)
2846+{
2847+ var classes = object[key];
2848+ object[key] = classes ? classes + ' ' + newClass : newClass;
2849+}
2850+
2851+
2852+
2853+// RENDER
2854+
2855+
2856+function _VirtualDom_render(vNode, eventNode)
2857+{
2858+ var tag = vNode.$;
2859+
2860+ if (tag === 5)
2861+ {
2862+ return _VirtualDom_render(vNode.k || (vNode.k = vNode.m()), eventNode);
2863+ }
2864+
2865+ if (tag === 0)
2866+ {
2867+ return _Lynx_createRawText(vNode.a);
2868+ }
2869+
2870+ if (tag === 4)
2871+ {
2872+ var subNode = vNode.k;
2873+ var tagger = vNode.j;
2874+
2875+ while (subNode.$ === 4)
2876+ {
2877+ typeof tagger !== 'object'
2878+ ? tagger = [tagger, subNode.j]
2879+ : tagger.push(subNode.j);
2880+
2881+ subNode = subNode.k;
2882+ }
2883+
2884+ var subEventRoot = { j: tagger, p: eventNode };
2885+ var domNode = _VirtualDom_render(subNode, subEventRoot);
2886+ _VirtualDom_getMeta(domNode).elm_event_node_ref = subEventRoot;
2887+ return domNode;
2888+ }
2889+
2890+ if (tag === 3)
2891+ {
2892+ var domNode = vNode.h(vNode.g);
2893+ _VirtualDom_applyFacts(domNode, eventNode, vNode.d);
2894+ return domNode;
2895+ }
2896+
2897+ // at this point `tag` must be 1 or 2
2898+
2899+ var domNode = _Lynx_createElement(vNode.c);
2900+
2901+ _VirtualDom_applyFacts(domNode, eventNode, vNode.d);
2902+
2903+ for (var kids = vNode.e, i = 0; i < kids.length; i++)
2904+ {
2905+ var kid = tag === 1 ? kids[i] : kids[i].b;
2906+ if (kid.$ === 0)
2907+ {
2908+ _Lynx_appendChild(domNode, _Lynx_createRawText(kid.a));
2909+ }
2910+ else
2911+ {
2912+ _VirtualDom_appendChild(domNode, _VirtualDom_render(kid, eventNode));
2913+ }
2914+ }
2915+
2916+ return domNode;
2917+}
2918+
2919+
2920+
2921+// APPLY FACTS
2922+
2923+
2924+function _VirtualDom_applyFacts(domNode, eventNode, facts)
2925+{
2926+ for (var key in facts)
2927+ {
2928+ var value = facts[key];
2929+
2930+ key === 'a1'
2931+ ? _VirtualDom_applyStyles(domNode, value)
2932+ :
2933+ key === 'a0'
2934+ ? _VirtualDom_applyEvents(domNode, eventNode, value)
2935+ :
2936+ key === 'a3'
2937+ ? _VirtualDom_applyAttrs(domNode, value)
2938+ :
2939+ key === 'a4'
2940+ ? _VirtualDom_applyAttrsNS(domNode, value)
2941+ :
2942+ (key !== 'value' && key !== 'checked' || domNode[key] !== value) && _Lynx_setAttribute(domNode, key === 'className' ? 'class' : key, String(value));
2943+ }
2944+}
2945+
2946+
2947+
2948+// APPLY STYLES
2949+
2950+
2951+function _VirtualDom_applyStyles(domNode, styles)
2952+{
2953+ _Lynx_setInlineStyles(domNode, styles);
2954+}
2955+
2956+
2957+
2958+// APPLY ATTRS
2959+
2960+
2961+function _VirtualDom_applyAttrs(domNode, attrs)
2962+{
2963+ for (var key in attrs)
2964+ {
2965+ var value = attrs[key];
2966+ if (typeof value !== 'undefined')
2967+ {
2968+ _Lynx_setAttribute(domNode, key, value);
2969+ }
2970+ }
2971+}
2972+
2973+
2974+
2975+// APPLY NAMESPACED ATTRS
2976+
2977+
2978+function _VirtualDom_applyAttrsNS(domNode, nsAttrs)
2979+{
2980+ for (var key in nsAttrs)
2981+ {
2982+ var pair = nsAttrs[key];
2983+ var value = pair.o;
2984+
2985+ if (typeof value !== 'undefined')
2986+ {
2987+ _Lynx_setAttribute(domNode, key, value);
2988+ }
2989+ }
2990+}
2991+
2992+
2993+
2994+// APPLY EVENTS
2995+
2996+
2997+function _VirtualDom_applyEvents(domNode, eventNode, events)
2998+{
2999+ var meta = _VirtualDom_getMeta(domNode);
3000+ var allCallbacks = meta.elmFs || (meta.elmFs = {});
3001+
3002+ for (var key in events)
3003+ {
3004+ var newHandler = events[key];
3005+ var oldCallback = allCallbacks[key];
3006+
3007+ if (!newHandler)
3008+ {
3009+ allCallbacks[key] = undefined;
3010+ continue;
3011+ }
3012+
3013+ if (oldCallback)
3014+ {
3015+ var oldHandler = oldCallback.q;
3016+ if (oldHandler.$ === newHandler.$)
3017+ {
3018+ oldCallback.q = newHandler;
3019+ continue;
3020+ }
3021+ }
3022+
3023+ oldCallback = _VirtualDom_makeCallback(eventNode, newHandler);
3024+ allCallbacks[key] = oldCallback;
3025+
3026+ var lynxEventName = _VirtualDom_mapEventName(key);
3027+ var handlerType = $lynxjs_elm$virtual_dom$VirtualDom$toHandlerInt(newHandler);
3028+ var prefix = (handlerType === 1) ? 'catch' : 'bind';
3029+ _Lynx_addEvent(domNode, 'catchEvent', lynxEventName, { type: 'worklet', value: oldCallback });
3030+ }
3031+}
3032+
3033+function _VirtualDom_mapEventName(name)
3034+{
3035+ switch (name)
3036+ {
3037+ case 'click': return 'tap';
3038+ case 'dblclick': return 'tap';
3039+ case 'mousedown': return 'touchstart';
3040+ case 'mousemove': return 'touchmove';
3041+ case 'mouseup': return 'touchend';
3042+ default: return name;
3043+ }
3044+}
3045+
3046+
3047+
3048+// PASSIVE EVENTS
3049+
3050+
3051+
3052+// EVENT HANDLERS
3053+
3054+
3055+function _VirtualDom_makeCallback(eventNode, initialHandler)
3056+{
3057+ function callback(event)
3058+ {
3059+ var handler = callback.q;
3060+ var result = _Json_runHelp(handler.a, event);
3061+
3062+ if (!$elm$core$Result$isOk(result))
3063+ {
3064+ return;
3065+ }
3066+
3067+ var tag = $lynxjs_elm$virtual_dom$VirtualDom$toHandlerInt(handler);
3068+
3069+ // 0 = Normal
3070+ // 1 = MayStopPropagation
3071+ // 2 = MayPreventDefault
3072+ // 3 = Custom
3073+
3074+ var value = result.a;
3075+ var message = !tag ? value : tag < 3 ? value.a : value.message;
3076+ var stopPropagation = tag == 1 ? value.b : tag == 3 && value.stopPropagation;
3077+ var currentEventNode = eventNode;
3078+ var tagger;
3079+ var i;
3080+ while (tagger = currentEventNode.j)
3081+ {
3082+ if (typeof tagger == 'function')
3083+ {
3084+ message = tagger(message);
3085+ }
3086+ else
3087+ {
3088+ for (var i = tagger.length; i--; )
3089+ {
3090+ message = tagger[i](message);
3091+ }
3092+ }
3093+ currentEventNode = currentEventNode.p;
3094+ }
3095+ currentEventNode(message, stopPropagation); // stopPropagation implies isSync
3096+ }
3097+
3098+ callback.q = initialHandler;
3099+
3100+ return callback;
3101+}
3102+
3103+function _VirtualDom_equalEvents(x, y)
3104+{
3105+ return x.$ == y.$ && _Json_equality(x.a, y.a);
3106+}
3107+
3108+
3109+
3110+// DIFF
3111+
3112+
3113+// TODO: Should we do patches like in iOS?
3114+//
3115+// type Patch
3116+// = At Int Patch
3117+// | Batch (List Patch)
3118+// | Change ...
3119+//
3120+// How could it not be better?
3121+//
3122+function _VirtualDom_diff(x, y)
3123+{
3124+ var patches = [];
3125+ _VirtualDom_diffHelp(x, y, patches, 0);
3126+ return patches;
3127+}
3128+
3129+
3130+function _VirtualDom_pushPatch(patches, type, index, data)
3131+{
3132+ var patch = {
3133+ $: type,
3134+ r: index,
3135+ s: data,
3136+ t: undefined,
3137+ u: undefined
3138+ };
3139+ patches.push(patch);
3140+ return patch;
3141+}
3142+
3143+
3144+function _VirtualDom_diffHelp(x, y, patches, index)
3145+{
3146+ if (x === y)
3147+ {
3148+ return;
3149+ }
3150+
3151+ var xType = x.$;
3152+ var yType = y.$;
3153+
3154+ // Bail if you run into different types of nodes. Implies that the
3155+ // structure has changed significantly and it's not worth a diff.
3156+ if (xType !== yType)
3157+ {
3158+ if (xType === 1 && yType === 2)
3159+ {
3160+ y = _VirtualDom_dekey(y);
3161+ yType = 1;
3162+ }
3163+ else
3164+ {
3165+ _VirtualDom_pushPatch(patches, 0, index, y);
3166+ return;
3167+ }
3168+ }
3169+
3170+ // Now we know that both nodes are the same $.
3171+ switch (yType)
3172+ {
3173+ case 5:
3174+ var xRefs = x.l;
3175+ var yRefs = y.l;
3176+ var i = xRefs.length;
3177+ var same = i === yRefs.length;
3178+ while (same && i--)
3179+ {
3180+ same = xRefs[i] === yRefs[i];
3181+ }
3182+ if (same)
3183+ {
3184+ y.k = x.k;
3185+ return;
3186+ }
3187+ y.k = y.m();
3188+ var subPatches = [];
3189+ _VirtualDom_diffHelp(x.k, y.k, subPatches, 0);
3190+ subPatches.length > 0 && _VirtualDom_pushPatch(patches, 1, index, subPatches);
3191+ return;
3192+
3193+ case 4:
3194+ // gather nested taggers
3195+ var xTaggers = x.j;
3196+ var yTaggers = y.j;
3197+ var nesting = false;
3198+
3199+ var xSubNode = x.k;
3200+ while (xSubNode.$ === 4)
3201+ {
3202+ nesting = true;
3203+
3204+ typeof xTaggers !== 'object'
3205+ ? xTaggers = [xTaggers, xSubNode.j]
3206+ : xTaggers.push(xSubNode.j);
3207+
3208+ xSubNode = xSubNode.k;
3209+ }
3210+
3211+ var ySubNode = y.k;
3212+ while (ySubNode.$ === 4)
3213+ {
3214+ nesting = true;
3215+
3216+ typeof yTaggers !== 'object'
3217+ ? yTaggers = [yTaggers, ySubNode.j]
3218+ : yTaggers.push(ySubNode.j);
3219+
3220+ ySubNode = ySubNode.k;
3221+ }
3222+
3223+ // Just bail if different numbers of taggers. This implies the
3224+ // structure of the virtual DOM has changed.
3225+ if (nesting && xTaggers.length !== yTaggers.length)
3226+ {
3227+ _VirtualDom_pushPatch(patches, 0, index, y);
3228+ return;
3229+ }
3230+
3231+ // check if taggers are "the same"
3232+ if (nesting ? !_VirtualDom_pairwiseRefEqual(xTaggers, yTaggers) : xTaggers !== yTaggers)
3233+ {
3234+ _VirtualDom_pushPatch(patches, 2, index, yTaggers);
3235+ }
3236+
3237+ // diff everything below the taggers
3238+ _VirtualDom_diffHelp(xSubNode, ySubNode, patches, index + 1);
3239+ return;
3240+
3241+ case 0:
3242+ if (x.a !== y.a)
3243+ {
3244+ _VirtualDom_pushPatch(patches, 3, index, y.a);
3245+ }
3246+ return;
3247+
3248+ case 1:
3249+ _VirtualDom_diffNodes(x, y, patches, index, _VirtualDom_diffKids);
3250+ return;
3251+
3252+ case 2:
3253+ _VirtualDom_diffNodes(x, y, patches, index, _VirtualDom_diffKeyedKids);
3254+ return;
3255+
3256+ case 3:
3257+ if (x.h !== y.h)
3258+ {
3259+ _VirtualDom_pushPatch(patches, 0, index, y);
3260+ return;
3261+ }
3262+
3263+ var factsDiff = _VirtualDom_diffFacts(x.d, y.d);
3264+ factsDiff && _VirtualDom_pushPatch(patches, 4, index, factsDiff);
3265+
3266+ var patch = y.i(x.g, y.g);
3267+ patch && _VirtualDom_pushPatch(patches, 5, index, patch);
3268+
3269+ return;
3270+ }
3271+}
3272+
3273+// assumes the incoming arrays are the same length
3274+function _VirtualDom_pairwiseRefEqual(as, bs)
3275+{
3276+ for (var i = 0; i < as.length; i++)
3277+ {
3278+ if (as[i] !== bs[i])
3279+ {
3280+ return false;
3281+ }
3282+ }
3283+
3284+ return true;
3285+}
3286+
3287+function _VirtualDom_diffNodes(x, y, patches, index, diffKids)
3288+{
3289+ // Bail if obvious indicators have changed. Implies more serious
3290+ // structural changes such that it's not worth it to diff.
3291+ if (x.c !== y.c || x.f !== y.f)
3292+ {
3293+ _VirtualDom_pushPatch(patches, 0, index, y);
3294+ return;
3295+ }
3296+
3297+ var factsDiff = _VirtualDom_diffFacts(x.d, y.d);
3298+ factsDiff && _VirtualDom_pushPatch(patches, 4, index, factsDiff);
3299+
3300+ diffKids(x, y, patches, index);
3301+}
3302+
3303+
3304+
3305+// DIFF FACTS
3306+
3307+
3308+// TODO Instead of creating a new diff object, it's possible to just test if
3309+// there *is* a diff. During the actual patch, do the diff again and make the
3310+// modifications directly. This way, there's no new allocations. Worth it?
3311+function _VirtualDom_diffFacts(x, y, category)
3312+{
3313+ var diff;
3314+
3315+ // look for changes and removals
3316+ for (var xKey in x)
3317+ {
3318+ if (xKey === 'a1' || xKey === 'a0' || xKey === 'a3' || xKey === 'a4')
3319+ {
3320+ var subDiff = _VirtualDom_diffFacts(x[xKey], y[xKey] || {}, xKey);
3321+ if (subDiff)
3322+ {
3323+ diff = diff || {};
3324+ diff[xKey] = subDiff;
3325+ }
3326+ continue;
3327+ }
3328+
3329+ // remove if not in the new facts
3330+ if (!(xKey in y))
3331+ {
3332+ diff = diff || {};
3333+ diff[xKey] =
3334+ !category
3335+ ? (typeof x[xKey] === 'string' ? '' : null)
3336+ :
3337+ (category === 'a1')
3338+ ? ''
3339+ :
3340+ (category === 'a0' || category === 'a3')
3341+ ? undefined
3342+ :
3343+ { f: x[xKey].f, o: undefined };
3344+
3345+ continue;
3346+ }
3347+
3348+ var xValue = x[xKey];
3349+ var yValue = y[xKey];
3350+
3351+ // reference equal, so don't worry about it
3352+ if (xValue === yValue && xKey !== 'value' && xKey !== 'checked'
3353+ || category === 'a0' && _VirtualDom_equalEvents(xValue, yValue))
3354+ {
3355+ continue;
3356+ }
3357+
3358+ diff = diff || {};
3359+ diff[xKey] = yValue;
3360+ }
3361+
3362+ // add new stuff
3363+ for (var yKey in y)
3364+ {
3365+ if (!(yKey in x))
3366+ {
3367+ diff = diff || {};
3368+ diff[yKey] = y[yKey];
3369+ }
3370+ }
3371+
3372+ return diff;
3373+}
3374+
3375+
3376+
3377+// DIFF KIDS
3378+
3379+
3380+function _VirtualDom_diffKids(xParent, yParent, patches, index)
3381+{
3382+ var xKids = xParent.e;
3383+ var yKids = yParent.e;
3384+
3385+ var xLen = xKids.length;
3386+ var yLen = yKids.length;
3387+
3388+ // FIGURE OUT IF THERE ARE INSERTS OR REMOVALS
3389+
3390+ if (xLen > yLen)
3391+ {
3392+ _VirtualDom_pushPatch(patches, 6, index, {
3393+ v: yLen,
3394+ i: xLen - yLen
3395+ });
3396+ }
3397+ else if (xLen < yLen)
3398+ {
3399+ _VirtualDom_pushPatch(patches, 7, index, {
3400+ v: xLen,
3401+ e: yKids
3402+ });
3403+ }
3404+
3405+ // PAIRWISE DIFF EVERYTHING ELSE
3406+
3407+ for (var minLen = xLen < yLen ? xLen : yLen, i = 0; i < minLen; i++)
3408+ {
3409+ var xKid = xKids[i];
3410+ _VirtualDom_diffHelp(xKid, yKids[i], patches, ++index);
3411+ index += xKid.b || 0;
3412+ }
3413+}
3414+
3415+
3416+
3417+// KEYED DIFF
3418+
3419+
3420+function _VirtualDom_diffKeyedKids(xParent, yParent, patches, rootIndex)
3421+{
3422+ var localPatches = [];
3423+
3424+ var changes = {}; // Dict String Entry
3425+ var inserts = []; // Array { index : Int, entry : Entry }
3426+ // type Entry = { tag : String, vnode : VNode, index : Int, data : _ }
3427+
3428+ var xKids = xParent.e;
3429+ var yKids = yParent.e;
3430+ var xLen = xKids.length;
3431+ var yLen = yKids.length;
3432+ var xIndex = 0;
3433+ var yIndex = 0;
3434+
3435+ var index = rootIndex;
3436+
3437+ while (xIndex < xLen && yIndex < yLen)
3438+ {
3439+ var x = xKids[xIndex];
3440+ var y = yKids[yIndex];
3441+
3442+ var xKey = x.a;
3443+ var yKey = y.a;
3444+ var xNode = x.b;
3445+ var yNode = y.b;
3446+
3447+ var newMatch = undefined;
3448+ var oldMatch = undefined;
3449+
3450+ // check if keys match
3451+
3452+ if (xKey === yKey)
3453+ {
3454+ index++;
3455+ _VirtualDom_diffHelp(xNode, yNode, localPatches, index);
3456+ index += xNode.b || 0;
3457+
3458+ xIndex++;
3459+ yIndex++;
3460+ continue;
3461+ }
3462+
3463+ // look ahead 1 to detect insertions and removals.
3464+
3465+ var xNext = xKids[xIndex + 1];
3466+ var yNext = yKids[yIndex + 1];
3467+
3468+ if (xNext)
3469+ {
3470+ var xNextKey = xNext.a;
3471+ var xNextNode = xNext.b;
3472+ oldMatch = yKey === xNextKey;
3473+ }
3474+
3475+ if (yNext)
3476+ {
3477+ var yNextKey = yNext.a;
3478+ var yNextNode = yNext.b;
3479+ newMatch = xKey === yNextKey;
3480+ }
3481+
3482+
3483+ // swap x and y
3484+ if (newMatch && oldMatch)
3485+ {
3486+ index++;
3487+ _VirtualDom_diffHelp(xNode, yNextNode, localPatches, index);
3488+ _VirtualDom_insertNode(changes, localPatches, xKey, yNode, yIndex, inserts);
3489+ index += xNode.b || 0;
3490+
3491+ index++;
3492+ _VirtualDom_removeNode(changes, localPatches, xKey, xNextNode, index);
3493+ index += xNextNode.b || 0;
3494+
3495+ xIndex += 2;
3496+ yIndex += 2;
3497+ continue;
3498+ }
3499+
3500+ // insert y
3501+ if (newMatch)
3502+ {
3503+ index++;
3504+ _VirtualDom_insertNode(changes, localPatches, yKey, yNode, yIndex, inserts);
3505+ _VirtualDom_diffHelp(xNode, yNextNode, localPatches, index);
3506+ index += xNode.b || 0;
3507+
3508+ xIndex += 1;
3509+ yIndex += 2;
3510+ continue;
3511+ }
3512+
3513+ // remove x
3514+ if (oldMatch)
3515+ {
3516+ index++;
3517+ _VirtualDom_removeNode(changes, localPatches, xKey, xNode, index);
3518+ index += xNode.b || 0;
3519+
3520+ index++;
3521+ _VirtualDom_diffHelp(xNextNode, yNode, localPatches, index);
3522+ index += xNextNode.b || 0;
3523+
3524+ xIndex += 2;
3525+ yIndex += 1;
3526+ continue;
3527+ }
3528+
3529+ // remove x, insert y
3530+ if (xNext && xNextKey === yNextKey)
3531+ {
3532+ index++;
3533+ _VirtualDom_removeNode(changes, localPatches, xKey, xNode, index);
3534+ _VirtualDom_insertNode(changes, localPatches, yKey, yNode, yIndex, inserts);
3535+ index += xNode.b || 0;
3536+
3537+ index++;
3538+ _VirtualDom_diffHelp(xNextNode, yNextNode, localPatches, index);
3539+ index += xNextNode.b || 0;
3540+
3541+ xIndex += 2;
3542+ yIndex += 2;
3543+ continue;
3544+ }
3545+
3546+ break;
3547+ }
3548+
3549+ // eat up any remaining nodes with removeNode and insertNode
3550+
3551+ while (xIndex < xLen)
3552+ {
3553+ index++;
3554+ var x = xKids[xIndex];
3555+ var xNode = x.b;
3556+ _VirtualDom_removeNode(changes, localPatches, x.a, xNode, index);
3557+ index += xNode.b || 0;
3558+ xIndex++;
3559+ }
3560+
3561+ while (yIndex < yLen)
3562+ {
3563+ var endInserts = endInserts || [];
3564+ var y = yKids[yIndex];
3565+ _VirtualDom_insertNode(changes, localPatches, y.a, y.b, undefined, endInserts);
3566+ yIndex++;
3567+ }
3568+
3569+ if (localPatches.length > 0 || inserts.length > 0 || endInserts)
3570+ {
3571+ _VirtualDom_pushPatch(patches, 8, rootIndex, {
3572+ w: localPatches,
3573+ x: inserts,
3574+ y: endInserts
3575+ });
3576+ }
3577+}
3578+
3579+
3580+
3581+// CHANGES FROM KEYED DIFF
3582+
3583+
3584+var _VirtualDom_POSTFIX = '_elmW6BL';
3585+
3586+
3587+function _VirtualDom_insertNode(changes, localPatches, key, vnode, yIndex, inserts)
3588+{
3589+ var entry = changes[key];
3590+
3591+ // never seen this key before
3592+ if (!entry)
3593+ {
3594+ entry = {
3595+ c: 0,
3596+ z: vnode,
3597+ r: yIndex,
3598+ s: undefined
3599+ };
3600+
3601+ inserts.push({ r: yIndex, A: entry });
3602+ changes[key] = entry;
3603+
3604+ return;
3605+ }
3606+
3607+ // this key was removed earlier, a match!
3608+ if (entry.c === 1)
3609+ {
3610+ inserts.push({ r: yIndex, A: entry });
3611+
3612+ entry.c = 2;
3613+ var subPatches = [];
3614+ _VirtualDom_diffHelp(entry.z, vnode, subPatches, entry.r);
3615+ entry.r = yIndex;
3616+ entry.s.s = {
3617+ w: subPatches,
3618+ A: entry
3619+ };
3620+
3621+ return;
3622+ }
3623+
3624+ // this key has already been inserted or moved, a duplicate!
3625+ _VirtualDom_insertNode(changes, localPatches, key + _VirtualDom_POSTFIX, vnode, yIndex, inserts);
3626+}
3627+
3628+
3629+function _VirtualDom_removeNode(changes, localPatches, key, vnode, index)
3630+{
3631+ var entry = changes[key];
3632+
3633+ // never seen this key before
3634+ if (!entry)
3635+ {
3636+ var patch = _VirtualDom_pushPatch(localPatches, 9, index, undefined);
3637+
3638+ changes[key] = {
3639+ c: 1,
3640+ z: vnode,
3641+ r: index,
3642+ s: patch
3643+ };
3644+
3645+ return;
3646+ }
3647+
3648+ // this key was inserted earlier, a match!
3649+ if (entry.c === 0)
3650+ {
3651+ entry.c = 2;
3652+ var subPatches = [];
3653+ _VirtualDom_diffHelp(vnode, entry.z, subPatches, index);
3654+
3655+ _VirtualDom_pushPatch(localPatches, 9, index, {
3656+ w: subPatches,
3657+ A: entry
3658+ });
3659+
3660+ return;
3661+ }
3662+
3663+ // this key has already been removed or moved, a duplicate!
3664+ _VirtualDom_removeNode(changes, localPatches, key + _VirtualDom_POSTFIX, vnode, index);
3665+}
3666+
3667+
3668+
3669+// ADD DOM NODES
3670+//
3671+// Each DOM node has an "index" assigned in order of traversal. It is important
3672+// to minimize our crawl over the actual DOM, so these indexes (along with the
3673+// descendantsCount of virtual nodes) let us skip touching entire subtrees of
3674+// the DOM if we know there are no patches there.
3675+
3676+
3677+function _VirtualDom_addDomNodes(domNode, vNode, patches, eventNode)
3678+{
3679+ _VirtualDom_addDomNodesHelp(domNode, vNode, patches, 0, 0, vNode.b, eventNode);
3680+}
3681+
3682+
3683+// assumes `patches` is non-empty and indexes increase monotonically.
3684+function _VirtualDom_addDomNodesHelp(domNode, vNode, patches, i, low, high, eventNode)
3685+{
3686+ var patch = patches[i];
3687+ var index = patch.r;
3688+
3689+ while (index === low)
3690+ {
3691+ var patchType = patch.$;
3692+
3693+ if (patchType === 1)
3694+ {
3695+ _VirtualDom_addDomNodes(domNode, vNode.k, patch.s, eventNode);
3696+ }
3697+ else if (patchType === 8)
3698+ {
3699+ patch.t = domNode;
3700+ patch.u = eventNode;
3701+
3702+ var subPatches = patch.s.w;
3703+ if (subPatches.length > 0)
3704+ {
3705+ _VirtualDom_addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode);
3706+ }
3707+ }
3708+ else if (patchType === 9)
3709+ {
3710+ patch.t = domNode;
3711+ patch.u = eventNode;
3712+
3713+ var data = patch.s;
3714+ if (data)
3715+ {
3716+ data.A.s = domNode;
3717+ var subPatches = data.w;
3718+ if (subPatches.length > 0)
3719+ {
3720+ _VirtualDom_addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode);
3721+ }
3722+ }
3723+ }
3724+ else
3725+ {
3726+ patch.t = domNode;
3727+ patch.u = eventNode;
3728+ }
3729+
3730+ i++;
3731+
3732+ if (!(patch = patches[i]) || (index = patch.r) > high)
3733+ {
3734+ return i;
3735+ }
3736+ }
3737+
3738+ var tag = vNode.$;
3739+
3740+ if (tag === 4)
3741+ {
3742+ var subNode = vNode.k;
3743+
3744+ while (subNode.$ === 4)
3745+ {
3746+ subNode = subNode.k;
3747+ }
3748+
3749+ return _VirtualDom_addDomNodesHelp(domNode, subNode, patches, i, low + 1, high, _VirtualDom_getMeta(domNode).elm_event_node_ref);
3750+ }
3751+
3752+ // tag must be 1 or 2 at this point
3753+
3754+ var vKids = vNode.e;
3755+ var childNodes = _Lynx_getChildren(domNode);
3756+ for (var j = 0; j < vKids.length; j++)
3757+ {
3758+ low++;
3759+ var vKid = tag === 1 ? vKids[j] : vKids[j].b;
3760+ var nextLow = low + (vKid.b || 0);
3761+ if (low <= index && index <= nextLow)
3762+ {
3763+ i = _VirtualDom_addDomNodesHelp(childNodes[j], vKid, patches, i, low, nextLow, eventNode);
3764+ if (!(patch = patches[i]) || (index = patch.r) > high)
3765+ {
3766+ return i;
3767+ }
3768+ }
3769+ low = nextLow;
3770+ }
3771+ return i;
3772+}
3773+
3774+
3775+
3776+// APPLY PATCHES
3777+
3778+
3779+function _VirtualDom_applyPatches(rootDomNode, oldVirtualNode, patches, eventNode)
3780+{
3781+ if (patches.length === 0)
3782+ {
3783+ return rootDomNode;
3784+ }
3785+
3786+ _VirtualDom_addDomNodes(rootDomNode, oldVirtualNode, patches, eventNode);
3787+ return _VirtualDom_applyPatchesHelp(rootDomNode, patches);
3788+}
3789+
3790+function _VirtualDom_applyPatchesHelp(rootDomNode, patches)
3791+{
3792+ for (var i = 0; i < patches.length; i++)
3793+ {
3794+ var patch = patches[i];
3795+ var localDomNode = patch.t
3796+ var newNode = _VirtualDom_applyPatch(localDomNode, patch);
3797+ if (localDomNode === rootDomNode)
3798+ {
3799+ rootDomNode = newNode;
3800+ }
3801+ }
3802+ return rootDomNode;
3803+}
3804+
3805+function _VirtualDom_applyPatch(domNode, patch)
3806+{
3807+ switch (patch.$)
3808+ {
3809+ case 0:
3810+ return _VirtualDom_applyPatchRedraw(domNode, patch.s, patch.u);
3811+
3812+ case 4:
3813+ _VirtualDom_applyFacts(domNode, patch.u, patch.s);
3814+ return domNode;
3815+
3816+ case 3:
3817+ _Lynx_setAttribute(domNode, 'text', patch.s);
3818+ return domNode;
3819+
3820+ case 1:
3821+ return _VirtualDom_applyPatchesHelp(domNode, patch.s);
3822+
3823+ case 2:
3824+ if (_VirtualDom_getMeta(domNode).elm_event_node_ref)
3825+ {
3826+ _VirtualDom_getMeta(domNode).elm_event_node_ref.j = patch.s;
3827+ }
3828+ else
3829+ {
3830+ _VirtualDom_getMeta(domNode).elm_event_node_ref = { j: patch.s, p: patch.u };
3831+ }
3832+ return domNode;
3833+
3834+ case 6:
3835+ var data = patch.s;
3836+ for (var i = 0; i < data.i; i++)
3837+ {
3838+ var children = _Lynx_getChildren(domNode);
3839+ _Lynx_removeElement(domNode, children[data.v]);
3840+ }
3841+ return domNode;
3842+
3843+ case 7:
3844+ var data = patch.s;
3845+ var kids = data.e;
3846+ for (var i = data.v; i < kids.length; i++)
3847+ {
3848+ _Lynx_appendChild(domNode, _VirtualDom_render(kids[i], patch.u));
3849+ }
3850+ return domNode;
3851+
3852+ case 9:
3853+ var data = patch.s;
3854+ if (!data)
3855+ {
3856+ _Lynx_removeElement(_Lynx_getParent(domNode), domNode);
3857+ return domNode;
3858+ }
3859+ var entry = data.A;
3860+ if (typeof entry.r !== 'undefined')
3861+ {
3862+ _Lynx_removeElement(_Lynx_getParent(domNode), domNode);
3863+ }
3864+ entry.s = _VirtualDom_applyPatchesHelp(domNode, data.w);
3865+ return domNode;
3866+
3867+ case 8:
3868+ return _VirtualDom_applyPatchReorder(domNode, patch);
3869+
3870+ case 5:
3871+ return patch.s(domNode);
3872+
3873+ default:
3874+ throw new Error('VirtualDom: unknown patch type');
3875+ }
3876+}
3877+
3878+
3879+function _VirtualDom_applyPatchRedraw(domNode, vNode, eventNode)
3880+{
3881+ var parentNode = _Lynx_getParent(domNode);
3882+ var newNode = _VirtualDom_render(vNode, eventNode);
3883+
3884+ if (!_VirtualDom_getMeta(newNode).elm_event_node_ref)
3885+ {
3886+ _VirtualDom_getMeta(newNode).elm_event_node_ref = _VirtualDom_getMeta(domNode).elm_event_node_ref;
3887+ }
3888+
3889+ if (parentNode && newNode !== domNode)
3890+ {
3891+ _Lynx_replaceElement(parentNode, newNode, domNode);
3892+ }
3893+ return newNode;
3894+}
3895+
3896+
3897+function _VirtualDom_applyPatchReorder(domNode, patch)
3898+{
3899+ var data = patch.s;
3900+
3901+ // remove end inserts
3902+ var endInsertNodes = _VirtualDom_applyPatchReorderEndInsertsHelp(data.y, patch);
3903+
3904+ // removals
3905+ domNode = _VirtualDom_applyPatchesHelp(domNode, data.w);
3906+
3907+ // inserts
3908+ var inserts = data.x;
3909+ for (var i = 0; i < inserts.length; i++)
3910+ {
3911+ var insert = inserts[i];
3912+ var entry = insert.A;
3913+ var node = entry.c === 2
3914+ ? entry.s
3915+ : _VirtualDom_render(entry.z, patch.u);
3916+ var children = _Lynx_getChildren(domNode);
3917+ _Lynx_insertBefore(domNode, node, children[insert.r]);
3918+ }
3919+
3920+ // add end inserts
3921+ if (endInsertNodes)
3922+ {
3923+ for (var i = 0; i < endInsertNodes.length; i++)
3924+ {
3925+ _Lynx_appendChild(domNode, endInsertNodes[i]);
3926+ }
3927+ }
3928+
3929+ return domNode;
3930+}
3931+
3932+
3933+function _VirtualDom_applyPatchReorderEndInsertsHelp(endInserts, patch)
3934+{
3935+ if (!endInserts)
3936+ {
3937+ return;
3938+ }
3939+
3940+ var nodes = [];
3941+ for (var i = 0; i < endInserts.length; i++)
3942+ {
3943+ var insert = endInserts[i];
3944+ var entry = insert.A;
3945+ nodes.push(entry.c === 2
3946+ ? entry.s
3947+ : _VirtualDom_render(entry.z, patch.u)
3948+ );
3949+ }
3950+ return nodes;
3951+}
3952+
3953+
3954+function _VirtualDom_dekey(keyedNode)
3955+{
3956+ var keyedKids = keyedNode.e;
3957+ var len = keyedKids.length;
3958+ var kids = new Array(len);
3959+ for (var i = 0; i < len; i++)
3960+ {
3961+ kids[i] = keyedKids[i].b;
3962+ }
3963+
3964+ return {
3965+ $: 1,
3966+ c: keyedNode.c,
3967+ d: keyedNode.d,
3968+ e: kids,
3969+ f: keyedNode.f,
3970+ b: keyedNode.b
3971+ };
3972+}
3973+
3974+
3975+
3976+// LYNXJS PAPI WRAPPERS
3977+var _Browser_lynx = (typeof globalThis !== 'undefined' ? globalThis : scope);
3978+function _Browser_newPage() {
3979+ return _Browser_lynx['page'];
3980+}
3981+function _Browser_flush() {
3982+ var fn = _Browser_lynx['_' + '_FlushElementTree'];
3983+ if (typeof fn === 'function') { fn(); }
3984+}
3985+
3986+
3987+
3988+// ELEMENT
3989+
3990+
3991+var _Browser_element = F4(function(impl, flagDecoder, debugMetadata, args)
3992+{
3993+ return _Platform_initialize(
3994+ flagDecoder,
3995+ args,
3996+ impl.init,
3997+ impl.update,
3998+ impl.subscriptions,
3999+ function(sendToApp, initialModel) {
4000+ var view = impl.view;
4001+ var domNode = args['node'] || _Browser_newPage();
4002+ var currNode = view(initialModel);
4003+ var currDomNode = _VirtualDom_render(currNode, sendToApp);
4004+ _VirtualDom_appendChild(domNode, currDomNode);
4005+ _Browser_flush();
4006+
4007+ return _Browser_makeAnimator(initialModel, function(model)
4008+ {
4009+ var nextNode = view(model);
4010+ var patches = _VirtualDom_diff(currNode, nextNode);
4011+ currDomNode = _VirtualDom_applyPatches(currDomNode, currNode, patches, sendToApp);
4012+ currNode = nextNode;
4013+ _Browser_flush();
4014+ });
4015+ }
4016+ );
4017+});
4018+
4019+
4020+
4021+// DOCUMENT
4022+
4023+
4024+var _Browser_document = F4(function(impl, flagDecoder, debugMetadata, args)
4025+{
4026+ return _Platform_initialize(
4027+ flagDecoder,
4028+ args,
4029+ impl.init,
4030+ impl.update,
4031+ impl.subscriptions,
4032+ function(sendToApp, initialModel) {
4033+ var view = impl.view;
4034+ var rootNode = args['node'] || _Browser_newPage();
4035+ var doc = view(initialModel);
4036+ var currNode = _VirtualDom_node('view')(_List_Nil)(doc.body);
4037+ var currDomNode = _VirtualDom_render(currNode, sendToApp);
4038+ _VirtualDom_appendChild(rootNode, currDomNode);
4039+ _Browser_flush();
4040+
4041+ return _Browser_makeAnimator(initialModel, function(model)
4042+ {
4043+ var doc = view(model);
4044+ var nextNode = _VirtualDom_node('view')(_List_Nil)(doc.body);
4045+ var patches = _VirtualDom_diff(currNode, nextNode);
4046+ currDomNode = _VirtualDom_applyPatches(currDomNode, currNode, patches, sendToApp);
4047+ currNode = nextNode;
4048+ _Browser_flush();
4049+ });
4050+ }
4051+ );
4052+});
4053+
4054+
4055+
4056+// ANIMATION
4057+
4058+
4059+var _Browser_cancelAnimationFrame =
4060+ function(id) { clearTimeout(id); };
4061+
4062+var _Browser_requestAnimationFrame =
4063+ function(callback) { return setTimeout(callback, 1000 / 60); };
4064+
4065+
4066+function _Browser_makeAnimator(model, draw)
4067+{
4068+ draw(model);
4069+
4070+ var state = 0;
4071+
4072+ function updateIfNeeded()
4073+ {
4074+ state = state === 1
4075+ ? 0
4076+ : ( _Browser_requestAnimationFrame(updateIfNeeded), draw(model), 1 );
4077+ }
4078+
4079+ return function(nextModel, isSync)
4080+ {
4081+ model = nextModel;
4082+
4083+ isSync
4084+ ? ( draw(model),
4085+ state === 2 && (state = 1)
4086+ )
4087+ : ( state === 0 && _Browser_requestAnimationFrame(updateIfNeeded),
4088+ state = 2
4089+ );
4090+ };
4091+}
4092+
4093+
4094+
4095+// APPLICATION
4096+
4097+
4098+function _Browser_application(impl)
4099+{
4100+ return _Browser_document({
4101+ init: function(flags)
4102+ {
4103+ return A3(impl.init, flags, _Browser_fakeUrl(), {});
4104+ },
4105+ view: impl.view,
4106+ update: impl.update,
4107+ subscriptions: impl.subscriptions
4108+ });
4109+}
4110+
4111+function _Browser_fakeUrl()
4112+{
4113+ return {
4114+ protocol: { $: 0 },
4115+ host: 'localhost',
4116+ port_: { $: 1 },
4117+ path: '/',
4118+ query: { $: 1 },
4119+ fragment: { $: 1 }
4120+ };
4121+}
4122+
4123+
4124+
4125+var _Browser_go = F2(function(key, n)
4126+{
4127+ return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() {
4128+ // no-op in LynxJS
4129+ key();
4130+ }));
4131+});
4132+
4133+var _Browser_pushUrl = F2(function(key, url)
4134+{
4135+ return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() {
4136+ // no-op in LynxJS
4137+ key();
4138+ }));
4139+});
4140+
4141+var _Browser_replaceUrl = F2(function(key, url)
4142+{
4143+ return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() {
4144+ // no-op in LynxJS
4145+ key();
4146+ }));
4147+});
4148+
4149+
4150+
4151+// GLOBAL EVENTS
4152+
4153+
4154+var _Browser_fakeNode = { addEventListener: function() {}, removeEventListener: function() {} };
4155+var _Browser_doc = typeof document !== 'undefined' ? document : _Browser_fakeNode;
4156+var _Browser_window = typeof window !== 'undefined' ? window : _Browser_fakeNode;
4157+
4158+var _Browser_on = F3(function(node, eventName, sendToSelf)
4159+{
4160+ return _Scheduler_spawn(_Scheduler_binding(function(callback)
4161+ {
4162+ return function() {};
4163+ }));
4164+});
4165+
4166+var _Browser_decodeEvent = F2(function(decoder, event)
4167+{
4168+ var result = _Json_runHelp(decoder, event);
4169+ return $elm$core$Result$isOk(result) ? $elm$core$Maybe$Just(result.a) : $elm$core$Maybe$Nothing;
4170+});
4171+
4172+
4173+
4174+// PAGE VISIBILITY
4175+
4176+
4177+function _Browser_visibilityInfo()
4178+{
4179+ return (typeof _VirtualDom_doc.hidden !== 'undefined')
4180+ ? { hidden: 'hidden', change: 'visibilitychange' }
4181+ :
4182+ (typeof _VirtualDom_doc.mozHidden !== 'undefined')
4183+ ? { hidden: 'mozHidden', change: 'mozvisibilitychange' }
4184+ :
4185+ (typeof _VirtualDom_doc.msHidden !== 'undefined')
4186+ ? { hidden: 'msHidden', change: 'msvisibilitychange' }
4187+ :
4188+ (typeof _VirtualDom_doc.webkitHidden !== 'undefined')
4189+ ? { hidden: 'webkitHidden', change: 'webkitvisibilitychange' }
4190+ : { hidden: 'hidden', change: 'visibilitychange' };
4191+}
4192+
4193+
4194+
4195+// ANIMATION FRAMES
4196+
4197+
4198+function _Browser_rAF()
4199+{
4200+ return _Scheduler_binding(function(callback)
4201+ {
4202+ var id = _Browser_requestAnimationFrame(function() {
4203+ callback(_Scheduler_succeed(Date.now()));
4204+ });
4205+
4206+ return function() {
4207+ _Browser_cancelAnimationFrame(id);
4208+ };
4209+ });
4210+}
4211+
4212+
4213+function _Browser_now()
4214+{
4215+ return _Scheduler_binding(function(callback)
4216+ {
4217+ callback(_Scheduler_succeed(Date.now()));
4218+ });
4219+}
4220+
4221+
4222+
4223+// DOM STUFF
4224+
4225+
4226+function _Browser_withNode(id, doStuff)
4227+{
4228+ return _Scheduler_binding(function(callback)
4229+ {
4230+ callback(_Scheduler_fail($lynxjs_elm$browser$Browser$Dom$NotFound(id)));
4231+ });
4232+}
4233+
4234+
4235+function _Browser_withWindow(doStuff)
4236+{
4237+ return _Scheduler_binding(function(callback)
4238+ {
4239+ _Browser_requestAnimationFrame(function() {
4240+ callback(_Scheduler_succeed(doStuff()));
4241+ });
4242+ });
4243+}
4244+
4245+
4246+// FOCUS and BLUR
4247+
4248+
4249+var _Browser_call = F2(function(functionName, id)
4250+{
4251+ return _Browser_withNode(id, function(node) {
4252+ node[functionName]();
4253+ return _Utils_Tuple0;
4254+ });
4255+});
4256+
4257+
4258+
4259+// WINDOW VIEWPORT
4260+
4261+
4262+function _Browser_getViewport()
4263+{
4264+ return {
4265+ scene: _Browser_getScene(),
4266+ viewport: {
4267+ x: _Browser_window.pageXOffset,
4268+ y: _Browser_window.pageYOffset,
4269+ width: _Browser_doc.documentElement.clientWidth,
4270+ height: _Browser_doc.documentElement.clientHeight
4271+ }
4272+ };
4273+}
4274+
4275+function _Browser_getScene()
4276+{
4277+ var body = _Browser_doc.body;
4278+ var elem = _Browser_doc.documentElement;
4279+ return {
4280+ width: Math.max(body.scrollWidth, body.offsetWidth, elem.scrollWidth, elem.offsetWidth, elem.clientWidth),
4281+ height: Math.max(body.scrollHeight, body.offsetHeight, elem.scrollHeight, elem.offsetHeight, elem.clientHeight)
4282+ };
4283+}
4284+
4285+var _Browser_setViewport = F2(function(x, y)
4286+{
4287+ return _Browser_withWindow(function()
4288+ {
4289+ _Browser_window.scroll(x, y);
4290+ return _Utils_Tuple0;
4291+ });
4292+});
4293+
4294+
4295+
4296+// ELEMENT VIEWPORT
4297+
4298+
4299+function _Browser_getViewportOf(id)
4300+{
4301+ return _Browser_withNode(id, function(node)
4302+ {
4303+ return {
4304+ scene: {
4305+ width: node.scrollWidth,
4306+ height: node.scrollHeight
4307+ },
4308+ viewport: {
4309+ x: node.scrollLeft,
4310+ y: node.scrollTop,
4311+ width: node.clientWidth,
4312+ height: node.clientHeight
4313+ }
4314+ };
4315+ });
4316+}
4317+
4318+
4319+var _Browser_setViewportOf = F3(function(id, x, y)
4320+{
4321+ return _Browser_withNode(id, function(node)
4322+ {
4323+ node.scrollLeft = x;
4324+ node.scrollTop = y;
4325+ return _Utils_Tuple0;
4326+ });
4327+});
4328+
4329+
4330+
4331+// ELEMENT
4332+
4333+
4334+function _Browser_getElement(id)
4335+{
4336+ return _Browser_withNode(id, function(node)
4337+ {
4338+ var rect = node.getBoundingClientRect();
4339+ var x = _Browser_window.pageXOffset;
4340+ var y = _Browser_window.pageYOffset;
4341+ return {
4342+ scene: _Browser_getScene(),
4343+ viewport: {
4344+ x: x,
4345+ y: y,
4346+ width: _Browser_doc.documentElement.clientWidth,
4347+ height: _Browser_doc.documentElement.clientHeight
4348+ },
4349+ element: {
4350+ x: x + rect.left,
4351+ y: y + rect.top,
4352+ width: rect.width,
4353+ height: rect.height
4354+ }
4355+ };
4356+ });
4357+}
4358+
4359+
4360+
4361+// LOAD and RELOAD
4362+
4363+
4364+function _Browser_reload(skipCache)
4365+{
4366+ return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function(callback)
4367+ {
4368+ // no-op in LynxJS
4369+ }));
4370+}
4371+
4372+function _Browser_load(url)
4373+{
4374+ return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function(callback)
4375+ {
4376+ try
4377+ {
4378+ // no-op in LynxJS
4379+ }
4380+ catch(err)
4381+ {
4382+ // Only Firefox can throw a NS_ERROR_MALFORMED_URI exception here.
4383+ // Other browsers reload the page, so let's be consistent about that.
4384+ // no-op in LynxJS
4385+ }
4386+ }));
4387+}
4388+var $author$project$Main$init = {count: 0};
4389+var $elm$core$List$cons = _List_cons;
4390+var $elm$core$Elm$JsArray$foldr = _JsArray_foldr;
4391+var $elm$core$Array$foldr = F3(
4392+ function (func, baseCase, _v0) {
4393+ var tree = _v0.c;
4394+ var tail = _v0.d;
4395+ var helper = F2(
4396+ function (node, acc) {
4397+ if (node.$ === 'SubTree') {
4398+ var subTree = node.a;
4399+ return A3($elm$core$Elm$JsArray$foldr, helper, acc, subTree);
4400+ } else {
4401+ var values = node.a;
4402+ return A3($elm$core$Elm$JsArray$foldr, func, acc, values);
4403+ }
4404+ });
4405+ return A3(
4406+ $elm$core$Elm$JsArray$foldr,
4407+ helper,
4408+ A3($elm$core$Elm$JsArray$foldr, func, baseCase, tail),
4409+ tree);
4410+ });
4411+var $elm$core$Array$toList = function (array) {
4412+ return A3($elm$core$Array$foldr, $elm$core$List$cons, _List_Nil, array);
4413+};
4414+var $elm$core$Dict$foldr = F3(
4415+ function (func, acc, t) {
4416+ foldr:
4417+ while (true) {
4418+ if (t.$ === 'RBEmpty_elm_builtin') {
4419+ return acc;
4420+ } else {
4421+ var key = t.b;
4422+ var value = t.c;
4423+ var left = t.d;
4424+ var right = t.e;
4425+ var $temp$func = func,
4426+ $temp$acc = A3(
4427+ func,
4428+ key,
4429+ value,
4430+ A3($elm$core$Dict$foldr, func, acc, right)),
4431+ $temp$t = left;
4432+ func = $temp$func;
4433+ acc = $temp$acc;
4434+ t = $temp$t;
4435+ continue foldr;
4436+ }
4437+ }
4438+ });
4439+var $elm$core$Dict$toList = function (dict) {
4440+ return A3(
4441+ $elm$core$Dict$foldr,
4442+ F3(
4443+ function (key, value, list) {
4444+ return A2(
4445+ $elm$core$List$cons,
4446+ _Utils_Tuple2(key, value),
4447+ list);
4448+ }),
4449+ _List_Nil,
4450+ dict);
4451+};
4452+var $elm$core$Dict$keys = function (dict) {
4453+ return A3(
4454+ $elm$core$Dict$foldr,
4455+ F3(
4456+ function (key, value, keyList) {
4457+ return A2($elm$core$List$cons, key, keyList);
4458+ }),
4459+ _List_Nil,
4460+ dict);
4461+};
4462+var $elm$core$Set$toList = function (_v0) {
4463+ var dict = _v0.a;
4464+ return $elm$core$Dict$keys(dict);
4465+};
4466+var $elm$core$Basics$EQ = {$: 'EQ'};
4467+var $elm$core$Basics$GT = {$: 'GT'};
4468+var $elm$core$Basics$LT = {$: 'LT'};
4469+var $elm$core$Result$Err = function (a) {
4470+ return {$: 'Err', a: a};
4471+};
4472+var $elm$json$Json$Decode$Failure = F2(
4473+ function (a, b) {
4474+ return {$: 'Failure', a: a, b: b};
4475+ });
4476+var $elm$json$Json$Decode$Field = F2(
4477+ function (a, b) {
4478+ return {$: 'Field', a: a, b: b};
4479+ });
4480+var $elm$json$Json$Decode$Index = F2(
4481+ function (a, b) {
4482+ return {$: 'Index', a: a, b: b};
4483+ });
4484+var $elm$core$Result$Ok = function (a) {
4485+ return {$: 'Ok', a: a};
4486+};
4487+var $elm$json$Json$Decode$OneOf = function (a) {
4488+ return {$: 'OneOf', a: a};
4489+};
4490+var $elm$core$Basics$False = {$: 'False'};
4491+var $elm$core$Basics$add = _Basics_add;
4492+var $elm$core$Maybe$Just = function (a) {
4493+ return {$: 'Just', a: a};
4494+};
4495+var $elm$core$Maybe$Nothing = {$: 'Nothing'};
4496+var $elm$core$String$all = _String_all;
4497+var $elm$core$Basics$and = _Basics_and;
4498+var $elm$core$Basics$append = _Utils_append;
4499+var $elm$json$Json$Encode$encode = _Json_encode;
4500+var $elm$core$String$fromInt = _String_fromNumber;
4501+var $elm$core$String$join = F2(
4502+ function (sep, chunks) {
4503+ return A2(
4504+ _String_join,
4505+ sep,
4506+ _List_toArray(chunks));
4507+ });
4508+var $elm$core$String$split = F2(
4509+ function (sep, string) {
4510+ return _List_fromArray(
4511+ A2(_String_split, sep, string));
4512+ });
4513+var $elm$json$Json$Decode$indent = function (str) {
4514+ return A2(
4515+ $elm$core$String$join,
4516+ '\n ',
4517+ A2($elm$core$String$split, '\n', str));
4518+};
4519+var $elm$core$List$foldl = F3(
4520+ function (func, acc, list) {
4521+ foldl:
4522+ while (true) {
4523+ if (!list.b) {
4524+ return acc;
4525+ } else {
4526+ var x = list.a;
4527+ var xs = list.b;
4528+ var $temp$func = func,
4529+ $temp$acc = A2(func, x, acc),
4530+ $temp$list = xs;
4531+ func = $temp$func;
4532+ acc = $temp$acc;
4533+ list = $temp$list;
4534+ continue foldl;
4535+ }
4536+ }
4537+ });
4538+var $elm$core$List$length = function (xs) {
4539+ return A3(
4540+ $elm$core$List$foldl,
4541+ F2(
4542+ function (_v0, i) {
4543+ return i + 1;
4544+ }),
4545+ 0,
4546+ xs);
4547+};
4548+var $elm$core$List$map2 = _List_map2;
4549+var $elm$core$Basics$le = _Utils_le;
4550+var $elm$core$Basics$sub = _Basics_sub;
4551+var $elm$core$List$rangeHelp = F3(
4552+ function (lo, hi, list) {
4553+ rangeHelp:
4554+ while (true) {
4555+ if (_Utils_cmp(lo, hi) < 1) {
4556+ var $temp$lo = lo,
4557+ $temp$hi = hi - 1,
4558+ $temp$list = A2($elm$core$List$cons, hi, list);
4559+ lo = $temp$lo;
4560+ hi = $temp$hi;
4561+ list = $temp$list;
4562+ continue rangeHelp;
4563+ } else {
4564+ return list;
4565+ }
4566+ }
4567+ });
4568+var $elm$core$List$range = F2(
4569+ function (lo, hi) {
4570+ return A3($elm$core$List$rangeHelp, lo, hi, _List_Nil);
4571+ });
4572+var $elm$core$List$indexedMap = F2(
4573+ function (f, xs) {
4574+ return A3(
4575+ $elm$core$List$map2,
4576+ f,
4577+ A2(
4578+ $elm$core$List$range,
4579+ 0,
4580+ $elm$core$List$length(xs) - 1),
4581+ xs);
4582+ });
4583+var $elm$core$Char$toCode = _Char_toCode;
4584+var $elm$core$Char$isLower = function (_char) {
4585+ var code = $elm$core$Char$toCode(_char);
4586+ return (97 <= code) && (code <= 122);
4587+};
4588+var $elm$core$Char$isUpper = function (_char) {
4589+ var code = $elm$core$Char$toCode(_char);
4590+ return (code <= 90) && (65 <= code);
4591+};
4592+var $elm$core$Basics$or = _Basics_or;
4593+var $elm$core$Char$isAlpha = function (_char) {
4594+ return $elm$core$Char$isLower(_char) || $elm$core$Char$isUpper(_char);
4595+};
4596+var $elm$core$Char$isDigit = function (_char) {
4597+ var code = $elm$core$Char$toCode(_char);
4598+ return (code <= 57) && (48 <= code);
4599+};
4600+var $elm$core$Char$isAlphaNum = function (_char) {
4601+ return $elm$core$Char$isLower(_char) || ($elm$core$Char$isUpper(_char) || $elm$core$Char$isDigit(_char));
4602+};
4603+var $elm$core$List$reverse = function (list) {
4604+ return A3($elm$core$List$foldl, $elm$core$List$cons, _List_Nil, list);
4605+};
4606+var $elm$core$String$uncons = _String_uncons;
4607+var $elm$json$Json$Decode$errorOneOf = F2(
4608+ function (i, error) {
4609+ return '\n\n(' + ($elm$core$String$fromInt(i + 1) + (') ' + $elm$json$Json$Decode$indent(
4610+ $elm$json$Json$Decode$errorToString(error))));
4611+ });
4612+var $elm$json$Json$Decode$errorToString = function (error) {
4613+ return A2($elm$json$Json$Decode$errorToStringHelp, error, _List_Nil);
4614+};
4615+var $elm$json$Json$Decode$errorToStringHelp = F2(
4616+ function (error, context) {
4617+ errorToStringHelp:
4618+ while (true) {
4619+ switch (error.$) {
4620+ case 'Field':
4621+ var f = error.a;
4622+ var err = error.b;
4623+ var isSimple = function () {
4624+ var _v1 = $elm$core$String$uncons(f);
4625+ if (_v1.$ === 'Nothing') {
4626+ return false;
4627+ } else {
4628+ var _v2 = _v1.a;
4629+ var _char = _v2.a;
4630+ var rest = _v2.b;
4631+ return $elm$core$Char$isAlpha(_char) && A2($elm$core$String$all, $elm$core$Char$isAlphaNum, rest);
4632+ }
4633+ }();
4634+ var fieldName = isSimple ? ('.' + f) : ('[\'' + (f + '\']'));
4635+ var $temp$error = err,
4636+ $temp$context = A2($elm$core$List$cons, fieldName, context);
4637+ error = $temp$error;
4638+ context = $temp$context;
4639+ continue errorToStringHelp;
4640+ case 'Index':
4641+ var i = error.a;
4642+ var err = error.b;
4643+ var indexName = '[' + ($elm$core$String$fromInt(i) + ']');
4644+ var $temp$error = err,
4645+ $temp$context = A2($elm$core$List$cons, indexName, context);
4646+ error = $temp$error;
4647+ context = $temp$context;
4648+ continue errorToStringHelp;
4649+ case 'OneOf':
4650+ var errors = error.a;
4651+ if (!errors.b) {
4652+ return 'Ran into a Json.Decode.oneOf with no possibilities' + function () {
4653+ if (!context.b) {
4654+ return '!';
4655+ } else {
4656+ return ' at json' + A2(
4657+ $elm$core$String$join,
4658+ '',
4659+ $elm$core$List$reverse(context));
4660+ }
4661+ }();
4662+ } else {
4663+ if (!errors.b.b) {
4664+ var err = errors.a;
4665+ var $temp$error = err,
4666+ $temp$context = context;
4667+ error = $temp$error;
4668+ context = $temp$context;
4669+ continue errorToStringHelp;
4670+ } else {
4671+ var starter = function () {
4672+ if (!context.b) {
4673+ return 'Json.Decode.oneOf';
4674+ } else {
4675+ return 'The Json.Decode.oneOf at json' + A2(
4676+ $elm$core$String$join,
4677+ '',
4678+ $elm$core$List$reverse(context));
4679+ }
4680+ }();
4681+ var introduction = starter + (' failed in the following ' + ($elm$core$String$fromInt(
4682+ $elm$core$List$length(errors)) + ' ways:'));
4683+ return A2(
4684+ $elm$core$String$join,
4685+ '\n\n',
4686+ A2(
4687+ $elm$core$List$cons,
4688+ introduction,
4689+ A2($elm$core$List$indexedMap, $elm$json$Json$Decode$errorOneOf, errors)));
4690+ }
4691+ }
4692+ default:
4693+ var msg = error.a;
4694+ var json = error.b;
4695+ var introduction = function () {
4696+ if (!context.b) {
4697+ return 'Problem with the given value:\n\n';
4698+ } else {
4699+ return 'Problem with the value at json' + (A2(
4700+ $elm$core$String$join,
4701+ '',
4702+ $elm$core$List$reverse(context)) + ':\n\n ');
4703+ }
4704+ }();
4705+ return introduction + ($elm$json$Json$Decode$indent(
4706+ A2($elm$json$Json$Encode$encode, 4, json)) + ('\n\n' + msg));
4707+ }
4708+ }
4709+ });
4710+var $elm$core$Array$branchFactor = 32;
4711+var $elm$core$Array$Array_elm_builtin = F4(
4712+ function (a, b, c, d) {
4713+ return {$: 'Array_elm_builtin', a: a, b: b, c: c, d: d};
4714+ });
4715+var $elm$core$Elm$JsArray$empty = _JsArray_empty;
4716+var $elm$core$Basics$ceiling = _Basics_ceiling;
4717+var $elm$core$Basics$fdiv = _Basics_fdiv;
4718+var $elm$core$Basics$logBase = F2(
4719+ function (base, number) {
4720+ return _Basics_log(number) / _Basics_log(base);
4721+ });
4722+var $elm$core$Basics$toFloat = _Basics_toFloat;
4723+var $elm$core$Array$shiftStep = $elm$core$Basics$ceiling(
4724+ A2($elm$core$Basics$logBase, 2, $elm$core$Array$branchFactor));
4725+var $elm$core$Array$empty = A4($elm$core$Array$Array_elm_builtin, 0, $elm$core$Array$shiftStep, $elm$core$Elm$JsArray$empty, $elm$core$Elm$JsArray$empty);
4726+var $elm$core$Elm$JsArray$initialize = _JsArray_initialize;
4727+var $elm$core$Array$Leaf = function (a) {
4728+ return {$: 'Leaf', a: a};
4729+};
4730+var $elm$core$Basics$apL = F2(
4731+ function (f, x) {
4732+ return f(x);
4733+ });
4734+var $elm$core$Basics$apR = F2(
4735+ function (x, f) {
4736+ return f(x);
4737+ });
4738+var $elm$core$Basics$eq = _Utils_equal;
4739+var $elm$core$Basics$floor = _Basics_floor;
4740+var $elm$core$Elm$JsArray$length = _JsArray_length;
4741+var $elm$core$Basics$gt = _Utils_gt;
4742+var $elm$core$Basics$max = F2(
4743+ function (x, y) {
4744+ return (_Utils_cmp(x, y) > 0) ? x : y;
4745+ });
4746+var $elm$core$Basics$mul = _Basics_mul;
4747+var $elm$core$Array$SubTree = function (a) {
4748+ return {$: 'SubTree', a: a};
4749+};
4750+var $elm$core$Elm$JsArray$initializeFromList = _JsArray_initializeFromList;
4751+var $elm$core$Array$compressNodes = F2(
4752+ function (nodes, acc) {
4753+ compressNodes:
4754+ while (true) {
4755+ var _v0 = A2($elm$core$Elm$JsArray$initializeFromList, $elm$core$Array$branchFactor, nodes);
4756+ var node = _v0.a;
4757+ var remainingNodes = _v0.b;
4758+ var newAcc = A2(
4759+ $elm$core$List$cons,
4760+ $elm$core$Array$SubTree(node),
4761+ acc);
4762+ if (!remainingNodes.b) {
4763+ return $elm$core$List$reverse(newAcc);
4764+ } else {
4765+ var $temp$nodes = remainingNodes,
4766+ $temp$acc = newAcc;
4767+ nodes = $temp$nodes;
4768+ acc = $temp$acc;
4769+ continue compressNodes;
4770+ }
4771+ }
4772+ });
4773+var $elm$core$Tuple$first = function (_v0) {
4774+ var x = _v0.a;
4775+ return x;
4776+};
4777+var $elm$core$Array$treeFromBuilder = F2(
4778+ function (nodeList, nodeListSize) {
4779+ treeFromBuilder:
4780+ while (true) {
4781+ var newNodeSize = $elm$core$Basics$ceiling(nodeListSize / $elm$core$Array$branchFactor);
4782+ if (newNodeSize === 1) {
4783+ return A2($elm$core$Elm$JsArray$initializeFromList, $elm$core$Array$branchFactor, nodeList).a;
4784+ } else {
4785+ var $temp$nodeList = A2($elm$core$Array$compressNodes, nodeList, _List_Nil),
4786+ $temp$nodeListSize = newNodeSize;
4787+ nodeList = $temp$nodeList;
4788+ nodeListSize = $temp$nodeListSize;
4789+ continue treeFromBuilder;
4790+ }
4791+ }
4792+ });
4793+var $elm$core$Array$builderToArray = F2(
4794+ function (reverseNodeList, builder) {
4795+ if (!builder.nodeListSize) {
4796+ return A4(
4797+ $elm$core$Array$Array_elm_builtin,
4798+ $elm$core$Elm$JsArray$length(builder.tail),
4799+ $elm$core$Array$shiftStep,
4800+ $elm$core$Elm$JsArray$empty,
4801+ builder.tail);
4802+ } else {
4803+ var treeLen = builder.nodeListSize * $elm$core$Array$branchFactor;
4804+ var depth = $elm$core$Basics$floor(
4805+ A2($elm$core$Basics$logBase, $elm$core$Array$branchFactor, treeLen - 1));
4806+ var correctNodeList = reverseNodeList ? $elm$core$List$reverse(builder.nodeList) : builder.nodeList;
4807+ var tree = A2($elm$core$Array$treeFromBuilder, correctNodeList, builder.nodeListSize);
4808+ return A4(
4809+ $elm$core$Array$Array_elm_builtin,
4810+ $elm$core$Elm$JsArray$length(builder.tail) + treeLen,
4811+ A2($elm$core$Basics$max, 5, depth * $elm$core$Array$shiftStep),
4812+ tree,
4813+ builder.tail);
4814+ }
4815+ });
4816+var $elm$core$Basics$idiv = _Basics_idiv;
4817+var $elm$core$Basics$lt = _Utils_lt;
4818+var $elm$core$Array$initializeHelp = F5(
4819+ function (fn, fromIndex, len, nodeList, tail) {
4820+ initializeHelp:
4821+ while (true) {
4822+ if (fromIndex < 0) {
4823+ return A2(
4824+ $elm$core$Array$builderToArray,
4825+ false,
4826+ {nodeList: nodeList, nodeListSize: (len / $elm$core$Array$branchFactor) | 0, tail: tail});
4827+ } else {
4828+ var leaf = $elm$core$Array$Leaf(
4829+ A3($elm$core$Elm$JsArray$initialize, $elm$core$Array$branchFactor, fromIndex, fn));
4830+ var $temp$fn = fn,
4831+ $temp$fromIndex = fromIndex - $elm$core$Array$branchFactor,
4832+ $temp$len = len,
4833+ $temp$nodeList = A2($elm$core$List$cons, leaf, nodeList),
4834+ $temp$tail = tail;
4835+ fn = $temp$fn;
4836+ fromIndex = $temp$fromIndex;
4837+ len = $temp$len;
4838+ nodeList = $temp$nodeList;
4839+ tail = $temp$tail;
4840+ continue initializeHelp;
4841+ }
4842+ }
4843+ });
4844+var $elm$core$Basics$remainderBy = _Basics_remainderBy;
4845+var $elm$core$Array$initialize = F2(
4846+ function (len, fn) {
4847+ if (len <= 0) {
4848+ return $elm$core$Array$empty;
4849+ } else {
4850+ var tailLen = len % $elm$core$Array$branchFactor;
4851+ var tail = A3($elm$core$Elm$JsArray$initialize, tailLen, len - tailLen, fn);
4852+ var initialFromIndex = (len - tailLen) - $elm$core$Array$branchFactor;
4853+ return A5($elm$core$Array$initializeHelp, fn, initialFromIndex, len, _List_Nil, tail);
4854+ }
4855+ });
4856+var $elm$core$Basics$True = {$: 'True'};
4857+var $elm$core$Result$isOk = function (result) {
4858+ if (result.$ === 'Ok') {
4859+ return true;
4860+ } else {
4861+ return false;
4862+ }
4863+};
4864+var $elm$json$Json$Decode$map = _Json_map1;
4865+var $elm$json$Json$Decode$map2 = _Json_map2;
4866+var $elm$json$Json$Decode$succeed = _Json_succeed;
4867+var $lynxjs_elm$virtual_dom$VirtualDom$toHandlerInt = function (handler) {
4868+ switch (handler.$) {
4869+ case 'Normal':
4870+ return 0;
4871+ case 'MayStopPropagation':
4872+ return 1;
4873+ case 'MayPreventDefault':
4874+ return 2;
4875+ default:
4876+ return 3;
4877+ }
4878+};
4879+var $elm$core$Basics$identity = function (x) {
4880+ return x;
4881+};
4882+var $lynxjs_elm$browser$Browser$Dom$NotFound = function (a) {
4883+ return {$: 'NotFound', a: a};
4884+};
4885+var $elm$core$Basics$never = function (_v0) {
4886+ never:
4887+ while (true) {
4888+ var nvr = _v0.a;
4889+ var $temp$_v0 = nvr;
4890+ _v0 = $temp$_v0;
4891+ continue never;
4892+ }
4893+};
4894+var $elm$core$Task$Perform = function (a) {
4895+ return {$: 'Perform', a: a};
4896+};
4897+var $elm$core$Task$succeed = _Scheduler_succeed;
4898+var $elm$core$Task$init = $elm$core$Task$succeed(_Utils_Tuple0);
4899+var $elm$core$List$foldrHelper = F4(
4900+ function (fn, acc, ctr, ls) {
4901+ if (!ls.b) {
4902+ return acc;
4903+ } else {
4904+ var a = ls.a;
4905+ var r1 = ls.b;
4906+ if (!r1.b) {
4907+ return A2(fn, a, acc);
4908+ } else {
4909+ var b = r1.a;
4910+ var r2 = r1.b;
4911+ if (!r2.b) {
4912+ return A2(
4913+ fn,
4914+ a,
4915+ A2(fn, b, acc));
4916+ } else {
4917+ var c = r2.a;
4918+ var r3 = r2.b;
4919+ if (!r3.b) {
4920+ return A2(
4921+ fn,
4922+ a,
4923+ A2(
4924+ fn,
4925+ b,
4926+ A2(fn, c, acc)));
4927+ } else {
4928+ var d = r3.a;
4929+ var r4 = r3.b;
4930+ var res = (ctr > 500) ? A3(
4931+ $elm$core$List$foldl,
4932+ fn,
4933+ acc,
4934+ $elm$core$List$reverse(r4)) : A4($elm$core$List$foldrHelper, fn, acc, ctr + 1, r4);
4935+ return A2(
4936+ fn,
4937+ a,
4938+ A2(
4939+ fn,
4940+ b,
4941+ A2(
4942+ fn,
4943+ c,
4944+ A2(fn, d, res))));
4945+ }
4946+ }
4947+ }
4948+ }
4949+ });
4950+var $elm$core$List$foldr = F3(
4951+ function (fn, acc, ls) {
4952+ return A4($elm$core$List$foldrHelper, fn, acc, 0, ls);
4953+ });
4954+var $elm$core$List$map = F2(
4955+ function (f, xs) {
4956+ return A3(
4957+ $elm$core$List$foldr,
4958+ F2(
4959+ function (x, acc) {
4960+ return A2(
4961+ $elm$core$List$cons,
4962+ f(x),
4963+ acc);
4964+ }),
4965+ _List_Nil,
4966+ xs);
4967+ });
4968+var $elm$core$Task$andThen = _Scheduler_andThen;
4969+var $elm$core$Task$map = F2(
4970+ function (func, taskA) {
4971+ return A2(
4972+ $elm$core$Task$andThen,
4973+ function (a) {
4974+ return $elm$core$Task$succeed(
4975+ func(a));
4976+ },
4977+ taskA);
4978+ });
4979+var $elm$core$Task$map2 = F3(
4980+ function (func, taskA, taskB) {
4981+ return A2(
4982+ $elm$core$Task$andThen,
4983+ function (a) {
4984+ return A2(
4985+ $elm$core$Task$andThen,
4986+ function (b) {
4987+ return $elm$core$Task$succeed(
4988+ A2(func, a, b));
4989+ },
4990+ taskB);
4991+ },
4992+ taskA);
4993+ });
4994+var $elm$core$Task$sequence = function (tasks) {
4995+ return A3(
4996+ $elm$core$List$foldr,
4997+ $elm$core$Task$map2($elm$core$List$cons),
4998+ $elm$core$Task$succeed(_List_Nil),
4999+ tasks);
5000+};
5001+var $elm$core$Platform$sendToApp = _Platform_sendToApp;
5002+var $elm$core$Task$spawnCmd = F2(
5003+ function (router, _v0) {
5004+ var task = _v0.a;
5005+ return _Scheduler_spawn(
5006+ A2(
5007+ $elm$core$Task$andThen,
5008+ $elm$core$Platform$sendToApp(router),
5009+ task));
5010+ });
5011+var $elm$core$Task$onEffects = F3(
5012+ function (router, commands, state) {
5013+ return A2(
5014+ $elm$core$Task$map,
5015+ function (_v0) {
5016+ return _Utils_Tuple0;
5017+ },
5018+ $elm$core$Task$sequence(
5019+ A2(
5020+ $elm$core$List$map,
5021+ $elm$core$Task$spawnCmd(router),
5022+ commands)));
5023+ });
5024+var $elm$core$Task$onSelfMsg = F3(
5025+ function (_v0, _v1, _v2) {
5026+ return $elm$core$Task$succeed(_Utils_Tuple0);
5027+ });
5028+var $elm$core$Task$cmdMap = F2(
5029+ function (tagger, _v0) {
5030+ var task = _v0.a;
5031+ return $elm$core$Task$Perform(
5032+ A2($elm$core$Task$map, tagger, task));
5033+ });
5034+_Platform_effectManagers['Task'] = _Platform_createManager($elm$core$Task$init, $elm$core$Task$onEffects, $elm$core$Task$onSelfMsg, $elm$core$Task$cmdMap);
5035+var $elm$core$Task$command = _Platform_leaf('Task');
5036+var $elm$core$Task$perform = F2(
5037+ function (toMessage, task) {
5038+ return $elm$core$Task$command(
5039+ $elm$core$Task$Perform(
5040+ A2($elm$core$Task$map, toMessage, task)));
5041+ });
5042+var $elm$core$Platform$Cmd$batch = _Platform_batch;
5043+var $elm$core$Platform$Cmd$none = $elm$core$Platform$Cmd$batch(_List_Nil);
5044+var $elm$core$Platform$Sub$batch = _Platform_batch;
5045+var $elm$core$Platform$Sub$none = $elm$core$Platform$Sub$batch(_List_Nil);
5046+var $lynxjs_elm$browser$Browser$sandbox = function (impl) {
5047+ return _Browser_element(
5048+ {
5049+ init: function (_v0) {
5050+ return _Utils_Tuple2(impl.init, $elm$core$Platform$Cmd$none);
5051+ },
5052+ subscriptions: function (_v1) {
5053+ return $elm$core$Platform$Sub$none;
5054+ },
5055+ update: F2(
5056+ function (msg, model) {
5057+ return _Utils_Tuple2(
5058+ A2(impl.update, msg, model),
5059+ $elm$core$Platform$Cmd$none);
5060+ }),
5061+ view: impl.view
5062+ });
5063+};
5064+var $author$project$Main$update = F2(
5065+ function (msg, model) {
5066+ if (msg.$ === 'Increment') {
5067+ return _Utils_update(
5068+ model,
5069+ {count: model.count + 1});
5070+ } else {
5071+ return _Utils_update(
5072+ model,
5073+ {count: model.count - 1});
5074+ }
5075+ });
5076+var $lynxjs_elm$ui$Lynx$Attributes$Center = {$: 'Center'};
5077+var $lynxjs_elm$ui$Lynx$Attributes$Column = {$: 'Column'};
5078+var $author$project$Main$Decrement = {$: 'Decrement'};
5079+var $author$project$Main$Increment = {$: 'Increment'};
5080+var $lynxjs_elm$ui$Lynx$Attributes$Row = {$: 'Row'};
5081+var $lynxjs_elm$ui$Lynx$Attributes$alignmentToString = function (a) {
5082+ switch (a.$) {
5083+ case 'Start':
5084+ return 'flex-start';
5085+ case 'Center':
5086+ return 'center';
5087+ case 'End':
5088+ return 'flex-end';
5089+ case 'SpaceBetween':
5090+ return 'space-between';
5091+ case 'SpaceAround':
5092+ return 'space-around';
5093+ case 'SpaceEvenly':
5094+ return 'space-evenly';
5095+ case 'Stretch':
5096+ return 'stretch';
5097+ default:
5098+ return 'baseline';
5099+ }
5100+};
5101+var $lynxjs_elm$virtual_dom$VirtualDom$style = _VirtualDom_style;
5102+var $lynxjs_elm$ui$Lynx$Attributes$style = $lynxjs_elm$virtual_dom$VirtualDom$style;
5103+var $lynxjs_elm$ui$Lynx$Attributes$alignItems = function (a) {
5104+ return A2(
5105+ $lynxjs_elm$ui$Lynx$Attributes$style,
5106+ 'alignItems',
5107+ $lynxjs_elm$ui$Lynx$Attributes$alignmentToString(a));
5108+};
5109+var $lynxjs_elm$ui$Lynx$Attributes$backgroundColor = $lynxjs_elm$ui$Lynx$Attributes$style('backgroundColor');
5110+var $lynxjs_elm$ui$Lynx$Attributes$pxStyle = F2(
5111+ function (key, val) {
5112+ return A2(
5113+ $lynxjs_elm$virtual_dom$VirtualDom$style,
5114+ key,
5115+ $elm$core$String$fromInt(val) + 'px');
5116+ });
5117+var $lynxjs_elm$ui$Lynx$Attributes$borderRadius = $lynxjs_elm$ui$Lynx$Attributes$pxStyle('borderRadius');
5118+var $lynxjs_elm$ui$Lynx$Attributes$color = $lynxjs_elm$ui$Lynx$Attributes$style('color');
5119+var $lynxjs_elm$ui$Lynx$Attributes$fontSize = $lynxjs_elm$ui$Lynx$Attributes$pxStyle('fontSize');
5120+var $lynxjs_elm$virtual_dom$VirtualDom$Normal = function (a) {
5121+ return {$: 'Normal', a: a};
5122+};
5123+var $lynxjs_elm$virtual_dom$VirtualDom$on = _VirtualDom_on;
5124+var $lynxjs_elm$ui$Lynx$Events$onTap = function (msg) {
5125+ return A2(
5126+ $lynxjs_elm$virtual_dom$VirtualDom$on,
5127+ 'tap',
5128+ $lynxjs_elm$virtual_dom$VirtualDom$Normal(
5129+ $elm$json$Json$Decode$succeed(msg)));
5130+};
5131+var $lynxjs_elm$ui$Lynx$Attributes$paddingBottom = $lynxjs_elm$ui$Lynx$Attributes$pxStyle('paddingBottom');
5132+var $lynxjs_elm$ui$Lynx$Attributes$paddingLeft = $lynxjs_elm$ui$Lynx$Attributes$pxStyle('paddingLeft');
5133+var $lynxjs_elm$ui$Lynx$Attributes$paddingRight = $lynxjs_elm$ui$Lynx$Attributes$pxStyle('paddingRight');
5134+var $lynxjs_elm$ui$Lynx$Attributes$paddingTop = $lynxjs_elm$ui$Lynx$Attributes$pxStyle('paddingTop');
5135+var $lynxjs_elm$virtual_dom$VirtualDom$node = function (tag) {
5136+ return _VirtualDom_node(
5137+ _VirtualDom_noScript(tag));
5138+};
5139+var $lynxjs_elm$ui$Lynx$text = $lynxjs_elm$virtual_dom$VirtualDom$node('text');
5140+var $lynxjs_elm$virtual_dom$VirtualDom$text = _VirtualDom_text;
5141+var $lynxjs_elm$ui$Lynx$textContent = $lynxjs_elm$virtual_dom$VirtualDom$text;
5142+var $lynxjs_elm$ui$Lynx$view = $lynxjs_elm$virtual_dom$VirtualDom$node('view');
5143+var $author$project$Main$button = F2(
5144+ function (msg, label) {
5145+ return A2(
5146+ $lynxjs_elm$ui$Lynx$view,
5147+ _List_fromArray(
5148+ [
5149+ $lynxjs_elm$ui$Lynx$Events$onTap(msg),
5150+ $lynxjs_elm$ui$Lynx$Attributes$backgroundColor('#4a90d9'),
5151+ $lynxjs_elm$ui$Lynx$Attributes$borderRadius(8),
5152+ $lynxjs_elm$ui$Lynx$Attributes$paddingTop(12),
5153+ $lynxjs_elm$ui$Lynx$Attributes$paddingBottom(12),
5154+ $lynxjs_elm$ui$Lynx$Attributes$paddingLeft(24),
5155+ $lynxjs_elm$ui$Lynx$Attributes$paddingRight(24)
5156+ ]),
5157+ _List_fromArray(
5158+ [
5159+ A2(
5160+ $lynxjs_elm$ui$Lynx$text,
5161+ _List_fromArray(
5162+ [
5163+ $lynxjs_elm$ui$Lynx$Attributes$color('#ffffff'),
5164+ $lynxjs_elm$ui$Lynx$Attributes$fontSize(24)
5165+ ]),
5166+ _List_fromArray(
5167+ [
5168+ $lynxjs_elm$ui$Lynx$textContent(label)
5169+ ]))
5170+ ]));
5171+ });
5172+var $lynxjs_elm$ui$Lynx$Attributes$intStyle = F2(
5173+ function (key, val) {
5174+ return A2(
5175+ $lynxjs_elm$virtual_dom$VirtualDom$style,
5176+ key,
5177+ $elm$core$String$fromInt(val));
5178+ });
5179+var $lynxjs_elm$ui$Lynx$Attributes$flex = $lynxjs_elm$ui$Lynx$Attributes$intStyle('flex');
5180+var $lynxjs_elm$ui$Lynx$Attributes$flexDirection = function (d) {
5181+ return A2(
5182+ $lynxjs_elm$ui$Lynx$Attributes$style,
5183+ 'flexDirection',
5184+ function () {
5185+ switch (d.$) {
5186+ case 'Row':
5187+ return 'row';
5188+ case 'Column':
5189+ return 'column';
5190+ case 'RowReverse':
5191+ return 'row-reverse';
5192+ default:
5193+ return 'column-reverse';
5194+ }
5195+ }());
5196+};
5197+var $lynxjs_elm$ui$Lynx$Attributes$justifyContent = function (a) {
5198+ return A2(
5199+ $lynxjs_elm$ui$Lynx$Attributes$style,
5200+ 'justifyContent',
5201+ $lynxjs_elm$ui$Lynx$Attributes$alignmentToString(a));
5202+};
5203+var $lynxjs_elm$ui$Lynx$Attributes$marginLeft = $lynxjs_elm$ui$Lynx$Attributes$pxStyle('marginLeft');
5204+var $lynxjs_elm$ui$Lynx$Attributes$marginRight = $lynxjs_elm$ui$Lynx$Attributes$pxStyle('marginRight');
5205+var $author$project$Main$view = function (model) {
5206+ return A2(
5207+ $lynxjs_elm$ui$Lynx$view,
5208+ _List_fromArray(
5209+ [
5210+ $lynxjs_elm$ui$Lynx$Attributes$flexDirection($lynxjs_elm$ui$Lynx$Attributes$Column),
5211+ $lynxjs_elm$ui$Lynx$Attributes$alignItems($lynxjs_elm$ui$Lynx$Attributes$Center),
5212+ $lynxjs_elm$ui$Lynx$Attributes$justifyContent($lynxjs_elm$ui$Lynx$Attributes$Center),
5213+ $lynxjs_elm$ui$Lynx$Attributes$flex(1)
5214+ ]),
5215+ _List_fromArray(
5216+ [
5217+ A2(
5218+ $lynxjs_elm$ui$Lynx$view,
5219+ _List_fromArray(
5220+ [
5221+ $lynxjs_elm$ui$Lynx$Attributes$flexDirection($lynxjs_elm$ui$Lynx$Attributes$Row),
5222+ $lynxjs_elm$ui$Lynx$Attributes$alignItems($lynxjs_elm$ui$Lynx$Attributes$Center)
5223+ ]),
5224+ _List_fromArray(
5225+ [
5226+ A2($author$project$Main$button, $author$project$Main$Decrement, '-'),
5227+ A2(
5228+ $lynxjs_elm$ui$Lynx$text,
5229+ _List_fromArray(
5230+ [
5231+ $lynxjs_elm$ui$Lynx$Attributes$fontSize(32),
5232+ $lynxjs_elm$ui$Lynx$Attributes$marginLeft(20),
5233+ $lynxjs_elm$ui$Lynx$Attributes$marginRight(20)
5234+ ]),
5235+ _List_fromArray(
5236+ [
5237+ $lynxjs_elm$ui$Lynx$textContent(
5238+ $elm$core$String$fromInt(model.count))
5239+ ])),
5240+ A2($author$project$Main$button, $author$project$Main$Increment, '+')
5241+ ]))
5242+ ]));
5243+};
5244+var $author$project$Main$main = $lynxjs_elm$browser$Browser$sandbox(
5245+ {init: $author$project$Main$init, update: $author$project$Main$update, view: $author$project$Main$view});
5246+_Platform_export({'Main':{'init':$author$project$Main$main(
5247+ $elm$json$Json$Decode$succeed(_Utils_Tuple0))(0)}});}(globalThis));
5248+var app = Elm.Main.init({});
5249+</script>
5250+</body>
5251+</html>