filestack-js
Version:
Official JavaScript library for Filestack
600 lines (599 loc) • 54.4 kB
JavaScript
/*
* Copyright (c) 2018 by Filestack.
* Some 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.
*/
import * as assert from 'assert';
import { getValidator, TransformSchema } from './';
describe('Transforms Schema', function () {
var validator = getValidator(TransformSchema);
var validate = function (params) {
var res = validator(params);
return res.errors.length === 0 ? true : false;
};
var assertFail = function (res) { return assert.ok(!res); };
it('should load json schema', function () {
// console.log(schema);
});
describe('Watermark', function () {
it('should validate correct params', function () {
assert.ok(validate({
watermark: {
file: 'testfilehandle',
size: 300,
position: 'top',
},
}));
});
it('should validate correct params (position array)', function () {
assert.ok(validate({
watermark: {
file: 'testfilehandle',
size: 300,
position: ['top', 'left'],
},
}));
});
it('should fail on wrong position params [top, bottom]', function () {
assertFail(validate({
watermark: {
file: 'testfilehandle',
size: 300,
position: ['top', 'bottom'],
},
}));
});
});
describe('Partial Blur', function () {
it('should validate correct params', function () {
assert.ok(validate({
partial_blur: {
objects: [
[1, 1, 2, 2],
[1, 1, 32, 15],
],
amount: 18.2,
blur: 12,
type: 'rect',
},
}));
});
it('should fail on wrong params (amount, blur, type)', function () {
assertFail(validate({
partial_blur: {
objects: [
[1, 1, 2, 2],
[1, 1, 32, 15],
],
amount: -10,
blur: 300,
type: 'wrong_type',
},
}));
});
it('should fail on wrong params (objects)', function () {
assertFail(validate({
partial_blur: {
objects: [
[1, 1, 2],
[1, 1, 32, 15, 32],
],
amount: 10,
blur: 20,
},
}));
});
});
describe('Partial Pixelate', function () {
it('should validate correct params', function () {
assert.ok(validate({
partial_pixelate: {
objects: [
[1, 1, 2, 2],
[1, 1, 32, 15],
],
amount: 100,
blur: 12.2,
type: 'oval',
},
}));
});
it('should fail on wrong params (amount, blur, type)', function () {
assertFail(validate({
partial_pixelate: {
objects: [
[1, 1, 2, 2],
[1, 1, 32, 15],
],
amount: -10,
blur: 300,
type: 'wrong_type',
},
}));
});
it('should fail on wrong params (objects)', function () {
assertFail(validate({
partial_pixelate: {
objects: [
[1, 1, 2],
[1, 1, 32, 15, 32],
],
amount: 10,
blur: 20,
},
}));
});
});
describe('Crop', function () {
it('should validate correct params', function () {
assert.ok(validate({
crop: {
dim: [1, 1, 2, 2],
},
}));
});
it('should fail on empty dim params', function () {
assertFail(validate({
crop: {
dim: [],
},
}));
});
it('should fail on wrong params (minimum value for 2 first items)', function () {
assertFail(validate({
crop: {
dim: [2, 1, 0, 2],
},
}));
});
it('should fail on wrong params (5 items in array)', function () {
assertFail(validate({
crop: {
dim: [1, 1, 2, 2, 4],
},
}));
});
});
describe('Resize', function () {
it('should validate correct params', function () {
assert.ok(validate({
resize: {
width: 10,
height: 20,
fit: 'crop',
align: ['top', 'left'],
},
}));
});
it('should validate correct when only one width or height is provided', function () {
assert.ok(validate({
resize: {
width: 10,
fit: 'crop',
align: 'left',
},
}));
assert.ok(validate({
resize: {
height: 10,
fit: 'crop',
align: 'left',
},
}));
});
it('should fail on wrong params (missing width and height)', function () {
assertFail(validate({
resize: {
fit: 'crop',
align: 'left',
},
}));
});
});
describe('Resize', function () {
it('should validate correct params', function () {
assert.ok(validate({
rotate: {
deg: 'exif',
exif: false,
background: 'fff',
},
}));
});
it('should validate correct params', function () {
assert.ok(validate({
rotate: {
deg: 200,
exif: true,
background: 'ffffff',
},
}));
});
it('should fail on wrong params (wrong exif rotation)', function () {
assertFail(validate({
rotate: {
deg: 123,
exif: 'true',
background: 'ffffff',
},
}));
});
});
describe('Pdfinfo', function () {
it('should validate correct params with bool value', function () {
assert.ok(validate({
pdfinfo: true,
}));
});
it('should validate correct params with color info', function () {
assert.ok(validate({
pdfinfo: {
colorinfo: true,
},
}));
});
});
describe('Pdfconvert', function () {
describe('Pages', function () {
[[1, 2], ['1-', 3], ['-2']].forEach(function (val) {
it("should validate on correct page \"".concat(val, "\""), function () {
assert.ok(validate({
pdfconvert: {
pages: val,
},
}));
});
});
it('should return error on fail page "1a"', function () {
assertFail(validate({
pdfconvert: {
pages: '1a',
},
}));
});
});
describe('Page orientation', function () {
it('should pass on correct orientation "landscape"', function () {
assert.ok(validate({
pdfconvert: {
pageorientation: 'landscape',
},
}));
});
it('should pass on correct orientation "portrait"', function () {
assert.ok(validate({
pdfconvert: {
pageorientation: 'portrait',
},
}));
});
it('should fail on wrong orientation "landscape1"', function () {
assertFail(validate({
pdfconvert: {
pageorientation: 'landscape1',
},
}));
});
});
describe('Page format', function () {
['a2', 'a3', 'a4', 'a5', 'b4', 'b5', 'letter', 'legal', 'tabloid'].forEach(function (val) {
it("should when correct page format is provided ".concat(val), function () {
assert.ok(validate({
pdfconvert: {
pages: [1, 2],
pageformat: val,
},
}));
});
});
it('should fail on wrong page format ie a22', function () {
assertFail(validate({
pdfconvert: {
pageformat: 'a22',
},
}));
});
});
});
});
// import * as assert from 'assert';
// import { getValidator, TransformSchema } from './';
// describe('Transforms Schema', () => {
// const validate = getValidator(TransformSchema);
// const assertFail = (val) => assert.ok(!val);
// it('should load json schema', () => {
// // console.log(schema);
// });
// describe('Watermark', () => {
// it('should validate correct params', () => {
// assert.ok(validate({
// watermark: {
// file: 'testfilehandle',
// size: 300,
// position: 'top',
// },
// }));
// });
// it('should validate correct params (position array)', () => {
// assert.ok(validate({
// watermark: {
// file: 'testfilehandle',
// size: 300,
// position: ['top', 'left'],
// },
// }));
// });
// it('should fail on wrong position params [top, bottom]', () => {
// assertFail(validate({
// watermark: {
// file: 'testfilehandle',
// size: 300,
// position: ['top', 'bottom'],
// },
// }));
// });
// });
// describe('Partial Blur', () => {
// it('should validate correct params', () => {
// assert.ok(validate({
// partial_blur: {
// objects: [
// [1, 1, 2, 2],
// [1, 1, 32, 15],
// ],
// amount: 18.2,
// blur: 12,
// type: 'rect',
// },
// }));
// });
// it('should fail on wrong params (amount, blur, type)', () => {
// assertFail(validate({
// partial_blur: {
// objects: [
// [1, 1, 2, 2],
// [1, 1, 32, 15],
// ],
// amount: -10,
// blur: 300,
// type: 'wrong_type',
// },
// }));
// });
// it('should fail on wrong params (objects)', () => {
// assertFail(validate({
// partial_blur: {
// objects: [
// [1, 1, 2],
// [1, 1, 32, 15, 32],
// ],
// amount: 10,
// blur: 20,
// },
// }));
// });
// });
// describe('Partial Pixelate', () => {
// it('should validate correct params', () => {
// assert.ok(validate({
// partial_pixelate: {
// objects: [
// [1, 1, 2, 2],
// [1, 1, 32, 15],
// ],
// amount: 100,
// blur: 12.2,
// type: 'oval',
// },
// }));
// });
// it('should fail on wrong params (amount, blur, type)', () => {
// assertFail(validate({
// partial_pixelate: {
// objects: [
// [1, 1, 2, 2],
// [1, 1, 32, 15],
// ],
// amount: -10,
// blur: 300,
// type: 'wrong_type',
// },
// }));
// });
// it('should fail on wrong params (objects)', () => {
// assertFail(validate({
// partial_pixelate: {
// objects: [
// [1, 1, 2],
// [1, 1, 32, 15, 32],
// ],
// amount: 10,
// blur: 20,
// },
// }));
// });
// });
// describe('Crop', () => {
// it('should validate correct params', () => {
// assert.ok(validate({
// crop: {
// dim: [1, 1, 2, 2],
// },
// }));
// });
// it('should fail on empty dim params', () => {
// assertFail(validate({
// crop: {
// dim: [],
// },
// }));
// });
// it('should fail on wrong params (minimum value for 2 first items)', () => {
// assertFail(validate({
// crop: {
// dim: [2, 1, 0, 2],
// },
// }));
// });
// it('should fail on wrong params (5 items in array)', () => {
// assertFail(validate({
// crop: {
// dim: [1, 1, 2, 2, 4],
// },
// }));
// });
// });
// describe('Resize', () => {
// it('should validate correct params', () => {
// assert.ok(validate({
// resize: {
// width: 10,
// height: 20,
// fit: 'crop',
// align: ['top', 'left'],
// },
// }));
// });
// it('should validate correct when only one width or height is provided', () => {
// assert.ok(validate({
// resize: {
// width: 10,
// fit: 'crop',
// align: 'left',
// },
// }));
// assert.ok(validate({
// resize: {
// height: 10,
// fit: 'crop',
// align: 'left',
// },
// }));
// });
// it('should fail on wrong params (missing width and height)', () => {
// assertFail(validate({
// resize: {
// fit: 'crop',
// align: 'left',
// },
// }));
// });
// });
// describe('Resize', () => {
// it('should validate correct params', () => {
// assert.ok(validate({
// rotate: {
// deg: 'exif',
// exif: false,
// background: 'fff',
// },
// }));
// });
// it('should validate correct params', () => {
// assert.ok(validate({
// rotate: {
// deg: 200,
// exif: true,
// background: 'ffffff',
// },
// }));
// });
// it('should fail on wrong params (wrong exif rotation)', () => {
// assertFail(validate({
// rotate: {
// deg: 123,
// exif: 'true',
// background: 'ffffff',
// },
// }));
// });
// });
// describe('Pdfinfo', () => {
// it('should validate correct params with bool value', () => {
// assert.ok(validate({
// pdfinfo: true,
// }));
// });
// it('should validate correct params with color info', () => {
// assert.ok(validate({
// pdfinfo: {
// colorinfo: true,
// },
// }));
// });
// });
// describe('Pdfconvert', () => {
// describe('Pages', () => {
// [[1,2], ['1-', 3], ['-2']].forEach((val) => {
// it(`should validate on correct page "${val}"`, () => {
// assert.ok(validate({
// pdfconvert: {
// pages: val,
// },
// }));
// });
// });
// it('should return error on fail page "1a"', () => {
// assertFail(validate({
// pdfconvert: {
// pages: '1a',
// },
// }));
// });
// });
// describe('Page orientation', () => {
// it('should pass on correct orientation "landscape"', () => {
// assert.ok(validate({
// pdfconvert: {
// pageorientation: 'landscape',
// },
// }));
// });
// it('should pass on correct orientation "portrait"', () => {
// assert.ok(validate({
// pdfconvert: {
// pageorientation: 'portrait',
// },
// }));
// });
// it('should fail on wrong orientation "landscape1"', () => {
// assertFail(validate({
// pdfconvert: {
// pageorientation: 'landscape1',
// },
// }));
// });
// });
// describe('Page format', () => {
// ['a2', 'a3', 'a4', 'a5', 'b4', 'b5', 'letter', 'legal', 'tabloid'].forEach((val) => {
// it(`should when correct page format is provided ${val}`, () => {
// assert.ok(validate({
// pdfconvert: {
// pages: [1,2],
// pageformat: val,
// },
// }));
// });
// });
// it('should fail on wrong page format ie a22', () => {
// assertFail(validate({
// pdfconvert: {
// pageformat: 'a22',
// },
// }));
// });
// });
// });
// });
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2hlbWEvdHJhbnNmb3Jtcy5zY2hlbWEuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUVuRCxRQUFRLENBQUMsbUJBQW1CLEVBQUU7SUFFNUIsSUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRWhELElBQU0sUUFBUSxHQUFHLFVBQUMsTUFBTTtRQUN0QixJQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ2hELENBQUMsQ0FBQztJQUVGLElBQU0sVUFBVSxHQUFHLFVBQUMsR0FBRyxJQUFLLE9BQUEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFmLENBQWUsQ0FBQztJQUU1QyxFQUFFLENBQUMseUJBQXlCLEVBQUU7UUFDNUIsdUJBQXVCO0lBQ3pCLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFdBQVcsRUFBRTtRQUNwQixFQUFFLENBQUMsZ0NBQWdDLEVBQUU7WUFDbkMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBQ2pCLFNBQVMsRUFBRTtvQkFDVCxJQUFJLEVBQUUsZ0JBQWdCO29CQUN0QixJQUFJLEVBQUUsR0FBRztvQkFDVCxRQUFRLEVBQUUsS0FBSztpQkFDaEI7YUFDRixDQUFDLENBQUMsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGlEQUFpRCxFQUFFO1lBQ3BELE1BQU0sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUNq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Z0NBQWdDO0FBQ2hDLHNEQUFzRDtBQUN0RCxpRUFBaUU7QUFDakUsaUNBQWlDO0FBQ2pDLDRCQUE0QjtBQUM1Qiw0QkFBNEI7QUFDNUIsaUJBQWlCO0FBQ2pCLGlCQUFpQjtBQUNqQixjQUFjO0FBQ2QsWUFBWTtBQUVaLDREQUE0RDtBQUM1RCxnQ0FBZ0M7QUFDaEMsMEJBQTBCO0FBQzFCLDJCQUEyQjtBQUMzQixlQUFlO0FBQ2YsZUFBZTtBQUNmLFlBQVk7QUFFWixVQUFVO0FBRVYsMkNBQTJDO0FBQzNDLHFFQUFxRTtBQUNyRSwrQkFBK0I7QUFDL0IsMEJBQTBCO0FBQzFCLDRDQUE0QztBQUM1QyxlQUFlO0FBQ2YsZUFBZTtBQUNmLFlBQVk7QUFFWixvRUFBb0U7QUFDcEUsK0JBQStCO0FBQy9CLDBCQUEwQjtBQUMxQiwyQ0FBMkM7QUFDM0MsZUFBZTtBQUNmLGVBQWU7QUFDZixZQUFZO0FBRVosb0VBQW9FO0FBQ3BFLGdDQUFnQztBQUNoQywwQkFBMEI7QUFDMUIsNkNBQTZDO0FBQzdDLGVBQWU7QUFDZixlQUFlO0FBQ2YsWUFBWTtBQUNaLFVBQVU7QUFFVixzQ0FBc0M7QUFDdEMsOEZBQThGO0FBQzlGLDJFQUEyRTtBQUMzRSxpQ0FBaUM7QUFDakMsNEJBQTRCO0FBQzVCLDhCQUE4QjtBQUM5QixpQ0FBaUM7QUFDakMsaUJBQWlCO0FBQ2pCLGlCQUFpQjtBQUNqQixjQUFjO0FBQ2QsWUFBWTtBQUVaLDhEQUE4RDtBQUM5RCxnQ0FBZ0M7QUFDaEMsMEJBQTBCO0FBQzFCLGlDQUFpQztBQUNqQyxlQUFlO0FBQ2YsZUFBZTtBQUNmLFlBQVk7QUFDWixVQUFVO0FBQ1YsUUFBUTtBQUNSLE1BQU0iLCJmaWxlIjoic2NoZW1hL3RyYW5zZm9ybXMuc2NoZW1hLnNwZWMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IGJ5IEZpbGVzdGFjay5cbiAqIFNvbWUgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGdldFZhbGlkYXRvciwgVHJhbnNmb3JtU2NoZW1hIH0gZnJvbSAnLi8nO1xuXG5kZXNjcmliZSgnVHJhbnNmb3JtcyBTY2hlbWEnLCAoKSA9PiB7XG5cbiAgY29uc3QgdmFsaWRhdG9yID0gZ2V0VmFsaWRhdG9yKFRyYW5zZm9ybVNjaGVtYSk7XG5cbiAgY29uc3QgdmFsaWRhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgY29uc3QgcmVzID0gdmFsaWRhdG9yKHBhcmFtcyk7XG4gICAgcmV0dXJuIHJlcy5lcnJvcnMubGVuZ3RoID09PSAwID8gdHJ1ZSA6IGZhbHNlO1xuICB9O1xuXG4gIGNvbnN0IGFzc2VydEZhaWwgPSAocmVzKSA9PiBhc3NlcnQub2soIXJlcyk7XG5cbiAgaXQoJ3Nob3VsZCBsb2FkIGpzb24gc2NoZW1hJywgKCkgPT4ge1xuICAgIC8vIGNvbnNvbGUubG9nKHNjaGVtYSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdXYXRlcm1hcmsnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcycsICgpID0+IHtcbiAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4gICAgICAgIHdhdGVybWFyazoge1xuICAgICAgICAgIGZpbGU6ICd0ZXN0ZmlsZWhhbmRsZScsXG4gICAgICAgICAgc2l6ZTogMzAwLFxuICAgICAgICAgIHBvc2l0aW9uOiAndG9wJyxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBwYXJhbXMgKHBvc2l0aW9uIGFycmF5KScsICgpID0+IHtcbiAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4gICAgICAgIHdhdGVybWFyazoge1xuICAgICAgICAgIGZpbGU6ICd0ZXN0ZmlsZWhhbmRsZScsXG4gICAgICAgICAgc2l6ZTogMzAwLFxuICAgICAgICAgIHBvc2l0aW9uOiBbJ3RvcCcsICdsZWZ0J10sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgb24gd3JvbmcgcG9zaXRpb24gcGFyYW1zIFt0b3AsIGJvdHRvbV0nLCAoKSA9PiB7XG4gICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbiAgICAgICAgd2F0ZXJtYXJrOiB7XG4gICAgICAgICAgZmlsZTogJ3Rlc3RmaWxlaGFuZGxlJyxcbiAgICAgICAgICBzaXplOiAzMDAsXG4gICAgICAgICAgcG9zaXRpb246IFsndG9wJywgJ2JvdHRvbSddLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGFydGlhbCBCbHVyJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBwYXJhbXMnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuICAgICAgICBwYXJ0aWFsX2JsdXI6IHtcbiAgICAgICAgICBvYmplY3RzOiBbXG4gICAgICAgICAgICBbMSwgMSwgMiwgMl0sXG4gICAgICAgICAgICBbMSwgMSwgMzIsIDE1XSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGFtb3VudDogMTguMixcbiAgICAgICAgICBibHVyOiAxMixcbiAgICAgICAgICB0eXBlOiAncmVjdCcsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgb24gd3JvbmcgcGFyYW1zIChhbW91bnQsIGJsdXIsIHR5cGUpJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4gICAgICAgIHBhcnRpYWxfYmx1cjoge1xuICAgICAgICAgIG9iamVjdHM6IFtcbiAgICAgICAgICAgIFsxLCAxLCAyLCAyXSxcbiAgICAgICAgICAgIFsxLCAxLCAzMiwgMTVdLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYW1vdW50OiAtMTAsXG4gICAgICAgICAgYmx1cjogMzAwLFxuICAgICAgICAgIHR5cGU6ICd3cm9uZ190eXBlJyxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwYXJhbXMgKG9iamVjdHMpJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4gICAgICAgIHBhcnRpYWxfYmx1cjoge1xuICAgICAgICAgIG9iamVjdHM6IFtcbiAgICAgICAgICAgIFsxLCAxLCAyXSxcbiAgICAgICAgICAgIFsxLCAxLCAzMiwgMTUsIDMyXSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGFtb3VudDogMTAsXG4gICAgICAgICAgYmx1cjogMjAsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdQYXJ0aWFsIFBpeGVsYXRlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBwYXJhbXMnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuICAgICAgICBwYXJ0aWFsX3BpeGVsYXRlOiB7XG4gICAgICAgICAgb2JqZWN0czogW1xuICAgICAgICAgICAgWzEsIDEsIDIsIDJdLFxuICAgICAgICAgICAgWzEsIDEsIDMyLCAxNV0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhbW91bnQ6IDEwMCxcbiAgICAgICAgICBibHVyOiAxMi4yLFxuICAgICAgICAgIHR5cGU6ICdvdmFsJyxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwYXJhbXMgKGFtb3VudCwgYmx1ciwgdHlwZSknLCAoKSA9PiB7XG4gICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbiAgICAgICAgcGFydGlhbF9waXhlbGF0ZToge1xuICAgICAgICAgIG9iamVjdHM6IFtcbiAgICAgICAgICAgIFsxLCAxLCAyLCAyXSxcbiAgICAgICAgICAgIFsxLCAxLCAzMiwgMTVdLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYW1vdW50OiAtMTAsXG4gICAgICAgICAgYmx1cjogMzAwLFxuICAgICAgICAgIHR5cGU6ICd3cm9uZ190eXBlJyxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwYXJhbXMgKG9iamVjdHMpJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4gICAgICAgIHBhcnRpYWxfcGl4ZWxhdGU6IHtcbiAgICAgICAgICBvYmplY3RzOiBbXG4gICAgICAgICAgICBbMSwgMSwgMl0sXG4gICAgICAgICAgICBbMSwgMSwgMzIsIDE1LCAzMl0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhbW91bnQ6IDEwLFxuICAgICAgICAgIGJsdXI6IDIwLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ3JvcCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgcGFyYW1zJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbiAgICAgICAgY3JvcDoge1xuICAgICAgICAgIGRpbTogWzEsIDEsIDIsIDJdLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIG9uIGVtcHR5IGRpbSBwYXJhbXMnLCAoKSA9PiB7XG4gICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbiAgICAgICAgY3JvcDoge1xuICAgICAgICAgIGRpbTogW10sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgb24gd3JvbmcgcGFyYW1zIChtaW5pbXVtIHZhbHVlIGZvciAyIGZpcnN0IGl0ZW1zKScsICgpID0+IHtcbiAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuICAgICAgICBjcm9wOiB7XG4gICAgICAgICAgZGltOiBbMiwgMSwgMCwgMl0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgb24gd3JvbmcgcGFyYW1zICg1IGl0ZW1zIGluIGFycmF5KScsICgpID0+IHtcbiAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuICAgICAgICBjcm9wOiB7XG4gICAgICAgICAgZGltOiBbMSwgMSwgMiwgMiwgNF0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSZXNpemUnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcycsICgpID0+IHtcbiAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4gICAgICAgIHJlc2l6ZToge1xuICAgICAgICAgIHdpZHRoOiAxMCxcbiAgICAgICAgICBoZWlnaHQ6IDIwLFxuICAgICAgICAgIGZpdDogJ2Nyb3AnLFxuICAgICAgICAgIGFsaWduOiBbJ3RvcCcsICdsZWZ0J10sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3Qgd2hlbiBvbmx5IG9uZSB3aWR0aCBvciBoZWlnaHQgaXMgcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuICAgICAgICByZXNpemU6IHtcbiAgICAgICAgICB3aWR0aDogMTAsXG4gICAgICAgICAgZml0OiAnY3JvcCcsXG4gICAgICAgICAgYWxpZ246ICdsZWZ0JyxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbiAgICAgICAgcmVzaXplOiB7XG4gICAgICAgICAgaGVpZ2h0OiAxMCxcbiAgICAgICAgICBmaXQ6ICdjcm9wJyxcbiAgICAgICAgICBhbGlnbjogJ2xlZnQnLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIG9uIHdyb25nIHBhcmFtcyAobWlzc2luZyB3aWR0aCBhbmQgaGVpZ2h0KScsICgpID0+IHtcbiAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuICAgICAgICByZXNpemU6IHtcbiAgICAgICAgICBmaXQ6ICdjcm9wJyxcbiAgICAgICAgICBhbGlnbjogJ2xlZnQnLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVzaXplJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBwYXJhbXMnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuICAgICAgICByb3RhdGU6IHtcbiAgICAgICAgICBkZWc6ICdleGlmJyxcbiAgICAgICAgICBleGlmOiBmYWxzZSxcbiAgICAgICAgICBiYWNrZ3JvdW5kOiAnZmZmJyxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBwYXJhbXMnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuICAgICAgICByb3RhdGU6IHtcbiAgICAgICAgICBkZWc6IDIwMCxcbiAgICAgICAgICBleGlmOiB0cnVlLFxuICAgICAgICAgIGJhY2tncm91bmQ6ICdmZmZmZmYnLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIG9uIHdyb25nIHBhcmFtcyAod3JvbmcgZXhpZiByb3RhdGlvbiknLCAoKSA9PiB7XG4gICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbiAgICAgICAgcm90YXRlOiB7XG4gICAgICAgICAgZGVnOiAxMjMsXG4gICAgICAgICAgZXhpZjogJ3RydWUnLFxuICAgICAgICAgIGJhY2tncm91bmQ6ICdmZmZmZmYnLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGRmaW5mbycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgcGFyYW1zIHdpdGggYm9vbCB2YWx1ZScsICgpID0+IHtcbiAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4gICAgICAgIHBkZmluZm86IHRydWUsXG4gICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgcGFyYW1zIHdpdGggY29sb3IgaW5mbycsICgpID0+IHtcbiAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4gICAgICAgIHBkZmluZm86IHtcbiAgICAgICAgICBjb2xvcmluZm86IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdQZGZjb252ZXJ0JywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCdQYWdlcycsICgpID0+IHtcbiAgICAgIFtbMSwyXSwgWycxLScsIDNdLCBbJy0yJ11dLmZvckVhY2goKHZhbCkgPT4ge1xuICAgICAgICBpdChgc2hvdWxkIHZhbGlkYXRlIG9uIGNvcnJlY3QgcGFnZSBcIiR7dmFsfVwiYCwgKCkgPT4ge1xuICAgICAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4gICAgICAgICAgICBwZGZjb252ZXJ0OiB7XG4gICAgICAgICAgICAgIHBhZ2VzOiB2YWwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gZXJyb3Igb24gZmFpbCBwYWdlIFwiMWFcIicsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4gICAgICAgICAgcGRmY29udmVydDoge1xuICAgICAgICAgICAgcGFnZXM6ICcxYScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdQYWdlIG9yaWVudGF0aW9uJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBwYXNzIG9uIGNvcnJlY3Qgb3JpZW50YXRpb24gXCJsYW5kc2NhcGVcIicsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbiAgICAgICAgICBwZGZjb252ZXJ0OiB7XG4gICAgICAgICAgICBwYWdlb3JpZW50YXRpb246ICdsYW5kc2NhcGUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHBhc3Mgb24gY29ycmVjdCBvcmllbnRhdGlvbiBcInBvcnRyYWl0XCInLCAoKSA9PiB7XG4gICAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4gICAgICAgICAgcGRmY29udmVydDoge1xuICAgICAgICAgICAgcGFnZW9yaWVudGF0aW9uOiAncG9ydHJhaXQnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgb24gd3Jvbmcgb3JpZW50YXRpb24gXCJsYW5kc2NhcGUxXCInLCAoKSA9PiB7XG4gICAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuICAgICAgICAgIHBkZmNvbnZlcnQ6IHtcbiAgICAgICAgICAgIHBhZ2VvcmllbnRhdGlvbjogJ2xhbmRzY2FwZTEnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1BhZ2UgZm9ybWF0JywgKCkgPT4ge1xuICAgICAgWydhMicsICdhMycsICdhNCcsICdhNScsICdiNCcsICdiNScsICdsZXR0ZXInLCAnbGVnYWwnLCAndGFibG9pZCddLmZvckVhY2goKHZhbCkgPT4ge1xuICAgICAgICBpdChgc2hvdWxkIHdoZW4gY29ycmVjdCBwYWdlIGZvcm1hdCBpcyBwcm92aWRlZCAke3ZhbH1gLCAoKSA9PiB7XG4gICAgICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbiAgICAgICAgICAgIHBkZmNvbnZlcnQ6IHtcbiAgICAgICAgICAgICAgcGFnZXM6IFsxLDJdLFxuICAgICAgICAgICAgICBwYWdlZm9ybWF0OiB2YWwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIG9uIHdyb25nIHBhZ2UgZm9ybWF0IGllIGEyMicsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4gICAgICAgICAgcGRmY29udmVydDoge1xuICAgICAgICAgICAgcGFnZWZvcm1hdDogJ2EyMicsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbi8vIGltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuLy8gaW1wb3J0IHsgZ2V0VmFsaWRhdG9yLCBUcmFuc2Zvcm1TY2hlbWEgfSBmcm9tICcuLyc7XG5cbi8vIGRlc2NyaWJlKCdUcmFuc2Zvcm1zIFNjaGVtYScsICgpID0+IHtcblxuLy8gICBjb25zdCB2YWxpZGF0ZSA9IGdldFZhbGlkYXRvcihUcmFuc2Zvcm1TY2hlbWEpO1xuXG4vLyAgIGNvbnN0IGFzc2VydEZhaWwgPSAodmFsKSA9PiBhc3NlcnQub2soIXZhbCk7XG5cbi8vICAgaXQoJ3Nob3VsZCBsb2FkIGpzb24gc2NoZW1hJywgKCkgPT4ge1xuLy8gICAgIC8vIGNvbnNvbGUubG9nKHNjaGVtYSk7XG4vLyAgIH0pO1xuXG4vLyAgIGRlc2NyaWJlKCdXYXRlcm1hcmsnLCAoKSA9PiB7XG4vLyAgICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcycsICgpID0+IHtcbi8vICAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4vLyAgICAgICAgIHdhdGVybWFyazoge1xuLy8gICAgICAgICAgIGZpbGU6ICd0ZXN0ZmlsZWhhbmRsZScsXG4vLyAgICAgICAgICAgc2l6ZTogMzAwLFxuLy8gICAgICAgICAgIHBvc2l0aW9uOiAndG9wJyxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcblxuLy8gICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBwYXJhbXMgKHBvc2l0aW9uIGFycmF5KScsICgpID0+IHtcbi8vICAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4vLyAgICAgICAgIHdhdGVybWFyazoge1xuLy8gICAgICAgICAgIGZpbGU6ICd0ZXN0ZmlsZWhhbmRsZScsXG4vLyAgICAgICAgICAgc2l6ZTogMzAwLFxuLy8gICAgICAgICAgIHBvc2l0aW9uOiBbJ3RvcCcsICdsZWZ0J10sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICB9KSk7XG4vLyAgICAgfSk7XG5cbi8vICAgICBpdCgnc2hvdWxkIGZhaWwgb24gd3JvbmcgcG9zaXRpb24gcGFyYW1zIFt0b3AsIGJvdHRvbV0nLCAoKSA9PiB7XG4vLyAgICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbi8vICAgICAgICAgd2F0ZXJtYXJrOiB7XG4vLyAgICAgICAgICAgZmlsZTogJ3Rlc3RmaWxlaGFuZGxlJyxcbi8vICAgICAgICAgICBzaXplOiAzMDAsXG4vLyAgICAgICAgICAgcG9zaXRpb246IFsndG9wJywgJ2JvdHRvbSddLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgfSkpO1xuLy8gICAgIH0pO1xuLy8gICB9KTtcblxuLy8gICBkZXNjcmliZSgnUGFydGlhbCBCbHVyJywgKCkgPT4ge1xuLy8gICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBwYXJhbXMnLCAoKSA9PiB7XG4vLyAgICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuLy8gICAgICAgICBwYXJ0aWFsX2JsdXI6IHtcbi8vICAgICAgICAgICBvYmplY3RzOiBbXG4vLyAgICAgICAgICAgICBbMSwgMSwgMiwgMl0sXG4vLyAgICAgICAgICAgICBbMSwgMSwgMzIsIDE1XSxcbi8vICAgICAgICAgICBdLFxuLy8gICAgICAgICAgIGFtb3VudDogMTguMixcbi8vICAgICAgICAgICBibHVyOiAxMixcbi8vICAgICAgICAgICB0eXBlOiAncmVjdCcsXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICB9KSk7XG4vLyAgICAgfSk7XG5cbi8vICAgICBpdCgnc2hvdWxkIGZhaWwgb24gd3JvbmcgcGFyYW1zIChhbW91bnQsIGJsdXIsIHR5cGUpJywgKCkgPT4ge1xuLy8gICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4vLyAgICAgICAgIHBhcnRpYWxfYmx1cjoge1xuLy8gICAgICAgICAgIG9iamVjdHM6IFtcbi8vICAgICAgICAgICAgIFsxLCAxLCAyLCAyXSxcbi8vICAgICAgICAgICAgIFsxLCAxLCAzMiwgMTVdLFxuLy8gICAgICAgICAgIF0sXG4vLyAgICAgICAgICAgYW1vdW50OiAtMTAsXG4vLyAgICAgICAgICAgYmx1cjogMzAwLFxuLy8gICAgICAgICAgIHR5cGU6ICd3cm9uZ190eXBlJyxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcblxuLy8gICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwYXJhbXMgKG9iamVjdHMpJywgKCkgPT4ge1xuLy8gICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4vLyAgICAgICAgIHBhcnRpYWxfYmx1cjoge1xuLy8gICAgICAgICAgIG9iamVjdHM6IFtcbi8vICAgICAgICAgICAgIFsxLCAxLCAyXSxcbi8vICAgICAgICAgICAgIFsxLCAxLCAzMiwgMTUsIDMyXSxcbi8vICAgICAgICAgICBdLFxuLy8gICAgICAgICAgIGFtb3VudDogMTAsXG4vLyAgICAgICAgICAgYmx1cjogMjAsXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICB9KSk7XG4vLyAgICAgfSk7XG4vLyAgIH0pO1xuXG4vLyAgIGRlc2NyaWJlKCdQYXJ0aWFsIFBpeGVsYXRlJywgKCkgPT4ge1xuLy8gICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBwYXJhbXMnLCAoKSA9PiB7XG4vLyAgICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuLy8gICAgICAgICBwYXJ0aWFsX3BpeGVsYXRlOiB7XG4vLyAgICAgICAgICAgb2JqZWN0czogW1xuLy8gICAgICAgICAgICAgWzEsIDEsIDIsIDJdLFxuLy8gICAgICAgICAgICAgWzEsIDEsIDMyLCAxNV0sXG4vLyAgICAgICAgICAgXSxcbi8vICAgICAgICAgICBhbW91bnQ6IDEwMCxcbi8vICAgICAgICAgICBibHVyOiAxMi4yLFxuLy8gICAgICAgICAgIHR5cGU6ICdvdmFsJyxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcblxuLy8gICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwYXJhbXMgKGFtb3VudCwgYmx1ciwgdHlwZSknLCAoKSA9PiB7XG4vLyAgICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbi8vICAgICAgICAgcGFydGlhbF9waXhlbGF0ZToge1xuLy8gICAgICAgICAgIG9iamVjdHM6IFtcbi8vICAgICAgICAgICAgIFsxLCAxLCAyLCAyXSxcbi8vICAgICAgICAgICAgIFsxLCAxLCAzMiwgMTVdLFxuLy8gICAgICAgICAgIF0sXG4vLyAgICAgICAgICAgYW1vdW50OiAtMTAsXG4vLyAgICAgICAgICAgYmx1cjogMzAwLFxuLy8gICAgICAgICAgIHR5cGU6ICd3cm9uZ190eXBlJyxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcbi8vICAgICB9KTtcblxuLy8gICAgIGl0KCdzaG91bGQgZmFpbCBvbiB3cm9uZyBwYXJhbXMgKG9iamVjdHMpJywgKCkgPT4ge1xuLy8gICAgICAgYXNzZXJ0RmFpbCh2YWxpZGF0ZSh7XG4vLyAgICAgICAgIHBhcnRpYWxfcGl4ZWxhdGU6IHtcbi8vICAgICAgICAgICBvYmplY3RzOiBbXG4vLyAgICAgICAgICAgICBbMSwgMSwgMl0sXG4vLyAgICAgICAgICAgICBbMSwgMSwgMzIsIDE1LCAzMl0sXG4vLyAgICAgICAgICAgXSxcbi8vICAgICAgICAgICBhbW91bnQ6IDEwLFxuLy8gICAgICAgICAgIGJsdXI6IDIwLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgfSkpO1xuLy8gICAgIH0pO1xuLy8gICB9KTtcblxuLy8gICBkZXNjcmliZSgnQ3JvcCcsICgpID0+IHtcbi8vICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgcGFyYW1zJywgKCkgPT4ge1xuLy8gICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbi8vICAgICAgICAgY3JvcDoge1xuLy8gICAgICAgICAgIGRpbTogWzEsIDEsIDIsIDJdLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgfSkpO1xuLy8gICAgIH0pO1xuXG4vLyAgICAgaXQoJ3Nob3VsZCBmYWlsIG9uIGVtcHR5IGRpbSBwYXJhbXMnLCAoKSA9PiB7XG4vLyAgICAgICBhc3NlcnRGYWlsKHZhbGlkYXRlKHtcbi8vICAgICAgICAgY3JvcDoge1xuLy8gICAgICAgICAgIGRpbTogW10sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICB9KSk7XG4vLyAgICAgfSk7XG5cbi8vICAgICBpdCgnc2hvdWxkIGZhaWwgb24gd3JvbmcgcGFyYW1zIChtaW5pbXVtIHZhbHVlIGZvciAyIGZpcnN0IGl0ZW1zKScsICgpID0+IHtcbi8vICAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuLy8gICAgICAgICBjcm9wOiB7XG4vLyAgICAgICAgICAgZGltOiBbMiwgMSwgMCwgMl0sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICB9KSk7XG4vLyAgICAgfSk7XG5cbi8vICAgICBpdCgnc2hvdWxkIGZhaWwgb24gd3JvbmcgcGFyYW1zICg1IGl0ZW1zIGluIGFycmF5KScsICgpID0+IHtcbi8vICAgICAgIGFzc2VydEZhaWwodmFsaWRhdGUoe1xuLy8gICAgICAgICBjcm9wOiB7XG4vLyAgICAgICAgICAgZGltOiBbMSwgMSwgMiwgMiwgNF0sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICB9KSk7XG4vLyAgICAgfSk7XG4vLyAgIH0pO1xuXG4vLyAgIGRlc2NyaWJlKCdSZXNpemUnLCAoKSA9PiB7XG4vLyAgICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHBhcmFtcycsICgpID0+IHtcbi8vICAgICAgIGFzc2VydC5vayh2YWxpZGF0ZSh7XG4vLyAgICAgICAgIHJlc2l6ZToge1xuLy8gICAgICAgICAgIHdpZHRoOiAxMCxcbi8vICAgICAgICAgICBoZWlnaHQ6IDIwLFxuLy8gICAgICAgICAgIGZpdDogJ2Nyb3AnLFxuLy8gICAgICAgICAgIGFsaWduOiBbJ3RvcCcsICdsZWZ0J10sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICB9KSk7XG4vLyAgICAgfSk7XG5cbi8vICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3Qgd2hlbiBvbmx5IG9uZSB3aWR0aCBvciBoZWlnaHQgaXMgcHJvdmlkZWQnLCAoKSA9PiB7XG4vLyAgICAgICBhc3NlcnQub2sodmFsaWRhdGUoe1xuLy8gICAgICAgICByZXNpemU6IHtcbi8vICAgICAgICAgICB3aWR0aDogMTAsXG4vLyAgICAgICAgICAgZml0OiAnY3JvcCcsXG4vLyAgICAgICAgICAgYWxpZ246ICdsZWZ0Jyxcbi8vICAgICAgICAgfSxcbi8vICAgICAgIH0pKTtcblxuLy8gICAgICAgYXNzZXJ0Lm9rKHZhbGlkYXRlKHtcbi8vICAgICAgICAgcmVzaXplOiB7XG4vLyAgICAgICAgICAgaGVpZ2h0OiAxMCxcbi8vICAgICAgICAgICBmaXQ6ICdjcm9wJyxcbi8vICAgICAgICAgICBhbGlnbjogJ2xlZnQnLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgfSkpO1xuLy8gICAgIH0pO1xuXG4vLyAgICAgaXQoJ3Nob3VsZCBmYWlsIG9uIHdyb25nIHBhcmFtcyAobWlzc2luZyB3aWR0aCBhbmQgaGVpZ2h0KScsICgpID0+IHtcbi8vICAgICAgIG