UNPKG

faastjs

Version:

Serverless batch computing made simple.

244 lines 31.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const ava_1 = tslib_1.__importDefault(require("ava")); const serialize_1 = require("../src/serialize"); const shared_1 = require("../src/shared"); const util_1 = require("./fixtures/util"); (0, ava_1.default)("deepCopyUndefined copies undefined properties", t => { const obj = { prop: undefined }; const obj2 = {}; (0, serialize_1.deepCopyUndefined)(obj2, obj); t.deepEqual(obj2, obj); }); (0, ava_1.default)("deepCopyUndefined copies nested undefined properties", t => { const obj = { outer: { inner: undefined } }; const obj2 = { outer: {} }; (0, serialize_1.deepCopyUndefined)(obj2, obj); t.deepEqual(obj2, obj); }); (0, ava_1.default)("deepCopyUndefined should not hang on cyclical references", t => { const obj = { ref: {} }; obj.ref = obj; const obj2 = { ref: {} }; obj2.ref = obj2; (0, serialize_1.deepCopyUndefined)(obj2, obj); t.deepEqual(obj2, obj); }); (0, ava_1.default)("deepCopyUndefined copies symbol properties", t => { const obj = { [Symbol()]: "value" }; const obj2 = {}; (0, serialize_1.deepCopyUndefined)(obj2, obj); t.deepEqual(obj2, obj); }); (0, ava_1.default)("deepCopyUndefined copies symbol values", t => { const obj = { symbolValuedKey: Symbol() }; const obj2 = {}; (0, serialize_1.deepCopyUndefined)(obj2, obj); t.deepEqual(obj2, obj); }); (0, ava_1.default)("deep copy should not fail when objects are not shaped similarly", t => { const obj = { geometry: { theorem: { name: "Pythagorean" } } }; const obj2 = { hypothesis: "Riemann" }; t.notThrows(() => (0, serialize_1.deepCopyUndefined)(obj2, obj)); }); function check(t, values) { const stat = new shared_1.Statistics(); values.forEach(value => stat.update(value)); t.true(Math.abs(stat.mean - (0, util_1.avg)(values)) < 0.000000001); t.true(Math.abs(stat.stdev - (0, util_1.stdev)(values)) < 0.000000001); t.is(stat.samples, values.length); } (0, ava_1.default)("statistics empty values", t => { const emptyStat = new shared_1.Statistics(); t.is(emptyStat.mean, NaN); t.is(emptyStat.stdev, 0); t.is(emptyStat.samples, 0); }); (0, ava_1.default)("statistics single values", t => { check(t, [0]); check(t, [1]); check(t, [-1]); check(t, [0.5]); check(t, [-0.5]); check(t, [0.1]); check(t, [-0.1]); }); (0, ava_1.default)("statistics multiple values", t => { check(t, [0, 1]); check(t, [0, 1, 2]); check(t, [42, 100, 1000]); check(t, [1, 0.1]); check(t, [-0.5, 0.5]); check(t, [-1, 1]); check(t, [3.14159, 2.717]); }); (0, ava_1.default)("statistics random values", t => { const a = []; const b = []; const c = []; for (let i = 0; i < 1000; i++) { a.push(Math.random()); b.push(Math.random() * 10); c.push(Math.random() * 100); } check(t, a); check(t, b); check(t, c); }); (0, ava_1.default)(`statistics clone`, t => { const stats = new shared_1.Statistics(); stats.update(10); stats.update(100); stats.update(5); const cloned = stats.clone(); t.deepEqual(cloned, stats); t.is(cloned.toString(), stats.toString()); cloned.update(42); t.true(cloned.mean !== stats.mean); t.true(cloned.stdev !== stats.stdev); t.is(stats.samples, 3); t.is(cloned.samples, 4); }); (0, ava_1.default)("MaxHeap basics", t => { const h = new shared_1.MaxHeap(); h.insert(5); h.insert(10); h.insert(100); h.insert(1); t.is(h.extractMax(), 100); t.is(h.extractMax(), 10); t.is(h.extractMax(), 5); t.is(h.extractMax(), 1); t.throws(() => h.extractMax(), { message: /empty/ }); }); (0, ava_1.default)("MaxHeap empty", t => { const h = new shared_1.MaxHeap(); t.throws(() => h.extractMax(), { message: /empty/ }); }); (0, ava_1.default)("MaxHeap sorting", t => { const h = new shared_1.MaxHeap(); const N = 10000; const size = 100; for (let attempt = 0; attempt < N; attempt++) { let orig = []; const a = []; for (let i = 0; i < size; i++) { const value = Math.round(Math.random() * 1000); a.push(value); h.insert(value); } orig = a.slice(); a.sort((x, y) => y - x); const b = []; while (h.size > 0) { b.push(h.extractMax()); } t.deepEqual(a, b, `difference sorting ${orig}`); } }); (0, ava_1.default)("MaxHeap specific ordering", t => { const h = new shared_1.MaxHeap(); h.insert(7); h.insert(2); h.insert(0); h.insert(3); h.insert(4); h.insert(1); h.insert(6); h.insert(5); t.is(h.extractMax(), 7); t.is(h.extractMax(), 6); t.is(h.extractMax(), 5); t.is(h.extractMax(), 4); t.is(h.extractMax(), 3); t.is(h.extractMax(), 2); t.is(h.extractMax(), 1); t.is(h.extractMax(), 0); }); (0, ava_1.default)("MaxHeap iterator", t => { const h = new shared_1.MaxHeap(); h.insert(10); h.insert(42); h.insert(12); t.deepEqual([...h], [42, 10, 12]); }); (0, ava_1.default)("SmallestN saves smallest N keys", t => { const s = new shared_1.SmallestN(3); s.update(100); s.update(42); s.update(-1); s.update(0); s.update(4); s.update(1000); t.deepEqual(s.keys().sort(), [-1, 0, 4].sort()); }); (0, ava_1.default)("SmallestN saves smallest N values", t => { const N = 3; const s = new shared_1.SmallestN(N); s.update(100, "100"); s.update(42, "42"); s.update(-1, "-1"); s.update(0, "0"); s.update(4, "4"); s.update(1000, "1000"); t.deepEqual([...s], [ [-1, "-1"], [0, "0"], [4, "4"] ]); }); (0, ava_1.default)("SmallestN duplicate values", t => { const N = 5; const s = new shared_1.SmallestN(N); s.update(88, "88.1"); s.update(88, "88.2"); s.update(88, "88.3"); s.update(42, "42"); s.update(88, "88.4"); s.update(88, "88.5"); s.update(88, "88.6"); s.update(10, "10.1"); s.update(10, "10.2"); s.update(88, "88.7"); s.update(88, "88.8"); t.deepEqual([...s], [ [88, "88.1"], [88, "88.2"], [42, "42"], [10, "10.1"], [10, "10.2"] ]); }); function vals(a) { return a.map(i => [i, undefined]); } (0, ava_1.default)("SmallestN can reduce size", t => { const N = 5; const s = new shared_1.SmallestN(N); s.update(1); s.update(2); s.update(3); s.update(4); s.update(5); s.update(6); s.update(7); s.setSize(3); t.deepEqual([...s], vals([1, 2, 3])); }); (0, ava_1.default)("SmallestN can increase size", t => { const N = 3; const s = new shared_1.SmallestN(N); s.update(1); s.update(2); s.update(3); s.update(4); s.update(5); t.deepEqual([...s], vals([1, 2, 3])); s.setSize(5); s.update(6); s.update(7); s.update(8); t.deepEqual([...s], vals([1, 2, 3, 6, 7])); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdC1zaGFyZWQudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvdW5pdC1zaGFyZWQudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzREFBdUM7QUFDdkMsZ0RBQXFEO0FBQ3JELDBDQUErRDtBQUMvRCwwQ0FBNkM7QUFFN0MsSUFBQSxhQUFJLEVBQUMsK0NBQStDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDdEQsTUFBTSxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDaEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLElBQUEsNkJBQWlCLEVBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBQSxhQUFJLEVBQUMsc0RBQXNELEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDN0QsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQztJQUM1QyxNQUFNLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUMzQixJQUFBLDZCQUFpQixFQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM3QixDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzQixDQUFDLENBQUMsQ0FBQztBQUVILElBQUEsYUFBSSxFQUFDLDBEQUEwRCxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ2pFLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ3hCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBRWQsTUFBTSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENB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QUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2QsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hCLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakIsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEIsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMsQ0FBQztBQUVILElBQUEsYUFBSSxFQUFDLDRCQUE0QixFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ25DLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQixLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDMUIsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25CLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMvQixDQUFDLENB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LGFBQUksRUFBQyw0QkFBNEIsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWixNQUFNLENBQUMsR0FBRyxJQUFJLGtCQUFTLENBQVMsQ0FBQyxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLFNBQVMsQ0FDUCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQ047UUFDSSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUM7UUFDWixDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUM7UUFDWixDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUM7UUFDVixDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUM7UUFDWixDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUM7S0FDZixDQUNKLENBQUM7QUFDTixDQUFDLENBQUMsQ0FBQztBQUVILFNBQVMsSUFBSSxDQUFDLENBQVc7SUFDckIsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUF3QixDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUVELElBQUEsYUFBSSxFQUFDLDJCQUEyQixFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLE1BQU0sQ0FBQyxHQUFHLElBQUksa0JBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRVosQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNiLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBQSxhQUFJLEVBQUMsNkJBQTZCLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDcEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osTUFBTSxDQUFDLEdBQUcsSUFBSSxrQkFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFckMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNiLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0MsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdGVzdCwgeyBBc3NlcnRpb25zIH0gZnJvbSBcImF2YVwiO1xuaW1wb3J0IHsgZGVlcENvcHlVbmRlZmluZWQgfSBmcm9tIFwiLi4vc3JjL3NlcmlhbGl6ZVwiO1xuaW1wb3J0IHsgTWF4SGVhcCwgU21hbGxlc3ROLCBTdGF0aXN0aWNzIH0gZnJvbSBcIi4uL3NyYy9zaGFyZWRcIjtcbmltcG9ydCB7IGF2Zywgc3RkZXYgfSBmcm9tIFwiLi9maXh0dXJlcy91dGlsXCI7XG5cbnRlc3QoXCJkZWVwQ29weVVuZGVmaW5lZCBjb3BpZXMgdW5kZWZpbmVkIHByb3BlcnRpZXNcIiwgdCA9PiB7XG4gICAgY29uc3Qgb2JqID0geyBwcm9wOiB1bmRlZmluZWQgfTtcbiAgICBjb25zdCBvYmoyID0ge307XG4gICAgZGVlcENvcHlVbmRlZmluZWQob2JqMiwgb2JqKTtcbiAgICB0LmRlZXBFcXVhbChvYmoyLCBvYmopO1xufSk7XG5cbnRlc3QoXCJkZWVwQ29weVVuZGVmaW5lZCBjb3BpZXMgbmVzdGVkIHVuZGVmaW5lZCBwcm9wZXJ0aWVzXCIsIHQgPT4ge1xuICAgIGNvbnN0IG9iaiA9IHsgb3V0ZXI6IHsgaW5uZXI6IHVuZGVmaW5lZCB9IH07XG4gICAgY29uc3Qgb2JqMiA9IHsgb3V0ZXI6IHt9IH07XG4gICAgZGVlcENvcHlVbmRlZmluZWQob2JqMiwgb2JqKTtcbiAgICB0LmRlZXBFcXVhbChvYmoyLCBvYmopO1xufSk7XG5cbnRlc3QoXCJkZWVwQ29weVVuZGVmaW5lZCBzaG91bGQgbm90IGhhbmcgb24gY3ljbGljYWwgcmVmZXJlbmNlc1wiLCB0ID0+IHtcbiAgICBjb25zdCBvYmogPSB7IHJlZjoge30gfTtcbiAgICBvYmoucmVmID0gb2JqO1xuXG4gICAgY29uc3Qgb2JqMiA9IHsgcmVmOiB7fSB9O1xuICAgIG9iajIucmVmID0gb2JqMjtcblxuICAgIGRlZXBDb3B5VW5kZWZpbmVkKG9iajIsIG9iaik7XG4gICAgdC5kZWVwRXF1YWwob2JqMiwgb2JqKTtcbn0pO1xuXG50ZXN0KFwiZGVlcENvcHlVbmRlZmluZWQgY29waWVzIHN5bWJvbCBwcm9wZXJ0aWVzXCIsIHQgPT4ge1xuICAgIGNvbnN0IG9iaiA9IHsgW1N5bWJvbCgpXTogXCJ2YWx1ZVwiIH07XG4gICAgY29uc3Qgb2JqMiA9IHt9O1xuICAgIGRlZXBDb3B5VW5kZWZpbmVkKG9iajIsIG9iaik7XG4gICAgdC5kZWVwRXF1YWwob2JqMiwgb2JqKTtcbn0pO1xuXG50ZXN0KFwiZGVlcENvcHlVbmRlZmluZWQgY29waWVzIHN5bWJvbCB2YWx1ZXNcIiwgdCA9PiB7XG4gICAgY29uc3Qgb2JqID0geyBzeW1ib2xWYWx1ZWRLZXk6IFN5bWJvbCgpIH07XG4gICAgY29uc3Qgb2JqMiA9IHt9O1xuICAgIGRlZXBDb3B5VW5kZWZpbmVkKG9iajIsIG9iaik7XG4gICAgdC5kZWVwRXF1YWwob2JqMiwgb2JqKTtcbn0pO1xuXG50ZXN0KFwiZGVlcCBjb3B5IHNob3VsZCBub3QgZmFpbCB3aGVuIG9iamVjdHMgYXJlIG5vdCBzaGFwZWQgc2ltaWxhcmx5XCIsIHQgPT4ge1xuICAgIGNvbnN0IG9iaiA9IHsgZ2VvbWV0cnk6IHsgdGhlb3JlbTogeyBuYW1lOiBcIlB5dGhhZ29yZWFuXCIgfSB9IH07XG4gICAgY29uc3Qgb2JqMiA9IHsgaHlwb3RoZXNpczogXCJSaWVtYW5uXCIgfTtcbiAgICB0Lm5vdFRocm93cygoKSA9PiBkZWVwQ29weVVuZGVmaW5lZChvYmoyLCBvYmopKTtcbn0pO1xuXG5mdW5jdGlvbiBjaGVjayh0OiBBc3NlcnRpb25zLCB2YWx1ZXM6IG51bWJlcltdKSB7XG4gICAgY29uc3Qgc3RhdCA9IG5ldyBTdGF0aXN0aWNzKCk7XG4gICAgdmFsdWVzLmZvckVhY2godmFsdWUgPT4gc3RhdC51cGRhdGUodmFsdWUpKTtcbiAgICB0LnRydWUoTWF0aC5hYnMoc3RhdC5tZWFuIC0gYXZnKHZhbHVlcykpIDwgMC4wMDAwMDAwMDEpO1xuICAgIHQudHJ1ZShNYXRoLmFicyhzdGF0LnN0ZGV2IC0gc3RkZXYodmFsdWVzKSkgPCAwLjAwMDAwMDAwMSk7XG4gICAgdC5pcyhzdGF0LnNhbXBsZXMsIHZhbHVlcy5sZW5ndGgpO1xufVxuXG50ZXN0KFwic3RhdGlzdGljcyBlbXB0eSB2YWx1ZXNcIiwgdCA9PiB7XG4gICAgY29uc3QgZW1wdHlTdGF0ID0gbmV3IFN0YXRpc3RpY3MoKTtcbiAgICB0LmlzKGVtcHR5U3RhdC5tZWFuLCBOYU4pO1xuICAgIHQuaXMoZW1wdHlTdGF0LnN0ZGV2LCAwKTtcbiAgICB0LmlzKGVtcHR5U3RhdC5zYW1wbGVzLCAwKTtcbn0pO1xuXG50ZXN0KFwic3RhdGlzdGljcyBzaW5nbGUgdmFsdWVzXCIsIHQgPT4ge1xuICAgIGNoZWNrKHQsIFswXSk7XG4gICAgY2hlY2sodCwgWzFdKTtcbiAgICBjaGVjayh0LCBbLTFdKTtcbiAgICBjaGVjayh0LCBbMC41XSk7XG4gICAgY2hlY2sodCwgWy0wLjVdKTtcbiAgICBjaGVjayh0LCBbMC4xXSk7XG4gICAgY2hlY2sodCwgWy0wLjFdKTtcbn0pO1xuXG50ZXN0KFwic3RhdGlzdGljcyBtdWx0aXBsZSB2YWx1ZXNcIiwgdCA9PiB7XG4gICAgY2hlY2sodCwgWzAsIDFdKTtcbiAgICBjaGVjayh0LCBbMCwgMSwgMl0pO1xuICAgIGNoZWNrKHQsIFs0MiwgMTAwLCAxMDAwXSk7XG4gICAgY2hlY2sodCwgWzEsIDAuMV0pO1xuICAgIGNoZWNrKHQsIFstMC41LCAwLjVdKTtcbiAgICBjaGVjayh0LCBbLTEsIDFdKTtcbiAgICBjaGVjayh0LCBbMy4xNDE1OSwgMi43MTddKTtcbn0pO1xuXG50ZXN0KFwic3RhdGlzdGljcyByYW5kb20gdmFsdWVzXCIsIHQgPT4ge1xuICAgIGNvbnN0IGEgPSBbXTtcbiAgICBjb25zdCBiID0gW107XG4gICAgY29uc3QgYyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7XG4gICAgICAgIGEucHVzaChNYXRoLnJhbmRvbSgpKTtcbiAgICAgICAgYi5wdXNoKE1hdGgucmFuZG9tKCkgKiAxMCk7XG4gICAgICAgIGMucHVzaChNYXRoLnJhbmRvbSgpICogMTAwKTtcbiAgICB9XG4gICAgY2hlY2sodCwgYSk7XG4gICAgY2hlY2sodCwgYik7XG4gICAgY2hlY2sodCwgYyk7XG59KTtcblxudGVzdChgc3RhdGlzdGljcyBjbG9uZWAsIHQgPT4ge1xuICAgIGNvbnN0IHN0YXRzID0gbmV3IFN0YXRpc3RpY3MoKTtcbiAgICBzdGF0cy51cGRhdGUoMTApO1xuICAgIHN0YXRzLnVwZGF0ZSgxMDApO1xuICAgIHN0YXRzLnVwZGF0ZSg1KTtcblxuICAgIGNvbnN0IGNsb25lZCA9IHN0YXRzLmNsb25lKCk7XG4gICAgdC5kZWVwRXF1YWwoY2xvbmVkLCBzdGF0cyk7XG4gICAgdC5pcyhjbG9uZWQudG9TdHJpbmcoKSwgc3RhdHMudG9TdHJpbmcoKSk7XG4gICAgY2xvbmVkLnVwZGF0ZSg0Mik7XG4gICAgdC50cnVlKGNsb25lZC5tZWFuICE9PSBzdGF0cy5tZWFuKTtcbiAgICB0LnRydWUoY2xvbmVkLnN0ZGV2ICE9PSBzdGF0cy5zdGRldik7XG4gICAgdC5pcyhzdGF0cy5zYW1wbGVzLCAzKTtcbiAgICB0LmlzKGNsb25lZC5zYW1wbGVzLCA0KTtcbn0pO1xuXG50ZXN0KFwiTWF4SGVhcCBiYXNpY3NcIiwgdCA9PiB7XG4gICAgY29uc3QgaCA9IG5ldyBNYXhIZWFwKCk7XG4gICAgaC5pbnNlcnQoNSk7XG4gICAgaC5pbnNlcnQoMTApO1xuICAgIGguaW5zZXJ0KDEwMCk7XG4gICAgaC5pbnNlcnQoMSk7XG5cbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCAxMDApO1xuICAgIHQuaXMoaC5leHRyYWN0TWF4KCksIDEwKTtcbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCA1KTtcbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCAxKTtcbiAgICB0LnRocm93cygoKSA9PiBoLmV4dHJhY3RNYXgoKSwgeyBtZXNzYWdlOiAvZW1wdHkvIH0pO1xufSk7XG5cbnRlc3QoXCJNYXhIZWFwIGVtcHR5XCIsIHQgPT4ge1xuICAgIGNvbnN0IGggPSBuZXcgTWF4SGVhcCgpO1xuICAgIHQudGhyb3dzKCgpID0+IGguZXh0cmFjdE1heCgpLCB7IG1lc3NhZ2U6IC9lbXB0eS8gfSk7XG59KTtcblxudGVzdChcIk1heEhlYXAgc29ydGluZ1wiLCB0ID0+IHtcbiAgICBjb25zdCBoID0gbmV3IE1heEhlYXAoKTtcbiAgICBjb25zdCBOID0gMTAwMDA7XG4gICAgY29uc3Qgc2l6ZSA9IDEwMDtcblxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgTjsgYXR0ZW1wdCsrKSB7XG4gICAgICAgIGxldCBvcmlnOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBjb25zdCBhOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiAxMDAwKTtcbiAgICAgICAgICAgIGEucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICBoLmluc2VydCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgb3JpZyA9IGEuc2xpY2UoKTtcbiAgICAgICAgYS5zb3J0KCh4LCB5KSA9PiB5IC0geCk7XG4gICAgICAgIGNvbnN0IGIgPSBbXTtcbiAgICAgICAgd2hpbGUgKGguc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIGIucHVzaChoLmV4dHJhY3RNYXgoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdC5kZWVwRXF1YWwoYSwgYiwgYGRpZmZlcmVuY2Ugc29ydGluZyAke29yaWd9YCk7XG4gICAgfVxufSk7XG5cbnRlc3QoXCJNYXhIZWFwIHNwZWNpZmljIG9yZGVyaW5nXCIsIHQgPT4ge1xuICAgIGNvbnN0IGggPSBuZXcgTWF4SGVhcCgpO1xuICAgIGguaW5zZXJ0KDcpO1xuICAgIGguaW5zZXJ0KDIpO1xuICAgIGguaW5zZXJ0KDApO1xuICAgIGguaW5zZXJ0KDMpO1xuICAgIGguaW5zZXJ0KDQpO1xuICAgIGguaW5zZXJ0KDEpO1xuICAgIGguaW5zZXJ0KDYpO1xuICAgIGguaW5zZXJ0KDUpO1xuXG4gICAgdC5pcyhoLmV4dHJhY3RNYXgoKSwgNyk7XG4gICAgdC5pcyhoLmV4dHJhY3RNYXgoKSwgNik7XG4gICAgdC5pcyhoLmV4dHJhY3RNYXgoKSwgNSk7XG4gICAgdC5pcyhoLmV4dHJhY3RNYXgoKSwgNCk7XG4gICAgdC5pcyhoLmV4dHJhY3RNYXgoKSwgMyk7XG4gICAgdC5pcyhoLmV4dHJhY3RNYXgoKSwgMik7XG4gICAgdC5pcyhoLmV4dHJhY3RNYXgoKSwgMSk7XG4gICAgdC5pcyhoLmV4dHJhY3RNYXgoKSwgMCk7XG59KTtcblxudGVzdChcIk1heEhlYXAgaXRlcmF0b3JcIiwgdCA9PiB7XG4gICAgY29uc3QgaCA9IG5ldyBNYXhIZWFwKCk7XG4gICAgaC5pbnNlcnQoMTApO1xuICAgIGguaW5zZXJ0KDQyKTtcbiAgICBoLmluc2VydCgxMik7XG4gICAgdC5kZWVwRXF1YWwoWy4uLmhdLCBbNDIsIDEwLCAxMl0pO1xufSk7XG5cbnRlc3QoXCJTbWFsbGVzdE4gc2F2ZXMgc21hbGxlc3QgTiBrZXlzXCIsIHQgPT4ge1xuICAgIGNvbnN0IHMgPSBuZXcgU21hbGxlc3ROKDMpO1xuICAgIHMudXBkYXRlKDEwMCk7XG4gICAgcy51cGRhdGUoNDIpO1xuICAgIHMudXBkYXRlKC0xKTtcbiAgICBzLnVwZGF0ZSgwKTtcbiAgICBzLnVwZGF0ZSg0KTtcbiAgICBzLnVwZGF0ZSgxMDAwKTtcbiAgICB0LmRlZXBFcXVhbChzLmtleXMoKS5zb3J0KCksIFstMSwgMCwgNF0uc29ydCgpKTtcbn0pO1xuXG50ZXN0KFwiU21hbGxlc3ROIHNhdmVzIHNtYWxsZXN0IE4gdmFsdWVzXCIsIHQgPT4ge1xuICAgIGNvbnN0IE4gPSAzO1xuICAgIGNvbnN0IHMgPSBuZXcgU21hbGxlc3ROPHN0cmluZz4oTik7XG4gICAgcy51cGRhdGUoMTAwLCBcIjEwMFwiKTtcbiAgICBzLnVwZGF0ZSg0MiwgXCI0MlwiKTtcbiAgICBzLnVwZGF0ZSgtMSwgXCItMVwiKTtcbiAgICBzLnVwZGF0ZSgwLCBcIjBcIik7XG4gICAgcy51cGRhdGUoNCwgXCI0XCIpO1xuICAgIHMudXBkYXRlKDEwMDAsIFwiMTAwMFwiKTtcbiAgICB0LmRlZXBFcXVhbChcbiAgICAgICAgWy4uLnNdLFxuICAgICAgICBbXG4gICAgICAgICAgICBbLTEsIFwiLTFcIl0sXG4gICAgICAgICAgICBbMCwgXCIwXCJdLFxuICAgICAgICAgICAgWzQsIFwiNFwiXVxuICAgICAgICBdXG4gICAgKTtcbn0pO1xuXG50ZXN0KFwiU21hbGxlc3ROIGR1cGxpY2F0ZSB2YWx1ZXNcIiwgdCA9PiB7XG4gICAgY29uc3QgTiA9IDU7XG4gICAgY29uc3QgcyA9IG5ldyBTbWFsbGVzdE48c3RyaW5nPihOKTtcbiAgICBzLnVwZGF0ZSg4OCwgXCI4OC4xXCIpO1xuICAgIHMudXBkYXRlKDg4LCBcIjg4LjJcIik7XG4gICAgcy51cGRhdGUoODgsIFwiODguM1wiKTtcbiAgICBzLnVwZGF0ZSg0MiwgXCI0MlwiKTtcbiAgICBzLnVwZGF0ZSg4OCwgXCI4OC40XCIpO1xuICAgIHMudXBkYXRlKDg4LCBcIjg4LjVcIik7XG4gICAgcy51cGRhdGUoODgsIFwiODguNlwiKTtcbiAgICBzLnVwZGF0ZSgxMCwgXCIxMC4xXCIpO1xuICAgIHMudXBkYXRlKDEwLCBcIjEwLjJcIik7XG4gICAgcy51cGRhdGUoODgsIFwiODguN1wiKTtcbiAgICBzLnVwZGF0ZSg4OCwgXCI4OC44XCIpO1xuICAgIHQuZGVlcEVxdWFsKFxuICAgICAgICBbLi4uc10sXG4gICAgICAgIFtcbiAgICAgICAgICAgIFs4OCwgXCI4OC4xXCJdLFxuICAgICAgICAgICAgWzg4LCBcIjg4LjJcIl0sXG4gICAgICAgICAgICBbNDIsIFwiNDJcIl0sXG4gICAgICAgICAgICBbMTAsIFwiMTAuMVwiXSxcbiAgICAgICAgICAgIFsxMCwgXCIxMC4yXCJdXG4gICAgICAgIF1cbiAgICApO1xufSk7XG5cbmZ1bmN0aW9uIHZhbHMoYTogbnVtYmVyW10pOiBbbnVtYmVyLCB1bmRlZmluZWRdW10ge1xuICAgIHJldHVybiBhLm1hcChpID0+IFtpLCB1bmRlZmluZWRdIGFzIFtudW1iZXIsIHVuZGVmaW5lZF0pO1xufVxuXG50ZXN0KFwiU21hbGxlc3ROIGNhbiByZWR1Y2Ugc2l6ZVwiLCB0ID0+IHtcbiAgICBjb25zdCBOID0gNTtcbiAgICBjb25zdCBzID0gbmV3IFNtYWxsZXN0TihOKTtcbiAgICBzLnVwZGF0ZSgxKTtcbiAgICBzLnVwZGF0ZSgyKTtcbiAgICBzLnVwZGF0ZSgzKTtcbiAgICBzLnVwZGF0ZSg0KTtcbiAgICBzLnVwZGF0ZSg1KTtcbiAgICBzLnVwZGF0ZSg2KTtcbiAgICBzLnVwZGF0ZSg3KTtcblxuICAgIHMuc2V0U2l6ZSgzKTtcbiAgICB0LmRlZXBFcXVhbChbLi4uc10sIHZhbHMoWzEsIDIsIDNdKSk7XG59KTtcblxudGVzdChcIlNtYWxsZXN0TiBjYW4gaW5jcmVhc2Ugc2l6ZVwiLCB0ID0+IHtcbiAgICBjb25zdCBOID0gMztcbiAgICBjb25zdCBzID0gbmV3IFNtYWxsZXN0TihOKTtcbiAgICBzLnVwZGF0ZSgxKTtcbiAgICBzLnVwZGF0ZSgyKTtcbiAgICBzLnVwZGF0ZSgzKTtcbiAgICBzLnVwZGF0ZSg0KTtcbiAgICBzLnVwZGF0ZSg1KTtcbiAgICB0LmRlZXBFcXVhbChbLi4uc10sIHZhbHMoWzEsIDIsIDNdKSk7XG5cbiAgICBzLnNldFNpemUoNSk7XG4gICAgcy51cGRhdGUoNik7XG4gICAgcy51cGRhdGUoNyk7XG4gICAgcy51cGRhdGUoOCk7XG4gICAgdC5kZWVwRXF1YWwoWy4uLnNdLCB2YWxzKFsxLCAyLCAzLCA2LCA3XSkpO1xufSk7XG4iXX0=