(function(scope){ 'use strict'; function F(arity, fun, wrapper) { wrapper.a = arity; wrapper.f = fun; return wrapper; } function F2(fun) { return F(2, fun, function(a) { return function(b) { return fun(a,b); }; }) } function F3(fun) { return F(3, fun, function(a) { return function(b) { return function(c) { return fun(a, b, c); }; }; }); } function F4(fun) { return F(4, fun, function(a) { return function(b) { return function(c) { return function(d) { return fun(a, b, c, d); }; }; }; }); } function F5(fun) { return F(5, fun, function(a) { return function(b) { return function(c) { return function(d) { return function(e) { return fun(a, b, c, d, e); }; }; }; }; }); } function F6(fun) { return F(6, fun, function(a) { return function(b) { return function(c) { return function(d) { return function(e) { return function(f) { return fun(a, b, c, d, e, f); }; }; }; }; }; }); } function F7(fun) { return F(7, fun, function(a) { return function(b) { return function(c) { return function(d) { return function(e) { return function(f) { return function(g) { return fun(a, b, c, d, e, f, g); }; }; }; }; }; }; }); } function F8(fun) { return F(8, fun, function(a) { return function(b) { return function(c) { return function(d) { return function(e) { return function(f) { return function(g) { return function(h) { return fun(a, b, c, d, e, f, g, h); }; }; }; }; }; }; }; }); } function F9(fun) { return F(9, fun, function(a) { return function(b) { return function(c) { return function(d) { return function(e) { return function(f) { return function(g) { return function(h) { return function(i) { return fun(a, b, c, d, e, f, g, h, i); }; }; }; }; }; }; }; }; }); } function A2(fun, a, b) { return fun.a === 2 ? fun.f(a, b) : fun(a)(b); } function A3(fun, a, b, c) { return fun.a === 3 ? fun.f(a, b, c) : fun(a)(b)(c); } function A4(fun, a, b, c, d) { return fun.a === 4 ? fun.f(a, b, c, d) : fun(a)(b)(c)(d); } function A5(fun, a, b, c, d, e) { return fun.a === 5 ? fun.f(a, b, c, d, e) : fun(a)(b)(c)(d)(e); } function A6(fun, a, b, c, d, e, f) { return fun.a === 6 ? fun.f(a, b, c, d, e, f) : fun(a)(b)(c)(d)(e)(f); } function A7(fun, a, b, c, d, e, f, g) { return fun.a === 7 ? fun.f(a, b, c, d, e, f, g) : fun(a)(b)(c)(d)(e)(f)(g); } function A8(fun, a, b, c, d, e, f, g, h) { return fun.a === 8 ? fun.f(a, b, c, d, e, f, g, h) : fun(a)(b)(c)(d)(e)(f)(g)(h); } function A9(fun, a, b, c, d, e, f, g, h, i) { 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); } console.warn('Compiled in DEV mode. Follow the advice at https://elm-lang.org/0.19.1/optimize for better performance and smaller assets.'); var _JsArray_empty = []; function _JsArray_singleton(value) { return [value]; } function _JsArray_length(array) { return array.length; } var _JsArray_initialize = F3(function(size, offset, func) { var result = new Array(size); for (var i = 0; i < size; i++) { result[i] = func(offset + i); } return result; }); var _JsArray_initializeFromList = F2(function (max, ls) { var result = new Array(max); for (var i = 0; i < max && ls.b; i++) { result[i] = ls.a; ls = ls.b; } result.length = i; return _Utils_Tuple2(result, ls); }); var _JsArray_unsafeGet = F2(function(index, array) { return array[index]; }); var _JsArray_unsafeSet = F3(function(index, value, array) { var length = array.length; var result = new Array(length); for (var i = 0; i < length; i++) { result[i] = array[i]; } result[index] = value; return result; }); var _JsArray_push = F2(function(value, array) { var length = array.length; var result = new Array(length + 1); for (var i = 0; i < length; i++) { result[i] = array[i]; } result[length] = value; return result; }); var _JsArray_foldl = F3(function(func, acc, array) { var length = array.length; for (var i = 0; i < length; i++) { acc = A2(func, array[i], acc); } return acc; }); var _JsArray_foldr = F3(function(func, acc, array) { for (var i = array.length - 1; i >= 0; i--) { acc = A2(func, array[i], acc); } return acc; }); var _JsArray_map = F2(function(func, array) { var length = array.length; var result = new Array(length); for (var i = 0; i < length; i++) { result[i] = func(array[i]); } return result; }); var _JsArray_indexedMap = F3(function(func, offset, array) { var length = array.length; var result = new Array(length); for (var i = 0; i < length; i++) { result[i] = A2(func, offset + i, array[i]); } return result; }); var _JsArray_slice = F3(function(from, to, array) { return array.slice(from, to); }); var _JsArray_appendN = F3(function(n, dest, source) { var destLen = dest.length; var itemsToCopy = n - destLen; if (itemsToCopy > source.length) { itemsToCopy = source.length; } var size = destLen + itemsToCopy; var result = new Array(size); for (var i = 0; i < destLen; i++) { result[i] = dest[i]; } for (var i = 0; i < itemsToCopy; i++) { result[i + destLen] = source[i]; } return result; }); // LOG var _Debug_log_UNUSED = F2(function(tag, value) { return value; }); var _Debug_log = F2(function(tag, value) { console.log(tag + ': ' + _Debug_toString(value)); return value; }); // TODOS function _Debug_todo(moduleName, region) { return function(message) { _Debug_crash(8, moduleName, region, message); }; } function _Debug_todoCase(moduleName, region, value) { return function(message) { _Debug_crash(9, moduleName, region, value, message); }; } // TO STRING function _Debug_toString_UNUSED(value) { return ''; } function _Debug_toString(value) { return _Debug_toAnsiString(false, value); } function _Debug_toAnsiString(ansi, value) { if (typeof value === 'function') { return _Debug_internalColor(ansi, ''); } if (typeof value === 'boolean') { return _Debug_ctorColor(ansi, value ? 'True' : 'False'); } if (typeof value === 'number') { return _Debug_numberColor(ansi, value + ''); } if (value instanceof String) { return _Debug_charColor(ansi, "'" + _Debug_addSlashes(value, true) + "'"); } if (typeof value === 'string') { return _Debug_stringColor(ansi, '"' + _Debug_addSlashes(value, false) + '"'); } if (typeof value === 'object' && '$' in value) { var tag = value.$; if (typeof tag === 'number') { return _Debug_internalColor(ansi, ''); } if (tag[0] === '#') { var output = []; for (var k in value) { if (k === '$') continue; output.push(_Debug_toAnsiString(ansi, value[k])); } return '(' + output.join(',') + ')'; } if (tag === 'Set_elm_builtin') { return _Debug_ctorColor(ansi, 'Set') + _Debug_fadeColor(ansi, '.fromList') + ' ' + _Debug_toAnsiString(ansi, $elm$core$Set$toList(value)); } if (tag === 'RBNode_elm_builtin' || tag === 'RBEmpty_elm_builtin') { return _Debug_ctorColor(ansi, 'Dict') + _Debug_fadeColor(ansi, '.fromList') + ' ' + _Debug_toAnsiString(ansi, $elm$core$Dict$toList(value)); } if (tag === 'Array_elm_builtin') { return _Debug_ctorColor(ansi, 'Array') + _Debug_fadeColor(ansi, '.fromList') + ' ' + _Debug_toAnsiString(ansi, $elm$core$Array$toList(value)); } if (tag === '::' || tag === '[]') { var output = '['; value.b && (output += _Debug_toAnsiString(ansi, value.a), value = value.b) for (; value.b; value = value.b) // WHILE_CONS { output += ',' + _Debug_toAnsiString(ansi, value.a); } return output + ']'; } var output = ''; for (var i in value) { if (i === '$') continue; var str = _Debug_toAnsiString(ansi, value[i]); var c0 = str[0]; var parenless = c0 === '{' || c0 === '(' || c0 === '[' || c0 === '<' || c0 === '"' || str.indexOf(' ') < 0; output += ' ' + (parenless ? str : '(' + str + ')'); } return _Debug_ctorColor(ansi, tag) + output; } if (typeof DataView === 'function' && value instanceof DataView) { return _Debug_stringColor(ansi, '<' + value.byteLength + ' bytes>'); } if (typeof File !== 'undefined' && value instanceof File) { return _Debug_internalColor(ansi, '<' + value.name + '>'); } if (typeof value === 'object') { var output = []; for (var key in value) { var field = key[0] === '_' ? key.slice(1) : key; output.push(_Debug_fadeColor(ansi, field) + ' = ' + _Debug_toAnsiString(ansi, value[key])); } if (output.length === 0) { return '{}'; } return '{ ' + output.join(', ') + ' }'; } return _Debug_internalColor(ansi, ''); } function _Debug_addSlashes(str, isChar) { var s = str .replace(/\\/g, '\\\\') .replace(/\n/g, '\\n') .replace(/\t/g, '\\t') .replace(/\r/g, '\\r') .replace(/\v/g, '\\v') .replace(/\0/g, '\\0'); if (isChar) { return s.replace(/\'/g, '\\\''); } else { return s.replace(/\"/g, '\\"'); } } function _Debug_ctorColor(ansi, string) { return ansi ? '\x1b[96m' + string + '\x1b[0m' : string; } function _Debug_numberColor(ansi, string) { return ansi ? '\x1b[95m' + string + '\x1b[0m' : string; } function _Debug_stringColor(ansi, string) { return ansi ? '\x1b[93m' + string + '\x1b[0m' : string; } function _Debug_charColor(ansi, string) { return ansi ? '\x1b[92m' + string + '\x1b[0m' : string; } function _Debug_fadeColor(ansi, string) { return ansi ? '\x1b[37m' + string + '\x1b[0m' : string; } function _Debug_internalColor(ansi, string) { return ansi ? '\x1b[36m' + string + '\x1b[0m' : string; } function _Debug_toHexDigit(n) { return String.fromCharCode(n < 10 ? 48 + n : 55 + n); } // CRASH function _Debug_crash_UNUSED(identifier) { throw new Error('https://github.com/elm/core/blob/1.0.0/hints/' + identifier + '.md'); } function _Debug_crash(identifier, fact1, fact2, fact3, fact4) { switch(identifier) { case 0: 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.'); case 1: 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.'); case 2: var jsonErrorString = fact1; throw new Error('Problem with the flags given to your Elm program on initialization.\n\n' + jsonErrorString); case 3: var portName = fact1; throw new Error('There can only be one port named `' + portName + '`, but your program has multiple.'); case 4: var portName = fact1; var problem = fact2; throw new Error('Trying to send an unexpected type of value through port `' + portName + '`:\n' + problem); case 5: 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.'); case 6: var moduleName = fact1; 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!'); case 8: var moduleName = fact1; var region = fact2; var message = fact3; throw new Error('TODO in module `' + moduleName + '` ' + _Debug_regionToString(region) + '\n\n' + message); case 9: var moduleName = fact1; var region = fact2; var value = fact3; var message = fact4; throw new Error( 'TODO in module `' + moduleName + '` from the `case` expression ' + _Debug_regionToString(region) + '\n\nIt received the following value:\n\n ' + _Debug_toString(value).replace('\n', '\n ') + '\n\nBut the branch that handles it says:\n\n ' + message.replace('\n', '\n ') ); case 10: throw new Error('Bug in https://github.com/elm/virtual-dom/issues'); case 11: throw new Error('Cannot perform mod 0. Division by zero error.'); } } function _Debug_regionToString(region) { if (region.start.line === region.end.line) { return 'on line ' + region.start.line; } return 'on lines ' + region.start.line + ' through ' + region.end.line; } // EQUALITY function _Utils_eq(x, y) { for ( var pair, stack = [], isEqual = _Utils_eqHelp(x, y, 0, stack); isEqual && (pair = stack.pop()); isEqual = _Utils_eqHelp(pair.a, pair.b, 0, stack) ) {} return isEqual; } function _Utils_eqHelp(x, y, depth, stack) { if (x === y) { return true; } if (typeof x !== 'object' || x === null || y === null) { typeof x === 'function' && _Debug_crash(5); return false; } if (depth > 100) { stack.push(_Utils_Tuple2(x,y)); return true; } /**/ if (x.$ === 'Set_elm_builtin') { x = $elm$core$Set$toList(x); y = $elm$core$Set$toList(y); } if (x.$ === 'RBNode_elm_builtin' || x.$ === 'RBEmpty_elm_builtin') { x = $elm$core$Dict$toList(x); y = $elm$core$Dict$toList(y); } //*/ /**_UNUSED/ if (x.$ < 0) { x = $elm$core$Dict$toList(x); y = $elm$core$Dict$toList(y); } //*/ for (var key in x) { if (!_Utils_eqHelp(x[key], y[key], depth + 1, stack)) { return false; } } return true; } var _Utils_equal = F2(_Utils_eq); var _Utils_notEqual = F2(function(a, b) { return !_Utils_eq(a,b); }); // COMPARISONS // Code in Generate/JavaScript.hs, Basics.js, and List.js depends on // the particular integer values assigned to LT, EQ, and GT. function _Utils_cmp(x, y, ord) { if (typeof x !== 'object') { return x === y ? /*EQ*/ 0 : x < y ? /*LT*/ -1 : /*GT*/ 1; } /**/ if (x instanceof String) { var a = x.valueOf(); var b = y.valueOf(); return a === b ? 0 : a < b ? -1 : 1; } //*/ /**_UNUSED/ if (typeof x.$ === 'undefined') //*/ /**/ if (x.$[0] === '#') //*/ { return (ord = _Utils_cmp(x.a, y.a)) ? ord : (ord = _Utils_cmp(x.b, y.b)) ? ord : _Utils_cmp(x.c, y.c); } // traverse conses until end of a list or a mismatch for (; x.b && y.b && !(ord = _Utils_cmp(x.a, y.a)); x = x.b, y = y.b) {} // WHILE_CONSES return ord || (x.b ? /*GT*/ 1 : y.b ? /*LT*/ -1 : /*EQ*/ 0); } var _Utils_lt = F2(function(a, b) { return _Utils_cmp(a, b) < 0; }); var _Utils_le = F2(function(a, b) { return _Utils_cmp(a, b) < 1; }); var _Utils_gt = F2(function(a, b) { return _Utils_cmp(a, b) > 0; }); var _Utils_ge = F2(function(a, b) { return _Utils_cmp(a, b) >= 0; }); var _Utils_compare = F2(function(x, y) { var n = _Utils_cmp(x, y); return n < 0 ? $elm$core$Basics$LT : n ? $elm$core$Basics$GT : $elm$core$Basics$EQ; }); // COMMON VALUES var _Utils_Tuple0_UNUSED = 0; var _Utils_Tuple0 = { $: '#0' }; function _Utils_Tuple2_UNUSED(a, b) { return { a: a, b: b }; } function _Utils_Tuple2(a, b) { return { $: '#2', a: a, b: b }; } function _Utils_Tuple3_UNUSED(a, b, c) { return { a: a, b: b, c: c }; } function _Utils_Tuple3(a, b, c) { return { $: '#3', a: a, b: b, c: c }; } function _Utils_chr_UNUSED(c) { return c; } function _Utils_chr(c) { return new String(c); } // RECORDS function _Utils_update(oldRecord, updatedFields) { var newRecord = {}; for (var key in oldRecord) { newRecord[key] = oldRecord[key]; } for (var key in updatedFields) { newRecord[key] = updatedFields[key]; } return newRecord; } // APPEND var _Utils_append = F2(_Utils_ap); function _Utils_ap(xs, ys) { // append Strings if (typeof xs === 'string') { return xs + ys; } // append Lists if (!xs.b) { return ys; } var root = _List_Cons(xs.a, ys); xs = xs.b for (var curr = root; xs.b; xs = xs.b) // WHILE_CONS { curr = curr.b = _List_Cons(xs.a, ys); } return root; } var _List_Nil_UNUSED = { $: 0 }; var _List_Nil = { $: '[]' }; function _List_Cons_UNUSED(hd, tl) { return { $: 1, a: hd, b: tl }; } function _List_Cons(hd, tl) { return { $: '::', a: hd, b: tl }; } var _List_cons = F2(_List_Cons); function _List_fromArray(arr) { var out = _List_Nil; for (var i = arr.length; i--; ) { out = _List_Cons(arr[i], out); } return out; } function _List_toArray(xs) { for (var out = []; xs.b; xs = xs.b) // WHILE_CONS { out.push(xs.a); } return out; } var _List_map2 = F3(function(f, xs, ys) { for (var arr = []; xs.b && ys.b; xs = xs.b, ys = ys.b) // WHILE_CONSES { arr.push(A2(f, xs.a, ys.a)); } return _List_fromArray(arr); }); var _List_map3 = F4(function(f, xs, ys, zs) { for (var arr = []; xs.b && ys.b && zs.b; xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES { arr.push(A3(f, xs.a, ys.a, zs.a)); } return _List_fromArray(arr); }); var _List_map4 = F5(function(f, ws, xs, ys, zs) { 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 { arr.push(A4(f, ws.a, xs.a, ys.a, zs.a)); } return _List_fromArray(arr); }); var _List_map5 = F6(function(f, vs, ws, xs, ys, zs) { 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 { arr.push(A5(f, vs.a, ws.a, xs.a, ys.a, zs.a)); } return _List_fromArray(arr); }); var _List_sortBy = F2(function(f, xs) { return _List_fromArray(_List_toArray(xs).sort(function(a, b) { return _Utils_cmp(f(a), f(b)); })); }); var _List_sortWith = F2(function(f, xs) { return _List_fromArray(_List_toArray(xs).sort(function(a, b) { var ord = A2(f, a, b); return ord === $elm$core$Basics$EQ ? 0 : ord === $elm$core$Basics$LT ? -1 : 1; })); }); // MATH var _Basics_add = F2(function(a, b) { return a + b; }); var _Basics_sub = F2(function(a, b) { return a - b; }); var _Basics_mul = F2(function(a, b) { return a * b; }); var _Basics_fdiv = F2(function(a, b) { return a / b; }); var _Basics_idiv = F2(function(a, b) { return (a / b) | 0; }); var _Basics_pow = F2(Math.pow); var _Basics_remainderBy = F2(function(b, a) { return a % b; }); // https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/divmodnote-letter.pdf var _Basics_modBy = F2(function(modulus, x) { var answer = x % modulus; return modulus === 0 ? _Debug_crash(11) : ((answer > 0 && modulus < 0) || (answer < 0 && modulus > 0)) ? answer + modulus : answer; }); // TRIGONOMETRY var _Basics_pi = Math.PI; var _Basics_e = Math.E; var _Basics_cos = Math.cos; var _Basics_sin = Math.sin; var _Basics_tan = Math.tan; var _Basics_acos = Math.acos; var _Basics_asin = Math.asin; var _Basics_atan = Math.atan; var _Basics_atan2 = F2(Math.atan2); // MORE MATH function _Basics_toFloat(x) { return x; } function _Basics_truncate(n) { return n | 0; } function _Basics_isInfinite(n) { return n === Infinity || n === -Infinity; } var _Basics_ceiling = Math.ceil; var _Basics_floor = Math.floor; var _Basics_round = Math.round; var _Basics_sqrt = Math.sqrt; var _Basics_log = Math.log; var _Basics_isNaN = isNaN; // BOOLEANS function _Basics_not(bool) { return !bool; } var _Basics_and = F2(function(a, b) { return a && b; }); var _Basics_or = F2(function(a, b) { return a || b; }); var _Basics_xor = F2(function(a, b) { return a !== b; }); var _String_cons = F2(function(chr, str) { return chr + str; }); function _String_uncons(string) { var word = string.charCodeAt(0); return !isNaN(word) ? $elm$core$Maybe$Just( 0xD800 <= word && word <= 0xDBFF ? _Utils_Tuple2(_Utils_chr(string[0] + string[1]), string.slice(2)) : _Utils_Tuple2(_Utils_chr(string[0]), string.slice(1)) ) : $elm$core$Maybe$Nothing; } var _String_append = F2(function(a, b) { return a + b; }); function _String_length(str) { return str.length; } var _String_map = F2(function(func, string) { var len = string.length; var array = new Array(len); var i = 0; while (i < len) { var word = string.charCodeAt(i); if (0xD800 <= word && word <= 0xDBFF) { array[i] = func(_Utils_chr(string[i] + string[i+1])); i += 2; continue; } array[i] = func(_Utils_chr(string[i])); i++; } return array.join(''); }); var _String_filter = F2(function(isGood, str) { var arr = []; var len = str.length; var i = 0; while (i < len) { var char = str[i]; var word = str.charCodeAt(i); i++; if (0xD800 <= word && word <= 0xDBFF) { char += str[i]; i++; } if (isGood(_Utils_chr(char))) { arr.push(char); } } return arr.join(''); }); function _String_reverse(str) { var len = str.length; var arr = new Array(len); var i = 0; while (i < len) { var word = str.charCodeAt(i); if (0xD800 <= word && word <= 0xDBFF) { arr[len - i] = str[i + 1]; i++; arr[len - i] = str[i - 1]; i++; } else { arr[len - i] = str[i]; i++; } } return arr.join(''); } var _String_foldl = F3(function(func, state, string) { var len = string.length; var i = 0; while (i < len) { var char = string[i]; var word = string.charCodeAt(i); i++; if (0xD800 <= word && word <= 0xDBFF) { char += string[i]; i++; } state = A2(func, _Utils_chr(char), state); } return state; }); var _String_foldr = F3(function(func, state, string) { var i = string.length; while (i--) { var char = string[i]; var word = string.charCodeAt(i); if (0xDC00 <= word && word <= 0xDFFF) { i--; char = string[i] + char; } state = A2(func, _Utils_chr(char), state); } return state; }); var _String_split = F2(function(sep, str) { return str.split(sep); }); var _String_join = F2(function(sep, strs) { return strs.join(sep); }); var _String_slice = F3(function(start, end, str) { return str.slice(start, end); }); function _String_trim(str) { return str.trim(); } function _String_trimLeft(str) { return str.replace(/^\s+/, ''); } function _String_trimRight(str) { return str.replace(/\s+$/, ''); } function _String_words(str) { return _List_fromArray(str.trim().split(/\s+/g)); } function _String_lines(str) { return _List_fromArray(str.split(/\r\n|\r|\n/g)); } function _String_toUpper(str) { return str.toUpperCase(); } function _String_toLower(str) { return str.toLowerCase(); } var _String_any = F2(function(isGood, string) { var i = string.length; while (i--) { var char = string[i]; var word = string.charCodeAt(i); if (0xDC00 <= word && word <= 0xDFFF) { i--; char = string[i] + char; } if (isGood(_Utils_chr(char))) { return true; } } return false; }); var _String_all = F2(function(isGood, string) { var i = string.length; while (i--) { var char = string[i]; var word = string.charCodeAt(i); if (0xDC00 <= word && word <= 0xDFFF) { i--; char = string[i] + char; } if (!isGood(_Utils_chr(char))) { return false; } } return true; }); var _String_contains = F2(function(sub, str) { return str.indexOf(sub) > -1; }); var _String_startsWith = F2(function(sub, str) { return str.indexOf(sub) === 0; }); var _String_endsWith = F2(function(sub, str) { return str.length >= sub.length && str.lastIndexOf(sub) === str.length - sub.length; }); var _String_indexes = F2(function(sub, str) { var subLen = sub.length; if (subLen < 1) { return _List_Nil; } var i = 0; var is = []; while ((i = str.indexOf(sub, i)) > -1) { is.push(i); i = i + subLen; } return _List_fromArray(is); }); // TO STRING function _String_fromNumber(number) { return number + ''; } // INT CONVERSIONS function _String_toInt(str) { var total = 0; var code0 = str.charCodeAt(0); var start = code0 == 0x2B /* + */ || code0 == 0x2D /* - */ ? 1 : 0; for (var i = start; i < str.length; ++i) { var code = str.charCodeAt(i); if (code < 0x30 || 0x39 < code) { return $elm$core$Maybe$Nothing; } total = 10 * total + code - 0x30; } return i == start ? $elm$core$Maybe$Nothing : $elm$core$Maybe$Just(code0 == 0x2D ? -total : total); } // FLOAT CONVERSIONS function _String_toFloat(s) { // check if it is a hex, octal, or binary number if (s.length === 0 || /[\sxbo]/.test(s)) { return $elm$core$Maybe$Nothing; } var n = +s; // faster isNaN check return n === n ? $elm$core$Maybe$Just(n) : $elm$core$Maybe$Nothing; } function _String_fromList(chars) { return _List_toArray(chars).join(''); } function _Char_toCode(char) { var code = char.charCodeAt(0); if (0xD800 <= code && code <= 0xDBFF) { return (code - 0xD800) * 0x400 + char.charCodeAt(1) - 0xDC00 + 0x10000 } return code; } function _Char_fromCode(code) { return _Utils_chr( (code < 0 || 0x10FFFF < code) ? '\uFFFD' : (code <= 0xFFFF) ? String.fromCharCode(code) : (code -= 0x10000, String.fromCharCode(Math.floor(code / 0x400) + 0xD800, code % 0x400 + 0xDC00) ) ); } function _Char_toUpper(char) { return _Utils_chr(char.toUpperCase()); } function _Char_toLower(char) { return _Utils_chr(char.toLowerCase()); } function _Char_toLocaleUpper(char) { return _Utils_chr(char.toLocaleUpperCase()); } function _Char_toLocaleLower(char) { return _Utils_chr(char.toLocaleLowerCase()); } /**/ function _Json_errorToString(error) { return $elm$json$Json$Decode$errorToString(error); } //*/ // CORE DECODERS function _Json_succeed(msg) { return { $: 0, a: msg }; } function _Json_fail(msg) { return { $: 1, a: msg }; } function _Json_decodePrim(decoder) { return { $: 2, b: decoder }; } var _Json_decodeInt = _Json_decodePrim(function(value) { return (typeof value !== 'number') ? _Json_expecting('an INT', value) : (-2147483647 < value && value < 2147483647 && (value | 0) === value) ? $elm$core$Result$Ok(value) : (isFinite(value) && !(value % 1)) ? $elm$core$Result$Ok(value) : _Json_expecting('an INT', value); }); var _Json_decodeBool = _Json_decodePrim(function(value) { return (typeof value === 'boolean') ? $elm$core$Result$Ok(value) : _Json_expecting('a BOOL', value); }); var _Json_decodeFloat = _Json_decodePrim(function(value) { return (typeof value === 'number') ? $elm$core$Result$Ok(value) : _Json_expecting('a FLOAT', value); }); var _Json_decodeValue = _Json_decodePrim(function(value) { return $elm$core$Result$Ok(_Json_wrap(value)); }); var _Json_decodeString = _Json_decodePrim(function(value) { return (typeof value === 'string') ? $elm$core$Result$Ok(value) : (value instanceof String) ? $elm$core$Result$Ok(value + '') : _Json_expecting('a STRING', value); }); function _Json_decodeList(decoder) { return { $: 3, b: decoder }; } function _Json_decodeArray(decoder) { return { $: 4, b: decoder }; } function _Json_decodeNull(value) { return { $: 5, c: value }; } var _Json_decodeField = F2(function(field, decoder) { return { $: 6, d: field, b: decoder }; }); var _Json_decodeIndex = F2(function(index, decoder) { return { $: 7, e: index, b: decoder }; }); function _Json_decodeKeyValuePairs(decoder) { return { $: 8, b: decoder }; } function _Json_mapMany(f, decoders) { return { $: 9, f: f, g: decoders }; } var _Json_andThen = F2(function(callback, decoder) { return { $: 10, b: decoder, h: callback }; }); function _Json_oneOf(decoders) { return { $: 11, g: decoders }; } // DECODING OBJECTS var _Json_map1 = F2(function(f, d1) { return _Json_mapMany(f, [d1]); }); var _Json_map2 = F3(function(f, d1, d2) { return _Json_mapMany(f, [d1, d2]); }); var _Json_map3 = F4(function(f, d1, d2, d3) { return _Json_mapMany(f, [d1, d2, d3]); }); var _Json_map4 = F5(function(f, d1, d2, d3, d4) { return _Json_mapMany(f, [d1, d2, d3, d4]); }); var _Json_map5 = F6(function(f, d1, d2, d3, d4, d5) { return _Json_mapMany(f, [d1, d2, d3, d4, d5]); }); var _Json_map6 = F7(function(f, d1, d2, d3, d4, d5, d6) { return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6]); }); var _Json_map7 = F8(function(f, d1, d2, d3, d4, d5, d6, d7) { return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6, d7]); }); var _Json_map8 = F9(function(f, d1, d2, d3, d4, d5, d6, d7, d8) { return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6, d7, d8]); }); // DECODE var _Json_runOnString = F2(function(decoder, string) { try { var value = JSON.parse(string); return _Json_runHelp(decoder, value); } catch (e) { return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, 'This is not valid JSON! ' + e.message, _Json_wrap(string))); } }); var _Json_run = F2(function(decoder, value) { return _Json_runHelp(decoder, _Json_unwrap(value)); }); function _Json_runHelp(decoder, value) { switch (decoder.$) { case 2: return decoder.b(value); case 5: return (value === null) ? $elm$core$Result$Ok(decoder.c) : _Json_expecting('null', value); case 3: if (!_Json_isArray(value)) { return _Json_expecting('a LIST', value); } return _Json_runArrayDecoder(decoder.b, value, _List_fromArray); case 4: if (!_Json_isArray(value)) { return _Json_expecting('an ARRAY', value); } return _Json_runArrayDecoder(decoder.b, value, _Json_toElmArray); case 6: var field = decoder.d; if (typeof value !== 'object' || value === null || !(field in value)) { return _Json_expecting('an OBJECT with a field named `' + field + '`', value); } var result = _Json_runHelp(decoder.b, value[field]); return ($elm$core$Result$isOk(result)) ? result : $elm$core$Result$Err(A2($elm$json$Json$Decode$Field, field, result.a)); case 7: var index = decoder.e; if (!_Json_isArray(value)) { return _Json_expecting('an ARRAY', value); } if (index >= value.length) { return _Json_expecting('a LONGER array. Need index ' + index + ' but only see ' + value.length + ' entries', value); } var result = _Json_runHelp(decoder.b, value[index]); return ($elm$core$Result$isOk(result)) ? result : $elm$core$Result$Err(A2($elm$json$Json$Decode$Index, index, result.a)); case 8: if (typeof value !== 'object' || value === null || _Json_isArray(value)) { return _Json_expecting('an OBJECT', value); } var keyValuePairs = _List_Nil; // TODO test perf of Object.keys and switch when support is good enough for (var key in value) { if (value.hasOwnProperty(key)) { var result = _Json_runHelp(decoder.b, value[key]); if (!$elm$core$Result$isOk(result)) { return $elm$core$Result$Err(A2($elm$json$Json$Decode$Field, key, result.a)); } keyValuePairs = _List_Cons(_Utils_Tuple2(key, result.a), keyValuePairs); } } return $elm$core$Result$Ok($elm$core$List$reverse(keyValuePairs)); case 9: var answer = decoder.f; var decoders = decoder.g; for (var i = 0; i < decoders.length; i++) { var result = _Json_runHelp(decoders[i], value); if (!$elm$core$Result$isOk(result)) { return result; } answer = answer(result.a); } return $elm$core$Result$Ok(answer); case 10: var result = _Json_runHelp(decoder.b, value); return (!$elm$core$Result$isOk(result)) ? result : _Json_runHelp(decoder.h(result.a), value); case 11: var errors = _List_Nil; for (var temp = decoder.g; temp.b; temp = temp.b) // WHILE_CONS { var result = _Json_runHelp(temp.a, value); if ($elm$core$Result$isOk(result)) { return result; } errors = _List_Cons(result.a, errors); } return $elm$core$Result$Err($elm$json$Json$Decode$OneOf($elm$core$List$reverse(errors))); case 1: return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, decoder.a, _Json_wrap(value))); case 0: return $elm$core$Result$Ok(decoder.a); } } function _Json_runArrayDecoder(decoder, value, toElmValue) { var len = value.length; var array = new Array(len); for (var i = 0; i < len; i++) { var result = _Json_runHelp(decoder, value[i]); if (!$elm$core$Result$isOk(result)) { return $elm$core$Result$Err(A2($elm$json$Json$Decode$Index, i, result.a)); } array[i] = result.a; } return $elm$core$Result$Ok(toElmValue(array)); } function _Json_isArray(value) { return Array.isArray(value) || (typeof FileList !== 'undefined' && value instanceof FileList); } function _Json_toElmArray(array) { return A2($elm$core$Array$initialize, array.length, function(i) { return array[i]; }); } function _Json_expecting(type, value) { return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, 'Expecting ' + type, _Json_wrap(value))); } // EQUALITY function _Json_equality(x, y) { if (x === y) { return true; } if (x.$ !== y.$) { return false; } switch (x.$) { case 0: case 1: return x.a === y.a; case 2: return x.b === y.b; case 5: return x.c === y.c; case 3: case 4: case 8: return _Json_equality(x.b, y.b); case 6: return x.d === y.d && _Json_equality(x.b, y.b); case 7: return x.e === y.e && _Json_equality(x.b, y.b); case 9: return x.f === y.f && _Json_listEquality(x.g, y.g); case 10: return x.h === y.h && _Json_equality(x.b, y.b); case 11: return _Json_listEquality(x.g, y.g); } } function _Json_listEquality(aDecoders, bDecoders) { var len = aDecoders.length; if (len !== bDecoders.length) { return false; } for (var i = 0; i < len; i++) { if (!_Json_equality(aDecoders[i], bDecoders[i])) { return false; } } return true; } // ENCODE var _Json_encode = F2(function(indentLevel, value) { return JSON.stringify(_Json_unwrap(value), null, indentLevel) + ''; }); function _Json_wrap(value) { return { $: 0, a: value }; } function _Json_unwrap(value) { return value.a; } function _Json_wrap_UNUSED(value) { return value; } function _Json_unwrap_UNUSED(value) { return value; } function _Json_emptyArray() { return []; } function _Json_emptyObject() { return {}; } var _Json_addField = F3(function(key, value, object) { object[key] = _Json_unwrap(value); return object; }); function _Json_addEntry(func) { return F2(function(entry, array) { array.push(_Json_unwrap(func(entry))); return array; }); } var _Json_encodeNull = _Json_wrap(null); // TASKS function _Scheduler_succeed(value) { return { $: 0, a: value }; } function _Scheduler_fail(error) { return { $: 1, a: error }; } function _Scheduler_binding(callback) { return { $: 2, b: callback, c: null }; } var _Scheduler_andThen = F2(function(callback, task) { return { $: 3, b: callback, d: task }; }); var _Scheduler_onError = F2(function(callback, task) { return { $: 4, b: callback, d: task }; }); function _Scheduler_receive(callback) { return { $: 5, b: callback }; } // PROCESSES var _Scheduler_guid = 0; function _Scheduler_rawSpawn(task) { var proc = { $: 0, e: _Scheduler_guid++, f: task, g: null, h: [] }; _Scheduler_enqueue(proc); return proc; } function _Scheduler_spawn(task) { return _Scheduler_binding(function(callback) { callback(_Scheduler_succeed(_Scheduler_rawSpawn(task))); }); } function _Scheduler_rawSend(proc, msg) { proc.h.push(msg); _Scheduler_enqueue(proc); } var _Scheduler_send = F2(function(proc, msg) { return _Scheduler_binding(function(callback) { _Scheduler_rawSend(proc, msg); callback(_Scheduler_succeed(_Utils_Tuple0)); }); }); function _Scheduler_kill(proc) { return _Scheduler_binding(function(callback) { var task = proc.f; if (task.$ === 2 && task.c) { task.c(); } proc.f = null; callback(_Scheduler_succeed(_Utils_Tuple0)); }); } /* STEP PROCESSES type alias Process = { $ : tag , id : unique_id , root : Task , stack : null | { $: SUCCEED | FAIL, a: callback, b: stack } , mailbox : [msg] } */ var _Scheduler_working = false; var _Scheduler_queue = []; function _Scheduler_enqueue(proc) { _Scheduler_queue.push(proc); if (_Scheduler_working) { return; } _Scheduler_working = true; while (proc = _Scheduler_queue.shift()) { _Scheduler_step(proc); } _Scheduler_working = false; } function _Scheduler_step(proc) { while (proc.f) { var rootTag = proc.f.$; if (rootTag === 0 || rootTag === 1) { while (proc.g && proc.g.$ !== rootTag) { proc.g = proc.g.i; } if (!proc.g) { return; } proc.f = proc.g.b(proc.f.a); proc.g = proc.g.i; } else if (rootTag === 2) { proc.f.c = proc.f.b(function(newRoot) { proc.f = newRoot; _Scheduler_enqueue(proc); }); return; } else if (rootTag === 5) { if (proc.h.length === 0) { return; } proc.f = proc.f.b(proc.h.shift()); } else // if (rootTag === 3 || rootTag === 4) { proc.g = { $: rootTag === 3 ? 0 : 1, b: proc.f.b, i: proc.g }; proc.f = proc.f.d; } } } function _Process_sleep(time) { return _Scheduler_binding(function(callback) { var id = setTimeout(function() { callback(_Scheduler_succeed(_Utils_Tuple0)); }, time); return function() { clearTimeout(id); }; }); } // PROGRAMS var _Platform_worker = F4(function(impl, flagDecoder, debugMetadata, args) { return _Platform_initialize( flagDecoder, args, impl.init, impl.update, impl.subscriptions, function() { return function() {} } ); }); // INITIALIZE A PROGRAM function _Platform_initialize(flagDecoder, args, init, update, subscriptions, stepperBuilder) { var result = A2(_Json_run, flagDecoder, _Json_wrap(args ? args['flags'] : undefined)); $elm$core$Result$isOk(result) || _Debug_crash(2 /**/, _Json_errorToString(result.a) /**/); var managers = {}; var initPair = init(result.a); var model = initPair.a; var stepper = stepperBuilder(sendToApp, model); var ports = _Platform_setupEffects(managers, sendToApp); function sendToApp(msg, viewMetadata) { var pair = A2(update, msg, model); stepper(model = pair.a, viewMetadata); _Platform_enqueueEffects(managers, pair.b, subscriptions(model)); } _Platform_enqueueEffects(managers, initPair.b, subscriptions(model)); return ports ? { ports: ports } : {}; } // TRACK PRELOADS // // This is used by code in elm/browser and elm/http // to register any HTTP requests that are triggered by init. // var _Platform_preload; function _Platform_registerPreload(url) { _Platform_preload.add(url); } // EFFECT MANAGERS var _Platform_effectManagers = {}; function _Platform_setupEffects(managers, sendToApp) { var ports; // setup all necessary effect managers for (var key in _Platform_effectManagers) { var manager = _Platform_effectManagers[key]; if (manager.a) { ports = ports || {}; ports[key] = manager.a(key, sendToApp); } managers[key] = _Platform_instantiateManager(manager, sendToApp); } return ports; } function _Platform_createManager(init, onEffects, onSelfMsg, cmdMap, subMap) { return { b: init, c: onEffects, d: onSelfMsg, e: cmdMap, f: subMap }; } function _Platform_instantiateManager(info, sendToApp) { var router = { g: sendToApp, h: undefined }; var onEffects = info.c; var onSelfMsg = info.d; var cmdMap = info.e; var subMap = info.f; function loop(state) { return A2(_Scheduler_andThen, loop, _Scheduler_receive(function(msg) { var value = msg.a; if (msg.$ === 0) { return A3(onSelfMsg, router, value, state); } return cmdMap && subMap ? A4(onEffects, router, value.i, value.j, state) : A3(onEffects, router, cmdMap ? value.i : value.j, state); })); } return router.h = _Scheduler_rawSpawn(A2(_Scheduler_andThen, loop, info.b)); } // ROUTING var _Platform_sendToApp = F2(function(router, msg) { return _Scheduler_binding(function(callback) { router.g(msg); callback(_Scheduler_succeed(_Utils_Tuple0)); }); }); var _Platform_sendToSelf = F2(function(router, msg) { return A2(_Scheduler_send, router.h, { $: 0, a: msg }); }); // BAGS function _Platform_leaf(home) { return function(value) { return { $: 1, k: home, l: value }; }; } function _Platform_batch(list) { return { $: 2, m: list }; } var _Platform_map = F2(function(tagger, bag) { return { $: 3, n: tagger, o: bag } }); // PIPE BAGS INTO EFFECT MANAGERS // // Effects must be queued! // // Say your init contains a synchronous command, like Time.now or Time.here // // - This will produce a batch of effects (FX_1) // - The synchronous task triggers the subsequent `update` call // - This will produce a batch of effects (FX_2) // // If we just start dispatching FX_2, subscriptions from FX_2 can be processed // before subscriptions from FX_1. No good! Earlier versions of this code had // this problem, leading to these reports: // // https://github.com/elm/core/issues/980 // https://github.com/elm/core/pull/981 // https://github.com/elm/compiler/issues/1776 // // The queue is necessary to avoid ordering issues for synchronous commands. // Why use true/false here? Why not just check the length of the queue? // The goal is to detect "are we currently dispatching effects?" If we // are, we need to bail and let the ongoing while loop handle things. // // Now say the queue has 1 element. When we dequeue the final element, // the queue will be empty, but we are still actively dispatching effects. // So you could get queue jumping in a really tricky category of cases. // var _Platform_effectsQueue = []; var _Platform_effectsActive = false; function _Platform_enqueueEffects(managers, cmdBag, subBag) { _Platform_effectsQueue.push({ p: managers, q: cmdBag, r: subBag }); if (_Platform_effectsActive) return; _Platform_effectsActive = true; for (var fx; fx = _Platform_effectsQueue.shift(); ) { _Platform_dispatchEffects(fx.p, fx.q, fx.r); } _Platform_effectsActive = false; } function _Platform_dispatchEffects(managers, cmdBag, subBag) { var effectsDict = {}; _Platform_gatherEffects(true, cmdBag, effectsDict, null); _Platform_gatherEffects(false, subBag, effectsDict, null); for (var home in managers) { _Scheduler_rawSend(managers[home], { $: 'fx', a: effectsDict[home] || { i: _List_Nil, j: _List_Nil } }); } } function _Platform_gatherEffects(isCmd, bag, effectsDict, taggers) { switch (bag.$) { case 1: var home = bag.k; var effect = _Platform_toEffect(isCmd, home, taggers, bag.l); effectsDict[home] = _Platform_insert(isCmd, effect, effectsDict[home]); return; case 2: for (var list = bag.m; list.b; list = list.b) // WHILE_CONS { _Platform_gatherEffects(isCmd, list.a, effectsDict, taggers); } return; case 3: _Platform_gatherEffects(isCmd, bag.o, effectsDict, { s: bag.n, t: taggers }); return; } } function _Platform_toEffect(isCmd, home, taggers, value) { function applyTaggers(x) { for (var temp = taggers; temp; temp = temp.t) { x = temp.s(x); } return x; } var map = isCmd ? _Platform_effectManagers[home].e : _Platform_effectManagers[home].f; return A2(map, applyTaggers, value) } function _Platform_insert(isCmd, newEffect, effects) { effects = effects || { i: _List_Nil, j: _List_Nil }; isCmd ? (effects.i = _List_Cons(newEffect, effects.i)) : (effects.j = _List_Cons(newEffect, effects.j)); return effects; } // PORTS function _Platform_checkPortName(name) { if (_Platform_effectManagers[name]) { _Debug_crash(3, name) } } // OUTGOING PORTS function _Platform_outgoingPort(name, converter) { _Platform_checkPortName(name); _Platform_effectManagers[name] = { e: _Platform_outgoingPortMap, u: converter, a: _Platform_setupOutgoingPort }; return _Platform_leaf(name); } var _Platform_outgoingPortMap = F2(function(tagger, value) { return value; }); function _Platform_setupOutgoingPort(name) { var subs = []; var converter = _Platform_effectManagers[name].u; // CREATE MANAGER var init = _Process_sleep(0); _Platform_effectManagers[name].b = init; _Platform_effectManagers[name].c = F3(function(router, cmdList, state) { for ( ; cmdList.b; cmdList = cmdList.b) // WHILE_CONS { // grab a separate reference to subs in case unsubscribe is called var currentSubs = subs; var value = _Json_unwrap(converter(cmdList.a)); for (var i = 0; i < currentSubs.length; i++) { currentSubs[i](value); } } return init; }); // PUBLIC API function subscribe(callback) { subs.push(callback); } function unsubscribe(callback) { // copy subs into a new array in case unsubscribe is called within a // subscribed callback subs = subs.slice(); var index = subs.indexOf(callback); if (index >= 0) { subs.splice(index, 1); } } return { subscribe: subscribe, unsubscribe: unsubscribe }; } // INCOMING PORTS function _Platform_incomingPort(name, converter) { _Platform_checkPortName(name); _Platform_effectManagers[name] = { f: _Platform_incomingPortMap, u: converter, a: _Platform_setupIncomingPort }; return _Platform_leaf(name); } var _Platform_incomingPortMap = F2(function(tagger, finalTagger) { return function(value) { return tagger(finalTagger(value)); }; }); function _Platform_setupIncomingPort(name, sendToApp) { var subs = _List_Nil; var converter = _Platform_effectManagers[name].u; // CREATE MANAGER var init = _Scheduler_succeed(null); _Platform_effectManagers[name].b = init; _Platform_effectManagers[name].c = F3(function(router, subList, state) { subs = subList; return init; }); // PUBLIC API function send(incomingValue) { var result = A2(_Json_run, converter, _Json_wrap(incomingValue)); $elm$core$Result$isOk(result) || _Debug_crash(4, name, result.a); var value = result.a; for (var temp = subs; temp.b; temp = temp.b) // WHILE_CONS { sendToApp(temp.a(value)); } } return { send: send }; } // EXPORT ELM MODULES // // Have DEBUG and PROD versions so that we can (1) give nicer errors in // debug mode and (2) not pay for the bits needed for that in prod mode. // function _Platform_export_UNUSED(exports) { scope['Elm'] ? _Platform_mergeExportsProd(scope['Elm'], exports) : scope['Elm'] = exports; } function _Platform_mergeExportsProd(obj, exports) { for (var name in exports) { (name in obj) ? (name == 'init') ? _Debug_crash(6) : _Platform_mergeExportsProd(obj[name], exports[name]) : (obj[name] = exports[name]); } } function _Platform_export(exports) { scope['Elm'] ? _Platform_mergeExportsDebug('Elm', scope['Elm'], exports) : scope['Elm'] = exports; } function _Platform_mergeExportsDebug(moduleName, obj, exports) { for (var name in exports) { (name in obj) ? (name == 'init') ? _Debug_crash(6, moduleName) : _Platform_mergeExportsDebug(moduleName + '.' + name, obj[name], exports[name]) : (obj[name] = exports[name]); } } // HELPERS var _VirtualDom_divertHrefToApp; var _VirtualDom_doc = typeof document !== 'undefined' ? document : {}; function _VirtualDom_appendChild(parent, child) { parent.appendChild(child); } var _VirtualDom_init = F4(function(virtualNode, flagDecoder, debugMetadata, args) { // NOTE: this function needs _Platform_export available to work /**_UNUSED/ var node = args['node']; //*/ /**/ var node = args && args['node'] ? args['node'] : _Debug_crash(0); //*/ node.parentNode.replaceChild( _VirtualDom_render(virtualNode, function() {}), node ); return {}; }); // TEXT function _VirtualDom_text(string) { return { $: 0, a: string }; } // NODE var _VirtualDom_nodeNS = F2(function(namespace, tag) { return F2(function(factList, kidList) { for (var kids = [], descendantsCount = 0; kidList.b; kidList = kidList.b) // WHILE_CONS { var kid = kidList.a; descendantsCount += (kid.b || 0); kids.push(kid); } descendantsCount += kids.length; return { $: 1, c: tag, d: _VirtualDom_organizeFacts(factList), e: kids, f: namespace, b: descendantsCount }; }); }); var _VirtualDom_node = _VirtualDom_nodeNS(undefined); // KEYED NODE var _VirtualDom_keyedNodeNS = F2(function(namespace, tag) { return F2(function(factList, kidList) { for (var kids = [], descendantsCount = 0; kidList.b; kidList = kidList.b) // WHILE_CONS { var kid = kidList.a; descendantsCount += (kid.b.b || 0); kids.push(kid); } descendantsCount += kids.length; return { $: 2, c: tag, d: _VirtualDom_organizeFacts(factList), e: kids, f: namespace, b: descendantsCount }; }); }); var _VirtualDom_keyedNode = _VirtualDom_keyedNodeNS(undefined); // CUSTOM function _VirtualDom_custom(factList, model, render, diff) { return { $: 3, d: _VirtualDom_organizeFacts(factList), g: model, h: render, i: diff }; } // MAP var _VirtualDom_map = F2(function(tagger, node) { return { $: 4, j: tagger, k: node, b: 1 + (node.b || 0) }; }); // LAZY function _VirtualDom_thunk(refs, thunk) { return { $: 5, l: refs, m: thunk, k: undefined }; } var _VirtualDom_lazy = F2(function(func, a) { return _VirtualDom_thunk([func, a], function() { return func(a); }); }); var _VirtualDom_lazy2 = F3(function(func, a, b) { return _VirtualDom_thunk([func, a, b], function() { return A2(func, a, b); }); }); var _VirtualDom_lazy3 = F4(function(func, a, b, c) { return _VirtualDom_thunk([func, a, b, c], function() { return A3(func, a, b, c); }); }); var _VirtualDom_lazy4 = F5(function(func, a, b, c, d) { return _VirtualDom_thunk([func, a, b, c, d], function() { return A4(func, a, b, c, d); }); }); var _VirtualDom_lazy5 = F6(function(func, a, b, c, d, e) { return _VirtualDom_thunk([func, a, b, c, d, e], function() { return A5(func, a, b, c, d, e); }); }); var _VirtualDom_lazy6 = F7(function(func, a, b, c, d, e, f) { return _VirtualDom_thunk([func, a, b, c, d, e, f], function() { return A6(func, a, b, c, d, e, f); }); }); var _VirtualDom_lazy7 = F8(function(func, a, b, c, d, e, f, g) { return _VirtualDom_thunk([func, a, b, c, d, e, f, g], function() { return A7(func, a, b, c, d, e, f, g); }); }); var _VirtualDom_lazy8 = F9(function(func, a, b, c, d, e, f, g, h) { return _VirtualDom_thunk([func, a, b, c, d, e, f, g, h], function() { return A8(func, a, b, c, d, e, f, g, h); }); }); // FACTS var _VirtualDom_on = F2(function(key, handler) { return { $: 'a0', n: key, o: handler }; }); var _VirtualDom_style = F2(function(key, value) { return { $: 'a1', n: key, o: value }; }); var _VirtualDom_property = F2(function(key, value) { return { $: 'a2', n: key, o: value }; }); var _VirtualDom_attribute = F2(function(key, value) { return { $: 'a3', n: key, o: value }; }); var _VirtualDom_attributeNS = F3(function(namespace, key, value) { return { $: 'a4', n: key, o: { f: namespace, o: value } }; }); // XSS ATTACK VECTOR CHECKS // // For some reason, tabs can appear in href protocols and it still works. // So '\tjava\tSCRIPT:alert("!!!")' and 'javascript:alert("!!!")' are the same // in practice. That is why _VirtualDom_RE_js and _VirtualDom_RE_js_html look // so freaky. // // Pulling the regular expressions out to the top level gives a slight speed // boost in small benchmarks (4-10%) but hoisting values to reduce allocation // can be unpredictable in large programs where JIT may have a harder time with // functions are not fully self-contained. The benefit is more that the js and // js_html ones are so weird that I prefer to see them near each other. var _VirtualDom_RE_script = /^script$/i; var _VirtualDom_RE_on_formAction = /^(on|formAction$)/i; var _VirtualDom_RE_js = /^\s*j\s*a\s*v\s*a\s*s\s*c\s*r\s*i\s*p\s*t\s*:/i; var _VirtualDom_RE_js_html = /^\s*(j\s*a\s*v\s*a\s*s\s*c\s*r\s*i\s*p\s*t\s*:|d\s*a\s*t\s*a\s*:\s*t\s*e\s*x\s*t\s*\/\s*h\s*t\s*m\s*l\s*(,|;))/i; function _VirtualDom_noScript(tag) { return _VirtualDom_RE_script.test(tag) ? 'p' : tag; } function _VirtualDom_noOnOrFormAction(key) { return _VirtualDom_RE_on_formAction.test(key) ? 'data-' + key : key; } function _VirtualDom_noInnerHtmlOrFormAction(key) { return key == 'innerHTML' || key == 'formAction' ? 'data-' + key : key; } function _VirtualDom_noJavaScriptUri(value) { return _VirtualDom_RE_js.test(value) ? /**_UNUSED/''//*//**/'javascript:alert("This is an XSS vector. Please use ports or web components instead.")'//*/ : value; } function _VirtualDom_noJavaScriptOrHtmlUri(value) { return _VirtualDom_RE_js_html.test(value) ? /**_UNUSED/''//*//**/'javascript:alert("This is an XSS vector. Please use ports or web components instead.")'//*/ : value; } function _VirtualDom_noJavaScriptOrHtmlJson(value) { return (typeof _Json_unwrap(value) === 'string' && _VirtualDom_RE_js_html.test(_Json_unwrap(value))) ? _Json_wrap( /**_UNUSED/''//*//**/'javascript:alert("This is an XSS vector. Please use ports or web components instead.")'//*/ ) : value; } // MAP FACTS var _VirtualDom_mapAttribute = F2(function(func, attr) { return (attr.$ === 'a0') ? A2(_VirtualDom_on, attr.n, _VirtualDom_mapHandler(func, attr.o)) : attr; }); function _VirtualDom_mapHandler(func, handler) { var tag = $elm$virtual_dom$VirtualDom$toHandlerInt(handler); // 0 = Normal // 1 = MayStopPropagation // 2 = MayPreventDefault // 3 = Custom return { $: handler.$, a: !tag ? A2($elm$json$Json$Decode$map, func, handler.a) : A3($elm$json$Json$Decode$map2, tag < 3 ? _VirtualDom_mapEventTuple : _VirtualDom_mapEventRecord, $elm$json$Json$Decode$succeed(func), handler.a ) }; } var _VirtualDom_mapEventTuple = F2(function(func, tuple) { return _Utils_Tuple2(func(tuple.a), tuple.b); }); var _VirtualDom_mapEventRecord = F2(function(func, record) { return { message: func(record.message), stopPropagation: record.stopPropagation, preventDefault: record.preventDefault } }); // ORGANIZE FACTS function _VirtualDom_organizeFacts(factList) { for (var facts = {}; factList.b; factList = factList.b) // WHILE_CONS { var entry = factList.a; var tag = entry.$; var key = entry.n; var value = entry.o; if (tag === 'a2') { (key === 'className') ? _VirtualDom_addClass(facts, key, _Json_unwrap(value)) : facts[key] = _Json_unwrap(value); continue; } var subFacts = facts[tag] || (facts[tag] = {}); (tag === 'a3' && key === 'class') ? _VirtualDom_addClass(subFacts, key, value) : subFacts[key] = value; } return facts; } function _VirtualDom_addClass(object, key, newClass) { var classes = object[key]; object[key] = classes ? classes + ' ' + newClass : newClass; } // RENDER function _VirtualDom_render(vNode, eventNode) { var tag = vNode.$; if (tag === 5) { return _VirtualDom_render(vNode.k || (vNode.k = vNode.m()), eventNode); } if (tag === 0) { return _VirtualDom_doc.createTextNode(vNode.a); } if (tag === 4) { var subNode = vNode.k; var tagger = vNode.j; while (subNode.$ === 4) { typeof tagger !== 'object' ? tagger = [tagger, subNode.j] : tagger.push(subNode.j); subNode = subNode.k; } var subEventRoot = { j: tagger, p: eventNode }; var domNode = _VirtualDom_render(subNode, subEventRoot); domNode.elm_event_node_ref = subEventRoot; return domNode; } if (tag === 3) { var domNode = vNode.h(vNode.g); _VirtualDom_applyFacts(domNode, eventNode, vNode.d); return domNode; } // at this point `tag` must be 1 or 2 var domNode = vNode.f ? _VirtualDom_doc.createElementNS(vNode.f, vNode.c) : _VirtualDom_doc.createElement(vNode.c); if (_VirtualDom_divertHrefToApp && vNode.c == 'a') { domNode.addEventListener('click', _VirtualDom_divertHrefToApp(domNode)); } _VirtualDom_applyFacts(domNode, eventNode, vNode.d); for (var kids = vNode.e, i = 0; i < kids.length; i++) { _VirtualDom_appendChild(domNode, _VirtualDom_render(tag === 1 ? kids[i] : kids[i].b, eventNode)); } return domNode; } // APPLY FACTS function _VirtualDom_applyFacts(domNode, eventNode, facts) { for (var key in facts) { var value = facts[key]; key === 'a1' ? _VirtualDom_applyStyles(domNode, value) : key === 'a0' ? _VirtualDom_applyEvents(domNode, eventNode, value) : key === 'a3' ? _VirtualDom_applyAttrs(domNode, value) : key === 'a4' ? _VirtualDom_applyAttrsNS(domNode, value) : ((key !== 'value' && key !== 'checked') || domNode[key] !== value) && (domNode[key] = value); } } // APPLY STYLES function _VirtualDom_applyStyles(domNode, styles) { var domNodeStyle = domNode.style; for (var key in styles) { domNodeStyle[key] = styles[key]; } } // APPLY ATTRS function _VirtualDom_applyAttrs(domNode, attrs) { for (var key in attrs) { var value = attrs[key]; typeof value !== 'undefined' ? domNode.setAttribute(key, value) : domNode.removeAttribute(key); } } // APPLY NAMESPACED ATTRS function _VirtualDom_applyAttrsNS(domNode, nsAttrs) { for (var key in nsAttrs) { var pair = nsAttrs[key]; var namespace = pair.f; var value = pair.o; typeof value !== 'undefined' ? domNode.setAttributeNS(namespace, key, value) : domNode.removeAttributeNS(namespace, key); } } // APPLY EVENTS function _VirtualDom_applyEvents(domNode, eventNode, events) { var allCallbacks = domNode.elmFs || (domNode.elmFs = {}); for (var key in events) { var newHandler = events[key]; var oldCallback = allCallbacks[key]; if (!newHandler) { domNode.removeEventListener(key, oldCallback); allCallbacks[key] = undefined; continue; } if (oldCallback) { var oldHandler = oldCallback.q; if (oldHandler.$ === newHandler.$) { oldCallback.q = newHandler; continue; } domNode.removeEventListener(key, oldCallback); } oldCallback = _VirtualDom_makeCallback(eventNode, newHandler); domNode.addEventListener(key, oldCallback, _VirtualDom_passiveSupported && { passive: $elm$virtual_dom$VirtualDom$toHandlerInt(newHandler) < 2 } ); allCallbacks[key] = oldCallback; } } // PASSIVE EVENTS var _VirtualDom_passiveSupported; try { window.addEventListener('t', null, Object.defineProperty({}, 'passive', { get: function() { _VirtualDom_passiveSupported = true; } })); } catch(e) {} // EVENT HANDLERS function _VirtualDom_makeCallback(eventNode, initialHandler) { function callback(event) { var handler = callback.q; var result = _Json_runHelp(handler.a, event); if (!$elm$core$Result$isOk(result)) { return; } var tag = $elm$virtual_dom$VirtualDom$toHandlerInt(handler); // 0 = Normal // 1 = MayStopPropagation // 2 = MayPreventDefault // 3 = Custom var value = result.a; var message = !tag ? value : tag < 3 ? value.a : value.message; var stopPropagation = tag == 1 ? value.b : tag == 3 && value.stopPropagation; var currentEventNode = ( stopPropagation && event.stopPropagation(), (tag == 2 ? value.b : tag == 3 && value.preventDefault) && event.preventDefault(), eventNode ); var tagger; var i; while (tagger = currentEventNode.j) { if (typeof tagger == 'function') { message = tagger(message); } else { for (var i = tagger.length; i--; ) { message = tagger[i](message); } } currentEventNode = currentEventNode.p; } currentEventNode(message, stopPropagation); // stopPropagation implies isSync } callback.q = initialHandler; return callback; } function _VirtualDom_equalEvents(x, y) { return x.$ == y.$ && _Json_equality(x.a, y.a); } // DIFF // TODO: Should we do patches like in iOS? // // type Patch // = At Int Patch // | Batch (List Patch) // | Change ... // // How could it not be better? // function _VirtualDom_diff(x, y) { var patches = []; _VirtualDom_diffHelp(x, y, patches, 0); return patches; } function _VirtualDom_pushPatch(patches, type, index, data) { var patch = { $: type, r: index, s: data, t: undefined, u: undefined }; patches.push(patch); return patch; } function _VirtualDom_diffHelp(x, y, patches, index) { if (x === y) { return; } var xType = x.$; var yType = y.$; // Bail if you run into different types of nodes. Implies that the // structure has changed significantly and it's not worth a diff. if (xType !== yType) { if (xType === 1 && yType === 2) { y = _VirtualDom_dekey(y); yType = 1; } else { _VirtualDom_pushPatch(patches, 0, index, y); return; } } // Now we know that both nodes are the same $. switch (yType) { case 5: var xRefs = x.l; var yRefs = y.l; var i = xRefs.length; var same = i === yRefs.length; while (same && i--) { same = xRefs[i] === yRefs[i]; } if (same) { y.k = x.k; return; } y.k = y.m(); var subPatches = []; _VirtualDom_diffHelp(x.k, y.k, subPatches, 0); subPatches.length > 0 && _VirtualDom_pushPatch(patches, 1, index, subPatches); return; case 4: // gather nested taggers var xTaggers = x.j; var yTaggers = y.j; var nesting = false; var xSubNode = x.k; while (xSubNode.$ === 4) { nesting = true; typeof xTaggers !== 'object' ? xTaggers = [xTaggers, xSubNode.j] : xTaggers.push(xSubNode.j); xSubNode = xSubNode.k; } var ySubNode = y.k; while (ySubNode.$ === 4) { nesting = true; typeof yTaggers !== 'object' ? yTaggers = [yTaggers, ySubNode.j] : yTaggers.push(ySubNode.j); ySubNode = ySubNode.k; } // Just bail if different numbers of taggers. This implies the // structure of the virtual DOM has changed. if (nesting && xTaggers.length !== yTaggers.length) { _VirtualDom_pushPatch(patches, 0, index, y); return; } // check if taggers are "the same" if (nesting ? !_VirtualDom_pairwiseRefEqual(xTaggers, yTaggers) : xTaggers !== yTaggers) { _VirtualDom_pushPatch(patches, 2, index, yTaggers); } // diff everything below the taggers _VirtualDom_diffHelp(xSubNode, ySubNode, patches, index + 1); return; case 0: if (x.a !== y.a) { _VirtualDom_pushPatch(patches, 3, index, y.a); } return; case 1: _VirtualDom_diffNodes(x, y, patches, index, _VirtualDom_diffKids); return; case 2: _VirtualDom_diffNodes(x, y, patches, index, _VirtualDom_diffKeyedKids); return; case 3: if (x.h !== y.h) { _VirtualDom_pushPatch(patches, 0, index, y); return; } var factsDiff = _VirtualDom_diffFacts(x.d, y.d); factsDiff && _VirtualDom_pushPatch(patches, 4, index, factsDiff); var patch = y.i(x.g, y.g); patch && _VirtualDom_pushPatch(patches, 5, index, patch); return; } } // assumes the incoming arrays are the same length function _VirtualDom_pairwiseRefEqual(as, bs) { for (var i = 0; i < as.length; i++) { if (as[i] !== bs[i]) { return false; } } return true; } function _VirtualDom_diffNodes(x, y, patches, index, diffKids) { // Bail if obvious indicators have changed. Implies more serious // structural changes such that it's not worth it to diff. if (x.c !== y.c || x.f !== y.f) { _VirtualDom_pushPatch(patches, 0, index, y); return; } var factsDiff = _VirtualDom_diffFacts(x.d, y.d); factsDiff && _VirtualDom_pushPatch(patches, 4, index, factsDiff); diffKids(x, y, patches, index); } // DIFF FACTS // TODO Instead of creating a new diff object, it's possible to just test if // there *is* a diff. During the actual patch, do the diff again and make the // modifications directly. This way, there's no new allocations. Worth it? function _VirtualDom_diffFacts(x, y, category) { var diff; // look for changes and removals for (var xKey in x) { if (xKey === 'a1' || xKey === 'a0' || xKey === 'a3' || xKey === 'a4') { var subDiff = _VirtualDom_diffFacts(x[xKey], y[xKey] || {}, xKey); if (subDiff) { diff = diff || {}; diff[xKey] = subDiff; } continue; } // remove if not in the new facts if (!(xKey in y)) { diff = diff || {}; diff[xKey] = !category ? (typeof x[xKey] === 'string' ? '' : null) : (category === 'a1') ? '' : (category === 'a0' || category === 'a3') ? undefined : { f: x[xKey].f, o: undefined }; continue; } var xValue = x[xKey]; var yValue = y[xKey]; // reference equal, so don't worry about it if (xValue === yValue && xKey !== 'value' && xKey !== 'checked' || category === 'a0' && _VirtualDom_equalEvents(xValue, yValue)) { continue; } diff = diff || {}; diff[xKey] = yValue; } // add new stuff for (var yKey in y) { if (!(yKey in x)) { diff = diff || {}; diff[yKey] = y[yKey]; } } return diff; } // DIFF KIDS function _VirtualDom_diffKids(xParent, yParent, patches, index) { var xKids = xParent.e; var yKids = yParent.e; var xLen = xKids.length; var yLen = yKids.length; // FIGURE OUT IF THERE ARE INSERTS OR REMOVALS if (xLen > yLen) { _VirtualDom_pushPatch(patches, 6, index, { v: yLen, i: xLen - yLen }); } else if (xLen < yLen) { _VirtualDom_pushPatch(patches, 7, index, { v: xLen, e: yKids }); } // PAIRWISE DIFF EVERYTHING ELSE for (var minLen = xLen < yLen ? xLen : yLen, i = 0; i < minLen; i++) { var xKid = xKids[i]; _VirtualDom_diffHelp(xKid, yKids[i], patches, ++index); index += xKid.b || 0; } } // KEYED DIFF function _VirtualDom_diffKeyedKids(xParent, yParent, patches, rootIndex) { var localPatches = []; var changes = {}; // Dict String Entry var inserts = []; // Array { index : Int, entry : Entry } // type Entry = { tag : String, vnode : VNode, index : Int, data : _ } var xKids = xParent.e; var yKids = yParent.e; var xLen = xKids.length; var yLen = yKids.length; var xIndex = 0; var yIndex = 0; var index = rootIndex; while (xIndex < xLen && yIndex < yLen) { var x = xKids[xIndex]; var y = yKids[yIndex]; var xKey = x.a; var yKey = y.a; var xNode = x.b; var yNode = y.b; var newMatch = undefined; var oldMatch = undefined; // check if keys match if (xKey === yKey) { index++; _VirtualDom_diffHelp(xNode, yNode, localPatches, index); index += xNode.b || 0; xIndex++; yIndex++; continue; } // look ahead 1 to detect insertions and removals. var xNext = xKids[xIndex + 1]; var yNext = yKids[yIndex + 1]; if (xNext) { var xNextKey = xNext.a; var xNextNode = xNext.b; oldMatch = yKey === xNextKey; } if (yNext) { var yNextKey = yNext.a; var yNextNode = yNext.b; newMatch = xKey === yNextKey; } // swap x and y if (newMatch && oldMatch) { index++; _VirtualDom_diffHelp(xNode, yNextNode, localPatches, index); _VirtualDom_insertNode(changes, localPatches, xKey, yNode, yIndex, inserts); index += xNode.b || 0; index++; _VirtualDom_removeNode(changes, localPatches, xKey, xNextNode, index); index += xNextNode.b || 0; xIndex += 2; yIndex += 2; continue; } // insert y if (newMatch) { index++; _VirtualDom_insertNode(changes, localPatches, yKey, yNode, yIndex, inserts); _VirtualDom_diffHelp(xNode, yNextNode, localPatches, index); index += xNode.b || 0; xIndex += 1; yIndex += 2; continue; } // remove x if (oldMatch) { index++; _VirtualDom_removeNode(changes, localPatches, xKey, xNode, index); index += xNode.b || 0; index++; _VirtualDom_diffHelp(xNextNode, yNode, localPatches, index); index += xNextNode.b || 0; xIndex += 2; yIndex += 1; continue; } // remove x, insert y if (xNext && xNextKey === yNextKey) { index++; _VirtualDom_removeNode(changes, localPatches, xKey, xNode, index); _VirtualDom_insertNode(changes, localPatches, yKey, yNode, yIndex, inserts); index += xNode.b || 0; index++; _VirtualDom_diffHelp(xNextNode, yNextNode, localPatches, index); index += xNextNode.b || 0; xIndex += 2; yIndex += 2; continue; } break; } // eat up any remaining nodes with removeNode and insertNode while (xIndex < xLen) { index++; var x = xKids[xIndex]; var xNode = x.b; _VirtualDom_removeNode(changes, localPatches, x.a, xNode, index); index += xNode.b || 0; xIndex++; } while (yIndex < yLen) { var endInserts = endInserts || []; var y = yKids[yIndex]; _VirtualDom_insertNode(changes, localPatches, y.a, y.b, undefined, endInserts); yIndex++; } if (localPatches.length > 0 || inserts.length > 0 || endInserts) { _VirtualDom_pushPatch(patches, 8, rootIndex, { w: localPatches, x: inserts, y: endInserts }); } } // CHANGES FROM KEYED DIFF var _VirtualDom_POSTFIX = '_elmW6BL'; function _VirtualDom_insertNode(changes, localPatches, key, vnode, yIndex, inserts) { var entry = changes[key]; // never seen this key before if (!entry) { entry = { c: 0, z: vnode, r: yIndex, s: undefined }; inserts.push({ r: yIndex, A: entry }); changes[key] = entry; return; } // this key was removed earlier, a match! if (entry.c === 1) { inserts.push({ r: yIndex, A: entry }); entry.c = 2; var subPatches = []; _VirtualDom_diffHelp(entry.z, vnode, subPatches, entry.r); entry.r = yIndex; entry.s.s = { w: subPatches, A: entry }; return; } // this key has already been inserted or moved, a duplicate! _VirtualDom_insertNode(changes, localPatches, key + _VirtualDom_POSTFIX, vnode, yIndex, inserts); } function _VirtualDom_removeNode(changes, localPatches, key, vnode, index) { var entry = changes[key]; // never seen this key before if (!entry) { var patch = _VirtualDom_pushPatch(localPatches, 9, index, undefined); changes[key] = { c: 1, z: vnode, r: index, s: patch }; return; } // this key was inserted earlier, a match! if (entry.c === 0) { entry.c = 2; var subPatches = []; _VirtualDom_diffHelp(vnode, entry.z, subPatches, index); _VirtualDom_pushPatch(localPatches, 9, index, { w: subPatches, A: entry }); return; } // this key has already been removed or moved, a duplicate! _VirtualDom_removeNode(changes, localPatches, key + _VirtualDom_POSTFIX, vnode, index); } // ADD DOM NODES // // Each DOM node has an "index" assigned in order of traversal. It is important // to minimize our crawl over the actual DOM, so these indexes (along with the // descendantsCount of virtual nodes) let us skip touching entire subtrees of // the DOM if we know there are no patches there. function _VirtualDom_addDomNodes(domNode, vNode, patches, eventNode) { _VirtualDom_addDomNodesHelp(domNode, vNode, patches, 0, 0, vNode.b, eventNode); } // assumes `patches` is non-empty and indexes increase monotonically. function _VirtualDom_addDomNodesHelp(domNode, vNode, patches, i, low, high, eventNode) { var patch = patches[i]; var index = patch.r; while (index === low) { var patchType = patch.$; if (patchType === 1) { _VirtualDom_addDomNodes(domNode, vNode.k, patch.s, eventNode); } else if (patchType === 8) { patch.t = domNode; patch.u = eventNode; var subPatches = patch.s.w; if (subPatches.length > 0) { _VirtualDom_addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); } } else if (patchType === 9) { patch.t = domNode; patch.u = eventNode; var data = patch.s; if (data) { data.A.s = domNode; var subPatches = data.w; if (subPatches.length > 0) { _VirtualDom_addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); } } } else { patch.t = domNode; patch.u = eventNode; } i++; if (!(patch = patches[i]) || (index = patch.r) > high) { return i; } } var tag = vNode.$; if (tag === 4) { var subNode = vNode.k; while (subNode.$ === 4) { subNode = subNode.k; } return _VirtualDom_addDomNodesHelp(domNode, subNode, patches, i, low + 1, high, domNode.elm_event_node_ref); } // tag must be 1 or 2 at this point var vKids = vNode.e; var childNodes = domNode.childNodes; for (var j = 0; j < vKids.length; j++) { low++; var vKid = tag === 1 ? vKids[j] : vKids[j].b; var nextLow = low + (vKid.b || 0); if (low <= index && index <= nextLow) { i = _VirtualDom_addDomNodesHelp(childNodes[j], vKid, patches, i, low, nextLow, eventNode); if (!(patch = patches[i]) || (index = patch.r) > high) { return i; } } low = nextLow; } return i; } // APPLY PATCHES function _VirtualDom_applyPatches(rootDomNode, oldVirtualNode, patches, eventNode) { if (patches.length === 0) { return rootDomNode; } _VirtualDom_addDomNodes(rootDomNode, oldVirtualNode, patches, eventNode); return _VirtualDom_applyPatchesHelp(rootDomNode, patches); } function _VirtualDom_applyPatchesHelp(rootDomNode, patches) { for (var i = 0; i < patches.length; i++) { var patch = patches[i]; var localDomNode = patch.t var newNode = _VirtualDom_applyPatch(localDomNode, patch); if (localDomNode === rootDomNode) { rootDomNode = newNode; } } return rootDomNode; } function _VirtualDom_applyPatch(domNode, patch) { switch (patch.$) { case 0: return _VirtualDom_applyPatchRedraw(domNode, patch.s, patch.u); case 4: _VirtualDom_applyFacts(domNode, patch.u, patch.s); return domNode; case 3: domNode.replaceData(0, domNode.length, patch.s); return domNode; case 1: return _VirtualDom_applyPatchesHelp(domNode, patch.s); case 2: if (domNode.elm_event_node_ref) { domNode.elm_event_node_ref.j = patch.s; } else { domNode.elm_event_node_ref = { j: patch.s, p: patch.u }; } return domNode; case 6: var data = patch.s; for (var i = 0; i < data.i; i++) { domNode.removeChild(domNode.childNodes[data.v]); } return domNode; case 7: var data = patch.s; var kids = data.e; var i = data.v; var theEnd = domNode.childNodes[i]; for (; i < kids.length; i++) { domNode.insertBefore(_VirtualDom_render(kids[i], patch.u), theEnd); } return domNode; case 9: var data = patch.s; if (!data) { domNode.parentNode.removeChild(domNode); return domNode; } var entry = data.A; if (typeof entry.r !== 'undefined') { domNode.parentNode.removeChild(domNode); } entry.s = _VirtualDom_applyPatchesHelp(domNode, data.w); return domNode; case 8: return _VirtualDom_applyPatchReorder(domNode, patch); case 5: return patch.s(domNode); default: _Debug_crash(10); // 'Ran into an unknown patch!' } } function _VirtualDom_applyPatchRedraw(domNode, vNode, eventNode) { var parentNode = domNode.parentNode; var newNode = _VirtualDom_render(vNode, eventNode); if (!newNode.elm_event_node_ref) { newNode.elm_event_node_ref = domNode.elm_event_node_ref; } if (parentNode && newNode !== domNode) { parentNode.replaceChild(newNode, domNode); } return newNode; } function _VirtualDom_applyPatchReorder(domNode, patch) { var data = patch.s; // remove end inserts var frag = _VirtualDom_applyPatchReorderEndInsertsHelp(data.y, patch); // removals domNode = _VirtualDom_applyPatchesHelp(domNode, data.w); // inserts var inserts = data.x; for (var i = 0; i < inserts.length; i++) { var insert = inserts[i]; var entry = insert.A; var node = entry.c === 2 ? entry.s : _VirtualDom_render(entry.z, patch.u); domNode.insertBefore(node, domNode.childNodes[insert.r]); } // add end inserts if (frag) { _VirtualDom_appendChild(domNode, frag); } return domNode; } function _VirtualDom_applyPatchReorderEndInsertsHelp(endInserts, patch) { if (!endInserts) { return; } var frag = _VirtualDom_doc.createDocumentFragment(); for (var i = 0; i < endInserts.length; i++) { var insert = endInserts[i]; var entry = insert.A; _VirtualDom_appendChild(frag, entry.c === 2 ? entry.s : _VirtualDom_render(entry.z, patch.u) ); } return frag; } function _VirtualDom_virtualize(node) { // TEXT NODES if (node.nodeType === 3) { return _VirtualDom_text(node.textContent); } // WEIRD NODES if (node.nodeType !== 1) { return _VirtualDom_text(''); } // ELEMENT NODES var attrList = _List_Nil; var attrs = node.attributes; for (var i = attrs.length; i--; ) { var attr = attrs[i]; var name = attr.name; var value = attr.value; attrList = _List_Cons( A2(_VirtualDom_attribute, name, value), attrList ); } var tag = node.tagName.toLowerCase(); var kidList = _List_Nil; var kids = node.childNodes; for (var i = kids.length; i--; ) { kidList = _List_Cons(_VirtualDom_virtualize(kids[i]), kidList); } return A3(_VirtualDom_node, tag, attrList, kidList); } function _VirtualDom_dekey(keyedNode) { var keyedKids = keyedNode.e; var len = keyedKids.length; var kids = new Array(len); for (var i = 0; i < len; i++) { kids[i] = keyedKids[i].b; } return { $: 1, c: keyedNode.c, d: keyedNode.d, e: kids, f: keyedNode.f, b: keyedNode.b }; } // ELEMENT var _Debugger_element; var _Browser_element = _Debugger_element || F4(function(impl, flagDecoder, debugMetadata, args) { return _Platform_initialize( flagDecoder, args, impl.init, impl.update, impl.subscriptions, function(sendToApp, initialModel) { var view = impl.view; /**_UNUSED/ var domNode = args['node']; //*/ /**/ var domNode = args && args['node'] ? args['node'] : _Debug_crash(0); //*/ var currNode = _VirtualDom_virtualize(domNode); return _Browser_makeAnimator(initialModel, function(model) { var nextNode = view(model); var patches = _VirtualDom_diff(currNode, nextNode); domNode = _VirtualDom_applyPatches(domNode, currNode, patches, sendToApp); currNode = nextNode; }); } ); }); // DOCUMENT var _Debugger_document; var _Browser_document = _Debugger_document || F4(function(impl, flagDecoder, debugMetadata, args) { return _Platform_initialize( flagDecoder, args, impl.init, impl.update, impl.subscriptions, function(sendToApp, initialModel) { var divertHrefToApp = impl.setup && impl.setup(sendToApp) var view = impl.view; var title = _VirtualDom_doc.title; var bodyNode = _VirtualDom_doc.body; var currNode = _VirtualDom_virtualize(bodyNode); return _Browser_makeAnimator(initialModel, function(model) { _VirtualDom_divertHrefToApp = divertHrefToApp; var doc = view(model); var nextNode = _VirtualDom_node('body')(_List_Nil)(doc.body); var patches = _VirtualDom_diff(currNode, nextNode); bodyNode = _VirtualDom_applyPatches(bodyNode, currNode, patches, sendToApp); currNode = nextNode; _VirtualDom_divertHrefToApp = 0; (title !== doc.title) && (_VirtualDom_doc.title = title = doc.title); }); } ); }); // ANIMATION var _Browser_cancelAnimationFrame = typeof cancelAnimationFrame !== 'undefined' ? cancelAnimationFrame : function(id) { clearTimeout(id); }; var _Browser_requestAnimationFrame = typeof requestAnimationFrame !== 'undefined' ? requestAnimationFrame : function(callback) { return setTimeout(callback, 1000 / 60); }; function _Browser_makeAnimator(model, draw) { draw(model); var state = 0; function updateIfNeeded() { state = state === 1 ? 0 : ( _Browser_requestAnimationFrame(updateIfNeeded), draw(model), 1 ); } return function(nextModel, isSync) { model = nextModel; isSync ? ( draw(model), state === 2 && (state = 1) ) : ( state === 0 && _Browser_requestAnimationFrame(updateIfNeeded), state = 2 ); }; } // APPLICATION function _Browser_application(impl) { var onUrlChange = impl.onUrlChange; var onUrlRequest = impl.onUrlRequest; var key = function() { key.a(onUrlChange(_Browser_getUrl())); }; return _Browser_document({ setup: function(sendToApp) { key.a = sendToApp; _Browser_window.addEventListener('popstate', key); _Browser_window.navigator.userAgent.indexOf('Trident') < 0 || _Browser_window.addEventListener('hashchange', key); return F2(function(domNode, event) { if (!event.ctrlKey && !event.metaKey && !event.shiftKey && event.button < 1 && !domNode.target && !domNode.hasAttribute('download')) { event.preventDefault(); var href = domNode.href; var curr = _Browser_getUrl(); var next = $elm$url$Url$fromString(href).a; sendToApp(onUrlRequest( (next && curr.protocol === next.protocol && curr.host === next.host && curr.port_.a === next.port_.a ) ? $elm$browser$Browser$Internal(next) : $elm$browser$Browser$External(href) )); } }); }, init: function(flags) { return A3(impl.init, flags, _Browser_getUrl(), key); }, view: impl.view, update: impl.update, subscriptions: impl.subscriptions }); } function _Browser_getUrl() { return $elm$url$Url$fromString(_VirtualDom_doc.location.href).a || _Debug_crash(1); } var _Browser_go = F2(function(key, n) { return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() { n && history.go(n); key(); })); }); var _Browser_pushUrl = F2(function(key, url) { return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() { history.pushState({}, '', url); key(); })); }); var _Browser_replaceUrl = F2(function(key, url) { return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() { history.replaceState({}, '', url); key(); })); }); // GLOBAL EVENTS var _Browser_fakeNode = { addEventListener: function() {}, removeEventListener: function() {} }; var _Browser_doc = typeof document !== 'undefined' ? document : _Browser_fakeNode; var _Browser_window = typeof window !== 'undefined' ? window : _Browser_fakeNode; var _Browser_on = F3(function(node, eventName, sendToSelf) { return _Scheduler_spawn(_Scheduler_binding(function(callback) { function handler(event) { _Scheduler_rawSpawn(sendToSelf(event)); } node.addEventListener(eventName, handler, _VirtualDom_passiveSupported && { passive: true }); return function() { node.removeEventListener(eventName, handler); }; })); }); var _Browser_decodeEvent = F2(function(decoder, event) { var result = _Json_runHelp(decoder, event); return $elm$core$Result$isOk(result) ? $elm$core$Maybe$Just(result.a) : $elm$core$Maybe$Nothing; }); // PAGE VISIBILITY function _Browser_visibilityInfo() { return (typeof _VirtualDom_doc.hidden !== 'undefined') ? { hidden: 'hidden', change: 'visibilitychange' } : (typeof _VirtualDom_doc.mozHidden !== 'undefined') ? { hidden: 'mozHidden', change: 'mozvisibilitychange' } : (typeof _VirtualDom_doc.msHidden !== 'undefined') ? { hidden: 'msHidden', change: 'msvisibilitychange' } : (typeof _VirtualDom_doc.webkitHidden !== 'undefined') ? { hidden: 'webkitHidden', change: 'webkitvisibilitychange' } : { hidden: 'hidden', change: 'visibilitychange' }; } // ANIMATION FRAMES function _Browser_rAF() { return _Scheduler_binding(function(callback) { var id = _Browser_requestAnimationFrame(function() { callback(_Scheduler_succeed(Date.now())); }); return function() { _Browser_cancelAnimationFrame(id); }; }); } function _Browser_now() { return _Scheduler_binding(function(callback) { callback(_Scheduler_succeed(Date.now())); }); } // DOM STUFF function _Browser_withNode(id, doStuff) { return _Scheduler_binding(function(callback) { _Browser_requestAnimationFrame(function() { var node = document.getElementById(id); callback(node ? _Scheduler_succeed(doStuff(node)) : _Scheduler_fail($elm$browser$Browser$Dom$NotFound(id)) ); }); }); } function _Browser_withWindow(doStuff) { return _Scheduler_binding(function(callback) { _Browser_requestAnimationFrame(function() { callback(_Scheduler_succeed(doStuff())); }); }); } // FOCUS and BLUR var _Browser_call = F2(function(functionName, id) { return _Browser_withNode(id, function(node) { node[functionName](); return _Utils_Tuple0; }); }); // WINDOW VIEWPORT function _Browser_getViewport() { return { scene: _Browser_getScene(), viewport: { x: _Browser_window.pageXOffset, y: _Browser_window.pageYOffset, width: _Browser_doc.documentElement.clientWidth, height: _Browser_doc.documentElement.clientHeight } }; } function _Browser_getScene() { var body = _Browser_doc.body; var elem = _Browser_doc.documentElement; return { width: Math.max(body.scrollWidth, body.offsetWidth, elem.scrollWidth, elem.offsetWidth, elem.clientWidth), height: Math.max(body.scrollHeight, body.offsetHeight, elem.scrollHeight, elem.offsetHeight, elem.clientHeight) }; } var _Browser_setViewport = F2(function(x, y) { return _Browser_withWindow(function() { _Browser_window.scroll(x, y); return _Utils_Tuple0; }); }); // ELEMENT VIEWPORT function _Browser_getViewportOf(id) { return _Browser_withNode(id, function(node) { return { scene: { width: node.scrollWidth, height: node.scrollHeight }, viewport: { x: node.scrollLeft, y: node.scrollTop, width: node.clientWidth, height: node.clientHeight } }; }); } var _Browser_setViewportOf = F3(function(id, x, y) { return _Browser_withNode(id, function(node) { node.scrollLeft = x; node.scrollTop = y; return _Utils_Tuple0; }); }); // ELEMENT function _Browser_getElement(id) { return _Browser_withNode(id, function(node) { var rect = node.getBoundingClientRect(); var x = _Browser_window.pageXOffset; var y = _Browser_window.pageYOffset; return { scene: _Browser_getScene(), viewport: { x: x, y: y, width: _Browser_doc.documentElement.clientWidth, height: _Browser_doc.documentElement.clientHeight }, element: { x: x + rect.left, y: y + rect.top, width: rect.width, height: rect.height } }; }); } // LOAD and RELOAD function _Browser_reload(skipCache) { return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function(callback) { _VirtualDom_doc.location.reload(skipCache); })); } function _Browser_load(url) { return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function(callback) { try { _Browser_window.location = url; } catch(err) { // Only Firefox can throw a NS_ERROR_MALFORMED_URI exception here. // Other browsers reload the page, so let's be consistent about that. _VirtualDom_doc.location.reload(false); } })); } // SEND REQUEST var _Http_toTask = F3(function(router, toTask, request) { return _Scheduler_binding(function(callback) { function done(response) { callback(toTask(request.expect.a(response))); } var xhr = new XMLHttpRequest(); xhr.addEventListener('error', function() { done($elm$http$Http$NetworkError_); }); xhr.addEventListener('timeout', function() { done($elm$http$Http$Timeout_); }); xhr.addEventListener('load', function() { done(_Http_toResponse(request.expect.b, xhr)); }); $elm$core$Maybe$isJust(request.tracker) && _Http_track(router, xhr, request.tracker.a); try { xhr.open(request.method, request.url, true); } catch (e) { return done($elm$http$Http$BadUrl_(request.url)); } _Http_configureRequest(xhr, request); request.body.a && xhr.setRequestHeader('Content-Type', request.body.a); xhr.send(request.body.b); return function() { xhr.c = true; xhr.abort(); }; }); }); // CONFIGURE function _Http_configureRequest(xhr, request) { for (var headers = request.headers; headers.b; headers = headers.b) // WHILE_CONS { xhr.setRequestHeader(headers.a.a, headers.a.b); } xhr.timeout = request.timeout.a || 0; xhr.responseType = request.expect.d; xhr.withCredentials = request.allowCookiesFromOtherDomains; } // RESPONSES function _Http_toResponse(toBody, xhr) { return A2( 200 <= xhr.status && xhr.status < 300 ? $elm$http$Http$GoodStatus_ : $elm$http$Http$BadStatus_, _Http_toMetadata(xhr), toBody(xhr.response) ); } // METADATA function _Http_toMetadata(xhr) { return { url: xhr.responseURL, statusCode: xhr.status, statusText: xhr.statusText, headers: _Http_parseHeaders(xhr.getAllResponseHeaders()) }; } // HEADERS function _Http_parseHeaders(rawHeaders) { if (!rawHeaders) { return $elm$core$Dict$empty; } var headers = $elm$core$Dict$empty; var headerPairs = rawHeaders.split('\r\n'); for (var i = headerPairs.length; i--; ) { var headerPair = headerPairs[i]; var index = headerPair.indexOf(': '); if (index > 0) { var key = headerPair.substring(0, index); var value = headerPair.substring(index + 2); headers = A3($elm$core$Dict$update, key, function(oldValue) { return $elm$core$Maybe$Just($elm$core$Maybe$isJust(oldValue) ? value + ', ' + oldValue.a : value ); }, headers); } } return headers; } // EXPECT var _Http_expect = F3(function(type, toBody, toValue) { return { $: 0, d: type, b: toBody, a: toValue }; }); var _Http_mapExpect = F2(function(func, expect) { return { $: 0, d: expect.d, b: expect.b, a: function(x) { return func(expect.a(x)); } }; }); function _Http_toDataView(arrayBuffer) { return new DataView(arrayBuffer); } // BODY and PARTS var _Http_emptyBody = { $: 0 }; var _Http_pair = F2(function(a, b) { return { $: 0, a: a, b: b }; }); function _Http_toFormData(parts) { for (var formData = new FormData(); parts.b; parts = parts.b) // WHILE_CONS { var part = parts.a; formData.append(part.a, part.b); } return formData; } var _Http_bytesToBlob = F2(function(mime, bytes) { return new Blob([bytes], { type: mime }); }); // PROGRESS function _Http_track(router, xhr, tracker) { // TODO check out lengthComputable on loadstart event xhr.upload.addEventListener('progress', function(event) { if (xhr.c) { return; } _Scheduler_rawSpawn(A2($elm$core$Platform$sendToSelf, router, _Utils_Tuple2(tracker, $elm$http$Http$Sending({ sent: event.loaded, size: event.total })))); }); xhr.addEventListener('progress', function(event) { if (xhr.c) { return; } _Scheduler_rawSpawn(A2($elm$core$Platform$sendToSelf, router, _Utils_Tuple2(tracker, $elm$http$Http$Receiving({ received: event.loaded, size: event.lengthComputable ? $elm$core$Maybe$Just(event.total) : $elm$core$Maybe$Nothing })))); }); } var _Bitwise_and = F2(function(a, b) { return a & b; }); var _Bitwise_or = F2(function(a, b) { return a | b; }); var _Bitwise_xor = F2(function(a, b) { return a ^ b; }); function _Bitwise_complement(a) { return ~a; }; var _Bitwise_shiftLeftBy = F2(function(offset, a) { return a << offset; }); var _Bitwise_shiftRightBy = F2(function(offset, a) { return a >> offset; }); var _Bitwise_shiftRightZfBy = F2(function(offset, a) { return a >>> offset; }); // eslint-disable-next-line no-unused-vars var _Texture_load = F6(function (magnify, mininify, horizontalWrap, verticalWrap, flipY, url) { var isMipmap = mininify !== 9728 && mininify !== 9729; return _Scheduler_binding(function (callback) { var img = new Image(); function createTexture(gl) { var texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipY); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, magnify); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, mininify); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, horizontalWrap); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, verticalWrap); if (isMipmap) { gl.generateMipmap(gl.TEXTURE_2D); } gl.bindTexture(gl.TEXTURE_2D, null); return texture; } img.onload = function () { var width = img.width; var height = img.height; var widthPowerOfTwo = (width & (width - 1)) === 0; var heightPowerOfTwo = (height & (height - 1)) === 0; var isSizeValid = (widthPowerOfTwo && heightPowerOfTwo) || ( !isMipmap && horizontalWrap === 33071 // clamp to edge && verticalWrap === 33071 ); if (isSizeValid) { callback(_Scheduler_succeed({ $: 0, createTexture: createTexture, a: width, b: height })); } else { callback(_Scheduler_fail(A2( $elm_explorations$webgl$WebGL$Texture$SizeError, width, height ))); } }; img.onerror = function () { callback(_Scheduler_fail($elm_explorations$webgl$WebGL$Texture$LoadError)); }; if (url.slice(0, 5) !== 'data:') { img.crossOrigin = 'Anonymous'; } img.src = url; }); }); // eslint-disable-next-line no-unused-vars var _Texture_size = function (texture) { return _Utils_Tuple2(texture.a, texture.b); }; function _Time_now(millisToPosix) { return _Scheduler_binding(function(callback) { callback(_Scheduler_succeed(millisToPosix(Date.now()))); }); } var _Time_setInterval = F2(function(interval, task) { return _Scheduler_binding(function(callback) { var id = setInterval(function() { _Scheduler_rawSpawn(task); }, interval); return function() { clearInterval(id); }; }); }); function _Time_here() { return _Scheduler_binding(function(callback) { callback(_Scheduler_succeed( A2($elm$time$Time$customZone, -(new Date().getTimezoneOffset()), _List_Nil) )); }); } function _Time_getZoneName() { return _Scheduler_binding(function(callback) { try { var name = $elm$time$Time$Name(Intl.DateTimeFormat().resolvedOptions().timeZone); } catch (e) { var name = $elm$time$Time$Offset(new Date().getTimezoneOffset()); } callback(_Scheduler_succeed(name)); }); } /* * Copyright (c) 2010 Mozilla Corporation * Copyright (c) 2010 Vladimir Vukicevic * Copyright (c) 2013 John Mayer * Copyright (c) 2018 Andrey Kuzmin * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ // Vector2 var _MJS_v2 = F2(function(x, y) { return new Float64Array([x, y]); }); var _MJS_v2getX = function(a) { return a[0]; }; var _MJS_v2getY = function(a) { return a[1]; }; var _MJS_v2setX = F2(function(x, a) { return new Float64Array([x, a[1]]); }); var _MJS_v2setY = F2(function(y, a) { return new Float64Array([a[0], y]); }); var _MJS_v2toRecord = function(a) { return { x: a[0], y: a[1] }; }; var _MJS_v2fromRecord = function(r) { return new Float64Array([r.x, r.y]); }; var _MJS_v2add = F2(function(a, b) { var r = new Float64Array(2); r[0] = a[0] + b[0]; r[1] = a[1] + b[1]; return r; }); var _MJS_v2sub = F2(function(a, b) { var r = new Float64Array(2); r[0] = a[0] - b[0]; r[1] = a[1] - b[1]; return r; }); var _MJS_v2negate = function(a) { var r = new Float64Array(2); r[0] = -a[0]; r[1] = -a[1]; return r; }; var _MJS_v2direction = F2(function(a, b) { var r = new Float64Array(2); r[0] = a[0] - b[0]; r[1] = a[1] - b[1]; var im = 1.0 / _MJS_v2lengthLocal(r); r[0] = r[0] * im; r[1] = r[1] * im; return r; }); function _MJS_v2lengthLocal(a) { return Math.sqrt(a[0] * a[0] + a[1] * a[1]); } var _MJS_v2length = _MJS_v2lengthLocal; var _MJS_v2lengthSquared = function(a) { return a[0] * a[0] + a[1] * a[1]; }; var _MJS_v2distance = F2(function(a, b) { var dx = a[0] - b[0]; var dy = a[1] - b[1]; return Math.sqrt(dx * dx + dy * dy); }); var _MJS_v2distanceSquared = F2(function(a, b) { var dx = a[0] - b[0]; var dy = a[1] - b[1]; return dx * dx + dy * dy; }); var _MJS_v2normalize = function(a) { var r = new Float64Array(2); var im = 1.0 / _MJS_v2lengthLocal(a); r[0] = a[0] * im; r[1] = a[1] * im; return r; }; var _MJS_v2scale = F2(function(k, a) { var r = new Float64Array(2); r[0] = a[0] * k; r[1] = a[1] * k; return r; }); var _MJS_v2dot = F2(function(a, b) { return a[0] * b[0] + a[1] * b[1]; }); // Vector3 var _MJS_v3temp1Local = new Float64Array(3); var _MJS_v3temp2Local = new Float64Array(3); var _MJS_v3temp3Local = new Float64Array(3); var _MJS_v3 = F3(function(x, y, z) { return new Float64Array([x, y, z]); }); var _MJS_v3getX = function(a) { return a[0]; }; var _MJS_v3getY = function(a) { return a[1]; }; var _MJS_v3getZ = function(a) { return a[2]; }; var _MJS_v3setX = F2(function(x, a) { return new Float64Array([x, a[1], a[2]]); }); var _MJS_v3setY = F2(function(y, a) { return new Float64Array([a[0], y, a[2]]); }); var _MJS_v3setZ = F2(function(z, a) { return new Float64Array([a[0], a[1], z]); }); var _MJS_v3toRecord = function(a) { return { x: a[0], y: a[1], z: a[2] }; }; var _MJS_v3fromRecord = function(r) { return new Float64Array([r.x, r.y, r.z]); }; var _MJS_v3add = F2(function(a, b) { var r = new Float64Array(3); r[0] = a[0] + b[0]; r[1] = a[1] + b[1]; r[2] = a[2] + b[2]; return r; }); function _MJS_v3subLocal(a, b, r) { if (r === undefined) { r = new Float64Array(3); } r[0] = a[0] - b[0]; r[1] = a[1] - b[1]; r[2] = a[2] - b[2]; return r; } var _MJS_v3sub = F2(_MJS_v3subLocal); var _MJS_v3negate = function(a) { var r = new Float64Array(3); r[0] = -a[0]; r[1] = -a[1]; r[2] = -a[2]; return r; }; function _MJS_v3directionLocal(a, b, r) { if (r === undefined) { r = new Float64Array(3); } return _MJS_v3normalizeLocal(_MJS_v3subLocal(a, b, r), r); } var _MJS_v3direction = F2(_MJS_v3directionLocal); function _MJS_v3lengthLocal(a) { return Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]); } var _MJS_v3length = _MJS_v3lengthLocal; var _MJS_v3lengthSquared = function(a) { return a[0] * a[0] + a[1] * a[1] + a[2] * a[2]; }; var _MJS_v3distance = F2(function(a, b) { var dx = a[0] - b[0]; var dy = a[1] - b[1]; var dz = a[2] - b[2]; return Math.sqrt(dx * dx + dy * dy + dz * dz); }); var _MJS_v3distanceSquared = F2(function(a, b) { var dx = a[0] - b[0]; var dy = a[1] - b[1]; var dz = a[2] - b[2]; return dx * dx + dy * dy + dz * dz; }); function _MJS_v3normalizeLocal(a, r) { if (r === undefined) { r = new Float64Array(3); } var im = 1.0 / _MJS_v3lengthLocal(a); r[0] = a[0] * im; r[1] = a[1] * im; r[2] = a[2] * im; return r; } var _MJS_v3normalize = _MJS_v3normalizeLocal; var _MJS_v3scale = F2(function(k, a) { return new Float64Array([a[0] * k, a[1] * k, a[2] * k]); }); var _MJS_v3dotLocal = function(a, b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; }; var _MJS_v3dot = F2(_MJS_v3dotLocal); function _MJS_v3crossLocal(a, b, r) { if (r === undefined) { r = new Float64Array(3); } r[0] = a[1] * b[2] - a[2] * b[1]; r[1] = a[2] * b[0] - a[0] * b[2]; r[2] = a[0] * b[1] - a[1] * b[0]; return r; } var _MJS_v3cross = F2(_MJS_v3crossLocal); var _MJS_v3mul4x4 = F2(function(m, v) { var w; var tmp = _MJS_v3temp1Local; var r = new Float64Array(3); tmp[0] = m[3]; tmp[1] = m[7]; tmp[2] = m[11]; w = _MJS_v3dotLocal(v, tmp) + m[15]; tmp[0] = m[0]; tmp[1] = m[4]; tmp[2] = m[8]; r[0] = (_MJS_v3dotLocal(v, tmp) + m[12]) / w; tmp[0] = m[1]; tmp[1] = m[5]; tmp[2] = m[9]; r[1] = (_MJS_v3dotLocal(v, tmp) + m[13]) / w; tmp[0] = m[2]; tmp[1] = m[6]; tmp[2] = m[10]; r[2] = (_MJS_v3dotLocal(v, tmp) + m[14]) / w; return r; }); // Vector4 var _MJS_v4 = F4(function(x, y, z, w) { return new Float64Array([x, y, z, w]); }); var _MJS_v4getX = function(a) { return a[0]; }; var _MJS_v4getY = function(a) { return a[1]; }; var _MJS_v4getZ = function(a) { return a[2]; }; var _MJS_v4getW = function(a) { return a[3]; }; var _MJS_v4setX = F2(function(x, a) { return new Float64Array([x, a[1], a[2], a[3]]); }); var _MJS_v4setY = F2(function(y, a) { return new Float64Array([a[0], y, a[2], a[3]]); }); var _MJS_v4setZ = F2(function(z, a) { return new Float64Array([a[0], a[1], z, a[3]]); }); var _MJS_v4setW = F2(function(w, a) { return new Float64Array([a[0], a[1], a[2], w]); }); var _MJS_v4toRecord = function(a) { return { x: a[0], y: a[1], z: a[2], w: a[3] }; }; var _MJS_v4fromRecord = function(r) { return new Float64Array([r.x, r.y, r.z, r.w]); }; var _MJS_v4add = F2(function(a, b) { var r = new Float64Array(4); r[0] = a[0] + b[0]; r[1] = a[1] + b[1]; r[2] = a[2] + b[2]; r[3] = a[3] + b[3]; return r; }); var _MJS_v4sub = F2(function(a, b) { var r = new Float64Array(4); r[0] = a[0] - b[0]; r[1] = a[1] - b[1]; r[2] = a[2] - b[2]; r[3] = a[3] - b[3]; return r; }); var _MJS_v4negate = function(a) { var r = new Float64Array(4); r[0] = -a[0]; r[1] = -a[1]; r[2] = -a[2]; r[3] = -a[3]; return r; }; var _MJS_v4direction = F2(function(a, b) { var r = new Float64Array(4); r[0] = a[0] - b[0]; r[1] = a[1] - b[1]; r[2] = a[2] - b[2]; r[3] = a[3] - b[3]; var im = 1.0 / _MJS_v4lengthLocal(r); r[0] = r[0] * im; r[1] = r[1] * im; r[2] = r[2] * im; r[3] = r[3] * im; return r; }); function _MJS_v4lengthLocal(a) { return Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2] + a[3] * a[3]); } var _MJS_v4length = _MJS_v4lengthLocal; var _MJS_v4lengthSquared = function(a) { return a[0] * a[0] + a[1] * a[1] + a[2] * a[2] + a[3] * a[3]; }; var _MJS_v4distance = F2(function(a, b) { var dx = a[0] - b[0]; var dy = a[1] - b[1]; var dz = a[2] - b[2]; var dw = a[3] - b[3]; return Math.sqrt(dx * dx + dy * dy + dz * dz + dw * dw); }); var _MJS_v4distanceSquared = F2(function(a, b) { var dx = a[0] - b[0]; var dy = a[1] - b[1]; var dz = a[2] - b[2]; var dw = a[3] - b[3]; return dx * dx + dy * dy + dz * dz + dw * dw; }); var _MJS_v4normalize = function(a) { var r = new Float64Array(4); var im = 1.0 / _MJS_v4lengthLocal(a); r[0] = a[0] * im; r[1] = a[1] * im; r[2] = a[2] * im; r[3] = a[3] * im; return r; }; var _MJS_v4scale = F2(function(k, a) { var r = new Float64Array(4); r[0] = a[0] * k; r[1] = a[1] * k; r[2] = a[2] * k; r[3] = a[3] * k; return r; }); var _MJS_v4dot = F2(function(a, b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; }); // Matrix4 var _MJS_m4x4temp1Local = new Float64Array(16); var _MJS_m4x4temp2Local = new Float64Array(16); var _MJS_m4x4identity = new Float64Array([ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ]); var _MJS_m4x4fromRecord = function(r) { var m = new Float64Array(16); m[0] = r.m11; m[1] = r.m21; m[2] = r.m31; m[3] = r.m41; m[4] = r.m12; m[5] = r.m22; m[6] = r.m32; m[7] = r.m42; m[8] = r.m13; m[9] = r.m23; m[10] = r.m33; m[11] = r.m43; m[12] = r.m14; m[13] = r.m24; m[14] = r.m34; m[15] = r.m44; return m; }; var _MJS_m4x4toRecord = function(m) { return { m11: m[0], m21: m[1], m31: m[2], m41: m[3], m12: m[4], m22: m[5], m32: m[6], m42: m[7], m13: m[8], m23: m[9], m33: m[10], m43: m[11], m14: m[12], m24: m[13], m34: m[14], m44: m[15] }; }; var _MJS_m4x4inverse = function(m) { var r = new Float64Array(16); r[0] = m[5] * m[10] * m[15] - m[5] * m[11] * m[14] - m[9] * m[6] * m[15] + m[9] * m[7] * m[14] + m[13] * m[6] * m[11] - m[13] * m[7] * m[10]; r[4] = -m[4] * m[10] * m[15] + m[4] * m[11] * m[14] + m[8] * m[6] * m[15] - m[8] * m[7] * m[14] - m[12] * m[6] * m[11] + m[12] * m[7] * m[10]; r[8] = m[4] * m[9] * m[15] - m[4] * m[11] * m[13] - m[8] * m[5] * m[15] + m[8] * m[7] * m[13] + m[12] * m[5] * m[11] - m[12] * m[7] * m[9]; r[12] = -m[4] * m[9] * m[14] + m[4] * m[10] * m[13] + m[8] * m[5] * m[14] - m[8] * m[6] * m[13] - m[12] * m[5] * m[10] + m[12] * m[6] * m[9]; r[1] = -m[1] * m[10] * m[15] + m[1] * m[11] * m[14] + m[9] * m[2] * m[15] - m[9] * m[3] * m[14] - m[13] * m[2] * m[11] + m[13] * m[3] * m[10]; r[5] = m[0] * m[10] * m[15] - m[0] * m[11] * m[14] - m[8] * m[2] * m[15] + m[8] * m[3] * m[14] + m[12] * m[2] * m[11] - m[12] * m[3] * m[10]; r[9] = -m[0] * m[9] * m[15] + m[0] * m[11] * m[13] + m[8] * m[1] * m[15] - m[8] * m[3] * m[13] - m[12] * m[1] * m[11] + m[12] * m[3] * m[9]; r[13] = m[0] * m[9] * m[14] - m[0] * m[10] * m[13] - m[8] * m[1] * m[14] + m[8] * m[2] * m[13] + m[12] * m[1] * m[10] - m[12] * m[2] * m[9]; r[2] = m[1] * m[6] * m[15] - m[1] * m[7] * m[14] - m[5] * m[2] * m[15] + m[5] * m[3] * m[14] + m[13] * m[2] * m[7] - m[13] * m[3] * m[6]; r[6] = -m[0] * m[6] * m[15] + m[0] * m[7] * m[14] + m[4] * m[2] * m[15] - m[4] * m[3] * m[14] - m[12] * m[2] * m[7] + m[12] * m[3] * m[6]; r[10] = m[0] * m[5] * m[15] - m[0] * m[7] * m[13] - m[4] * m[1] * m[15] + m[4] * m[3] * m[13] + m[12] * m[1] * m[7] - m[12] * m[3] * m[5]; r[14] = -m[0] * m[5] * m[14] + m[0] * m[6] * m[13] + m[4] * m[1] * m[14] - m[4] * m[2] * m[13] - m[12] * m[1] * m[6] + m[12] * m[2] * m[5]; r[3] = -m[1] * m[6] * m[11] + m[1] * m[7] * m[10] + m[5] * m[2] * m[11] - m[5] * m[3] * m[10] - m[9] * m[2] * m[7] + m[9] * m[3] * m[6]; r[7] = m[0] * m[6] * m[11] - m[0] * m[7] * m[10] - m[4] * m[2] * m[11] + m[4] * m[3] * m[10] + m[8] * m[2] * m[7] - m[8] * m[3] * m[6]; r[11] = -m[0] * m[5] * m[11] + m[0] * m[7] * m[9] + m[4] * m[1] * m[11] - m[4] * m[3] * m[9] - m[8] * m[1] * m[7] + m[8] * m[3] * m[5]; r[15] = m[0] * m[5] * m[10] - m[0] * m[6] * m[9] - m[4] * m[1] * m[10] + m[4] * m[2] * m[9] + m[8] * m[1] * m[6] - m[8] * m[2] * m[5]; var det = m[0] * r[0] + m[1] * r[4] + m[2] * r[8] + m[3] * r[12]; if (det === 0) { return $elm$core$Maybe$Nothing; } det = 1.0 / det; for (var i = 0; i < 16; i = i + 1) { r[i] = r[i] * det; } return $elm$core$Maybe$Just(r); }; var _MJS_m4x4inverseOrthonormal = function(m) { var r = _MJS_m4x4transposeLocal(m); var t = [m[12], m[13], m[14]]; r[3] = r[7] = r[11] = 0; r[12] = -_MJS_v3dotLocal([r[0], r[4], r[8]], t); r[13] = -_MJS_v3dotLocal([r[1], r[5], r[9]], t); r[14] = -_MJS_v3dotLocal([r[2], r[6], r[10]], t); return r; }; function _MJS_m4x4makeFrustumLocal(left, right, bottom, top, znear, zfar) { var r = new Float64Array(16); r[0] = 2 * znear / (right - left); r[1] = 0; r[2] = 0; r[3] = 0; r[4] = 0; r[5] = 2 * znear / (top - bottom); r[6] = 0; r[7] = 0; r[8] = (right + left) / (right - left); r[9] = (top + bottom) / (top - bottom); r[10] = -(zfar + znear) / (zfar - znear); r[11] = -1; r[12] = 0; r[13] = 0; r[14] = -2 * zfar * znear / (zfar - znear); r[15] = 0; return r; } var _MJS_m4x4makeFrustum = F6(_MJS_m4x4makeFrustumLocal); var _MJS_m4x4makePerspective = F4(function(fovy, aspect, znear, zfar) { var ymax = znear * Math.tan(fovy * Math.PI / 360.0); var ymin = -ymax; var xmin = ymin * aspect; var xmax = ymax * aspect; return _MJS_m4x4makeFrustumLocal(xmin, xmax, ymin, ymax, znear, zfar); }); function _MJS_m4x4makeOrthoLocal(left, right, bottom, top, znear, zfar) { var r = new Float64Array(16); r[0] = 2 / (right - left); r[1] = 0; r[2] = 0; r[3] = 0; r[4] = 0; r[5] = 2 / (top - bottom); r[6] = 0; r[7] = 0; r[8] = 0; r[9] = 0; r[10] = -2 / (zfar - znear); r[11] = 0; r[12] = -(right + left) / (right - left); r[13] = -(top + bottom) / (top - bottom); r[14] = -(zfar + znear) / (zfar - znear); r[15] = 1; return r; } var _MJS_m4x4makeOrtho = F6(_MJS_m4x4makeOrthoLocal); var _MJS_m4x4makeOrtho2D = F4(function(left, right, bottom, top) { return _MJS_m4x4makeOrthoLocal(left, right, bottom, top, -1, 1); }); function _MJS_m4x4mulLocal(a, b) { var r = new Float64Array(16); var a11 = a[0]; var a21 = a[1]; var a31 = a[2]; var a41 = a[3]; var a12 = a[4]; var a22 = a[5]; var a32 = a[6]; var a42 = a[7]; var a13 = a[8]; var a23 = a[9]; var a33 = a[10]; var a43 = a[11]; var a14 = a[12]; var a24 = a[13]; var a34 = a[14]; var a44 = a[15]; var b11 = b[0]; var b21 = b[1]; var b31 = b[2]; var b41 = b[3]; var b12 = b[4]; var b22 = b[5]; var b32 = b[6]; var b42 = b[7]; var b13 = b[8]; var b23 = b[9]; var b33 = b[10]; var b43 = b[11]; var b14 = b[12]; var b24 = b[13]; var b34 = b[14]; var b44 = b[15]; r[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; r[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; r[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; r[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; r[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; r[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; r[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; r[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; r[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; r[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; r[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; r[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; r[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; r[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; r[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; r[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; return r; } var _MJS_m4x4mul = F2(_MJS_m4x4mulLocal); var _MJS_m4x4mulAffine = F2(function(a, b) { var r = new Float64Array(16); var a11 = a[0]; var a21 = a[1]; var a31 = a[2]; var a12 = a[4]; var a22 = a[5]; var a32 = a[6]; var a13 = a[8]; var a23 = a[9]; var a33 = a[10]; var a14 = a[12]; var a24 = a[13]; var a34 = a[14]; var b11 = b[0]; var b21 = b[1]; var b31 = b[2]; var b12 = b[4]; var b22 = b[5]; var b32 = b[6]; var b13 = b[8]; var b23 = b[9]; var b33 = b[10]; var b14 = b[12]; var b24 = b[13]; var b34 = b[14]; r[0] = a11 * b11 + a12 * b21 + a13 * b31; r[1] = a21 * b11 + a22 * b21 + a23 * b31; r[2] = a31 * b11 + a32 * b21 + a33 * b31; r[3] = 0; r[4] = a11 * b12 + a12 * b22 + a13 * b32; r[5] = a21 * b12 + a22 * b22 + a23 * b32; r[6] = a31 * b12 + a32 * b22 + a33 * b32; r[7] = 0; r[8] = a11 * b13 + a12 * b23 + a13 * b33; r[9] = a21 * b13 + a22 * b23 + a23 * b33; r[10] = a31 * b13 + a32 * b23 + a33 * b33; r[11] = 0; r[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14; r[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24; r[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34; r[15] = 1; return r; }); var _MJS_m4x4makeRotate = F2(function(angle, axis) { var r = new Float64Array(16); axis = _MJS_v3normalizeLocal(axis, _MJS_v3temp1Local); var x = axis[0]; var y = axis[1]; var z = axis[2]; var c = Math.cos(angle); var c1 = 1 - c; var s = Math.sin(angle); r[0] = x * x * c1 + c; r[1] = y * x * c1 + z * s; r[2] = z * x * c1 - y * s; r[3] = 0; r[4] = x * y * c1 - z * s; r[5] = y * y * c1 + c; r[6] = y * z * c1 + x * s; r[7] = 0; r[8] = x * z * c1 + y * s; r[9] = y * z * c1 - x * s; r[10] = z * z * c1 + c; r[11] = 0; r[12] = 0; r[13] = 0; r[14] = 0; r[15] = 1; return r; }); var _MJS_m4x4rotate = F3(function(angle, axis, m) { var r = new Float64Array(16); var im = 1.0 / _MJS_v3lengthLocal(axis); var x = axis[0] * im; var y = axis[1] * im; var z = axis[2] * im; var c = Math.cos(angle); var c1 = 1 - c; var s = Math.sin(angle); var xs = x * s; var ys = y * s; var zs = z * s; var xyc1 = x * y * c1; var xzc1 = x * z * c1; var yzc1 = y * z * c1; var t11 = x * x * c1 + c; var t21 = xyc1 + zs; var t31 = xzc1 - ys; var t12 = xyc1 - zs; var t22 = y * y * c1 + c; var t32 = yzc1 + xs; var t13 = xzc1 + ys; var t23 = yzc1 - xs; var t33 = z * z * c1 + c; var m11 = m[0], m21 = m[1], m31 = m[2], m41 = m[3]; var m12 = m[4], m22 = m[5], m32 = m[6], m42 = m[7]; var m13 = m[8], m23 = m[9], m33 = m[10], m43 = m[11]; var m14 = m[12], m24 = m[13], m34 = m[14], m44 = m[15]; r[0] = m11 * t11 + m12 * t21 + m13 * t31; r[1] = m21 * t11 + m22 * t21 + m23 * t31; r[2] = m31 * t11 + m32 * t21 + m33 * t31; r[3] = m41 * t11 + m42 * t21 + m43 * t31; r[4] = m11 * t12 + m12 * t22 + m13 * t32; r[5] = m21 * t12 + m22 * t22 + m23 * t32; r[6] = m31 * t12 + m32 * t22 + m33 * t32; r[7] = m41 * t12 + m42 * t22 + m43 * t32; r[8] = m11 * t13 + m12 * t23 + m13 * t33; r[9] = m21 * t13 + m22 * t23 + m23 * t33; r[10] = m31 * t13 + m32 * t23 + m33 * t33; r[11] = m41 * t13 + m42 * t23 + m43 * t33; r[12] = m14, r[13] = m24; r[14] = m34; r[15] = m44; return r; }); function _MJS_m4x4makeScale3Local(x, y, z) { var r = new Float64Array(16); r[0] = x; r[1] = 0; r[2] = 0; r[3] = 0; r[4] = 0; r[5] = y; r[6] = 0; r[7] = 0; r[8] = 0; r[9] = 0; r[10] = z; r[11] = 0; r[12] = 0; r[13] = 0; r[14] = 0; r[15] = 1; return r; } var _MJS_m4x4makeScale3 = F3(_MJS_m4x4makeScale3Local); var _MJS_m4x4makeScale = function(v) { return _MJS_m4x4makeScale3Local(v[0], v[1], v[2]); }; var _MJS_m4x4scale3 = F4(function(x, y, z, m) { var r = new Float64Array(16); r[0] = m[0] * x; r[1] = m[1] * x; r[2] = m[2] * x; r[3] = m[3] * x; r[4] = m[4] * y; r[5] = m[5] * y; r[6] = m[6] * y; r[7] = m[7] * y; r[8] = m[8] * z; r[9] = m[9] * z; r[10] = m[10] * z; r[11] = m[11] * z; r[12] = m[12]; r[13] = m[13]; r[14] = m[14]; r[15] = m[15]; return r; }); var _MJS_m4x4scale = F2(function(v, m) { var r = new Float64Array(16); var x = v[0]; var y = v[1]; var z = v[2]; r[0] = m[0] * x; r[1] = m[1] * x; r[2] = m[2] * x; r[3] = m[3] * x; r[4] = m[4] * y; r[5] = m[5] * y; r[6] = m[6] * y; r[7] = m[7] * y; r[8] = m[8] * z; r[9] = m[9] * z; r[10] = m[10] * z; r[11] = m[11] * z; r[12] = m[12]; r[13] = m[13]; r[14] = m[14]; r[15] = m[15]; return r; }); function _MJS_m4x4makeTranslate3Local(x, y, z) { var r = new Float64Array(16); r[0] = 1; r[1] = 0; r[2] = 0; r[3] = 0; r[4] = 0; r[5] = 1; r[6] = 0; r[7] = 0; r[8] = 0; r[9] = 0; r[10] = 1; r[11] = 0; r[12] = x; r[13] = y; r[14] = z; r[15] = 1; return r; } var _MJS_m4x4makeTranslate3 = F3(_MJS_m4x4makeTranslate3Local); var _MJS_m4x4makeTranslate = function(v) { return _MJS_m4x4makeTranslate3Local(v[0], v[1], v[2]); }; var _MJS_m4x4translate3 = F4(function(x, y, z, m) { var r = new Float64Array(16); var m11 = m[0]; var m21 = m[1]; var m31 = m[2]; var m41 = m[3]; var m12 = m[4]; var m22 = m[5]; var m32 = m[6]; var m42 = m[7]; var m13 = m[8]; var m23 = m[9]; var m33 = m[10]; var m43 = m[11]; r[0] = m11; r[1] = m21; r[2] = m31; r[3] = m41; r[4] = m12; r[5] = m22; r[6] = m32; r[7] = m42; r[8] = m13; r[9] = m23; r[10] = m33; r[11] = m43; r[12] = m11 * x + m12 * y + m13 * z + m[12]; r[13] = m21 * x + m22 * y + m23 * z + m[13]; r[14] = m31 * x + m32 * y + m33 * z + m[14]; r[15] = m41 * x + m42 * y + m43 * z + m[15]; return r; }); var _MJS_m4x4translate = F2(function(v, m) { var r = new Float64Array(16); var x = v[0]; var y = v[1]; var z = v[2]; var m11 = m[0]; var m21 = m[1]; var m31 = m[2]; var m41 = m[3]; var m12 = m[4]; var m22 = m[5]; var m32 = m[6]; var m42 = m[7]; var m13 = m[8]; var m23 = m[9]; var m33 = m[10]; var m43 = m[11]; r[0] = m11; r[1] = m21; r[2] = m31; r[3] = m41; r[4] = m12; r[5] = m22; r[6] = m32; r[7] = m42; r[8] = m13; r[9] = m23; r[10] = m33; r[11] = m43; r[12] = m11 * x + m12 * y + m13 * z + m[12]; r[13] = m21 * x + m22 * y + m23 * z + m[13]; r[14] = m31 * x + m32 * y + m33 * z + m[14]; r[15] = m41 * x + m42 * y + m43 * z + m[15]; return r; }); var _MJS_m4x4makeLookAt = F3(function(eye, center, up) { var z = _MJS_v3directionLocal(eye, center, _MJS_v3temp1Local); var x = _MJS_v3normalizeLocal(_MJS_v3crossLocal(up, z, _MJS_v3temp2Local), _MJS_v3temp2Local); var y = _MJS_v3normalizeLocal(_MJS_v3crossLocal(z, x, _MJS_v3temp3Local), _MJS_v3temp3Local); var tm1 = _MJS_m4x4temp1Local; var tm2 = _MJS_m4x4temp2Local; tm1[0] = x[0]; tm1[1] = y[0]; tm1[2] = z[0]; tm1[3] = 0; tm1[4] = x[1]; tm1[5] = y[1]; tm1[6] = z[1]; tm1[7] = 0; tm1[8] = x[2]; tm1[9] = y[2]; tm1[10] = z[2]; tm1[11] = 0; tm1[12] = 0; tm1[13] = 0; tm1[14] = 0; tm1[15] = 1; tm2[0] = 1; tm2[1] = 0; tm2[2] = 0; tm2[3] = 0; tm2[4] = 0; tm2[5] = 1; tm2[6] = 0; tm2[7] = 0; tm2[8] = 0; tm2[9] = 0; tm2[10] = 1; tm2[11] = 0; tm2[12] = -eye[0]; tm2[13] = -eye[1]; tm2[14] = -eye[2]; tm2[15] = 1; return _MJS_m4x4mulLocal(tm1, tm2); }); function _MJS_m4x4transposeLocal(m) { var r = new Float64Array(16); r[0] = m[0]; r[1] = m[4]; r[2] = m[8]; r[3] = m[12]; r[4] = m[1]; r[5] = m[5]; r[6] = m[9]; r[7] = m[13]; r[8] = m[2]; r[9] = m[6]; r[10] = m[10]; r[11] = m[14]; r[12] = m[3]; r[13] = m[7]; r[14] = m[11]; r[15] = m[15]; return r; } var _MJS_m4x4transpose = _MJS_m4x4transposeLocal; var _MJS_m4x4makeBasis = F3(function(vx, vy, vz) { var r = new Float64Array(16); r[0] = vx[0]; r[1] = vx[1]; r[2] = vx[2]; r[3] = 0; r[4] = vy[0]; r[5] = vy[1]; r[6] = vy[2]; r[7] = 0; r[8] = vz[0]; r[9] = vz[1]; r[10] = vz[2]; r[11] = 0; r[12] = 0; r[13] = 0; r[14] = 0; r[15] = 1; return r; }); var _WebGL_guid = 0; function _WebGL_listEach(fn, list) { for (; list.b; list = list.b) { fn(list.a); } } function _WebGL_listLength(list) { var length = 0; for (; list.b; list = list.b) { length++; } return length; } var _WebGL_rAF = typeof requestAnimationFrame !== 'undefined' ? requestAnimationFrame : function (cb) { setTimeout(cb, 1000 / 60); }; // eslint-disable-next-line no-unused-vars var _WebGL_entity = F5(function (settings, vert, frag, mesh, uniforms) { return { $: 0, a: settings, b: vert, c: frag, d: mesh, e: uniforms }; }); // eslint-disable-next-line no-unused-vars var _WebGL_enableBlend = F2(function (cache, setting) { var blend = cache.blend; blend.toggle = cache.toggle; if (!blend.enabled) { cache.gl.enable(cache.gl.BLEND); blend.enabled = true; } // a b c d e f g h i j // eq1 f11 f12 eq2 f21 f22 r g b a if (blend.a !== setting.a || blend.d !== setting.d) { cache.gl.blendEquationSeparate(setting.a, setting.d); blend.a = setting.a; blend.d = setting.d; } if (blend.b !== setting.b || blend.c !== setting.c || blend.e !== setting.e || blend.f !== setting.f) { cache.gl.blendFuncSeparate(setting.b, setting.c, setting.e, setting.f); blend.b = setting.b; blend.c = setting.c; blend.e = setting.e; blend.f = setting.f; } if (blend.g !== setting.g || blend.h !== setting.h || blend.i !== setting.i || blend.j !== setting.j) { cache.gl.blendColor(setting.g, setting.h, setting.i, setting.j); blend.g = setting.g; blend.h = setting.h; blend.i = setting.i; blend.j = setting.j; } }); // eslint-disable-next-line no-unused-vars var _WebGL_enableDepthTest = F2(function (cache, setting) { var depthTest = cache.depthTest; depthTest.toggle = cache.toggle; if (!depthTest.enabled) { cache.gl.enable(cache.gl.DEPTH_TEST); depthTest.enabled = true; } // a b c d // func mask near far if (depthTest.a !== setting.a) { cache.gl.depthFunc(setting.a); depthTest.a = setting.a; } if (depthTest.b !== setting.b) { cache.gl.depthMask(setting.b); depthTest.b = setting.b; } if (depthTest.c !== setting.c || depthTest.d !== setting.d) { cache.gl.depthRange(setting.c, setting.d); depthTest.c = setting.c; depthTest.d = setting.d; } }); // eslint-disable-next-line no-unused-vars var _WebGL_enableStencilTest = F2(function (cache, setting) { var stencilTest = cache.stencilTest; stencilTest.toggle = cache.toggle; if (!stencilTest.enabled) { cache.gl.enable(cache.gl.STENCIL_TEST); stencilTest.enabled = true; } // a b c d e f g h i j k // ref mask writeMask test1 fail1 zfail1 zpass1 test2 fail2 zfail2 zpass2 if (stencilTest.d !== setting.d || stencilTest.a !== setting.a || stencilTest.b !== setting.b) { cache.gl.stencilFuncSeparate(cache.gl.FRONT, setting.d, setting.a, setting.b); stencilTest.d = setting.d; // a and b are set in the cache.gl.BACK diffing because they should be the same } if (stencilTest.e !== setting.e || stencilTest.f !== setting.f || stencilTest.g !== setting.g) { cache.gl.stencilOpSeparate(cache.gl.FRONT, setting.e, setting.f, setting.g); stencilTest.e = setting.e; stencilTest.f = setting.f; stencilTest.g = setting.g; } if (stencilTest.c !== setting.c) { cache.gl.stencilMask(setting.c); stencilTest.c = setting.c; } if (stencilTest.h !== setting.h || stencilTest.a !== setting.a || stencilTest.b !== setting.b) { cache.gl.stencilFuncSeparate(cache.gl.BACK, setting.h, setting.a, setting.b); stencilTest.h = setting.h; stencilTest.a = setting.a; stencilTest.b = setting.b; } if (stencilTest.i !== setting.i || stencilTest.j !== setting.j || stencilTest.k !== setting.k) { cache.gl.stencilOpSeparate(cache.gl.BACK, setting.i, setting.j, setting.k); stencilTest.i = setting.i; stencilTest.j = setting.j; stencilTest.k = setting.k; } }); // eslint-disable-next-line no-unused-vars var _WebGL_enableScissor = F2(function (cache, setting) { var scissor = cache.scissor; scissor.toggle = cache.toggle; if (!scissor.enabled) { cache.gl.enable(cache.gl.SCISSOR_TEST); scissor.enabled = true; } if (scissor.a !== setting.a || scissor.b !== setting.b || scissor.c !== setting.c || scissor.d !== setting.d) { cache.gl.scissor(setting.a, setting.b, setting.c, setting.d); scissor.a = setting.a; scissor.b = setting.b; scissor.c = setting.c; scissor.d = setting.d; } }); // eslint-disable-next-line no-unused-vars var _WebGL_enableColorMask = F2(function (cache, setting) { var colorMask = cache.colorMask; colorMask.toggle = cache.toggle; colorMask.enabled = true; if (colorMask.a !== setting.a || colorMask.b !== setting.b || colorMask.c !== setting.c || colorMask.d !== setting.d) { cache.gl.colorMask(setting.a, setting.b, setting.c, setting.d); colorMask.a = setting.a; colorMask.b = setting.b; colorMask.c = setting.c; colorMask.d = setting.d; } }); // eslint-disable-next-line no-unused-vars var _WebGL_enableCullFace = F2(function (cache, setting) { var cullFace = cache.cullFace; cullFace.toggle = cache.toggle; if (!cullFace.enabled) { cache.gl.enable(cache.gl.CULL_FACE); cullFace.enabled = true; } if (cullFace.a !== setting.a) { cache.gl.cullFace(setting.a); cullFace.a = setting.a; } }); // eslint-disable-next-line no-unused-vars var _WebGL_enablePolygonOffset = F2(function (cache, setting) { var polygonOffset = cache.polygonOffset; polygonOffset.toggle = cache.toggle; if (!polygonOffset.enabled) { cache.gl.enable(cache.gl.POLYGON_OFFSET_FILL); polygonOffset.enabled = true; } if (polygonOffset.a !== setting.a || polygonOffset.b !== setting.b) { cache.gl.polygonOffset(setting.a, setting.b); polygonOffset.a = setting.a; polygonOffset.b = setting.b; } }); // eslint-disable-next-line no-unused-vars var _WebGL_enableSampleCoverage = F2(function (cache, setting) { var sampleCoverage = cache.sampleCoverage; sampleCoverage.toggle = cache.toggle; if (!sampleCoverage.enabled) { cache.gl.enable(cache.gl.SAMPLE_COVERAGE); sampleCoverage.enabled = true; } if (sampleCoverage.a !== setting.a || sampleCoverage.b !== setting.b) { cache.gl.sampleCoverage(setting.a, setting.b); sampleCoverage.a = setting.a; sampleCoverage.b = setting.b; } }); // eslint-disable-next-line no-unused-vars var _WebGL_enableSampleAlphaToCoverage = function (cache) { var sampleAlphaToCoverage = cache.sampleAlphaToCoverage; sampleAlphaToCoverage.toggle = cache.toggle; if (!sampleAlphaToCoverage.enabled) { cache.gl.enable(cache.gl.SAMPLE_ALPHA_TO_COVERAGE); sampleAlphaToCoverage.enabled = true; } }; var _WebGL_disableBlend = function (cache) { if (cache.blend.enabled) { cache.gl.disable(cache.gl.BLEND); cache.blend.enabled = false; } }; var _WebGL_disableDepthTest = function (cache) { if (cache.depthTest.enabled) { cache.gl.disable(cache.gl.DEPTH_TEST); cache.depthTest.enabled = false; } }; var _WebGL_disableStencilTest = function (cache) { if (cache.stencilTest.enabled) { cache.gl.disable(cache.gl.STENCIL_TEST); cache.stencilTest.enabled = false; } }; var _WebGL_disableScissor = function (cache) { if (cache.scissor.enabled) { cache.gl.disable(cache.gl.SCISSOR_TEST); cache.scissor.enabled = false; } }; var _WebGL_disableColorMask = function (cache) { var colorMask = cache.colorMask; if (!colorMask.a || !colorMask.b || !colorMask.c || !colorMask.d) { cache.gl.colorMask(true, true, true, true); colorMask.a = true; colorMask.b = true; colorMask.c = true; colorMask.d = true; } }; var _WebGL_disableCullFace = function (cache) { cache.gl.disable(cache.gl.CULL_FACE); }; var _WebGL_disablePolygonOffset = function (cache) { cache.gl.disable(cache.gl.POLYGON_OFFSET_FILL); }; var _WebGL_disableSampleCoverage = function (cache) { cache.gl.disable(cache.gl.SAMPLE_COVERAGE); }; var _WebGL_disableSampleAlphaToCoverage = function (cache) { cache.gl.disable(cache.gl.SAMPLE_ALPHA_TO_COVERAGE); }; var _WebGL_settings = ['blend', 'depthTest', 'stencilTest', 'scissor', 'colorMask', 'cullFace', 'polygonOffset', 'sampleCoverage', 'sampleAlphaToCoverage']; var _WebGL_disableFunctions = [_WebGL_disableBlend, _WebGL_disableDepthTest, _WebGL_disableStencilTest, _WebGL_disableScissor, _WebGL_disableColorMask, _WebGL_disableCullFace, _WebGL_disablePolygonOffset, _WebGL_disableSampleCoverage, _WebGL_disableSampleAlphaToCoverage]; function _WebGL_doCompile(gl, src, type) { var shader = gl.createShader(type); // Enable OES_standard_derivatives extension gl.shaderSource(shader, '#extension GL_OES_standard_derivatives : enable\n' + src); gl.compileShader(shader); return shader; } function _WebGL_doLink(gl, vshader, fshader) { var program = gl.createProgram(); gl.attachShader(program, vshader); gl.attachShader(program, fshader); gl.linkProgram(program); if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { throw ('Link failed: ' + gl.getProgramInfoLog(program) + '\nvs info-log: ' + gl.getShaderInfoLog(vshader) + '\nfs info-log: ' + gl.getShaderInfoLog(fshader)); } return program; } function _WebGL_getAttributeInfo(gl, type) { switch (type) { case gl.FLOAT: return { size: 1, arraySize: 1, type: Float32Array, baseType: gl.FLOAT }; case gl.FLOAT_VEC2: return { size: 2, arraySize: 1, type: Float32Array, baseType: gl.FLOAT }; case gl.FLOAT_VEC3: return { size: 3, arraySize: 1, type: Float32Array, baseType: gl.FLOAT }; case gl.FLOAT_VEC4: return { size: 4, arraySize: 1, type: Float32Array, baseType: gl.FLOAT }; case gl.FLOAT_MAT4: return { size: 4, arraySize: 4, type: Float32Array, baseType: gl.FLOAT }; case gl.INT: return { size: 1, arraySize: 1, type: Int32Array, baseType: gl.INT }; } } /** * Form the buffer for a given attribute. * * @param {WebGLRenderingContext} gl context * @param {WebGLActiveInfo} attribute the attribute to bind to. * We use its name to grab the record by name and also to know * how many elements we need to grab. * @param {Mesh} mesh The mesh coming in from Elm. * @param {Object} attributes The mapping between the attribute names and Elm fields * @return {WebGLBuffer} */ function _WebGL_doBindAttribute(gl, attribute, mesh, attributes) { // The length of the number of vertices that // complete one 'thing' based on the drawing mode. // ie, 2 for Lines, 3 for Triangles, etc. var elemSize = mesh.a.elemSize; var idxKeys = []; for (var i = 0; i < elemSize; i++) { idxKeys.push(String.fromCharCode(97 + i)); } function dataFill(data, cnt, fillOffset, elem, key) { var i; if (elemSize === 1) { for (i = 0; i < cnt; i++) { data[fillOffset++] = cnt === 1 ? elem[key] : elem[key][i]; } } else { idxKeys.forEach(function (idx) { for (i = 0; i < cnt; i++) { data[fillOffset++] = cnt === 1 ? elem[idx][key] : elem[idx][key][i]; } }); } } var attributeInfo = _WebGL_getAttributeInfo(gl, attribute.type); if (attributeInfo === undefined) { throw new Error('No info available for: ' + attribute.type); } var dataIdx = 0; var dataOffset = attributeInfo.size * attributeInfo.arraySize * elemSize; var array = new attributeInfo.type(_WebGL_listLength(mesh.b) * dataOffset); _WebGL_listEach(function (elem) { dataFill(array, attributeInfo.size * attributeInfo.arraySize, dataIdx, elem, attributes[attribute.name] || attribute.name); dataIdx += dataOffset; }, mesh.b); var buffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, buffer); gl.bufferData(gl.ARRAY_BUFFER, array, gl.STATIC_DRAW); return buffer; } /** * This sets up the binding caching buffers. * * We don't actually bind any buffers now except for the indices buffer. * The problem with filling the buffers here is that it is possible to * have a buffer shared between two webgl shaders; * which could have different active attributes. If we bind it here against * a particular program, we might not bind them all. That final bind is now * done right before drawing. * * @param {WebGLRenderingContext} gl context * @param {Mesh} mesh a mesh object from Elm * @return {Object} buffer - an object with the following properties * @return {Number} buffer.numIndices * @return {WebGLBuffer|null} buffer.indexBuffer - optional index buffer * @return {Object} buffer.buffers - will be used to buffer attributes */ function _WebGL_doBindSetup(gl, mesh) { if (mesh.a.indexSize > 0) { var indexBuffer = gl.createBuffer(); var indices = _WebGL_makeIndexedBuffer(mesh.c, mesh.a.indexSize); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW); return { numIndices: indices.length, indexBuffer: indexBuffer, buffers: {} }; } else { return { numIndices: mesh.a.elemSize * _WebGL_listLength(mesh.b), indexBuffer: null, buffers: {} }; } } /** * Create an indices array and fill it from indices * based on the size of the index * * @param {List} indicesList the list of indices * @param {Number} indexSize the size of the index * @return {Uint32Array} indices */ function _WebGL_makeIndexedBuffer(indicesList, indexSize) { var indices = new Uint32Array(_WebGL_listLength(indicesList) * indexSize); var fillOffset = 0; var i; _WebGL_listEach(function (elem) { if (indexSize === 1) { indices[fillOffset++] = elem; } else { for (i = 0; i < indexSize; i++) { indices[fillOffset++] = elem[String.fromCharCode(97 + i)]; } } }, indicesList); return indices; } function _WebGL_getProgID(vertID, fragID) { return vertID + '#' + fragID; } var _WebGL_drawGL = F2(function (model, domNode) { var cache = model.f; var gl = cache.gl; if (!gl) { return domNode; } gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); if (!cache.depthTest.b) { gl.depthMask(true); cache.depthTest.b = true; } if (cache.stencilTest.c !== cache.STENCIL_WRITEMASK) { gl.stencilMask(cache.STENCIL_WRITEMASK); cache.stencilTest.c = cache.STENCIL_WRITEMASK; } _WebGL_disableScissor(cache); _WebGL_disableColorMask(cache); gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT); function drawEntity(entity) { if (!entity.d.b.b) { return; // Empty list } var progid; var program; var i; if (entity.b.id && entity.c.id) { progid = _WebGL_getProgID(entity.b.id, entity.c.id); program = cache.programs[progid]; } if (!program) { var vshader; if (entity.b.id) { vshader = cache.shaders[entity.b.id]; } else { entity.b.id = _WebGL_guid++; } if (!vshader) { vshader = _WebGL_doCompile(gl, entity.b.src, gl.VERTEX_SHADER); cache.shaders[entity.b.id] = vshader; } var fshader; if (entity.c.id) { fshader = cache.shaders[entity.c.id]; } else { entity.c.id = _WebGL_guid++; } if (!fshader) { fshader = _WebGL_doCompile(gl, entity.c.src, gl.FRAGMENT_SHADER); cache.shaders[entity.c.id] = fshader; } var glProgram = _WebGL_doLink(gl, vshader, fshader); program = { glProgram: glProgram, attributes: Object.assign({}, entity.b.attributes, entity.c.attributes), currentUniforms: {}, activeAttributes: [], activeAttributeLocations: [] }; program.uniformSetters = _WebGL_createUniformSetters( gl, model, program, Object.assign({}, entity.b.uniforms, entity.c.uniforms) ); var numActiveAttributes = gl.getProgramParameter(glProgram, gl.ACTIVE_ATTRIBUTES); for (i = 0; i < numActiveAttributes; i++) { var attribute = gl.getActiveAttrib(glProgram, i); var attribLocation = gl.getAttribLocation(glProgram, attribute.name); program.activeAttributes.push(attribute); program.activeAttributeLocations.push(attribLocation); } progid = _WebGL_getProgID(entity.b.id, entity.c.id); cache.programs[progid] = program; } if (cache.lastProgId !== progid) { gl.useProgram(program.glProgram); cache.lastProgId = progid; } _WebGL_setUniforms(program.uniformSetters, entity.e); var buffer = cache.buffers.get(entity.d); if (!buffer) { buffer = _WebGL_doBindSetup(gl, entity.d); cache.buffers.set(entity.d, buffer); } for (i = 0; i < program.activeAttributes.length; i++) { attribute = program.activeAttributes[i]; attribLocation = program.activeAttributeLocations[i]; if (buffer.buffers[attribute.name] === undefined) { buffer.buffers[attribute.name] = _WebGL_doBindAttribute(gl, attribute, entity.d, program.attributes); } gl.bindBuffer(gl.ARRAY_BUFFER, buffer.buffers[attribute.name]); var attributeInfo = _WebGL_getAttributeInfo(gl, attribute.type); if (attributeInfo.arraySize === 1) { gl.enableVertexAttribArray(attribLocation); gl.vertexAttribPointer(attribLocation, attributeInfo.size, attributeInfo.baseType, false, 0, 0); } else { // Point to four vec4 in case of mat4 var offset = attributeInfo.size * 4; // float32 takes 4 bytes var stride = offset * attributeInfo.arraySize; for (var m = 0; m < attributeInfo.arraySize; m++) { gl.enableVertexAttribArray(attribLocation + m); gl.vertexAttribPointer(attribLocation + m, attributeInfo.size, attributeInfo.baseType, false, stride, offset * m); } } } // Apply all the new settings cache.toggle = !cache.toggle; _WebGL_listEach($elm_explorations$webgl$WebGL$Internal$enableSetting(cache), entity.a); // Disable the settings that were applied in the previous draw call for (i = 0; i < _WebGL_settings.length; i++) { var setting = cache[_WebGL_settings[i]]; if (setting.toggle !== cache.toggle && setting.enabled) { _WebGL_disableFunctions[i](cache); setting.enabled = false; setting.toggle = cache.toggle; } } if (buffer.indexBuffer) { gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffer.indexBuffer); gl.drawElements(entity.d.a.mode, buffer.numIndices, gl.UNSIGNED_INT, 0); } else { gl.drawArrays(entity.d.a.mode, 0, buffer.numIndices); } } _WebGL_listEach(drawEntity, model.g); return domNode; }); function _WebGL_createUniformSetters(gl, model, program, uniformsMap) { var glProgram = program.glProgram; var currentUniforms = program.currentUniforms; var textureCounter = 0; var cache = model.f; function createUniformSetter(glProgram, uniform) { var uniformName = uniform.name; var uniformLocation = gl.getUniformLocation(glProgram, uniformName); switch (uniform.type) { case gl.INT: return function (value) { if (currentUniforms[uniformName] !== value) { gl.uniform1i(uniformLocation, value); currentUniforms[uniformName] = value; } }; case gl.FLOAT: return function (value) { if (currentUniforms[uniformName] !== value) { gl.uniform1f(uniformLocation, value); currentUniforms[uniformName] = value; } }; case gl.FLOAT_VEC2: return function (value) { if (currentUniforms[uniformName] !== value) { gl.uniform2f(uniformLocation, value[0], value[1]); currentUniforms[uniformName] = value; } }; case gl.FLOAT_VEC3: return function (value) { if (currentUniforms[uniformName] !== value) { gl.uniform3f(uniformLocation, value[0], value[1], value[2]); currentUniforms[uniformName] = value; } }; case gl.FLOAT_VEC4: return function (value) { if (currentUniforms[uniformName] !== value) { gl.uniform4f(uniformLocation, value[0], value[1], value[2], value[3]); currentUniforms[uniformName] = value; } }; case gl.FLOAT_MAT4: return function (value) { if (currentUniforms[uniformName] !== value) { gl.uniformMatrix4fv(uniformLocation, false, new Float32Array(value)); currentUniforms[uniformName] = value; } }; case gl.SAMPLER_2D: var currentTexture = textureCounter++; return function (texture) { gl.activeTexture(gl.TEXTURE0 + currentTexture); var tex = cache.textures.get(texture); if (!tex) { tex = texture.createTexture(gl); cache.textures.set(texture, tex); } gl.bindTexture(gl.TEXTURE_2D, tex); if (currentUniforms[uniformName] !== texture) { gl.uniform1i(uniformLocation, currentTexture); currentUniforms[uniformName] = texture; } }; case gl.BOOL: return function (value) { if (currentUniforms[uniformName] !== value) { gl.uniform1i(uniformLocation, value); currentUniforms[uniformName] = value; } }; default: return function () { }; } } var uniformSetters = {}; var numUniforms = gl.getProgramParameter(glProgram, gl.ACTIVE_UNIFORMS); for (var i = 0; i < numUniforms; i++) { var uniform = gl.getActiveUniform(glProgram, i); uniformSetters[uniformsMap[uniform.name] || uniform.name] = createUniformSetter(glProgram, uniform); } return uniformSetters; } function _WebGL_setUniforms(setters, values) { Object.keys(values).forEach(function (name) { var setter = setters[name]; if (setter) { setter(values[name]); } }); } // VIRTUAL-DOM WIDGET // eslint-disable-next-line no-unused-vars var _WebGL_toHtml = F3(function (options, factList, entities) { return _VirtualDom_custom( factList, { g: entities, f: {}, h: options }, _WebGL_render, _WebGL_diff ); }); // eslint-disable-next-line no-unused-vars var _WebGL_enableAlpha = F2(function (options, option) { options.contextAttributes.alpha = true; options.contextAttributes.premultipliedAlpha = option.a; }); // eslint-disable-next-line no-unused-vars var _WebGL_enableDepth = F2(function (options, option) { options.contextAttributes.depth = true; options.sceneSettings.push(function (gl) { gl.clearDepth(option.a); }); }); // eslint-disable-next-line no-unused-vars var _WebGL_enableStencil = F2(function (options, option) { options.contextAttributes.stencil = true; options.sceneSettings.push(function (gl) { gl.clearStencil(option.a); }); }); // eslint-disable-next-line no-unused-vars var _WebGL_enableAntialias = F2(function (options, option) { options.contextAttributes.antialias = true; }); // eslint-disable-next-line no-unused-vars var _WebGL_enableClearColor = F2(function (options, option) { options.sceneSettings.push(function (gl) { gl.clearColor(option.a, option.b, option.c, option.d); }); }); // eslint-disable-next-line no-unused-vars var _WebGL_enablePreserveDrawingBuffer = F2(function (options, option) { options.contextAttributes.preserveDrawingBuffer = true; }); /** * Creates canvas and schedules initial _WebGL_drawGL * @param {Object} model * @param {Object} model.f that may contain the following properties: gl, shaders, programs, buffers, textures * @param {List