@rudderstack/integrations-lib
Version:
A comprehensive TypeScript library providing shared utilities, SDKs, and tools for RudderStack integrations and destinations.
96 lines • 20.6 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
/* eslint-disable no-console */
const node_perf_hooks_1 = require("node:perf_hooks");
const lodash_1 = __importDefault(require("lodash"));
const batch_processing_1 = require("./batch-processing");
async function bench(fn, label, iterations = 5) {
let total = 0;
for (let i = 0; i < iterations; i += 1) {
const start = node_perf_hooks_1.performance.now();
// eslint-disable-next-line no-await-in-loop
await fn();
total += node_perf_hooks_1.performance.now() - start;
}
const avg = total / iterations;
console.log(`${label}: avg ${avg.toFixed(2)} ms over ${iterations} runs`);
return avg;
}
async function section(title, fn) {
console.log(`\n=== ${title} ===`);
await fn();
}
async function runBenchmarks() {
const arr = Array.from({ length: 10_000 }, (_, i) => i);
console.log(`Running benchmarks on array of length ${arr.length}`);
await section('map', async () => {
await bench(() => (0, batch_processing_1.mapInBatches)(arr, (x) => x + 1, { batchSize: 20, yieldThreshold: 10 }), 'mapInBatches { batchSize: 20, yieldThreshold: 10 }');
await bench(() => (0, batch_processing_1.mapInBatches)(arr, (x) => x + 1, {
batchSize: 20,
yieldThreshold: 10,
sequentialProcessing: false,
}), 'mapInBatches { batchSize: 20, yieldThreshold: 10, sequentialProcessing: false }');
await bench(() => Promise.resolve(lodash_1.default.map(arr, (x) => x + 1)), 'lodash.map');
await bench(() => Promise.resolve(arr.map((x) => x + 1)), 'Array.prototype.map');
});
await section('filter', async () => {
await bench(() => (0, batch_processing_1.filterInBatches)(arr, (x) => x % 2 === 0, { batchSize: 20, yieldThreshold: 10 }), 'filterInBatches { batchSize: 20, yieldThreshold: 10 }');
await bench(() => (0, batch_processing_1.filterInBatches)(arr, (x) => x % 2 === 0, {
batchSize: 20,
yieldThreshold: 10,
sequentialProcessing: false,
}), 'filterInBatches { batchSize: 20, yieldThreshold: 10, sequentialProcessing: false }');
await bench(() => Promise.resolve(lodash_1.default.filter(arr, (x) => x % 2 === 0)), 'lodash.filter');
await bench(() => Promise.resolve(arr.filter((x) => x % 2 === 0)), 'Array.prototype.filter');
});
await section('groupBy', async () => {
await bench(() => (0, batch_processing_1.groupByInBatches)(arr, (x) => (x % 2 === 0 ? 'even' : 'odd'), {
batchSize: 20,
yieldThreshold: 10,
}), 'groupByInBatches { batchSize: 20, yieldThreshold: 10 }');
await bench(() => (0, batch_processing_1.groupByInBatches)(arr, (x) => (x % 2 === 0 ? 'even' : 'odd'), {
batchSize: 20,
yieldThreshold: 10,
sequentialProcessing: false,
}), 'groupByInBatches { batchSize: 20, yieldThreshold: 10, sequentialProcessing: false }');
await bench(() => Promise.resolve(lodash_1.default.groupBy(arr, (x) => (x % 2 === 0 ? 'even' : 'odd'))), 'lodash.groupBy');
});
await section('reduce', async () => {
await bench(() => (0, batch_processing_1.reduceInBatches)(arr, (acc, x) => acc + x, 0, { batchSize: 20, yieldThreshold: 10 }), 'reduceInBatches { batchSize: 20, yieldThreshold: 10 }');
await bench(() => Promise.resolve(lodash_1.default.reduce(arr, (acc, x) => acc + x, 0)), 'lodash.reduce');
await bench(() => Promise.resolve(arr.reduce((acc, x) => acc + x, 0)), 'Array.prototype.reduce');
});
await section('flatMap', async () => {
await bench(() => (0, batch_processing_1.flatMapInBatches)(arr, (x) => [x, x], { batchSize: 20, yieldThreshold: 10 }), 'flatMapInBatches { batchSize: 20, yieldThreshold: 10 }');
await bench(() => (0, batch_processing_1.flatMapInBatches)(arr, (x) => [x, x], {
batchSize: 20,
yieldThreshold: 10,
sequentialProcessing: false,
}), 'flatMapInBatches { batchSize: 20, yieldThreshold: 10, sequentialProcessing: false }');
await bench(() => Promise.resolve(lodash_1.default.flatMap(arr, (x) => [x, x])), 'lodash.flatMap');
await bench(() => Promise.resolve(arr.flatMap
? arr.flatMap((x) => [x, x])
: [].concat(...arr.map((x) => [x, x]))), 'Array.prototype.flatMap');
});
await section('forEach', async () => {
await bench(() => (0, batch_processing_1.forEachInBatches)(arr, () => { }, { batchSize: 20, yieldThreshold: 10 }), 'forEachInBatches { batchSize: 20, yieldThreshold: 10 }');
await bench(() => (0, batch_processing_1.forEachInBatches)(arr, () => { }, {
batchSize: 20,
yieldThreshold: 10,
sequentialProcessing: false,
}), 'forEachInBatches { batchSize: 20, yieldThreshold: 10, sequentialProcessing: false }');
await bench(() => Promise.resolve(arr.forEach(() => { })), 'Array.prototype.forEach');
await bench(() => Promise.resolve(lodash_1.default.forEach(arr, () => { })), 'lodash.forEach');
});
}
// to run benchmarks use: npx ts-node src/utils/batch-processing.bench.ts
if (require.main === module) {
runBenchmarks().catch((err) => {
console.error(err);
process.exit(1);
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2gtcHJvY2Vzc2luZy5iZW5jaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9iYXRjaC1wcm9jZXNzaW5nLmJlbmNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0JBQStCO0FBQy9CLHFEQUE4QztBQUM5QyxvREFBNEI7QUFDNUIseURBTzRCO0FBRTVCLEtBQUssVUFBVSxLQUFLLENBQ2xCLEVBQW9DLEVBQ3BDLEtBQWEsRUFDYixVQUFVLEdBQUcsQ0FBQztJQUVkLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLDZCQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDaEMsNENBQTRDO1FBQzVDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDWCxLQUFLLElBQUksNkJBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFDckMsQ0FBQztJQUNELE1BQU0sR0FBRyxHQUFHLEtBQUssR0FBRyxVQUFVLENBQUM7SUFDL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssU0FBUyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLFVBQVUsT0FBTyxDQUFDLENBQUM7SUFDMUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsS0FBSyxVQUFVLE9BQU8sQ0FBQyxLQUFhLEVBQUUsRUFBdUI7SUFDM0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssTUFBTSxDQUFDLENBQUM7SUFDbEMsTUFBTSxFQUFFLEVBQUUsQ0FBQztBQUNiLENBQUM7QUFFRCxLQUFLLFVBQVUsYUFBYTtJQUMxQixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFB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QUFFLEdBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3JGLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUN0RixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCx5RUFBeUU7QUFDekUsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO0lBQzVCLGFBQWEsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQgeyBwZXJmb3JtYW5jZSB9IGZyb20gJ25vZGU6cGVyZl9ob29rcyc7XG5pbXBvcnQgbG9kYXNoIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBtYXBJbkJhdGNoZXMsXG4gIGZpbHRlckluQmF0Y2hlcyxcbiAgZ3JvdXBCeUluQmF0Y2hlcyxcbiAgcmVkdWNlSW5CYXRjaGVzLFxuICBmbGF0TWFwSW5CYXRjaGVzLFxuICBmb3JFYWNoSW5CYXRjaGVzLFxufSBmcm9tICcuL2JhdGNoLXByb2Nlc3NpbmcnO1xuXG5hc3luYyBmdW5jdGlvbiBiZW5jaChcbiAgZm46ICgpID0+IFByb21pc2U8dW5rbm93bj4gfCB1bmtub3duLFxuICBsYWJlbDogc3RyaW5nLFxuICBpdGVyYXRpb25zID0gNSxcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGxldCB0b3RhbCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSArPSAxKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgIGF3YWl0IGZuKCk7XG4gICAgdG90YWwgKz0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydDtcbiAgfVxuICBjb25zdCBhdmcgPSB0b3RhbCAvIGl0ZXJhdGlvbnM7XG4gIGNvbnNvbGUubG9nKGAke2xhYmVsfTogYXZnICR7YXZnLnRvRml4ZWQoMil9IG1zIG92ZXIgJHtpdGVyYXRpb25zfSBydW5zYCk7XG4gIHJldHVybiBhdmc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNlY3Rpb24odGl0bGU6IHN0cmluZywgZm46ICgpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgY29uc29sZS5sb2coYFxcbj09PSAke3RpdGxlfSA9PT1gKTtcbiAgYXdhaXQgZm4oKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuQmVuY2htYXJrcygpIHtcbiAgY29uc3QgYXJyID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTBfMDAwIH0sIChfLCBpKSA9PiBpKTtcblxuICBjb25zb2xlLmxvZyhgUnVubmluZyBiZW5jaG1hcmtzIG9uIGFycmF5IG9mIGxlbmd0aCAke2Fyci5sZW5ndGh9YCk7XG5cbiAgYXdhaXQgc2VjdGlvbignbWFwJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGJlbmNoKFxuICAgICAgKCkgPT4gbWFwSW5CYXRjaGVzKGFyciwgKHgpID0+IHggKyAxLCB7IGJhdGNoU2l6ZTogMjAsIHlpZWxkVGhyZXNob2xkOiAxMCB9KSxcbiAgICAgICdtYXBJbkJhdGNoZXMgeyBiYXRjaFNpemU6IDIwLCB5aWVsZFRocmVzaG9sZDogMTAgfScsXG4gICAgKTtcbiAgICBhd2FpdCBiZW5jaChcbiAgICAgICgpID0+XG4gICAgICAgIG1hcEluQmF0Y2hlcyhhcnIsICh4KSA9PiB4ICsgMSwge1xuICAgICAgICAgIGJhdGNoU2l6ZTogMjAsXG4gICAgICAgICAgeWllbGRUaHJlc2hvbGQ6IDEwLFxuICAgICAgICAgIHNlcXVlbnRpYWxQcm9jZXNzaW5nOiBmYWxzZSxcbiAgICAgICAgfSksXG4gICAgICAnbWFwSW5CYXRjaGVzIHsgYmF0Y2hTaXplOiAyMCwgeWllbGRUaHJlc2hvbGQ6IDEwLCBzZXF1ZW50aWFsUHJvY2Vzc2luZzogZmFsc2UgfScsXG4gICAgKTtcbiAgICBhd2FpdCBiZW5jaCgoKSA9PiBQcm9taXNlLnJlc29sdmUobG9kYXNoLm1hcChhcnIsICh4KSA9PiB4ICsgMSkpLCAnbG9kYXNoLm1hcCcpO1xuICAgIGF3YWl0IGJlbmNoKCgpID0+IFByb21pc2UucmVzb2x2ZShhcnIubWFwKCh4KSA9PiB4ICsgMSkpLCAnQXJyYXkucHJvdG90eXBlLm1hcCcpO1xuICB9KTtcblxuICBhd2FpdCBzZWN0aW9uKCdmaWx0ZXInLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgYmVuY2goXG4gICAgICAoKSA9PiBmaWx0ZXJJbkJhdGNoZXMoYXJyLCAoeCkgPT4geCAlIDIgPT09IDAsIHsgYmF0Y2hTaXplOiAyMCwgeWllbGRUaHJlc2hvbGQ6IDEwIH0pLFxuICAgICAgJ2ZpbHRlckluQmF0Y2hlcyB7IGJhdGNoU2l6ZTogMjAsIHlpZWxkVGhyZXNob2xkOiAxMCB9JyxcbiAgICApO1xuICAgIGF3YWl0IGJlbmNoKFxuICAgICAgKCkgPT5cbiAgICAgICAgZmlsdGVySW5CYXRjaGVzKGFyciwgKHgpID0+IHggJSAyID09PSAwLCB7XG4gICAgICAgICAgYmF0Y2hTaXplOiAyMCxcbiAgICAgICAgICB5aWVsZFRocmVzaG9sZDogMTAsXG4gICAgICAgICAgc2VxdWVudGlhbFByb2Nlc3Npbmc6IGZhbHNlLFxuICAgICAgICB9KSxcbiAgICAgICdmaWx0ZXJJbkJhdGNoZXMgeyBiYXRjaFNpemU6IDIwLCB5aWVsZFRocmVzaG9sZDogMTAsIHNlcXVlbnRpYWxQcm9jZXNzaW5nOiBmYWxzZSB9JyxcbiAgICApO1xuICAgIGF3YWl0IGJlbmNoKCgpID0+IFByb21pc2UucmVzb2x2ZShsb2Rhc2guZmlsdGVyKGFyciwgKHgpID0+IHggJSAyID09PSAwKSksICdsb2Rhc2guZmlsdGVyJyk7XG4gICAgYXdhaXQgYmVuY2goKCkgPT4gUHJvbWlzZS5yZXNvbHZlKGFyci5maWx0ZXIoKHgpID0+IHggJSAyID09PSAwKSksICdBcnJheS5wcm90b3R5cGUuZmlsdGVyJyk7XG4gIH0pO1xuXG4gIGF3YWl0IHNlY3Rpb24oJ2dyb3VwQnknLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgYmVuY2goXG4gICAgICAoKSA9PlxuICAgICAgICBncm91cEJ5SW5CYXRjaGVzKGFyciwgKHgpID0+ICh4ICUgMiA9PT0gMCA/ICdldmVuJyA6ICdvZGQnKSwge1xuICAgICAgICAgIGJhdGNoU2l6ZTogMjAsXG4gICAgICAgICAgeWllbGRUaHJlc2hvbGQ6IDEwLFxuICAgICAgICB9KSxcbiAgICAgICdncm91cEJ5SW5CYXRjaGVzIHsgYmF0Y2hTaXplOiAyMCwgeWllbGRUaHJlc2hvbGQ6IDEwIH0nLFxuICAgICk7XG4gICAgYXdhaXQgYmVuY2goXG4gICAgICAoKSA9PlxuICAgICAgICBncm91cEJ5SW5CYXRjaGVzKGFyciwgKHgpID0+ICh4ICUgMiA9PT0gMCA/ICdldmVuJyA6ICdvZGQnKSwge1xuICAgICAgICAgIGJhdGNoU2l6ZTogMjAsXG4gICAgICAgICAgeWllbGRUaHJlc2hvbGQ6IDEwLFxuICAgICAgICAgIHNlcXVlbnRpYWxQcm9jZXNzaW5nOiBmYWxzZSxcbiAgICAgICAgfSksXG4gICAgICAnZ3JvdXBCeUluQmF0Y2hlcyB7IGJhdGNoU2l6ZTogMjAsIHlpZWxkVGhyZXNob2xkOiAxMCwgc2VxdWVudGlhbFByb2Nlc3Npbmc6IGZhbHNlIH0nLFxuICAgICk7XG4gICAgYXdhaXQgYmVuY2goXG4gICAgICAoKSA9PiBQcm9taXNlLnJlc29sdmUobG9kYXNoLmdyb3VwQnkoYXJyLCAoeCkgPT4gKHggJSAyID09PSAwID8gJ2V2ZW4nIDogJ29kZCcpKSksXG4gICAgICAnbG9kYXNoLmdyb3VwQnknLFxuICAgICk7XG4gIH0pO1xuXG4gIGF3YWl0IHNlY3Rpb24oJ3JlZHVjZScsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBiZW5jaChcbiAgICAgICgpID0+IHJlZHVjZUluQmF0Y2hlcyhhcnIsIChhY2MsIHgpID0+IGFjYyArIHgsIDAsIHsgYmF0Y2hTaXplOiAyMCwgeWllbGRUaHJlc2hvbGQ6IDEwIH0pLFxuICAgICAgJ3JlZHVjZUluQmF0Y2hlcyB7IGJhdGNoU2l6ZTogMjAsIHlpZWxkVGhyZXNob2xkOiAxMCB9JyxcbiAgICApO1xuICAgIGF3YWl0IGJlbmNoKCgpID0+IFByb21pc2UucmVzb2x2ZShsb2Rhc2gucmVkdWNlKGFyciwgKGFjYywgeCkgPT4gYWNjICsgeCwgMCkpLCAnbG9kYXNoLnJlZHVjZScpO1xuICAgIGF3YWl0IGJlbmNoKFxuICAgICAgKCkgPT4gUHJvbWlzZS5yZXNvbHZlKGFyci5yZWR1Y2UoKGFjYywgeCkgPT4gYWNjICsgeCwgMCkpLFxuICAgICAgJ0FycmF5LnByb3RvdHlwZS5yZWR1Y2UnLFxuICAgICk7XG4gIH0pO1xuXG4gIGF3YWl0IHNlY3Rpb24oJ2ZsYXRNYXAnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgYmVuY2goXG4gICAgICAoKSA9PiBmbGF0TWFwSW5CYXRjaGVzKGFyciwgKHgpID0+IFt4LCB4XSwgeyBiYXRjaFNpemU6IDIwLCB5aWVsZFRocmVzaG9sZDogMTAgfSksXG4gICAgICAnZmxhdE1hcEluQmF0Y2hlcyB7IGJhdGNoU2l6ZTogMjAsIHlpZWxkVGhyZXNob2xkOiAxMCB9JyxcbiAgICApO1xuICAgIGF3YWl0IGJlbmNoKFxuICAgICAgKCkgPT5cbiAgICAgICAgZmxhdE1hcEluQmF0Y2hlcyhhcnIsICh4KSA9PiBbeCwgeF0sIHtcbiAgICAgICAgICBiYXRjaFNpemU6IDIwLFxuICAgICAgICAgIHlpZWxkVGhyZXNob2xkOiAxMCxcbiAgICAgICAgICBzZXF1ZW50aWFsUHJvY2Vzc2luZzogZmFsc2UsXG4gICAgICAgIH0pLFxuICAgICAgJ2ZsYXRNYXBJbkJhdGNoZXMgeyBiYXRjaFNpemU6IDIwLCB5aWVsZFRocmVzaG9sZDogMTAsIHNlcXVlbnRpYWxQcm9jZXNzaW5nOiBmYWxzZSB9JyxcbiAgICApO1xuICAgIGF3YWl0IGJlbmNoKCgpID0+IFByb21pc2UucmVzb2x2ZShsb2Rhc2guZmxhdE1hcChhcnIsICh4KSA9PiBbeCwgeF0pKSwgJ2xvZGFzaC5mbGF0TWFwJyk7XG4gICAgYXdhaXQgYmVuY2goXG4gICAgICAoKSA9PlxuICAgICAgICBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgICAgYXJyLmZsYXRNYXBcbiAgICAgICAgICAgID8gYXJyLmZsYXRNYXAoKHgpID0+IFt4LCB4XSlcbiAgICAgICAgICAgIDogKFtdIGFzIG51bWJlcltdKS5jb25jYXQoLi4uYXJyLm1hcCgoeCkgPT4gW3gsIHhdKSksXG4gICAgICAgICksXG4gICAgICAnQXJyYXkucHJvdG90eXBlLmZsYXRNYXAnLFxuICAgICk7XG4gIH0pO1xuXG4gIGF3YWl0IHNlY3Rpb24oJ2ZvckVhY2gnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgYmVuY2goXG4gICAgICAoKSA9PiBmb3JFYWNoSW5CYXRjaGVzKGFyciwgKCkgPT4ge30sIHsgYmF0Y2hTaXplOiAyMCwgeWllbGRUaHJlc2hvbGQ6IDEwIH0pLFxuICAgICAgJ2ZvckVhY2hJbkJhdGNoZXMgeyBiYXRjaFNpemU6IDIwLCB5aWVsZFRocmVzaG9sZDogMTAgfScsXG4gICAgKTtcbiAgICBhd2FpdCBiZW5jaChcbiAgICAgICgpID0+XG4gICAgICAgIGZvckVhY2hJbkJhdGNoZXMoYXJyLCAoKSA9PiB7fSwge1xuICAgICAgICAgIGJhdGNoU2l6ZTogMjAsXG4gICAgICAgICAgeWllbGRUaHJlc2hvbGQ6IDEwLFxuICAgICAgICAgIHNlcXVlbnRpYWxQcm9jZXNzaW5nOiBmYWxzZSxcbiAgICAgICAgfSksXG4gICAgICAnZm9yRWFjaEluQmF0Y2hlcyB7IGJhdGNoU2l6ZTogMjAsIHlpZWxkVGhyZXNob2xkOiAxMCwgc2VxdWVudGlhbFByb2Nlc3Npbmc6IGZhbHNlIH0nLFxuICAgICk7XG4gICAgYXdhaXQgYmVuY2goKCkgPT4gUHJvbWlzZS5yZXNvbHZlKGFyci5mb3JFYWNoKCgpID0+IHt9KSksICdBcnJheS5wcm90b3R5cGUuZm9yRWFjaCcpO1xuICAgIGF3YWl0IGJlbmNoKCgpID0+IFByb21pc2UucmVzb2x2ZShsb2Rhc2guZm9yRWFjaChhcnIsICgpID0+IHt9KSksICdsb2Rhc2guZm9yRWFjaCcpO1xuICB9KTtcbn1cblxuLy8gdG8gcnVuIGJlbmNobWFya3MgdXNlOiBucHggdHMtbm9kZSBzcmMvdXRpbHMvYmF0Y2gtcHJvY2Vzc2luZy5iZW5jaC50c1xuaWYgKHJlcXVpcmUubWFpbiA9PT0gbW9kdWxlKSB7XG4gIHJ1bkJlbmNobWFya3MoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfSk7XG59XG4iXX0=