filestack-adaptive
Version:
HTML5 picture elements powered by Filestack
474 lines (473 loc) • 54.1 kB
JavaScript
import { makePictureTree } from './tree';
import * as assert from 'assert';
var handle = 'seW1thvcR1aQBfOCF8bX';
var apiKey = 'BBcu94EFL1STGYvkM6a8usz';
var baseURL = 'https://cdn.filestackcontent.com';
var result = function (base, opts) {
if (opts) {
return base + "/" + opts + "/" + handle;
}
return base + "/" + handle;
};
describe('makePictureTree', function () {
it('should throw if handle is not a string', function () {
assert.throws(function () { return makePictureTree(); });
});
it('should not let a user use width descriptors without at least one size (numbers)', function () {
var options = {
resolutions: [320, 420],
};
assert.throws(function () { return makePictureTree(handle, options); });
});
it('should not let a user use width descriptors without at least one size (strings)', function () {
var options = {
resolutions: ['320w', '420w'],
};
assert.throws(function () { return makePictureTree(handle, options); });
});
it('should not let a user pass sizes with pixel densities', function () {
var options = {
sizes: {
'(min-width: 1080px)': '100vw',
fallback: '90vw',
},
resolutions: ['1x', '2x'],
};
assert.throws(function () { return makePictureTree(handle, options); });
});
it('should not let a user specify resolutions if no width is set', function () {
var options = {
resolutions: ['1x', '2x'],
};
assert.throws(function () { return makePictureTree(handle, options); });
});
it('should generate a picture object with no sources', function () {
var obj = makePictureTree(handle, { keys: false });
var url = result(baseURL);
var expected = {
img: {
src: url,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with no sources (no resolutions) with security', function () {
var obj = makePictureTree(handle, {
resolutions: [],
security: {
policy: 'abc',
signature: 'xyz',
},
keys: false,
});
var url = result(baseURL, "security=policy:abc,signature:xyz");
var expected = {
img: {
src: url,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 1 source', function () {
var testSize1 = { '(min-width: 640px)': '50vw' };
var resolutions = [320, 640];
var obj = makePictureTree(handle, { sizes: testSize1, resolutions: resolutions, keys: false });
var srcSet = result(baseURL, 'resize=width:320') + " 320w, " + result(baseURL, 'resize=width:640') + " 640w";
var expected = {
sources: [
{
media: '(min-width: 640px)',
sizes: '50vw',
srcSet: srcSet,
},
],
img: {
src: result(baseURL),
srcSet: srcSet,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 1 source and img fallback size', function () {
var testSize1 = {
'(min-width: 640px)': '50vw',
fallback: '300px',
};
var resolutions = [320, 640];
var obj = makePictureTree(handle, { sizes: testSize1, resolutions: resolutions, keys: false });
var srcSet = result(baseURL, 'resize=width:320') + " 320w, " + result(baseURL, 'resize=width:640') + " 640w";
var expected = {
sources: [
{
media: '(min-width: 640px)',
sizes: '50vw',
srcSet: srcSet,
},
],
img: {
sizes: '300px',
src: result(baseURL, 'resize=width:300'),
srcSet: srcSet,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 1 source with security', function () {
var testSize1 = { '(min-width: 640px)': '50vw' };
var resolutions = [320, 640];
var obj = makePictureTree(handle, {
sizes: testSize1,
resolutions: resolutions,
security: {
policy: 'abc',
signature: 'xyz',
},
keys: false,
});
var srcSet = result(baseURL, 'security=policy:abc,signature:xyz/resize=width:320') + " 320w, " + result(baseURL, 'security=policy:abc,signature:xyz/resize=width:640') + " 640w";
var expected = {
sources: [
{
media: '(min-width: 640px)',
sizes: '50vw',
srcSet: srcSet,
},
],
img: {
src: result(baseURL, 'security=policy:abc,signature:xyz'),
srcSet: srcSet,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 1 source and 1 format', function () {
var testSize1 = { '(min-width: 640px)': '50vw' };
var resolutions = [320, 640];
var obj = makePictureTree(handle, {
sizes: testSize1,
resolutions: resolutions,
formats: ['webp'],
keys: false,
});
var imgSrcset = result(baseURL, 'resize=width:320') + " 320w, " + result(baseURL, 'resize=width:640') + " 640w";
var url = result(baseURL, 'output=format:webp/resize=width:320') + " 320w, " + result(baseURL, 'output=format:webp/resize=width:640') + " 640w";
var expected = {
sources: [
{
media: '(min-width: 640px)',
sizes: '50vw',
srcSet: url,
type: 'image/webp',
},
],
img: {
src: result(baseURL),
srcSet: imgSrcset,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 1 format', function () {
var obj = makePictureTree(handle, { formats: ['webp'], keys: false });
var url = result(baseURL, 'output=format:webp');
var expected = {
sources: [
{
srcSet: url,
type: 'image/webp',
},
],
img: {
src: result(baseURL),
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 2 formats and 1 size with fallback size', function () {
var obj = makePictureTree(handle, {
formats: ['webp', 'jpg'],
resolutions: [640],
sizes: {
'(min-width: 640px)': '90vw',
fallback: '80vw',
},
keys: false,
});
var expected = {
sources: [
{
media: '(min-width: 640px)',
sizes: '90vw',
srcSet: result(baseURL, 'output=format:webp/resize=width:640') + " 640w",
type: 'image/webp',
},
{
media: '(min-width: 640px)',
sizes: '90vw',
srcSet: result(baseURL, 'output=format:jpg/resize=width:640') + " 640w",
type: 'image/jpg',
},
{
sizes: '80vw',
srcSet: result(baseURL, 'output=format:webp/resize=width:640') + " 640w",
type: 'image/webp',
},
{
sizes: '80vw',
srcSet: result(baseURL, 'output=format:jpg/resize=width:640') + " 640w",
type: 'image/jpg',
},
],
img: {
sizes: '80vw',
src: result(baseURL),
srcSet: result(baseURL, 'resize=width:640') + " 640w",
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 1 format with fallback size', function () {
var obj = makePictureTree(handle, {
formats: ['webp'],
resolutions: [640],
sizes: {
fallback: '700px',
},
keys: false,
});
var expected = {
sources: [
{
sizes: '700px',
srcSet: result(baseURL, 'output=format:webp/resize=width:640') + " 640w",
type: 'image/webp',
},
],
img: {
sizes: '700px',
src: result(baseURL, 'resize=width:700'),
srcSet: result(baseURL, 'resize=width:640') + " 640w",
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with 2 sources and 2 formats in order', function () {
var testSize1 = {
'(min-width: 640px)': '50vw',
'(min-width: 340px)': '33vw',
};
var resolutions = ['320w', '640w'];
var obj = makePictureTree(handle, {
sizes: testSize1,
formats: ['jpg', 'webp'],
resolutions: resolutions,
keys: false,
});
var imgSrcset = result(baseURL, 'resize=width:320') + " 320w, " + result(baseURL, 'resize=width:640') + " 640w";
var srcSet1 = result(baseURL, 'output=format:jpg/resize=width:320') + " 320w, " + result(baseURL, 'output=format:jpg/resize=width:640') + " 640w";
var srcSet2 = result(baseURL, 'output=format:webp/resize=width:320') + " 320w, " + result(baseURL, 'output=format:webp/resize=width:640') + " 640w";
var srcSet3 = result(baseURL, 'output=format:jpg/resize=width:320') + " 320w, " + result(baseURL, 'output=format:jpg/resize=width:640') + " 640w";
var srcSet4 = result(baseURL, 'output=format:webp/resize=width:320') + " 320w, " + result(baseURL, 'output=format:webp/resize=width:640') + " 640w";
var expected = {
sources: [
{
media: '(min-width: 640px)',
sizes: '50vw',
srcSet: srcSet3,
type: 'image/jpg',
},
{
media: '(min-width: 640px)',
sizes: '50vw',
srcSet: srcSet4,
type: 'image/webp',
},
{
media: '(min-width: 340px)',
sizes: '33vw',
srcSet: srcSet1,
type: 'image/jpg',
},
{
media: '(min-width: 340px)',
sizes: '33vw',
srcSet: srcSet2,
type: 'image/webp',
},
],
img: {
src: result(baseURL),
srcSet: imgSrcset,
},
};
assert.deepStrictEqual(obj, expected);
});
it('should generate a picture object with a fallback size (no resolutions)', function () {
var options = {
sizes: {
fallback: '100vw',
},
resolutions: [],
keys: false,
};
var tree = makePictureTree(handle, options);
var expected = {
img: {
src: result(baseURL),
sizes: '100vw',
},
};
assert.deepStrictEqual(tree, expected);
});
it('should generate a picture object with a fallback size (resolutions)', function () {
var options = {
sizes: {
fallback: '100vw',
},
resolutions: [320, 640],
keys: false,
};
var srcSet = result(baseURL, 'resize=width:320') + " 320w, " + result(baseURL, 'resize=width:640') + " 640w";
var tree = makePictureTree(handle, options);
var expected = {
img: {
src: result(baseURL),
sizes: '100vw',
srcSet: srcSet,
},
};
assert.deepStrictEqual(tree, expected);
});
it('should generate a picture object with a fallback img and 1 source (1 resolution)', function () {
var options = {
sizes: {
'(min-width: 1080px)': '100vw',
fallback: '300px',
},
resolutions: [320, 640],
keys: false,
};
var srcSet = result(baseURL, 'resize=width:320') + " 320w, " + result(baseURL, 'resize=width:640') + " 640w";
var tree = makePictureTree(handle, options);
var expected = {
img: {
src: result(baseURL, 'resize=width:300'),
sizes: '300px',
srcSet: srcSet,
},
sources: [
{
media: '(min-width: 1080px)',
sizes: '100vw',
srcSet: srcSet,
},
],
};
assert.deepStrictEqual(tree, expected);
});
it('should generate a single img element using width and pixel densities', function () {
var options = {
width: '768px',
keys: false,
};
var srcSet = result(baseURL, 'resize=width:768') + " 1x, " + result(baseURL, 'resize=width:1536') + " 2x";
var expected = {
img: {
width: 768,
src: result(baseURL, 'resize=width:768'),
srcSet: srcSet,
},
};
var tree = makePictureTree(handle, options);
assert.deepStrictEqual(tree, expected);
});
it('should generate a single img element using storage alias handle', function () {
var storageAliasHandle = {
srcHandle: handle,
apiKey: apiKey,
};
var options = {
width: '768px',
keys: false,
transforms: {
quality: {
value: 5,
},
},
};
var expected = {
img: {
src: 'https://cdn.filestackcontent.com/BBcu94EFL1STGYvkM6a8usz/quality=value:5/resize=width:768/seW1thvcR1aQBfOCF8bX',
srcSet: 'https://cdn.filestackcontent.com/BBcu94EFL1STGYvkM6a8usz/quality=value:5/resize=width:768/seW1thvcR1aQBfOCF8bX 1x, https://cdn.filestackcontent.com/BBcu94EFL1STGYvkM6a8usz/quality=value:5/resize=width:1536/seW1thvcR1aQBfOCF8bX 2x',
width: 768,
},
};
var tree = makePictureTree(storageAliasHandle, options);
assert.deepStrictEqual(tree, expected);
});
it('should be able to disable a transformation validator', function () {
var storageAliasHandle = {
srcHandle: handle,
apiKey: apiKey,
};
var options = {
width: '768px',
keys: false,
transforms: {
quality: {
value: 5,
},
},
useValidator: false,
};
var expected = {
img: {
src: 'https://cdn.filestackcontent.com/BBcu94EFL1STGYvkM6a8usz/quality=value:5/resize=width:768/seW1thvcR1aQBfOCF8bX',
srcSet: 'https://cdn.filestackcontent.com/BBcu94EFL1STGYvkM6a8usz/quality=value:5/resize=width:768/seW1thvcR1aQBfOCF8bX 1x, https://cdn.filestackcontent.com/BBcu94EFL1STGYvkM6a8usz/quality=value:5/resize=width:1536/seW1thvcR1aQBfOCF8bX 2x',
width: 768,
},
};
var tree = makePictureTree(storageAliasHandle, options);
assert.deepStrictEqual(tree, expected);
});
it('should move output task always as the first in the filelink', function () {
var options = {
transforms: {
quality: {
value: 5,
},
output: {
format: 'webp',
},
sepia: {
tone: 70,
},
},
};
var expected = {
img: {
src: 'https://cdn.filestackcontent.com/output=format:webp/quality=value:5/sepia=tone:70/seW1thvcR1aQBfOCF8bX',
},
};
var tree = makePictureTree(handle, options);
assert.deepStrictEqual(tree, expected);
});
it('should return filelinks with custom cname', function () {
var options = {
cname: 'fs.test123.com',
width: '768px',
keys: false,
};
var srcSet = result("https://cdn." + options.cname, 'resize=width:768') + " 1x, " + result("https://cdn." + options.cname, 'resize=width:1536') + " 2x";
var expected = {
img: {
width: 768,
src: result("https://cdn." + options.cname, 'resize=width:768'),
srcSet: srcSet,
},
};
var tree = makePictureTree(handle, options);
assert.deepStrictEqual(tree, expected);
});
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmVlLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN6QyxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUVqQyxJQUFNLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQztBQUN0QyxJQUFNLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQztBQUN6QyxJQUFNLE9BQU8sR0FBRyxrQ0FBa0MsQ0FBQztBQUNuRCxJQUFNLE1BQU0sR0FBRyxVQUFDLElBQVksRUFBRSxJQUFVO0lBQ3RDLElBQUksSUFBSSxFQUFFO1FBQ1IsT0FBVSxJQUFJLFNBQUksSUFBSSxTQUFJLE1BQVEsQ0FBQztLQUNwQztJQUNELE9BQVUsSUFBSSxTQUFJLE1BQVEsQ0FBQztBQUM3QixDQUFDLENBQUM7QUFFRixRQUFRLENBQUMsaUJBQWlCLEVBQUU7SUFFMUIsRUFBRSxDQUFDLHdDQUF3QyxFQUFFO1FBQzNDLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBTSxPQUFBLGVBQWUsRUFBRSxFQUFqQixDQUFpQixDQUFDLENBQUM7SUFDekMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsaUZBQWlGLEVBQUU7UUFDcEYsSUFBTSxPQUFPLEdBQUc7WUFDZCxXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1NBQ3hCLENBQUM7UUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLGNBQU0sT0FBQSxlQUFlLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUFoQyxDQUFnQyxDQUFDLENBQUM7SUFDeEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsaUZBQWlGLEVBQUU7UUFDcEYsSUFBTSxPQUFPLEdBQUc7WUFDZCxXQUFXLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO1NBQzlCLENBQUM7UUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLGNBQU0sT0FBQSxlQUFlLENBQUMsTUFB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S0FBSyxFQUFFLE9BQU87WUFDZCxJQUFJLEVBQUUsS0FBSztTQUNaLENBQUM7UUFDRixJQUFNLE1BQU0sR0FBTSxNQUFNLENBQUMsaUJBQWUsT0FBTyxDQUFDLEtBQU8sRUFBRSxrQkFBa0IsQ0FBQyxhQUFRLE1BQU0sQ0FBQyxpQkFBZSxPQUFPLENBQUMsS0FBTyxFQUFFLG1CQUFtQixDQUFDLFFBQUssQ0FBQztRQUNySixJQUFNLFFBQVEsR0FBRztZQUNmLEdBQUcsRUFBRTtnQkFDSCxLQUFLLEVBQUUsR0FBRztnQkFDVixHQUFHLEVBQUUsTUFBTSxDQUFDLGlCQUFlLE9BQU8sQ0FBQyxLQUFPLEVBQUUsa0JBQWtCLENBQUM7Z0JBQy9ELE1BQU0sUUFBQTthQUNQO1NBQ0YsQ0FBQztRQUNGLElBQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDekMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsImZpbGUiOiJ0cmVlLnNwZWMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlUGljdHVyZVRyZWUgfSBmcm9tICcuL3RyZWUnO1xuaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmNvbnN0IGhhbmRsZSA9ICdzZVcxdGh2Y1IxYVFCZk9DRjhiWCc7XG5jb25zdCBhcGlLZXkgPSAnQkJjdTk0RUZMMVNUR1l2a002YTh1c3onO1xuY29uc3QgYmFzZVVSTCA9ICdodHRwczovL2Nkbi5maWxlc3RhY2tjb250ZW50LmNvbSc7XG5jb25zdCByZXN1bHQgPSAoYmFzZTogc3RyaW5nLCBvcHRzPzogYW55KSA9PiB7XG4gIGlmIChvcHRzKSB7XG4gICAgcmV0dXJuIGAke2Jhc2V9LyR7b3B0c30vJHtoYW5kbGV9YDtcbiAgfVxuICByZXR1cm4gYCR7YmFzZX0vJHtoYW5kbGV9YDtcbn07XG5cbmRlc2NyaWJlKCdtYWtlUGljdHVyZVRyZWUnLCAoKSA9PiB7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBoYW5kbGUgaXMgbm90IGEgc3RyaW5nJywgKCkgPT4ge1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gbWFrZVBpY3R1cmVUcmVlKCkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIG5vdCBsZXQgYSB1c2VyIHVzZSB3aWR0aCBkZXNjcmlwdG9ycyB3aXRob3V0IGF0IGxlYXN0IG9uZSBzaXplIChudW1iZXJzKScsICgpID0+IHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgcmVzb2x1dGlvbnM6IFszMjAsIDQyMF0sXG4gICAgfTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IG1ha2VQaWN0dXJlVHJlZShoYW5kbGUsIG9wdGlvbnMpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBub3QgbGV0IGEgdXNlciB1c2Ugd2lkdGggZGVzY3JpcHRvcnMgd2l0aG91dCBhdCBsZWFzdCBvbmUgc2l6ZSAoc3RyaW5ncyknLCAoKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHJlc29sdXRpb25zOiBbJzMyMHcnLCAnNDIwdyddLFxuICAgIH07XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBtYWtlUGljdHVyZVRyZWUoaGFuZGxlLCBvcHRpb25zKSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbm90IGxldCBhIHVzZXIgcGFzcyBzaXplcyB3aXRoIHBpeGVsIGRlbnNpdGllcycsICgpID0+IHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgc2l6ZXM6IHtcbiAgICAgICAgJyhtaW4td2lkdGg6IDEwODBweCknOiAnMTAwdncnLFxuICAgICAgICBmYWxsYmFjazogJzkwdncnLFxuICAgICAgfSxcbiAgICAgIHJlc29sdXRpb25zOiBbJzF4JywgJzJ4J10sXG4gICAgfTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IG1ha2VQaWN0dXJlVHJlZShoYW5kbGUsIG9wdGlvbnMpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBub3QgbGV0IGEgdXNlciBzcGVjaWZ5IHJlc29sdXRpb25zIGlmIG5vIHdpZHRoIGlzIHNldCcsICgpID0+IHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgcmVzb2x1dGlvbnM6IFsnMXgnLCAnMngnXSxcbiAgICB9O1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gbWFrZVBpY3R1cmVUcmVlKGhhbmRsZSwgb3B0aW9ucykpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdlbmVyYXRlIGEgcGljdHVyZSBvYmplY3Qgd2l0aCBubyBzb3VyY2VzJywgKCkgPT4ge1xuICAgIGNvbnN0IG9iaiA9IG1ha2VQaWN0dXJlVHJlZShoYW5kbGUsIHsga2V5czogZmFsc2UgfSk7XG4gICAgY29uc3QgdXJsID0gcmVzdWx0KGJhc2VVUkwpO1xuICAgIGNvbnN0IGV4cGVjdGVkID0ge1xuICAgICAgaW1nOiB7XG4gICAgICAgIHNyYzogdXJsLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob2JqLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBwaWN0dXJlIG9iamVjdCB3aXRoIG5vIHNvdXJjZXMgKG5vIHJlc29sdXRpb25zKSB3aXRoIHNlY3VyaXR5JywgKCkgPT4ge1xuICAgIGNvbnN0IG9iaiA9IG1ha2VQaWN0dXJlVHJlZShoYW5kbGUsIHtcbiAgICAgIHJlc29sdXRpb25zOiBbXSxcbiAgICAgIHNlY3VyaXR5OiB7XG4gICAgICAgIHBvbGljeTogJ2FiYycsXG4gICAgICAgIHNpZ25hdHVyZTogJ3h5eicsXG4gICAgICB9LFxuICAgICAga2V5czogZmFsc2UsXG4gICAgfSk7XG4gICAgY29uc3QgdXJsID0gcmVzdWx0KGJhc2VVUkwsIGBzZWN1cml0eT1wb2xpY3k6YWJjLHNpZ25hdHVyZTp4eXpgKTtcbiAgICBjb25zdCBleHBlY3RlZCA9IHtcbiAgICAgIGltZzoge1xuICAgICAgICBzcmM6IHVybCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG9iaiwgZXhwZWN0ZWQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdlbmVyYXRlIGEgcGljdHVyZSBvYmplY3Qgd2l0aCAxIHNvdXJjZScsICgpID0+IHtcbiAgICBjb25zdCB0ZXN0U2l6ZTEgPSB7ICcobWluLXdpZHRoOiA2NDBweCknOiAnNTB2dycgfTtcbiAgICBjb25zdCByZXNvbHV0aW9ucyA9IFszMjAsIDY0MF07XG4gICAgY29uc3Qgb2JqID0gbWFrZVBpY3R1cmVUcmVlKGhhbmRsZSwgeyBzaXplczogdGVzdFNpemUxLCByZXNvbHV0aW9ucywga2V5czogZmFsc2UgfSk7XG4gICAgY29uc3Qgc3JjU2V0ID0gYCR7cmVzdWx0KGJhc2VVUkwsICdyZXNpemU9d2lkdGg6MzIwJyl9IDMyMHcsICR7cmVzdWx0KGJhc2VVUkwsICdyZXNpemU9d2lkdGg6NjQwJyl9IDY0MHdgO1xuICAgIGNvbnN0IGV4cGVjdGVkID0ge1xuICAgICAgc291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbWVkaWE6ICcobWluLXdpZHRoOiA2NDBweCknLFxuICAgICAgICAgIHNpemVzOiAnNTB2dycsXG4gICAgICAgICAgc3JjU2V0LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGltZzoge1xuICAgICAgICBzcmM6IHJlc3VsdChiYXNlVVJMKSxcbiAgICAgICAgc3JjU2V0LFxuICAgICAgfSxcbiAgICB9O1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob2JqLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBwaWN0dXJlIG9iamVjdCB3aXRoIDEgc291cmNlIGFuZCBpbWcgZmFsbGJhY2sgc2l6ZScsICgpID0+IHtcbiAgICBjb25zdCB0ZXN0U2l6ZTEgPSB7XG4gICAgICAnKG1pbi13aWR0aDogNjQwcHgpJzogJzUwdncnLFxuICAgICAgZmFsbGJhY2s6ICczMDBweCcsXG4gICAgfTtcbiAgICBjb25zdCByZXNvbHV0aW9ucyA9IFszMjAsIDY0MF07XG4gICAgY29uc3Qgb2JqID0gbWFrZVBpY3R1cmVUcmVlKGhhbmRsZSwgeyBzaXplczogdGVzdFNpemUxLCByZXNvbHV0aW9ucywga2V5czogZmFsc2UgfSk7XG4gICAgY29uc3Qgc3JjU2V0ID0gYCR7cmVzdWx0KGJhc2VVUkwsICdyZXNpemU9d2lkdGg6MzIwJyl9IDMyMHcsICR7cmVzdWx0KGJhc2VVUkwsICdyZXNpemU9d2lkdGg6NjQwJyl9IDY0MHdgO1xuICAgIGNvbnN0IGV4cGVjdGVkID0ge1xuICAgICAgc291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbWVkaWE6ICcobWluLXdpZHRoOiA2NDBweCknLFxuICAgICAgICAgIHNpemVzOiAnNTB2dycsXG4gICAgICAgICAgc3JjU2V0LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGltZzoge1xuICAgICAgICBzaXplczogJzMwMHB4JyxcbiAgICAgICAgc3JjOiByZXN1bHQoYmFzZVVSTCwgJ3Jlc2l6ZT13aWR0aDozMDAnKSxcbiAgICAgICAgc3JjU2V0LFxuICAgICAgfSxcbiAgICB9O1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob2JqLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBwaWN0dXJlIG9iamVjdCB3aXRoIDEgc291cmNlIHdpdGggc2VjdXJpdHknLCAoKSA9PiB7XG4gICAgY29uc3QgdGVzdFNpemUxID0geyAnKG1pbi13aWR0aDogNjQwcHgpJzogJzUwdncnIH07XG4gICAgY29uc3QgcmVzb2x1dGlvbnMgPSBbMzIwLCA2NDBdO1xuICAgIGNvbnN0IG9iaiA9IG1ha2VQaWN0dXJlVHJlZShoYW5kbGUsIHtcbiAgICAgIHNpemVzOiB0ZXN0U2l6ZTEsXG4gICAgICByZXNvbHV0aW9ucyxcbiAgICAgIHNlY3VyaXR5OiB7XG4gICAgICAgIHBvbGljeTogJ2FiYycsXG4gICAgICAgIHNpZ25hdHVyZTogJ3h5eicsXG4gICAgICB9LFxuICAgICAga2V5czogZmFsc2UsXG4gICAgfSk7XG4gICAgY29uc3Qgc3JjU2V0ID0gYCR7cmVzdWx0KGJhc2VVUkwsICdzZWN1cml0eT1wb2xpY3k6YWJjLHNpZ25hdHVyZTp4eXovcmVzaXplPXdpZHRoOjMyMCcpfSAzMjB3LCAke3Jlc3VsdChiYXNlVVJMLCAnc2VjdXJpdHk9cG9saWN5OmFiYyxzaWduYXR1cmU6eHl6L3Jlc2l6ZT13aWR0aDo2NDAnKX0gNjQwd2A7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSB7XG4gICAgICBzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBtZWRpYTogJyhtaW4td2lkdGg6IDY0MHB4KScsXG4gICAgICAgICAgc2l6ZXM6ICc1MHZ3JyxcbiAgICAgICAgICBzcmNTZXQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgaW1nOiB7XG4gICAgICAgIHNyYzogcmVzdWx0KGJhc2VVUkwsICdzZWN1cml0eT1wb2xpY3k6YWJjLHNpZ25hdHVyZTp4eXonKSxcbiAgICAgICAgc3JjU2V0LFxuICAgICAgfSxcbiAgICB9O1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob2JqLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBwaWN0dXJlIG9iamVjdCB3aXRoIDEgc291cmNlIGFuZCAxIGZvcm1hdCcsICgpID0+IHtcbiAgICBjb25zdCB0ZXN0U2l6ZTEgPSB7ICcobWluLXdpZHRoOiA2NDBweCknOiAnNTB2dycgfTtcbiAgICBjb25zdCByZXNvbHV0aW9ucyA9IFszMjAsIDY0MF07XG4gICAgY29uc3Qgb2JqID0gbWFrZVBpY3R1cmVUcmVlKGhhbmRsZSwge1xuICAgICAgc2l6ZXM6IHRlc3RTaXplMSxcbiAgICAgIHJlc29sdXRpb25zLFxuICAgICAgZm9ybWF0czogWyd3ZWJwJ10sXG4gICAgICBrZXlzOiBmYWxzZSxcbiAgICB9KTtcbiAgICBjb25zdCBpbWdTcmNzZXQgPSBgJHtyZXN1bHQoYmFzZVVSTCwgJ3Jlc2l6ZT13aWR0aDozMjAnKX0gMzIwdywgJHtyZXN1bHQoYmFzZVVSTCwgJ3Jlc2l6ZT13aWR0aDo2NDAnKX0gNjQwd2A7XG4gICAgY29uc3QgdXJsID0gYCR7cmVzdWx0KGJhc2VVUkwsICdvdXRwdXQ9Zm9ybWF0OndlYnAvcmVzaXplPXdpZHRoOjMyMCcpfSAzMjB3LCAke3Jlc3VsdChiYXNlVVJMLCAnb3V0cHV0PWZvcm1hdDp3ZWJwL3Jlc2l6ZT13aWR0aDo2NDAnKX0gNjQwd2A7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSB7XG4gICAgICBzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBtZWRpYTogJyhtaW4td2lkdGg6IDY0MHB4KScsXG4gICAgICAgICAgc2l6ZXM6ICc1MHZ3JyxcbiAgICAgICAgICBzcmNTZXQ6IHVybCxcbiAgICAgICAgICB0eXBlOiAnaW1hZ2Uvd2VicCcsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgaW1nOiB7XG4gICAgICAgIHNyYzogcmVzdWx0KGJhc2VVUkwpLFxuICAgICAgICBzcmNTZXQ6IGltZ1NyY3NldCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG9iaiwgZXhwZWN0ZWQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdlbmVyYXRlIGEgcGljdHVyZSBvYmplY3Qgd2l0aCAxIGZvcm1hdCcsICgpID0+IHtcbiAgICBjb25zdCBvYmogPSBtYWtlUGljdHVyZVRyZWUoaGFuZGxlLCB7IGZvcm1hdHM6IFsnd2VicCddLCBrZXlzOiBmYWxzZSB9KTtcbiAgICBjb25zdCB1cmwgPSByZXN1bHQoYmFzZVVSTCwgJ291dHB1dD1mb3JtYXQ6d2VicCcpO1xuICAgIGNvbnN0IGV4cGVjdGVkID0ge1xuICAgICAgc291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgc3JjU2V0OiB1cmwsXG4gICAgICAgICAgdHlwZTogJ2ltYWdlL3dlYnAnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGltZzoge1xuICAgICAgICBzcmM6IHJlc3VsdChiYXNlVVJMKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG9iaiwgZXhwZWN0ZWQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdlbmVyYXRlIGEgcGljdHVyZSBvYmplY3Qgd2l0aCAyIGZvcm1hdHMgYW5kIDEgc2l6ZSB3aXRoIGZhbGxiYWNrIHNpemUnLCAoKSA9PiB7XG4gICAgY29uc3Qgb2JqID0gbWFrZVBpY3R1cmVUcmVlKGhhbmRsZSwge1xuICAgICAgZm9ybWF0czogWyd3ZWJwJywgJ2pwZyddLFxuICAgICAgcmVzb2x1dGlvbnM6IFs2NDBdLFxuICAgICAgc2l6ZXM6IHtcbiAgICAgICAgJyhtaW4td2lkdGg6IDY0MHB4KSc6ICc5MHZ3JyxcbiAgICAgICAgZmFsbGJhY2s6ICc4MHZ3JyxcbiAgICAgIH0sXG4gICAgICBrZXlzOiBmYWxzZSxcbiAgICB9KTtcbiAgICBjb25zdCBleHBlY3RlZCA9IHtcbiAgICAgIHNvdXJjZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG1lZGlhOiAnKG1pbi13aWR0aDogNjQwcHgpJyxcbiAgICAgICAgICBzaXplczogJzkwdncnLFxuICAgICAgICAgIHNyY1NldDogYCR7cmVzdWx0KGJhc2VVUkwsICdvdXRwdXQ9Zm9ybWF0OndlYnAvcmVzaXplPXdpZHRoOjY0MCcpfSA2NDB3YCxcbiAgICAgICAgICB0eXBlOiAnaW1hZ2Uvd2VicCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBtZWRpYTogJyhtaW4td2lkdGg6IDY0MHB4KScsXG4gICAgICAgICAgc2l6ZXM6ICc5MHZ3JyxcbiAgICAgICAgICBzcmNTZXQ6IGAke3Jlc3VsdChiYXNlVVJMLCAnb3V0cHV0PWZvcm1hdDpqcGcvcmVzaXplPXdpZHRoOjY0MCcpfSA2NDB3YCxcbiAgICAgICAgICB0eXBlOiAnaW1hZ2UvanBnJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNpemVzOiAnODB2dycsXG4gICAgICAgICAgc3JjU2V0OiBgJHtyZXN1bHQoYmFzZVVSTCwgJ291dHB1dD1mb3JtYXQ6d2VicC9yZXNpemU9d2lkdGg6NjQwJyl9IDY0MHdgLFxuICAgICAgICAgIHR5cGU6ICdpbWFnZS93ZWJwJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNpemVzOiAnODB2dycsXG4gICAgICAgICAgc3JjU2V0OiBgJHtyZXN1bHQoYmFzZVVSTCwgJ291dHB1dD1mb3JtYXQ6anBnL3Jlc2l6ZT13aWR0aDo2NDAnKX0gNjQwd2AsXG4gICAgICAgICAgdHlwZTogJ2ltYWdlL2pwZycsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgaW1nOiB7XG4gICAgICAgIHNpemVzOiAnODB2dycsXG4gICAgICAgIHNyYzogcmVzdWx0KGJhc2VVUkwpLFxuICAgICAgICBzcmNTZXQ6IGAke3Jlc3VsdChiYXNlVVJMLCAncmVzaXplPXdpZHRoOjY0MCcpfSA2NDB3YCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG9iaiwgZXhwZWN0ZWQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdlbmVyYXRlIGEgcGljdHVyZSBvYmplY3Qgd2l0aCAxIGZvcm1hdCB3aXRoIGZhbGxiYWNrIHNpemUnLCAoKSA9PiB7XG4gICAgY29uc3Qgb2JqID0gbWFrZVBpY3R1cmVUcmVlKGhhbmRsZSwge1xuICAgICAgZm9ybWF0czogWyd3ZWJwJ10sXG4gICAgICByZXNvbHV0aW9uczogWzY0MF0sXG4gICAgICBzaXplczoge1xuICAgICAgICBmYWxsYmFjazogJzcwMHB4JyxcbiAgICAgIH0sXG4gICAgICBrZXlzOiBmYWxzZSxcbiAgICB9KTtcbiAgICBjb25zdCBleHBlY3RlZCA9IHtcbiAgICAgIHNvdXJjZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNpemVzOiAnNzAwcHgnLFxuICAgICAgICAgIHNyY1NldDogYCR7cmVzdWx0KGJhc2VVUkwsICdvdXRwdXQ9Zm9ybWF0OndlYnAvcmVzaXplPXdpZHRoOjY0MCcpfSA2NDB3YCxcbiAgICAgICAgICB0eXBlOiAnaW1hZ2Uvd2VicCcsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgaW1nOiB7XG4gICAgICAgIHNpemVzOiAnNzAwcHgnLFxuICAgICAgICBzcmM6IHJlc3VsdChiYXNlVVJMLCAncmVzaXplPXdpZHRoOjcwMCcpLFxuICAgICAgICBzcmNTZXQ6IGAke3Jlc3VsdChiYXNlVVJMLCAncmVzaXplPXdpZHRoOjY0MCcpfSA2NDB3YCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG9iaiwgZXhwZWN0ZWQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdlbmVyYXRlIGEgcGljdHVyZSBvYmplY3Qgd2l0aCAyIHNvdXJjZXMgYW5kIDIgZm9ybWF0cyBpbiBvcmRlcicsICgpID0+IHtcbiAgICBjb25zdCB0ZXN0U2l6ZTEgPSB7XG4gICAgICAnKG1pbi13aWR0aDogNjQwcHgpJzogJzUwdncnLFxuICAgICAgJyhtaW4td2lkdGg6IDM0MHB4KSc6ICczM3Z3JyxcbiAgICB9O1xuICAgIGNvbnN0IHJlc29sdXRpb25zID0gWyczMjB3JywgJzY0MHcnXTtcbiAgICBjb25zdCBvYmogPSBtYWtlUGljdHVyZVRyZWUoaGFuZGxlLCB7XG4gICAgICBzaXplczogdGVzdFNpemUxLFxuICAgICAgZm9ybWF0czogWydqcGcnLCAnd2VicCddLFxuICAgICAgcmVzb2x1dGlvbnMsXG4gICAgICBrZXlzOiBmYWxzZSxcbiAgICB9KTtcbiAgICBjb25zdCBpbWdTcmNzZXQgPSBgJHtyZXN1bHQoYmFzZVVSTCwgJ3Jlc2l6ZT13aWR0aDozMjAnKX0gMzIwdywgJHtyZXN1bHQoYmFzZVVSTCwgJ3Jlc2l6ZT13aWR0aDo2NDAnKX0gNjQwd2A7XG4gICAgY29uc3Qgc3JjU2V0MSA9IGAke3Jlc3VsdChiYXNlVVJMLCAnb3V0cHV0PWZvcm1hdDpqcGcvcmVzaXplPXdpZHRoOjMyMCcpfSAzMjB3LCAke3Jlc3VsdChiYXNlVVJMLCAnb3V0cHV0PWZvcm1hdDpqcGcvcmVzaXplPXdpZHRoOjY0MCcpfSA2NDB3YDtcbiAgICBjb25zdCBzcmNTZXQyID0gYCR7cmVzdWx0KGJhc2VVUkwsICdvdXRwdXQ9Zm9ybWF0OndlYnAvcmVzaXplPXdpZHRoOjMyMCcpfSAzMjB3LCAke3Jlc3VsdChiYXNlVVJMLCAnb3V0cHV0PWZvcm1hdDp3ZWJwL3Jlc2l6ZT13aWR0aDo2NDAnKX0gNjQwd2A7XG4gICAgY29uc3Qgc3JjU2V0MyA9IGAke3Jlc3VsdChiYXNlVVJMLCAnb3V0cHV0PWZvcm1hdDpqcGcvcmVzaXplPXdpZHRoOjMyMCcpfSAzMjB3LCAke3Jlc3VsdChiYXNlVVJMLCAnb3V0cHV0PWZvcm1hdDpqcGcvcmVzaXplPXdpZHRoOjY0MCcpfSA2NDB3YDtcbiAgICBjb25zdCBzcmNTZXQ0ID0gYCR7cmVzdWx0KGJhc2VVUkwsICdvdXRwdXQ9Zm9ybWF0OndlYnAvcmVzaXplPXdpZHRoOjMyMCcpfSAzMjB3LCAke3Jlc3VsdChiYXNlVVJMLCAnb3V0cHV0PWZvcm1hdDp3ZWJwL3Jlc2l6ZT13aWR0aDo2NDAnKX0gNjQwd2A7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSB7XG4gICAgICBzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBtZWRpYTogJyhtaW4td2lkdGg6IDY0MHB4KScsXG4gICAgICAgICAgc2l6ZXM6ICc1MHZ3JyxcbiAgICAgICAgICBzcmNTZXQ6IHNyY1NldDMsXG4gICAgICAgICAgdHlwZTogJ2ltYWdlL2pwZycsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBtZWRpYTogJyhtaW4td2lkdGg6IDY0MHB4KScsXG4gICAgICAgICAgc2l6ZXM6ICc1MHZ3JyxcbiAgICAgICAgICBzcmNTZXQ6IHNyY1NldDQsXG4gICAgICAgICAgdHlwZTogJ2ltYWdlL3dlYnAnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbWVkaWE6ICcobWluLXdpZHRoOiAzNDBweCknLFxuICAgICAgICAgIHNpemVzOiAnMzN2dycsXG4gICAgICAgICAgc3JjU2V0OiBzcmNTZXQxLFxuICAgICAgICAgIHR5cGU6ICdpbWFnZS9qcGcnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbWVkaWE6ICcobWluLXdpZHRoOiAzNDBweCknLFxuICAgICAgICAgIHNpemVzOiAnMzN2dycsXG4gICAgICAgICAgc3JjU2V0OiBzcmNTZXQyLFxuICAgICAgICAgIHR5cGU6ICdpbWFnZS93ZWJwJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBpbWc6IHtcbiAgICAgICAgc3JjOiByZXN1bHQoYmFzZVVSTCksXG4gICAgICAgIHNyY1NldDogaW1nU3Jjc2V0LFxuICAgICAgfSxcbiAgICB9O1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwob2JqLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBwaWN0dXJlIG9iamVjdCB3aXRoIGEgZmFsbGJhY2sgc2l6ZSAobm8gcmVzb2x1dGlvbnMpJywgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBzaXplczoge1xuICAgICAgICBmYWxsYmFjazogJzEwMHZ3JyxcbiAgICAgIH0sXG4gICAgICByZXNvbHV0aW9uczogW10sXG4gICAgICBrZXlzOiBmYWxzZSxcbiAgICB9O1xuICAgIGNvbnN0IHRyZWUgPSBtYWtlUGljdHVyZVRyZWUoaGFuZGxlLCBvcHRpb25zKTtcbiAgICBjb25zdCBleHBlY3RlZCA9IHtcbiAgICAgIGltZzoge1xuICAgICAgICBzcmM6IHJlc3VsdChiYXNlVVJMKSxcbiAgICAgICAgc2l6ZXM6ICcxMDB2dycsXG4gICAgICB9LFxuICAgIH07XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCh0cmVlLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBwaWN0dXJlIG9iamVjdCB3aXRoIGEgZmFsbGJhY2sgc2l6ZSAocmVzb2x1dGlvbnMpJywgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBzaXplczoge1xuICAgICAgICBmYWxsYmFjazogJzEwMHZ3JyxcbiAgICAgIH0sXG4gICAgICByZXNvbHV0aW9uczogWzMyMCwgNjQwXSxcbiAgICAgIGtleXM6IGZhbHNlLFxuICAgIH07XG4gICAgY29uc3Qgc3JjU2V0ID0gYCR7cmVzdWx0KGJhc2VVUkwsICdyZXNpemU9d2lkdGg6MzIwJyl9IDMyMHcsICR7cmVzdWx0KGJhc2VVUkwsICdyZXNpemU9d2lkdGg6NjQwJyl9IDY0MHdgO1xuICAgIGNvbnN0IHRyZWUgPSBtYWtlUGljdHVyZVRyZWUoaGFuZGxlLCBvcHRpb25zKTtcbiAgICBjb25zdCBleHBlY3RlZCA9IHtcbiAgICAgIGltZzoge1xuICAgICAgICBzcmM6IHJlc3VsdChiYXNlVVJMKSxcbiAgICAgICAgc2l6ZXM6ICcxMDB2dycsXG4gICAgICAgIHNyY1NldCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHRyZWUsIGV4cGVjdGVkKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIHBpY3R1cmUgb2JqZWN0IHdpdGggYSBmYWxsYmFjayBpbWcgYW5kIDEgc291cmNlICgxIHJlc29sdXRpb24pJywgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBzaXplczoge1xuICAgICAgICAnKG1pbi13aWR0aDogMTA4MHB4KSc6ICcxMDB2dycsXG4gICAgICAgIGZhbGxiYWNrOiAnMzAwcHgnLFxuICAgICAgfSxcbiAgICAgIHJlc29sdXRpb25zOiBbMzIwLCA2NDBdLFxuICAgICAga2V5czogZmFsc2UsXG4gICAgfTtcbiAgICBjb25zdCBzcmNTZXQgPSBgJHtyZXN1bHQoYmFzZVVSTCwgJ3Jlc2l6ZT13aWR0aDozMjAnKX0gMzIwdywgJHtyZXN1bHQoYmFzZVVSTCwgJ3Jlc2l6ZT13aWR0aDo2NDAnKX0gNjQwd2A7XG4gICAgY29uc3QgdHJlZSA9IG1ha2VQaWN0dXJlVHJlZShoYW5kbGUsIG9wdGlvbnMpO1xuICAgIGNvbnN0IGV4cGVjdGVkID0ge1xuICAgICAgaW1nOiB7XG4gICAgICAgIHNyYzogcmVzdWx0KGJhc2VVUkwsICdyZXNpemU9d2lkdGg6MzAwJyksXG4gICAgICAgIHNpemVzOiAnMzAwcHgnLFxuICAgICAgICBzcmNTZXQsXG4gICAgICB9LFxuICAgICAgc291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgbWVkaWE6ICcobWluLXdpZHRoOiAxMDgwcHgpJyxcbiAgICAgICAgICBzaXplczogJzEwMHZ3JyxcbiAgICAgICAgICBzcmNTZXQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCh0cmVlLCBleHBlY3RlZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBzaW5nbGUgaW1nIGVsZW1lbnQgdXNpbmcgd2lkdGggYW5kIHBpeGVsIGRlbnNpdGllcycsICgpID0+IHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgd2lkdGg6ICc3NjhweCcsXG4gICAgICBrZXlzOiBmYWxzZSxcbiAgICB9O1xuICAgIGNvbnN0IHNyY1NldCA9IGAke3Jlc3VsdChiYXNlVVJMLCAncmVzaXplPXdpZHRoOjc2OCcpfSAxeCwgJHtyZXN1bHQoYmFzZVVSTCwgJ3Jlc2l6ZT13aWR0aDoxNTM2Jyl9IDJ4YDtcbiAgICBjb25zdCBleHBlY3RlZCA9IHtcbiAgICAgIGltZzoge1xuICAgICAgICB3aWR0aDogNzY4LFxuICAgICAgICBzcmM6IHJlc3VsdChiYXNlVVJMLCAncmVzaXplPXdpZHRoOjc2OCcpLFxuICAgICAgICBzcmNTZXQsXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgdHJlZSA9IG1ha2VQaWN0dXJlVHJlZShoYW5kbGUsI