firebase-bolt
Version:
Firebase Bolt Security and Modeling Language Compiler
214 lines (212 loc) • 26.7 kB
JavaScript
;
exports.__esModule = true;
/*
* Copyright 2015 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var chai_1 = require("chai");
var helper = require("./test-helper");
var bolt = require("../bolt");
var parse = bolt.parse;
var ast = require("../ast");
suite("Abstract Syntax Tree (AST)", function () {
suite("Left Associative Operators (AND OR)", function () {
var t = ast.boolean(true);
var f = ast.boolean(false);
var v = ast.variable;
var and = ast.and;
var or = ast.or;
var a = v('a');
var b = v('b');
var c = v('c');
var d = v('d');
var tests = [
{ data: [],
expect: { and: t, or: f } },
{ data: [t],
expect: { and: t, or: t } },
{ data: [f],
expect: { and: f, or: f } },
{ data: [f, t],
expect: { and: f, or: t } },
{ data: [t, f],
expect: { and: f, or: t } },
{ data: [t, f, t],
expect: { and: f, or: t } },
{ data: [f, t, f],
expect: { and: f, or: t } },
{ data: [a],
expect: { and: a, or: a } },
{ data: [a, t],
expect: { and: a, or: t } },
{ data: [a, f],
expect: { and: f, or: a } },
{ data: [t, a],
expect: { and: a, or: t } },
{ data: [f, a],
expect: { and: f, or: a } },
{ data: [t, a, f],
expect: { and: f, or: t } },
{ data: [f, a, t],
expect: { and: f, or: t } },
{ data: [a, f, a],
expect: { and: f, or: ast.or(a, a) } },
{ data: [a, t, a],
expect: { and: and(a, a), or: t } },
{ data: [and(a, b), and(c, d)],
expect: { and: and(and(and(a, b), c), d),
or: or(and(a, b), and(c, d)) } },
{ data: [or(a, b), or(c, d)],
expect: { and: and(or(a, b), or(c, d)),
or: or(or(or(a, b), c), d) } },
];
helper.dataDrivenTest(tests, function (data, expect) {
chai_1.assert.deepEqual(ast.andArray(data), expect.and, 'AND');
chai_1.assert.deepEqual(ast.orArray(data), expect.or, 'OR');
}, helper.expFormat);
});
suite("Flatten", function () {
var v = ast.variable;
var and = ast.and;
var a = v('a');
var b = v('b');
var c = v('c');
var d = v('d');
var tests = [
{ data: a,
expect: [a] },
{ data: and(a, b),
expect: [a, b] },
{ data: and(a, b),
expect: [a, b] },
{ data: and(and(a, b), c),
expect: [a, b, c] },
{ data: and(a, and(b, c)),
expect: [a, b, c] },
{ data: and(and(a, b), and(c, d)),
expect: [a, b, c, d] },
];
helper.dataDrivenTest(tests, function (data, expect) {
var result = ast.flatten('&&', data);
chai_1.assert.deepEqual(result, expect);
}, helper.expFormat);
});
suite("isIdentifierString", function () {
var tests = [
[ast.string('hi'), true],
[ast.string('Hi'), true],
[ast.string('a'), true],
[ast.string('A'), true],
[ast.string('hiThere'), true],
[ast.string('H123'), true],
[ast.string('$id'), true],
[ast.string('a$id'), false],
[ast.string('a b'), false],
[ast.string('0H123'), false],
[ast.boolean(true), false],
[ast.number(123), false],
['hi', false],
];
helper.dataDrivenTest(tests, function (data, expect) {
var result = ast.isIdentifierStringExp(data);
chai_1.assert.equal(result, expect);
}, helper.expFormat);
});
suite("Expression decoding.", function () {
var tests = [
["true"],
["false"],
["1"],
["(1)", '1'],
["1.1"],
["+3", "3"],
["-3"],
["0x2", "2"],
["\"string\"", "'string'"],
["'string'"],
["'st\\'ring'"],
["'st\\ring'"],
["'\\u000d'", "'\\r'"],
["/pattern/"],
["/pattern/i"],
["/pat\\/tern/i"],
["a"],
["a.b"],
["a.b.c"],
["a['b']", 'a.b'],
["a[b]"],
["a[b][c]"],
["a.b[c]"],
["a[b].c"],
["(a.b)[c]", "a.b[c]"],
["(a(b))[c]", "a(b)[c]"],
["a()"],
["a()()"],
["a.b()"],
["a().b"],
["a[0]()"],
["a()[0]"],
["-a"],
["--a"],
["+a", "a"],
["+a +b", "a + b"],
["-a -b", "-a - b"],
["-a --b", "-a - -b"],
["-a ---b", "-a - --b"],
["!a"],
["!!a"],
["!+a", '!a'],
["!-a"],
["-!a"],
["2 * a"],
["(2 * a)", '2 * a'],
["2 / a"],
["a % 2"],
["1 + 1"],
["a - 1"],
["a - -b"],
["a + b + c"],
["a + (b + c)"],
["(a + b) + c", 'a + b + c'],
["a + b * c"],
["(a + b) * c"],
["a < 7"],
["a > 7"],
["a <= 7"],
["a >= 7"],
["a == 3"],
["a != 0"],
["a === 3", "a == 3"],
["a !== 0", "a != 0"],
["3 * a == b"],
["a == 1 && b <= 2", "(a == 1 && b <= 2)"],
["a == 1 || b <= 2", "(a == 1 || b <= 2)"],
["a && b && c", "((a && b) && c)"],
["a || b || c", "((a || b) || c)"],
["a && b || c && d", "((a && b) || (c && d))"],
["a ? b : c"],
["a || b ? c : d", "(a || b) ? c : d"],
["(this + ' ').test(/\d+/)"],
];
helper.dataDrivenTest(tests, function (data, expect) {
// Decode to self by default
expect = expect || data;
var result = parse('function f() {return ' + data + ';}');
var exp = result.functions.f.body;
var decode = bolt.decodeExpression(exp);
chai_1.assert.equal(decode, expect);
});
});
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvYXN0LXRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILDZCQUE0QjtBQUM1QixzQ0FBd0M7QUFFeEMsOEJBQWdDO0FBQ2hDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDdkIsNEJBQThCO0FBRTlCLEtBQUssQ0FBQyw0QkFBNEIsRUFBRTtJQUNsQyxLQUFLLENBQUMscUNBQXFDLEVBQUU7UUFDM0MsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDckIsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNsQixJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVmLElBQUksS0FBSyxHQUFHO1lBQ1YsRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDUixNQUFNLEVBQUUsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUMsRUFBRTtZQUMzQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDVCxNQUFNLEVBQUUsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUMsRUFBRTtZQUMzQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDVCxNQUFNLEVBQUUsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUMsRUFBRTtZQUMzQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ1osTUFBTSxFQUFFLEVBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFDLEVBQUU7WUFDM0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNaLE1BQU0sRUFBRSxFQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBQyxFQUFFO1lBQzNCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2YsTUFBTSxFQUFFLEVBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFDLEVBQUU7WUFDM0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDZixNQUFNLEVBQUUsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUMsRUFBRTtZQUMzQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDVCxNQUFNLEVBQUUsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUMsRUFBRTtZQUMzQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ1osTUFBTSxFQUFFLEVBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFDLEVBQUU7WUFDM0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNaLE1BQU0sRUFBRSxFQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBQyxFQUFFO1lBQzNCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDWixNQUFNLEVBQUUsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUMsRUFBRTtZQUMzQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ1osTUFBTSxFQUFFLEVBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFDLEVBQUU7WUFDM0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDZixNQUFNLEVBQUUsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUMsRUFBRTtZQUMzQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNmLE1BQU0sRUFBRSxFQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBQyxFQUFFO1lBQzNCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2YsTUFBTSxFQUFFLEVBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsRUFBRTtZQUN0QyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNmLE1BQU0sRUFBRSxFQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUMsRUFBRTtZQUNuQyxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDNUIsTUFBTSxFQUFFLEVBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMs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QUFRLENBQUU7WUFDdkIsQ0FBRSxTQUFTLEVBQUUsUUFBUSxDQUFFO1lBQ3ZCLENBQUUsWUFBWSxDQUFFO1lBQ2hCLENBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUU7WUFDNUMsQ0FBRSxrQkFBa0IsRUFBRSxvQkFBb0IsQ0FBRTtZQUM1QyxDQUFFLGFBQWEsRUFBRSxpQkFBaUIsQ0FBRTtZQUNwQyxDQUFFLGFBQWEsRUFBRSxpQkFBaUIsQ0FBRTtZQUNwQyxDQUFFLGtCQUFrQixFQUFFLHdCQUF3QixDQUFFO1lBQ2hELENBQUUsV0FBVyxDQUFFO1lBQ2YsQ0FBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsQ0FBRTtZQUN4QyxDQUFFLDBCQUEwQixDQUFFO1NBQy9CLENBQUM7UUFFRixNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxVQUFTLElBQVksRUFBRSxNQUFjO1lBQ2hFLDRCQUE0QjtZQUM1QixNQUFNLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQztZQUN4QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQzFELElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNsQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEMsYUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwiZmlsZSI6InRlc3QvYXN0LXRlc3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCAqIGFzIGhlbHBlciBmcm9tICcuL3Rlc3QtaGVscGVyJztcblxuaW1wb3J0ICogYXMgYm9sdCBmcm9tICcuLi9ib2x0JztcbmxldCBwYXJzZSA9IGJvbHQucGFyc2U7XG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAnLi4vYXN0Jztcblxuc3VpdGUoXCJBYnN0cmFjdCBTeW50YXggVHJlZSAoQVNUKVwiLCBmdW5jdGlvbigpIHtcbiAgc3VpdGUoXCJMZWZ0IEFzc29jaWF0aXZlIE9wZXJhdG9ycyAoQU5EIE9SKVwiLCBmdW5jdGlvbigpIHtcbiAgICB2YXIgdCA9IGFzdC5ib29sZWFuKHRydWUpO1xuICAgIHZhciBmID0gYXN0LmJvb2xlYW4oZmFsc2UpO1xuICAgIHZhciB2ID0gYXN0LnZhcmlhYmxlO1xuICAgIHZhciBhbmQgPSBhc3QuYW5kO1xuICAgIHZhciBvciA9IGFzdC5vcjtcbiAgICB2YXIgYSA9IHYoJ2EnKTtcbiAgICB2YXIgYiA9IHYoJ2InKTtcbiAgICB2YXIgYyA9IHYoJ2MnKTtcbiAgICB2YXIgZCA9IHYoJ2QnKTtcblxuICAgIHZhciB0ZXN0cyA9IFtcbiAgICAgIHsgZGF0YTogW10sXG4gICAgICAgIGV4cGVjdDoge2FuZDogdCwgb3I6IGZ9IH0sXG4gICAgICB7IGRhdGE6IFt0XSxcbiAgICAgICAgZXhwZWN0OiB7YW5kOiB0LCBvcjogdH0gfSxcbiAgICAgIHsgZGF0YTogW2ZdLFxuICAgICAgICBleHBlY3Q6IHthbmQ6IGYsIG9yOiBmfSB9LFxuICAgICAgeyBkYXRhOiBbZiwgdF0sXG4gICAgICAgIGV4cGVjdDoge2FuZDogZiwgb3I6IHR9IH0sXG4gICAgICB7IGRhdGE6IFt0LCBmXSxcbiAgICAgICAgZXhwZWN0OiB7YW5kOiBmLCBvcjogdH0gfSxcbiAgICAgIHsgZGF0YTogW3QsIGYsIHRdLFxuICAgICAgICBleHBlY3Q6IHthbmQ6IGYsIG9yOiB0fSB9LFxuICAgICAgeyBkYXRhOiBbZiwgdCwgZl0sXG4gICAgICAgIGV4cGVjdDoge2FuZDogZiwgb3I6IHR9IH0sXG4gICAgICB7IGRhdGE6IFthXSxcbiAgICAgICAgZXhwZWN0OiB7YW5kOiBhLCBvcjogYX0gfSxcbiAgICAgIHsgZGF0YTogW2EsIHRdLFxuICAgICAgICBleHBlY3Q6IHthbmQ6IGEsIG9yOiB0fSB9LFxuICAgICAgeyBkYXRhOiBbYSwgZl0sXG4gICAgICAgIGV4cGVjdDoge2FuZDogZiwgb3I6IGF9IH0sXG4gICAgICB7IGRhdGE6IFt0LCBhXSxcbiAgICAgICAgZXhwZWN0OiB7YW5kOiBhLCBvcjogdH0gfSxcbiAgICAgIHsgZGF0YTogW2YsIGFdLFxuICAgICAgICBleHBlY3Q6IHthbmQ6IGYsIG9yOiBhfSB9LFxuICAgICAgeyBkYXRhOiBbdCwgYSwgZl0sXG4gICAgICAgIGV4cGVjdDoge2FuZDogZiwgb3I6IHR9IH0sXG4gICAgICB7IGRhdGE6IFtmLCBhLCB0XSxcbiAgICAgICAgZXhwZWN0OiB7YW5kOiBmLCBvcjogdH0gfSxcbiAgICAgIHsgZGF0YTogW2EsIGYsIGFdLFxuICAgICAgICBleHBlY3Q6IHthbmQ6IGYsIG9yOiBhc3Qub3IoYSwgYSl9IH0sXG4gICAgICB7IGRhdGE6IFthLCB0LCBhXSxcbiAgICAgICAgZXhwZWN0OiB7YW5kOiBhbmQoYSwgYSksIG9yOiB0fSB9LFxuICAgICAgeyBkYXRhOiBbYW5kKGEsIGIpLCBhbmQoYywgZCldLFxuICAgICAgICBleHBlY3Q6IHthbmQ6IGFuZChhbmQoYW5kKGEsIGIpLCBjKSwgZCksXG4gICAgICAgICAgICAgICAgIG9yOiBvcihhbmQoYSwgYiksIGFuZChjLCBkKSl9IH0sXG4gICAgICB7IGRhdGE6IFtvcihhLCBiKSwgb3IoYywgZCldLFxuICAgICAgICBleHBlY3Q6IHthbmQ6IGFuZChvcihhLCBiKSwgb3IoYywgZCkpLFxuICAgICAgICAgICAgICAgICBvcjogb3Iob3Iob3IoYSwgYiksIGMpLCBkKX0gfSxcbiAgICBdO1xuXG4gICAgaGVscGVyLmRhdGFEcml2ZW5UZXN0KHRlc3RzLCBmdW5jdGlvbihkYXRhOiBhc3QuRXhwW10sIGV4cGVjdDogYW55KSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGFzdC5hbmRBcnJheShkYXRhKSwgZXhwZWN0LmFuZCwgJ0FORCcpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChhc3Qub3JBcnJheShkYXRhKSwgZXhwZWN0Lm9yLCAnT1InKTtcbiAgICB9LCBoZWxwZXIuZXhwRm9ybWF0KTtcbiAgfSk7XG5cbiAgc3VpdGUoXCJGbGF0dGVuXCIsIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gYXN0LnZhcmlhYmxlO1xuICAgIHZhciBhbmQgPSBhc3QuYW5kO1xuICAgIHZhciBhID0gdignYScpO1xuICAgIHZhciBiID0gdignYicpO1xuICAgIHZhciBjID0gdignYycpO1xuICAgIHZhciBkID0gdignZCcpO1xuXG4gICAgdmFyIHRlc3RzID0gW1xuICAgICAgeyBkYXRhOiBhLFxuICAgICAgICBleHBlY3Q6IFthXSB9LFxuICAgICAgeyBkYXRhOiBhbmQoYSwgYiksXG4gICAgICAgIGV4cGVjdDogW2EsIGJdIH0sXG4gICAgICB7IGRhdGE6IGFuZChhLCBiKSxcbiAgICAgICAgZXhwZWN0OiBbYSwgYl0gfSxcbiAgICAgIHsgZGF0YTogYW5kKGFuZChhLCBiKSwgYyksXG4gICAgICAgIGV4cGVjdDogW2EsIGIsIGNdIH0sXG4gICAgICB7IGRhdGE6IGFuZChhLCBhbmQoYiwgYykpLFxuICAgICAgICBleHBlY3Q6IFthLCBiLCBjXSB9LFxuICAgICAgeyBkYXRhOiBhbmQoYW5kKGEsIGIpLCBhbmQoYywgZCkpLFxuICAgICAgICBleHBlY3Q6IFthLCBiLCBjLCBkXSB9LFxuICAgIF07XG5cbiAgICBoZWxwZXIuZGF0YURyaXZlblRlc3QodGVzdHMsIGZ1bmN0aW9uKGRhdGE6IGFzdC5FeHAsIGV4cGVjdDogYXN0LkV4cFtdKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gYXN0LmZsYXR0ZW4oJyYmJywgZGF0YSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3VsdCwgZXhwZWN0KTtcbiAgICB9LCBoZWxwZXIuZXhwRm9ybWF0KTtcbiAgfSk7XG5cbiAgc3VpdGUoXCJpc0lkZW50aWZpZXJTdHJpbmdcIiwgZnVuY3Rpb24oKSB7XG4gICAgbGV0IHRlc3RzID0gW1xuICAgICAgW2FzdC5zdHJpbmcoJ2hpJyksIHRydWVdLFxuICAgICAgW2FzdC5zdHJpbmcoJ0hpJyksIHRydWVdLFxuICAgICAgW2FzdC5zdHJpbmcoJ2EnKSwgdHJ1ZV0sXG4gICAgICBbYXN0LnN0cmluZygnQScpLCB0cnVlXSxcbiAgICAgIFthc3Quc3RyaW5nKCdoaVRoZXJlJyksIHRydWVdLFxuICAgICAgW2FzdC5zdHJpbmcoJ0gxMjMnKSwgdHJ1ZV0sXG4gICAgICBbYXN0LnN0cmluZygnJGlkJyksIHRydWVdLFxuICAgICAgW2FzdC5zdHJpbmcoJ2EkaWQnKSwgZmFsc2VdLFxuICAgICAgW2FzdC5zdHJpbmcoJ2EgYicpLCBmYWxzZV0sXG4gICAgICBbYXN0LnN0cmluZygnMEgxMjMnKSwgZmFsc2VdLFxuICAgICAgW2FzdC5ib29sZWFuKHRydWUpLCBmYWxzZV0sXG4gICAgICBbYXN0Lm51bWJlcigxMjMpLCBmYWxzZV0sXG4gICAgICBbJ2hpJywgZmFsc2VdLFxuICAgIF07XG5cbiAgICBoZWxwZXIuZGF0YURyaXZlblRlc3QodGVzdHMsIGZ1bmN0aW9uKGRhdGE6IGFzdC5FeHAsIGV4cGVjdDogYm9vbGVhbikge1xuICAgICAgdmFyIHJlc3VsdCA9IGFzdC5pc0lkZW50aWZpZXJTdHJpbmdFeHAoZGF0YSk7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBleHBlY3QpO1xuICAgIH0sIGhlbHBlci5leHBGb3JtYXQpO1xuICB9KTtcblxuICBzdWl0ZShcIkV4cHJlc3Npb24gZGVjb2RpbmcuXCIsIGZ1bmN0aW9uKCkge1xuICAgIHZhciB0ZXN0cyA9IFtcbiAgICAgIFsgXCJ0cnVlXCIgXSxcbiAgICAgIFsgXCJmYWxzZVwiIF0sXG4gICAgICBbIFwiMVwiIF0sXG4gICAgICBbIFwiKDEpXCIsICcxJyBdLFxuICAgICAgWyBcIjEuMVwiIF0sXG4gICAgICBbIFwiKzNcIiwgXCIzXCJdLFxuICAgICAgWyBcIi0zXCIgXSxcbiAgICAgIFsgXCIweDJcIiwgXCIyXCIgXSxcbiAgICAgIFsgXCJcXFwic3RyaW5nXFxcIlwiLCBcIidzdHJpbmcnXCIgXSxcbiAgICAgIFsgXCInc3RyaW5nJ1wiIF0sXG4gICAgICBbIFwiJ3N0XFxcXCdyaW5nJ1wiXSxcbiAgICAgIFsgXCInc3RcXFxccmluZydcIiBdLFxuICAgICAgWyBcIidcXFxcdTAwMGQnXCIsIFwiJ1xcXFxyJ1wiIF0sXG4gICAgICBbIFwiL3BhdHRlcm4vXCIgXSxcbiAgICAgIFsgXCIvcGF0dGVybi9pXCIgXSxcbiAgICAgIFsgXCIvcGF0XFxcXC90ZXJuL2lcIiBdLFxuICAgICAgWyBcImFcIiBdLFxuICAgICAgWyBcImEuYlwiIF0sXG4gICAgICBbIFwiYS5iLmNcIiBdLFxuXG4gICAgICBbIFwiYVsnYiddXCIsICdhLmInIF0sXG4gICAgICBbIFwiYVtiXVwiIF0sXG4gICAgICBbIFwiYVtiXVtjXVwiIF0sXG4gICAgICBbIFwiYS5iW2NdXCIgXSxcbiAgICAgIFsgXCJhW2JdLmNcIiBdLFxuICAgICAgWyBcIihhLmIpW2NdXCIsIFwiYS5iW2NdXCIgXSxcbiAgICAgIFsgXCIoYShiKSlbY11cIiwgXCJhKGIpW2NdXCIgXSxcblxuICAgICAgWyBcImEoKVwiIF0sXG4gICAgICBbIFwiYSgpKClcIiBdLFxuICAgICAgWyBcImEuYigpXCIgXSxcbiAgICAgIFsgXCJhKCkuYlwiIF0sXG4gICAgICBbIFwiYVswXSgpXCIgXSxcbiAgICAgIFsgXCJhKClbMF1cIiBdLFxuXG4gICAgICBbIFwiLWFcIiBdLFxuICAgICAgWyBcIi0tYVwiIF0sXG4gICAgICBbIFwiK2FcIiwgXCJhXCJdLFxuICAgICAgWyBcIithICtiXCIsIFwiYSArIGJcIiBdLFxuICAgICAgWyBcIi1hIC1iXCIsIFwiLWEgLSBiXCIgXSxcbiAgICAgIFsgXCItYSAtLWJcIiwgXCItYSAtIC1iXCIgXSxcbiAgICAgIFsgXCItYSAtLS1iXCIsIFwiLWEgLSAtLWJcIiBdLFxuICAgICAgWyBcIiFhXCIgXSxcbiAgICAgIFsgXCIhIWFcIiBdLFxuICAgICAgWyBcIiErYVwiLCAnIWEnIF0sXG4gICAgICBbIFwiIS1hXCIgXSxcbiAgICAgIFsgXCItIWFcIiBdLFxuICAgICAgWyBcIjIgKiBhXCIgXSxcbiAgICAgIFsgXCIoMiAqIGEpXCIsICcyICogYScgXSxcbiAgICAgIFsgXCIyIC8gYVwiIF0sXG4gICAgICBbIFwiYSAlIDJcIiBdLFxuICAgICAgWyBcIjEgKyAxXCIgXSxcbiAgICAgIFsgXCJhIC0gMVwiIF0sXG4gICAgICBbIFwiYSAtIC1iXCIgXSxcbiAgICAgIFsgXCJhICsgYiArIGNcIiBdLFxuICAgICAgWyBcImEgKyAoYiArIGMpXCIgXSxcbiAgICAgIFsgXCIoYSArIGIpICsgY1wiLCAnYSArIGIgKyBjJyBdLFxuICAgICAgWyBcImEgKyBiICogY1wiIF0sXG4gICAgICBbIFwiKGEgKyBiKSAqIGNcIiBdLFxuICAgICAgWyBcImEgPCA3XCIgXSxcbiAgICAgIFsgXCJhID4gN1wiIF0sXG4gICAgICBbIFwiYSA8PSA3XCIgXSxcbiAgICAgIFsgXCJhID49IDdcIiBdLFxuICAgICAgWyBcImEgPT0gM1wiIF0sXG4gICAgICBbIFwiYSAhPSAwXCIgXSxcbiAgICAgIFsgXCJhID09PSAzXCIsIFwiYSA9PSAzXCIgXSxcbiAgICAgIFsgXCJhICE9PSAwXCIsIFwiYSAhPSAwXCIgXSxcbiAgICAgIFsgXCIzICogYSA9PSBiXCIgXSxcbiAgICAgIFsgXCJhID09IDEgJiYgYiA8PSAyXCIsIFwiKGEgPT0gMSAmJiBiIDw9IDIpXCIgXSxcbiAgICAgIFsgXCJhID09IDEgfHwgYiA8PSAyXCIsIFwiKGEgPT0gMSB8fCBiIDw9IDIpXCIgXSxcbiAgICAgIFsgXCJhICYmIGIgJiYgY1wiLCBcIigoYSAmJiBiKSAmJiBjKVwiIF0sXG4gICAgICBbIFwiYSB8fCBiIHx8IGNcIiwgXCIoKGEgfHwgYikgfHwgYylcIiBdLFxuICAgICAgWyBcImEgJiYgYiB8fCBjICYmIGRcIiwgXCIoKGEgJiYgYikgfHwgKGMgJiYgZCkpXCIgXSxcbiAgICAgIFsgXCJhID8gYiA6IGNcIiBdLFxuICAgICAgWyBcImEgfHwgYiA/IGMgOiBkXCIsIFwiKGEgfHwgYikgPyBjIDogZFwiIF0sXG4gICAgICBbIFwiKHRoaXMgKyAnICcpLnRlc3QoL1xcZCsvKVwiIF0sXG4gICAgXTtcblxuICAgIGhlbHBlci5kYXRhRHJpdmVuVGVzdCh0ZXN0cywgZnVuY3Rpb24oZGF0YTogc3RyaW5nLCBleHBlY3Q6IHN0cmluZykge1xuICAgICAgLy8gRGVjb2RlIHRvIHNlbGYgYnkgZGVmYXVsdFxuICAgICAgZXhwZWN0ID0gZXhwZWN0IHx8IGRhdGE7XG4gICAgICB2YXIgcmVzdWx0ID0gcGFyc2UoJ2Z1bmN0aW9uIGYoKSB7cmV0dXJuICcgKyBkYXRhICsgJzt9Jyk7XG4gICAgICB2YXIgZXhwID0gcmVzdWx0LmZ1bmN0aW9ucy5mLmJvZHk7XG4gICAgICB2YXIgZGVjb2RlID0gYm9sdC5kZWNvZGVFeHByZXNzaW9uKGV4cCk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGVjb2RlLCBleHBlY3QpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19