UNPKG

faastjs

Version:

Serverless batch computing made simple.

244 lines 31.8 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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WCxDQUNKLENBQUM7QUFDTixDQUFDLENBQUMsQ0FBQztBQUVILElBQUEsYUFBSSxFQUFDLDRCQUE0QixFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ25DLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLE1BQU0sQ0FBQyxHQUFHLElBQUksa0JBQVMsQ0FBUyxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsU0FBUyxDQUNQLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDTjtRQUNJLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQztRQUNaLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQztRQUNaLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQztRQUNWLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQztRQUNaLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQztLQUNmLENBQ0osQ0FBQztBQUNOLENBQUMsQ0FBQyxDQUFDO0FBRUgsU0FBUyxJQUFJLENBQUMsQ0FBVztJQUNyQixPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQXdCLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQsSUFBQSxhQUFJLEVBQUMsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDbEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1osTUFBTSxDQUFDLEdBQUcsSUFBSSxrQkFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFWixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekMsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFBLGFBQUksRUFBQyw2QkFBNkIsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUNwQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWixNQUFNLENBQUMsR0FBRyxJQUFJLGtCQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVyQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0ZXN0LCB7IEFzc2VydGlvbnMgfSBmcm9tIFwiYXZhXCI7XG5pbXBvcnQgeyBkZWVwQ29weVVuZGVmaW5lZCB9IGZyb20gXCIuLi9zcmMvc2VyaWFsaXplXCI7XG5pbXBvcnQgeyBNYXhIZWFwLCBTbWFsbGVzdE4sIFN0YXRpc3RpY3MgfSBmcm9tIFwiLi4vc3JjL3NoYXJlZFwiO1xuaW1wb3J0IHsgYXZnLCBzdGRldiB9IGZyb20gXCIuL2ZpeHR1cmVzL3V0aWxcIjtcblxudGVzdChcImRlZXBDb3B5VW5kZWZpbmVkIGNvcGllcyB1bmRlZmluZWQgcHJvcGVydGllc1wiLCB0ID0+IHtcbiAgICBjb25zdCBvYmogPSB7IHByb3A6IHVuZGVmaW5lZCB9O1xuICAgIGNvbnN0IG9iajIgPSB7fTtcbiAgICBkZWVwQ29weVVuZGVmaW5lZChvYmoyLCBvYmopO1xuICAgIHQuZGVlcEVxdWFsKG9iajIsIG9iaik7XG59KTtcblxudGVzdChcImRlZXBDb3B5VW5kZWZpbmVkIGNvcGllcyBuZXN0ZWQgdW5kZWZpbmVkIHByb3BlcnRpZXNcIiwgdCA9PiB7XG4gICAgY29uc3Qgb2JqID0geyBvdXRlcjogeyBpbm5lcjogdW5kZWZpbmVkIH0gfTtcbiAgICBjb25zdCBvYmoyID0geyBvdXRlcjoge30gfTtcbiAgICBkZWVwQ29weVVuZGVmaW5lZChvYmoyLCBvYmopO1xuICAgIHQuZGVlcEVxdWFsKG9iajIsIG9iaik7XG59KTtcblxudGVzdChcImRlZXBDb3B5VW5kZWZpbmVkIHNob3VsZCBub3QgaGFuZyBvbiBjeWNsaWNhbCByZWZlcmVuY2VzXCIsIHQgPT4ge1xuICAgIGNvbnN0IG9iaiA9IHsgcmVmOiB7fSB9O1xuICAgIG9iai5yZWYgPSBvYmo7XG5cbiAgICBjb25zdCBvYmoyID0geyByZWY6IHt9IH07XG4gICAgb2JqMi5yZWYgPSBvYmoyO1xuXG4gICAgZGVlcENvcHlVbmRlZmluZWQob2JqMiwgb2JqKTtcbiAgICB0LmRlZXBFcXVhbChvYmoyLCBvYmopO1xufSk7XG5cbnRlc3QoXCJkZWVwQ29weVVuZGVmaW5lZCBjb3BpZXMgc3ltYm9sIHByb3BlcnRpZXNcIiwgdCA9PiB7XG4gICAgY29uc3Qgb2JqID0geyBbU3ltYm9sKCldOiBcInZhbHVlXCIgfTtcbiAgICBjb25zdCBvYmoyID0ge307XG4gICAgZGVlcENvcHlVbmRlZmluZWQob2JqMiwgb2JqKTtcbiAgICB0LmRlZXBFcXVhbChvYmoyLCBvYmopO1xufSk7XG5cbnRlc3QoXCJkZWVwQ29weVVuZGVmaW5lZCBjb3BpZXMgc3ltYm9sIHZhbHVlc1wiLCB0ID0+IHtcbiAgICBjb25zdCBvYmogPSB7IHN5bWJvbFZhbHVlZEtleTogU3ltYm9sKCkgfTtcbiAgICBjb25zdCBvYmoyID0ge307XG4gICAgZGVlcENvcHlVbmRlZmluZWQob2JqMiwgb2JqKTtcbiAgICB0LmRlZXBFcXVhbChvYmoyLCBvYmopO1xufSk7XG5cbnRlc3QoXCJkZWVwIGNvcHkgc2hvdWxkIG5vdCBmYWlsIHdoZW4gb2JqZWN0cyBhcmUgbm90IHNoYXBlZCBzaW1pbGFybHlcIiwgdCA9PiB7XG4gICAgY29uc3Qgb2JqID0geyBnZW9tZXRyeTogeyB0aGVvcmVtOiB7IG5hbWU6IFwiUHl0aGFnb3JlYW5cIiB9IH0gfTtcbiAgICBjb25zdCBvYmoyID0geyBoeXBvdGhlc2lzOiBcIlJpZW1hbm5cIiB9O1xuICAgIHQubm90VGhyb3dzKCgpID0+IGRlZXBDb3B5VW5kZWZpbmVkKG9iajIsIG9iaikpO1xufSk7XG5cbmZ1bmN0aW9uIGNoZWNrKHQ6IEFzc2VydGlvbnMsIHZhbHVlczogbnVtYmVyW10pIHtcbiAgICBjb25zdCBzdGF0ID0gbmV3IFN0YXRpc3RpY3MoKTtcbiAgICB2YWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiBzdGF0LnVwZGF0ZSh2YWx1ZSkpO1xuICAgIHQudHJ1ZShNYXRoLmFicyhzdGF0Lm1lYW4gLSBhdmcodmFsdWVzKSkgPCAwLjAwMDAwMDAwMSk7XG4gICAgdC50cnVlKE1hdGguYWJzKHN0YXQuc3RkZXYgLSBzdGRldih2YWx1ZXMpKSA8IDAuMDAwMDAwMDAxKTtcbiAgICB0LmlzKHN0YXQuc2FtcGxlcywgdmFsdWVzLmxlbmd0aCk7XG59XG5cbnRlc3QoXCJzdGF0aXN0aWNzIGVtcHR5IHZhbHVlc1wiLCB0ID0+IHtcbiAgICBjb25zdCBlbXB0eVN0YXQgPSBuZXcgU3RhdGlzdGljcygpO1xuICAgIHQuaXMoZW1wdHlTdGF0Lm1lYW4sIE5hTik7XG4gICAgdC5pcyhlbXB0eVN0YXQuc3RkZXYsIDApO1xuICAgIHQuaXMoZW1wdHlTdGF0LnNhbXBsZXMsIDApO1xufSk7XG5cbnRlc3QoXCJzdGF0aXN0aWNzIHNpbmdsZSB2YWx1ZXNcIiwgdCA9PiB7XG4gICAgY2hlY2sodCwgWzBdKTtcbiAgICBjaGVjayh0LCBbMV0pO1xuICAgIGNoZWNrKHQsIFstMV0pO1xuICAgIGNoZWNrKHQsIFswLjVdKTtcbiAgICBjaGVjayh0LCBbLTAuNV0pO1xuICAgIGNoZWNrKHQsIFswLjFdKTtcbiAgICBjaGVjayh0LCBbLTAuMV0pO1xufSk7XG5cbnRlc3QoXCJzdGF0aXN0aWNzIG11bHRpcGxlIHZhbHVlc1wiLCB0ID0+IHtcbiAgICBjaGVjayh0LCBbMCwgMV0pO1xuICAgIGNoZWNrKHQsIFswLCAxLCAyXSk7XG4gICAgY2hlY2sodCwgWzQyLCAxMDAsIDEwMDBdKTtcbiAgICBjaGVjayh0LCBbMSwgMC4xXSk7XG4gICAgY2hlY2sodCwgWy0wLjUsIDAuNV0pO1xuICAgIGNoZWNrKHQsIFstMSwgMV0pO1xuICAgIGNoZWNrKHQsIFszLjE0MTU5LCAyLjcxN10pO1xufSk7XG5cbnRlc3QoXCJzdGF0aXN0aWNzIHJhbmRvbSB2YWx1ZXNcIiwgdCA9PiB7XG4gICAgY29uc3QgYSA9IFtdO1xuICAgIGNvbnN0IGIgPSBbXTtcbiAgICBjb25zdCBjID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHtcbiAgICAgICAgYS5wdXNoKE1hdGgucmFuZG9tKCkpO1xuICAgICAgICBiLnB1c2goTWF0aC5yYW5kb20oKSAqIDEwKTtcbiAgICAgICAgYy5wdXNoKE1hdGgucmFuZG9tKCkgKiAxMDApO1xuICAgIH1cbiAgICBjaGVjayh0LCBhKTtcbiAgICBjaGVjayh0LCBiKTtcbiAgICBjaGVjayh0LCBjKTtcbn0pO1xuXG50ZXN0KGBzdGF0aXN0aWNzIGNsb25lYCwgdCA9PiB7XG4gICAgY29uc3Qgc3RhdHMgPSBuZXcgU3RhdGlzdGljcygpO1xuICAgIHN0YXRzLnVwZGF0ZSgxMCk7XG4gICAgc3RhdHMudXBkYXRlKDEwMCk7XG4gICAgc3RhdHMudXBkYXRlKDUpO1xuXG4gICAgY29uc3QgY2xvbmVkID0gc3RhdHMuY2xvbmUoKTtcbiAgICB0LmRlZXBFcXVhbChjbG9uZWQsIHN0YXRzKTtcbiAgICB0LmlzKGNsb25lZC50b1N0cmluZygpLCBzdGF0cy50b1N0cmluZygpKTtcbiAgICBjbG9uZWQudXBkYXRlKDQyKTtcbiAgICB0LnRydWUoY2xvbmVkLm1lYW4gIT09IHN0YXRzLm1lYW4pO1xuICAgIHQudHJ1ZShjbG9uZWQuc3RkZXYgIT09IHN0YXRzLnN0ZGV2KTtcbiAgICB0LmlzKHN0YXRzLnNhbXBsZXMsIDMpO1xuICAgIHQuaXMoY2xvbmVkLnNhbXBsZXMsIDQpO1xufSk7XG5cbnRlc3QoXCJNYXhIZWFwIGJhc2ljc1wiLCB0ID0+IHtcbiAgICBjb25zdCBoID0gbmV3IE1heEhlYXAoKTtcbiAgICBoLmluc2VydCg1KTtcbiAgICBoLmluc2VydCgxMCk7XG4gICAgaC5pbnNlcnQoMTAwKTtcbiAgICBoLmluc2VydCgxKTtcblxuICAgIHQuaXMoaC5leHRyYWN0TWF4KCksIDEwMCk7XG4gICAgdC5pcyhoLmV4dHJhY3RNYXgoKSwgMTApO1xuICAgIHQuaXMoaC5leHRyYWN0TWF4KCksIDUpO1xuICAgIHQuaXMoaC5leHRyYWN0TWF4KCksIDEpO1xuICAgIHQudGhyb3dzKCgpID0+IGguZXh0cmFjdE1heCgpLCB7IG1lc3NhZ2U6IC9lbXB0eS8gfSk7XG59KTtcblxudGVzdChcIk1heEhlYXAgZW1wdHlcIiwgdCA9PiB7XG4gICAgY29uc3QgaCA9IG5ldyBNYXhIZWFwKCk7XG4gICAgdC50aHJvd3MoKCkgPT4gaC5leHRyYWN0TWF4KCksIHsgbWVzc2FnZTogL2VtcHR5LyB9KTtcbn0pO1xuXG50ZXN0KFwiTWF4SGVhcCBzb3J0aW5nXCIsIHQgPT4ge1xuICAgIGNvbnN0IGggPSBuZXcgTWF4SGVhcCgpO1xuICAgIGNvbnN0IE4gPSAxMDAwMDtcbiAgICBjb25zdCBzaXplID0gMTAwO1xuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCBOOyBhdHRlbXB0KyspIHtcbiAgICAgICAgbGV0IG9yaWc6IG51bWJlcltdID0gW107XG4gICAgICAgIGNvbnN0IGE6IG51bWJlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIDEwMDApO1xuICAgICAgICAgICAgYS5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIGguaW5zZXJ0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBvcmlnID0gYS5zbGljZSgpO1xuICAgICAgICBhLnNvcnQoKHgsIHkpID0+IHkgLSB4KTtcbiAgICAgICAgY29uc3QgYiA9IFtdO1xuICAgICAgICB3aGlsZSAoaC5zaXplID4gMCkge1xuICAgICAgICAgICAgYi5wdXNoKGguZXh0cmFjdE1heCgpKTtcbiAgICAgICAgfVxuICAgICAgICB0LmRlZXBFcXVhbChhLCBiLCBgZGlmZmVyZW5jZSBzb3J0aW5nICR7b3JpZ31gKTtcbiAgICB9XG59KTtcblxudGVzdChcIk1heEhlYXAgc3BlY2lmaWMgb3JkZXJpbmdcIiwgdCA9PiB7XG4gICAgY29uc3QgaCA9IG5ldyBNYXhIZWFwKCk7XG4gICAgaC5pbnNlcnQoNyk7XG4gICAgaC5pbnNlcnQoMik7XG4gICAgaC5pbnNlcnQoMCk7XG4gICAgaC5pbnNlcnQoMyk7XG4gICAgaC5pbnNlcnQoNCk7XG4gICAgaC5pbnNlcnQoMSk7XG4gICAgaC5pbnNlcnQoNik7XG4gICAgaC5pbnNlcnQoNSk7XG5cbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCA3KTtcbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCA2KTtcbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCA1KTtcbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCA0KTtcbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCAzKTtcbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCAyKTtcbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCAxKTtcbiAgICB0LmlzKGguZXh0cmFjdE1heCgpLCAwKTtcbn0pO1xuXG50ZXN0KFwiTWF4SGVhcCBpdGVyYXRvclwiLCB0ID0+IHtcbiAgICBjb25zdCBoID0gbmV3IE1heEhlYXAoKTtcbiAgICBoLmluc2VydCgxMCk7XG4gICAgaC5pbnNlcnQoNDIpO1xuICAgIGguaW5zZXJ0KDEyKTtcbiAgICB0LmRlZXBFcXVhbChbLi4uaF0sIFs0MiwgMTAsIDEyXSk7XG59KTtcblxudGVzdChcIlNtYWxsZXN0TiBzYXZlcyBzbWFsbGVzdCBOIGtleXNcIiwgdCA9PiB7XG4gICAgY29uc3QgcyA9IG5ldyBTbWFsbGVzdE4oMyk7XG4gICAgcy51cGRhdGUoMTAwKTtcbiAgICBzLnVwZGF0ZSg0Mik7XG4gICAgcy51cGRhdGUoLTEpO1xuICAgIHMudXBkYXRlKDApO1xuICAgIHMudXBkYXRlKDQpO1xuICAgIHMudXBkYXRlKDEwMDApO1xuICAgIHQuZGVlcEVxdWFsKHMua2V5cygpLnNvcnQoKSwgWy0xLCAwLCA0XS5zb3J0KCkpO1xufSk7XG5cbnRlc3QoXCJTbWFsbGVzdE4gc2F2ZXMgc21hbGxlc3QgTiB2YWx1ZXNcIiwgdCA9PiB7XG4gICAgY29uc3QgTiA9IDM7XG4gICAgY29uc3QgcyA9IG5ldyBTbWFsbGVzdE48c3RyaW5nPihOKTtcbiAgICBzLnVwZGF0ZSgxMDAsIFwiMTAwXCIpO1xuICAgIHMudXBkYXRlKDQyLCBcIjQyXCIpO1xuICAgIHMudXBkYXRlKC0xLCBcIi0xXCIpO1xuICAgIHMudXBkYXRlKDAsIFwiMFwiKTtcbiAgICBzLnVwZGF0ZSg0LCBcIjRcIik7XG4gICAgcy51cGRhdGUoMTAwMCwgXCIxMDAwXCIpO1xuICAgIHQuZGVlcEVxdWFsKFxuICAgICAgICBbLi4uc10sXG4gICAgICAgIFtcbiAgICAgICAgICAgIFstMSwgXCItMVwiXSxcbiAgICAgICAgICAgIFswLCBcIjBcIl0sXG4gICAgICAgICAgICBbNCwgXCI0XCJdXG4gICAgICAgIF1cbiAgICApO1xufSk7XG5cbnRlc3QoXCJTbWFsbGVzdE4gZHVwbGljYXRlIHZhbHVlc1wiLCB0ID0+IHtcbiAgICBjb25zdCBOID0gNTtcbiAgICBjb25zdCBzID0gbmV3IFNtYWxsZXN0TjxzdHJpbmc+KE4pO1xuICAgIHMudXBkYXRlKDg4LCBcIjg4LjFcIik7XG4gICAgcy51cGRhdGUoODgsIFwiODguMlwiKTtcbiAgICBzLnVwZGF0ZSg4OCwgXCI4OC4zXCIpO1xuICAgIHMudXBkYXRlKDQyLCBcIjQyXCIpO1xuICAgIHMudXBkYXRlKDg4LCBcIjg4LjRcIik7XG4gICAgcy51cGRhdGUoODgsIFwiODguNVwiKTtcbiAgICBzLnVwZGF0ZSg4OCwgXCI4OC42XCIpO1xuICAgIHMudXBkYXRlKDEwLCBcIjEwLjFcIik7XG4gICAgcy51cGRhdGUoMTAsIFwiMTAuMlwiKTtcbiAgICBzLnVwZGF0ZSg4OCwgXCI4OC43XCIpO1xuICAgIHMudXBkYXRlKDg4LCBcIjg4LjhcIik7XG4gICAgdC5kZWVwRXF1YWwoXG4gICAgICAgIFsuLi5zXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgWzg4LCBcIjg4LjFcIl0sXG4gICAgICAgICAgICBbODgsIFwiODguMlwiXSxcbiAgICAgICAgICAgIFs0MiwgXCI0MlwiXSxcbiAgICAgICAgICAgIFsxMCwgXCIxMC4xXCJdLFxuICAgICAgICAgICAgWzEwLCBcIjEwLjJcIl1cbiAgICAgICAgXVxuICAgICk7XG59KTtcblxuZnVuY3Rpb24gdmFscyhhOiBudW1iZXJbXSk6IFtudW1iZXIsIHVuZGVmaW5lZF1bXSB7XG4gICAgcmV0dXJuIGEubWFwKGkgPT4gW2ksIHVuZGVmaW5lZF0gYXMgW251bWJlciwgdW5kZWZpbmVkXSk7XG59XG5cbnRlc3QoXCJTbWFsbGVzdE4gY2FuIHJlZHVjZSBzaXplXCIsIHQgPT4ge1xuICAgIGNvbnN0IE4gPSA1O1xuICAgIGNvbnN0IHMgPSBuZXcgU21hbGxlc3ROKE4pO1xuICAgIHMudXBkYXRlKDEpO1xuICAgIHMudXBkYXRlKDIpO1xuICAgIHMudXBkYXRlKDMpO1xuICAgIHMudXBkYXRlKDQpO1xuICAgIHMudXBkYXRlKDUpO1xuICAgIHMudXBkYXRlKDYpO1xuICAgIHMudXBkYXRlKDcpO1xuXG4gICAgcy5zZXRTaXplKDMpO1xuICAgIHQuZGVlcEVxdWFsKFsuLi5zXSwgdmFscyhbMSwgMiwgM10pKTtcbn0pO1xuXG50ZXN0KFwiU21hbGxlc3ROIGNhbiBpbmNyZWFzZSBzaXplXCIsIHQgPT4ge1xuICAgIGNvbnN0IE4gPSAzO1xuICAgIGNvbnN0IHMgPSBuZXcgU21hbGxlc3ROKE4pO1xuICAgIHMudXBkYXRlKDEpO1xuICAgIHMudXBkYXRlKDIpO1xuICAgIHMudXBkYXRlKDMpO1xuICAgIHMudXBkYXRlKDQpO1xuICAgIHMudXBkYXRlKDUpO1xuICAgIHQuZGVlcEVxdWFsKFsuLi5zXSwgdmFscyhbMSwgMiwgM10pKTtcblxuICAgIHMuc2V0U2l6ZSg1KTtcbiAgICBzLnVwZGF0ZSg2KTtcbiAgICBzLnVwZGF0ZSg3KTtcbiAgICBzLnVwZGF0ZSg4KTtcbiAgICB0LmRlZXBFcXVhbChbLi4uc10sIHZhbHMoWzEsIDIsIDMsIDYsIDddKSk7XG59KTtcbiJdfQ==