// Permutations in js reference (also cool algorithm): // https://stackoverflow.com/a/41068709 function perm(a){ if (a.length == 0) return [[]]; var r = [[a[0]]], t = [], s = []; if (a.length == 1) return r; for (var i = 1, la = a.length; i < la; i++){ for (var j = 0, lr = r.length; j < lr; j++){ r[j].push(a[i]); t.push(r[j]); for(var k = 1, lrj = r[j].length; k < lrj; k++){ for (var l = 0; l < lrj; l++) s[l] = r[j][(k+l)%lrj]; t[t.length] = s; s = []; } } r = t; t = []; } return r; } function setHTML(id, html) { document.getElementById(id).innerHTML = html; } function setValue(id, value) { let el = document.getElementById(id); el.value = value; el.dispatchEvent(new Event("change")); } // Base 64 encoding tools // https://stackoverflow.com/a/27696695 // Modified for fixed precision Base64 = (function () { var digitsStr = // 0 8 16 24 32 40 48 56 63 // v v v v v v v v v "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+-"; var digits = digitsStr.split(''); var digitsMap = {}; for (var i = 0; i < digits.length; i++) { digitsMap[digits[i]] = i; } return { fromIntV: function(int32) { var result = ''; while (true) { result = digits[int32 & 0x3f] + result; int32 >>>= 6; if (int32 === 0) break; } return result; }, fromIntN: function(int32, n) { var result = ''; for (let i = 0; i < n; ++i) { result = digits[int32 & 0x3f] + result; int32 >>>= 6; } return result; }, toInt: function(digitsStr) { var result = 0; var digits = digitsStr.split(''); for (var i = 0; i < digits.length; i++) { result = (result << 6) + digitsMap[digits[i]]; } return result; }, }; })(); // Base64.fromInt(-2147483648); // gives "200000" // Base64.toInt("200000"); // gives -2147483648