UNPKG

filestack-js

Version:

Official JavaScript library for Filestack

600 lines (599 loc) 54.4 kB
/* * 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