@rudderstack/integrations-lib
Version:
105 lines • 17.2 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const split_string_1 = __importDefault(require("split-string"));
const _1 = __importDefault(require("."));
describe('set-value', () => {
it('should set value', () => {
const obj = {};
(0, _1.default)(obj, 'a.b.c', 1);
expect(obj).toEqual({ a: { b: { c: 1 } } });
});
it('should not allow setting constructor', () => {
const obj = {};
(0, _1.default)(obj, 'a.constructor.b', 'c');
expect(obj['a.constructor.b']).toBe('c');
(0, _1.default)(obj, 'a.constructor', 'c');
expect(obj['a.constructor']).toBe('c');
(0, _1.default)(obj, 'constructor', 'c');
expect(obj.constructor).toBe('c');
});
it('should not allow setting prototype', () => {
const obj = {};
(0, _1.default)(obj, 'a.prototype.b', 'c');
expect(obj['a.prototype.b']).toBe('c');
(0, _1.default)(obj, 'a.prototype', 'c');
expect(obj['a.prototype']).toBe('c');
(0, _1.default)(obj, 'prototype', 'c');
expect(obj.prototype).toBe('c');
});
it('should not allow setting __proto__', () => {
const obj = {};
(0, _1.default)(obj, 'a.__proto__.b', 'c');
expect(obj['a.__proto__.b']).toBe('c');
(0, _1.default)(obj, 'a.__proto__', 'c');
expect(obj['a.__proto__']).toBe('c');
(0, _1.default)(obj, '__proto__', 'c');
// eslint-disable-next-line no-proto
expect(obj.__proto__).toBe('c');
});
it('should set when key is a symbol', () => {
const key = Symbol('foo');
const obj = {};
(0, _1.default)(obj, key, 'bar');
expect(obj[key]).toBe('bar');
});
it('should support passing an array as the key', () => {
const actual = (0, _1.default)({ a: 'a', b: { c: 'd' } }, ['b', 'c', 'd'], 'eee');
expect(actual).toEqual({ a: 'a', b: { c: { d: 'eee' } } });
});
it('should merge an existing value with the given value', () => {
const obj = { a: { b: { c: 'd' } } };
(0, _1.default)(obj, 'a.b', { y: 'z' }, { merge: true });
expect(obj.a.b).toEqual({ c: 'd', y: 'z' });
});
it('should not split properties with a forward slash when preservePaths is true', () => {
const obj = {};
(0, _1.default)(obj, 'foo/bar/baz.md', 'c', { preservePaths: true });
expect(obj['foo/bar/baz.md']).toBe('c');
});
it('should use a custom function to not split inside double quotes', () => {
const keep = (value, _state) => value !== '"' && value !== "'";
const options = {
split(prop) {
return (0, split_string_1.default)(prop, { separator: '.', brackets: true, quotes: true, keep });
},
};
const obj = {};
// @ts-expect-error: set-value does not support this return-type
(0, _1.default)(obj, 'a."b.c.d".e', 'c', options);
expect(obj.a['b.c.d'].e).toBe('c');
});
it('should use simple String.split() when options.split is not defined', () => {
const obj = {};
(0, _1.default)(obj, 'a."b.c.d".e', 'c');
expect(obj.a['"b'].c['d"'].e).toBe('c');
});
it('should set a deeply nested value', () => {
const obj = { a: 'a', b: { c: 'd' } };
(0, _1.default)(obj, 'b.c.d', 'eee');
expect(obj).toEqual({ a: 'a', b: { c: { d: 'eee' } } });
});
it('should create a deeply nested property if it does not already exist', () => {
const obj = {};
(0, _1.default)(obj, 'a.b.c.d.e', 'c');
expect(obj.a.b.c.d.e).toBe('c');
});
it('should handle array indices correctly', () => {
const obj = { a: [1, 2, 3] };
(0, _1.default)(obj, 'a.1', 42);
expect(obj.a[1]).toBe(42);
});
it('should handle setting values on arrays', () => {
const obj = {};
(0, _1.default)(obj, 'a.0.b', 'c');
expect(obj.a[0].b).toBe('c');
});
it('should handle setting values with special characters in keys', () => {
const obj = {};
(0, _1.default)(obj, 'a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z', 'z');
expect(obj.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z).toBe('z');
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0LXZhbHVlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3NldC12YWx1ZS9zZXQtdmFsdWUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGdFQUFpQztBQUNqQyx5Q0FBeUI7QUFFekIsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7SUFDekIsRUFBRSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtRQUMxQixNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDZixJQUFBLFVBQVEsRUFBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsc0NBQXNDLEVBQUUsR0FBRyxFQUFFO1FBQzlDLE1BQU0sR0FBRyxHQUF3QixFQUFFLENBQUM7UUFDcEMsSUFBQSxVQUFRLEVBQUMsR0FBRyxFQUFFLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFBLFVBQVEsRUFBQyxHQUFHLEVBQUUsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsSUFBQSxVQUFRLEVBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsQyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLEVBQUU7UUFDNUMsTUFBTSxHQUFHLEdBQXdCLEVBQUUsQ0FBQztRQUNwQyxJQUFBLFVBQVEsRUFBQyxHQUFHLEVBQUUsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsSUFBQSxVQUFRLEVBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsQyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLElBQUEsVUFBUSxFQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUUsR0FBRyxFQUFFO1FBQzVDLE1BQU0sR0FBRyxHQUF3QixFQUFFLENBQUM7UUFDcEMsSUFBQSxVQUFRLEVBQUMsR0FBRyxFQUFFLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwQyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUEsVUFBUSxFQUFDLEdBQUcsRUFBRSxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxJQUFBLFVBQVEsRUFBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLG9DQUFvQztRQUNwQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxHQUFHLEVBQUU7UUFDekMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUEsVUFBUSxFQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0Q0FBNEMsRUFBRSxHQUFHLEVBQUU7UUFDcEQsTUFBTSxNQUFNLEdBQUcsSUFBQSxVQUFRLEVBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMscURBQXFELEVBQUUsR0FBRyxFQUFFO1FBQzdELE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNyQyxJQUFBLFVBQVEsRUFBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUs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QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc3BsaXQgZnJvbSAnc3BsaXQtc3RyaW5nJztcbmltcG9ydCBzZXRWYWx1ZSBmcm9tICcuJztcblxuZGVzY3JpYmUoJ3NldC12YWx1ZScsICgpID0+IHtcbiAgaXQoJ3Nob3VsZCBzZXQgdmFsdWUnLCAoKSA9PiB7XG4gICAgY29uc3Qgb2JqID0ge307XG4gICAgc2V0VmFsdWUob2JqLCAnYS5iLmMnLCAxKTtcbiAgICBleHBlY3Qob2JqKS50b0VxdWFsKHsgYTogeyBiOiB7IGM6IDEgfSB9IH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIG5vdCBhbGxvdyBzZXR0aW5nIGNvbnN0cnVjdG9yJywgKCkgPT4ge1xuICAgIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHNldFZhbHVlKG9iaiwgJ2EuY29uc3RydWN0b3IuYicsICdjJyk7XG4gICAgZXhwZWN0KG9ialsnYS5jb25zdHJ1Y3Rvci5iJ10pLnRvQmUoJ2MnKTtcbiAgICBzZXRWYWx1ZShvYmosICdhLmNvbnN0cnVjdG9yJywgJ2MnKTtcbiAgICBleHBlY3Qob2JqWydhLmNvbnN0cnVjdG9yJ10pLnRvQmUoJ2MnKTtcbiAgICBzZXRWYWx1ZShvYmosICdjb25zdHJ1Y3RvcicsICdjJyk7XG4gICAgZXhwZWN0KG9iai5jb25zdHJ1Y3RvcikudG9CZSgnYycpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIG5vdCBhbGxvdyBzZXR0aW5nIHByb3RvdHlwZScsICgpID0+IHtcbiAgICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBzZXRWYWx1ZShvYmosICdhLnByb3RvdHlwZS5iJywgJ2MnKTtcbiAgICBleHBlY3Qob2JqWydhLnByb3RvdHlwZS5iJ10pLnRvQmUoJ2MnKTtcbiAgICBzZXRWYWx1ZShvYmosICdhLnByb3RvdHlwZScsICdjJyk7XG4gICAgZXhwZWN0KG9ialsnYS5wcm90b3R5cGUnXSkudG9CZSgnYycpO1xuICAgIHNldFZhbHVlKG9iaiwgJ3Byb3RvdHlwZScsICdjJyk7XG4gICAgZXhwZWN0KG9iai5wcm90b3R5cGUpLnRvQmUoJ2MnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBub3QgYWxsb3cgc2V0dGluZyBfX3Byb3RvX18nLCAoKSA9PiB7XG4gICAgY29uc3Qgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgc2V0VmFsdWUob2JqLCAnYS5fX3Byb3RvX18uYicsICdjJyk7XG4gICAgZXhwZWN0KG9ialsnYS5fX3Byb3RvX18uYiddKS50b0JlKCdjJyk7XG4gICAgc2V0VmFsdWUob2JqLCAnYS5fX3Byb3RvX18nLCAnYycpO1xuICAgIGV4cGVjdChvYmpbJ2EuX19wcm90b19fJ10pLnRvQmUoJ2MnKTtcbiAgICBzZXRWYWx1ZShvYmosICdfX3Byb3RvX18nLCAnYycpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b1xuICAgIGV4cGVjdChvYmouX19wcm90b19fKS50b0JlKCdjJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc2V0IHdoZW4ga2V5IGlzIGEgc3ltYm9sJywgKCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IFN5bWJvbCgnZm9vJyk7XG4gICAgY29uc3Qgb2JqID0ge307XG4gICAgc2V0VmFsdWUob2JqLCBrZXksICdiYXInKTtcbiAgICBleHBlY3Qob2JqW2tleV0pLnRvQmUoJ2JhcicpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHN1cHBvcnQgcGFzc2luZyBhbiBhcnJheSBhcyB0aGUga2V5JywgKCkgPT4ge1xuICAgIGNvbnN0IGFjdHVhbCA9IHNldFZhbHVlKHsgYTogJ2EnLCBiOiB7IGM6ICdkJyB9IH0sIFsnYicsICdjJywgJ2QnXSwgJ2VlZScpO1xuICAgIGV4cGVjdChhY3R1YWwpLnRvRXF1YWwoeyBhOiAnYScsIGI6IHsgYzogeyBkOiAnZWVlJyB9IH0gfSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbWVyZ2UgYW4gZXhpc3RpbmcgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUnLCAoKSA9PiB7XG4gICAgY29uc3Qgb2JqID0geyBhOiB7IGI6IHsgYzogJ2QnIH0gfSB9O1xuICAgIHNldFZhbHVlKG9iaiwgJ2EuYicsIHsgeTogJ3onIH0sIHsgbWVyZ2U6IHRydWUgfSk7XG4gICAgZXhwZWN0KG9iai5hLmIpLnRvRXF1YWwoeyBjOiAnZCcsIHk6ICd6JyB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBub3Qgc3BsaXQgcHJvcGVydGllcyB3aXRoIGEgZm9yd2FyZCBzbGFzaCB3aGVuIHByZXNlcnZlUGF0aHMgaXMgdHJ1ZScsICgpID0+IHtcbiAgICBjb25zdCBvYmogPSB7fTtcbiAgICBzZXRWYWx1ZShvYmosICdmb28vYmFyL2Jhei5tZCcsICdjJywgeyBwcmVzZXJ2ZVBhdGhzOiB0cnVlIH0pO1xuICAgIGV4cGVjdChvYmpbJ2Zvby9iYXIvYmF6Lm1kJ10pLnRvQmUoJ2MnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB1c2UgYSBjdXN0b20gZnVuY3Rpb24gdG8gbm90IHNwbGl0IGluc2lkZSBkb3VibGUgcXVvdGVzJywgKCkgPT4ge1xuICAgIGNvbnN0IGtlZXAgPSAodmFsdWUsIF9zdGF0ZSkgPT4gdmFsdWUgIT09ICdcIicgJiYgdmFsdWUgIT09IFwiJ1wiO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHNwbGl0KHByb3ApIHtcbiAgICAgICAgcmV0dXJuIHNwbGl0KHByb3AsIHsgc2VwYXJhdG9yOiAnLicsIGJyYWNrZXRzOiB0cnVlLCBxdW90ZXM6IHRydWUsIGtlZXAgfSk7XG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3Qgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogc2V0LXZhbHVlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyByZXR1cm4tdHlwZVxuICAgIHNldFZhbHVlKG9iaiwgJ2EuXCJiLmMuZFwiLmUnLCAnYycsIG9wdGlvbnMpO1xuICAgIGV4cGVjdChvYmouYVsnYi5jLmQnXS5lKS50b0JlKCdjJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdXNlIHNpbXBsZSBTdHJpbmcuc3BsaXQoKSB3aGVuIG9wdGlvbnMuc3BsaXQgaXMgbm90IGRlZmluZWQnLCAoKSA9PiB7XG4gICAgY29uc3Qgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgc2V0VmFsdWUob2JqLCAnYS5cImIuYy5kXCIuZScsICdjJyk7XG4gICAgZXhwZWN0KG9iai5hWydcImInXS5jWydkXCInXS5lKS50b0JlKCdjJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc2V0IGEgZGVlcGx5IG5lc3RlZCB2YWx1ZScsICgpID0+IHtcbiAgICBjb25zdCBvYmogPSB7IGE6ICdhJywgYjogeyBjOiAnZCcgfSB9O1xuICAgIHNldFZhbHVlKG9iaiwgJ2IuYy5kJywgJ2VlZScpO1xuICAgIGV4cGVjdChvYmopLnRvRXF1YWwoeyBhOiAnYScsIGI6IHsgYzogeyBkOiAnZWVlJyB9IH0gfSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY3JlYXRlIGEgZGVlcGx5IG5lc3RlZCBwcm9wZXJ0eSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0JywgKCkgPT4ge1xuICAgIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHNldFZhbHVlKG9iaiwgJ2EuYi5jLmQuZScsICdjJyk7XG4gICAgZXhwZWN0KG9iai5hLmIuYy5kLmUpLnRvQmUoJ2MnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBoYW5kbGUgYXJyYXkgaW5kaWNlcyBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgY29uc3Qgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0geyBhOiBbMSwgMiwgM10gfTtcbiAgICBzZXRWYWx1ZShvYmosICdhLjEnLCA0Mik7XG4gICAgZXhwZWN0KG9iai5hWzFdKS50b0JlKDQyKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBoYW5kbGUgc2V0dGluZyB2YWx1ZXMgb24gYXJyYXlzJywgKCkgPT4ge1xuICAgIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHNldFZhbHVlKG9iaiwgJ2EuMC5iJywgJ2MnKTtcbiAgICBleHBlY3Qob2JqLmFbMF0uYikudG9CZSgnYycpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGhhbmRsZSBzZXR0aW5nIHZhbHVlcyB3aXRoIHNwZWNpYWwgY2hhcmFjdGVycyBpbiBrZXlzJywgKCkgPT4ge1xuICAgIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHNldFZhbHVlKG9iaiwgJ2EuYi5jLmQuZS5mLmcuaC5pLmouay5sLm0ubi5vLnAucS5yLnMudC51LnYudy54LnkueicsICd6Jyk7XG4gICAgZXhwZWN0KG9iai5hLmIuYy5kLmUuZi5nLmguaS5qLmsubC5tLm4uby5wLnEuci5zLnQudS52LncueC55LnopLnRvQmUoJ3onKTtcbiAgfSk7XG59KTtcbiJdfQ==