filestack-js
Version:
Official JavaScript library for Filestack
395 lines (393 loc) • 47.8 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
/*
* 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.
*/
var filestack_error_1 = require("./../filestack_error");
var config_1 = require("./../config");
var client_1 = require("./client");
var cloud_1 = require("./api/cloud");
var upload_1 = require("./api/upload/upload");
var picker_1 = require("./picker");
var preview_1 = require("./api/preview");
var file_1 = require("./api/file");
var store_1 = require("./api/store");
var transform_1 = require("./api/transform");
jest.mock('./api/upload/upload');
jest.mock('./api/cloud');
jest.mock('./api/file');
jest.mock('./api/store');
jest.mock('./picker');
jest.mock('./api/preview');
jest.mock('./api/transform');
describe('client', function () {
var defaultApikey = 'EXAMPLE_API_KEY';
var defaultHandle = 'EXAMPLE_HANDLE';
var defaultSecurity = {
policy: 'examplePolicy',
signature: 'exampleSignature',
};
var sessionURls = config_1.config.urls;
var defaultSession = {
apikey: defaultApikey,
urls: sessionURls,
};
it('should properly instantiate Client', function () {
var client = new client_1.Client(defaultApikey);
expect(client).toBeDefined();
expect(client).toBeInstanceOf(client_1.Client);
});
it('should throw an error if api key not provided', function () {
expect(function () {
return new client_1.Client('');
}).toThrow('An apikey is required to initialize the Filestack client');
});
it('should throw an error if provided security without signature', function () {
var options = {
security: {
policy: 'examplePolicy',
signature: '',
},
};
expect(function () {
return new client_1.Client(defaultApikey, options);
}).toThrow('Both policy and signature are required for client security');
});
it('should pass policy & signature to the session', function () {
var options = {
security: defaultSecurity,
};
var client = new client_1.Client(defaultApikey, options);
expect(client.session.policy).toBe(options.security.policy);
expect(client.session.signature).toBe(options.security.signature);
});
it('should pass cname to the session', function () {
var options = {
cname: 'testCname.com',
};
var client = new client_1.Client(defaultApikey, options);
expect(client.session.cname).toBe(options.cname);
});
it('should be able to logout for provied cloud', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var client, cloudName;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
client = new client_1.Client(defaultApikey);
cloudName = 'dropbox';
return [4 /*yield*/, client.logout(cloudName)];
case 1:
_a.sent();
expect(cloud_1.CloudClient.prototype.logout).toHaveBeenCalledWith(cloudName);
return [2 /*return*/];
}
});
}); });
it('should get metadata for a provided handle', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var client, options;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
client = new client_1.Client(defaultApikey);
options = {
sha224: true,
};
return [4 /*yield*/, client.metadata(defaultHandle, options, defaultSecurity)];
case 1:
_a.sent();
expect(file_1.metadata).toHaveBeenCalledWith(defaultSession, defaultHandle, options, defaultSecurity);
return [2 /*return*/];
}
});
}); });
it('should be able to open picker', function () {
var client = new client_1.Client(defaultApikey);
var pickerOptions = {
lang: 'de',
};
client.picker(pickerOptions);
expect(picker_1.picker).toHaveBeenCalledWith(client, pickerOptions);
});
it('should be able to open preview', function () {
var client = new client_1.Client(defaultApikey);
var previewOptions = {
id: 'testElement',
};
client.preview(defaultHandle, previewOptions);
expect(preview_1.preview).toHaveBeenCalledWith(defaultSession, defaultHandle, previewOptions);
});
it('should be able to remove handle', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var client;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
client = new client_1.Client(defaultApikey);
return [4 /*yield*/, client.remove(defaultHandle, defaultSecurity)];
case 1:
_a.sent();
expect(file_1.remove).toHaveBeenCalledWith(defaultSession, defaultHandle, false, defaultSecurity);
return [2 /*return*/];
}
});
}); });
it('should be able to remove metadata', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var client;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
client = new client_1.Client(defaultApikey);
return [4 /*yield*/, client.removeMetadata(defaultHandle, defaultSecurity)];
case 1:
_a.sent();
expect(file_1.remove).toHaveBeenCalledWith(defaultSession, defaultHandle, true, defaultSecurity);
return [2 /*return*/];
}
});
}); });
it('should be able to store url', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var client, url, options, token, uploadTags, headers, workflowIds;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
client = new client_1.Client(defaultApikey);
url = 'http://example.com/img3.jpg';
options = {};
token = {};
uploadTags = { test: '123' };
headers = { 'test': '123' };
workflowIds = ['123', '321'];
return [4 /*yield*/, client.storeURL(url, options, token, defaultSecurity, uploadTags, headers, workflowIds)];
case 1:
_a.sent();
expect(store_1.storeURL).toHaveBeenCalledWith({
session: defaultSession,
url: url,
storeParams: options,
token: token,
security: defaultSecurity,
uploadTags: uploadTags,
headers: headers,
workflowIds: workflowIds,
});
return [2 /*return*/];
}
});
}); });
it('should be able to retrieve handle', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var client, retrieveOptions;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
client = new client_1.Client(defaultApikey);
retrieveOptions = {};
return [4 /*yield*/, client.retrieve(defaultHandle, retrieveOptions, defaultSecurity)];
case 1:
_a.sent();
expect(file_1.retrieve).toHaveBeenCalledWith(defaultSession, defaultHandle, retrieveOptions, defaultSecurity);
return [2 /*return*/];
}
});
}); });
it('should be able to transform url with b64', function () {
var client = new client_1.Client(defaultApikey);
var transformOptions = {
blur: {
amount: 5,
},
};
var b64 = true;
client.transform(defaultHandle, transformOptions, b64);
expect(transform_1.transform).toHaveBeenCalledWith(defaultSession, defaultHandle, transformOptions, b64);
});
it('should be able to transform url without b64', function () {
var client = new client_1.Client(defaultApikey);
var transformOptions = {
blur: {
amount: 5,
},
};
client.transform(defaultHandle, transformOptions);
expect(transform_1.transform).toHaveBeenCalledWith(defaultSession, defaultHandle, transformOptions, false);
});
it('should be able to upload file', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var client, file, uploadOptions, storeOptions, token;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
client = new client_1.Client(defaultApikey);
file = 'anyFile';
uploadOptions = {};
storeOptions = {};
token = {};
jest.spyOn(upload_1.Upload.prototype, 'upload').mockImplementation(function () { return Promise.resolve(); });
return [4 /*yield*/, client.upload(file, uploadOptions, storeOptions, token, defaultSecurity)];
case 1:
_a.sent();
expect(upload_1.Upload.prototype.setSession).toHaveBeenCalledWith({
apikey: defaultApikey,
urls: sessionURls,
});
expect(upload_1.Upload.prototype.setToken).toHaveBeenCalledWith(token);
expect(upload_1.Upload.prototype.setSecurity).toHaveBeenCalledWith(defaultSecurity);
expect(upload_1.Upload.prototype.upload).toHaveBeenCalledWith(file, undefined);
return [2 /*return*/];
}
});
}); });
it('should be able to upload file with alt text', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var client, file, uploadOptions, storeOptions, token;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
client = new client_1.Client(defaultApikey);
file = 'anyFile';
uploadOptions = {
altText: 'alt',
};
storeOptions = {};
token = {};
jest.spyOn(upload_1.Upload.prototype, 'upload').mockImplementation(function () { return Promise.resolve(); });
return [4 /*yield*/, client.upload(file, uploadOptions, storeOptions, token, defaultSecurity)];
case 1:
_a.sent();
expect(upload_1.Upload.prototype.setSession).toHaveBeenCalledWith({
apikey: defaultApikey,
urls: sessionURls,
});
expect(upload_1.Upload.prototype.setToken).toHaveBeenCalledWith(token);
expect(upload_1.Upload.prototype.setSecurity).toHaveBeenCalledWith(defaultSecurity);
expect(upload_1.Upload.prototype.upload).toHaveBeenCalledWith(file, uploadOptions.altText);
return [2 /*return*/];
}
});
}); });
it('should be able to upload file without token and security', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var client, file, uploadOptions, storeOptions;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
client = new client_1.Client(defaultApikey);
file = 'anyFile';
uploadOptions = {};
storeOptions = {};
jest.spyOn(upload_1.Upload.prototype, 'upload').mockImplementation(function () { return Promise.resolve(); });
return [4 /*yield*/, client.upload(file, uploadOptions, storeOptions)];
case 1:
_a.sent();
expect(upload_1.Upload.prototype.setSession).toHaveBeenCalledWith({
apikey: defaultApikey,
urls: sessionURls,
});
expect(upload_1.Upload.prototype.upload).toHaveBeenCalledWith(file, undefined);
return [2 /*return*/];
}
});
}); });
it('should emit error', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var client, file, uploadOptions, storeOptions, token, mockOnError, test;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
client = new client_1.Client(defaultApikey);
file = 'anyFile';
uploadOptions = {};
storeOptions = {};
token = {};
mockOnError = jest.fn().mockName('mockOnError');
test = new filestack_error_1.FilestackError('test');
client.on('upload.error', mockOnError);
jest.spyOn(upload_1.Upload.prototype, 'on').mockImplementation(function (name, cb, ctx) { return cb(test); });
return [4 /*yield*/, client.upload(file, uploadOptions, storeOptions, token, defaultSecurity)];
case 1:
_a.sent();
expect(mockOnError).toHaveBeenCalledWith(test);
return [2 /*return*/];
}
});
}); });
it('should be able to multiupload file', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var client, files, uploadOptions, storeOptions, token;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
client = new client_1.Client(defaultApikey);
files = ['anyFile'];
uploadOptions = {};
storeOptions = {};
token = {};
jest.spyOn(upload_1.Upload.prototype, 'multiupload').mockImplementation(function () { return Promise.resolve(); });
return [4 /*yield*/, client.multiupload(files, uploadOptions, storeOptions, token, defaultSecurity)];
case 1:
_a.sent();
expect(upload_1.Upload.prototype.setSession).toHaveBeenCalledWith({
apikey: defaultApikey,
urls: sessionURls,
});
expect(upload_1.Upload.prototype.setToken).toHaveBeenCalledWith(token);
expect(upload_1.Upload.prototype.setSecurity).toHaveBeenCalledWith(defaultSecurity);
expect(upload_1.Upload.prototype.multiupload).toHaveBeenCalledWith(files);
return [2 /*return*/];
}
});
}); });
it('should call multiupload without security or token', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var client, files, uploadOptions, storeOptions;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
client = new client_1.Client(defaultApikey);
files = ['anyFile'];
uploadOptions = {};
storeOptions = {};
jest.spyOn(upload_1.Upload.prototype, 'multiupload').mockImplementation(function () { return Promise.resolve(); });
return [4 /*yield*/, client.multiupload(files, uploadOptions, storeOptions)];
case 1:
_a.sent();
expect(upload_1.Upload.prototype.setSession).toHaveBeenCalledWith({
apikey: defaultApikey,
urls: sessionURls,
});
expect(upload_1.Upload.prototype.multiupload).toHaveBeenCalledWith(files);
return [2 /*return*/];
}
});
}); });
it('should emit error for multiupload', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var client, files, uploadOptions, storeOptions, token, mockOnError, test;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
client = new client_1.Client(defaultApikey);
files = ['anyFile'];
uploadOptions = {};
storeOptions = {};
token = {};
jest.spyOn(upload_1.Upload.prototype, 'multiupload').mockImplementation(function () { return Promise.resolve(); });
mockOnError = jest.fn().mockName('mockOnError');
test = new filestack_error_1.FilestackError('test');
client.on('upload.error', mockOnError);
jest.spyOn(upload_1.Upload.prototype, 'on').mockImplementation(function (name, cb, ctx) { return cb(test); });
return [4 /*yield*/, client.multiupload(files, uploadOptions, storeOptions, token, defaultSecurity)];
case 1:
_a.sent();
expect(mockOnError).toHaveBeenCalledWith(test);
return [2 /*return*/];
}
});
}); });
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvY2xpZW50LnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsd0RBQXNEO0FBQ3RELHNDQUFxQztBQUNyQyxtQ0FBa0M7QUFDbEMscUNBQTBDO0FBQzFDLDhDQUE2QztBQUM3QyxtQ0FBa0M7QUFDbEMseUNBQXdDO0FBQ3hDLG1DQUF3RDtBQUN4RCxxQ0FBdUM7QUFDdkMsNkNBQTRDO0FBRTVDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBRTdCLFFBQVEsQ0FBQyxRQUFRLEVBQUU7SUFDakIsSUFBTSxhQUFhLEdBQUcsaUJBQWlCLENBQUM7SUFDeEMsSUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUM7SUFDdkMsSUFBTSxlQUFlLEdBQUc7UUFDdEIsTUFBTSxFQUFFLGVBQWU7UUFDdkIsU0FBUyxFQUFFLGtCQUFrQjtLQUM5QixDQUFDO0lBRUYsSUFBTSxXQUFXLEdBQUcsZUFBTSxDQUFDLElBQUksQ0FBQztJQUNoQyxJQUFNLGNBQWMsR0FBRztRQUNyQixNQUFNLEVBQUUsYUFBYTtRQUNyQixJQUFJLEVBQUUsV0FBVztLQUNsQixDQUFDO0lBRUYsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1FBQ3ZDLElBQU0sTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3QixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsY0FBYyxDQUFDLGVBQU0sQ0FBQyxDQUFDO0lBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLCtDQUErQyxFQUFFO1FBQ2xELE1BQU0sQ0FBQztZQUNMLE9BQU8sSUFBSSxlQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7SUFDekUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsOERBQThELEVBQUU7UUFDakUsSUFBTSxPQUFPLEdBQUc7WUFDZCxRQUFRLEVBQUU7Z0JBQ1IsTUFBTSxFQUFFLGVBQWU7Z0JBQ3ZCLFNBQVMsRUFBRSxFQUFFO2FBQ2Q7U0FDRixDQUFDO1FBQ0YsTUFBTSxDQUFDO1lBQ0wsT0FBTyxJQUFJLGVBQU0sQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLDREQUE0RCxDQUFDLENBQUM7SUFDM0UsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsK0NBQStDLEVBQUU7UUFDbEQsSUFBTSxPQUFPLEdBQUc7WUFDZCxRQUFRLEVBQUUsZUFBZTtTQUMxQixDQUFDO1FBQ0YsSUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVELE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGtDQUFrQyxFQUFFO1FBQ3JDLElBQU0sT0FBTyxHQUFHO1lBQ2QsS0FBSyxFQUFFLGVBQWU7U0FDdkIsQ0FBQztRQUNGLElBQU0sTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25ELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDRDQUE0QyxFQUFFOzs7OztvQkFDekMsTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUNuQyxTQUFTLEdBQUcsU0FBUyxDQUFDO29CQUM1QixxQkFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFBOztvQkFBOUIsU0FBOEIsQ0FBQztvQkFFL0IsTUFBTSxDQUFDLG1CQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDOzs7O1NBQ3RFLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRTs7Ozs7b0JBQ3hDLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDbkMsT0FBTyxHQUFHO3dCQUNkLE1BQU0sRUFBRSxJQUFJO3FCQUNiLENBQUM7b0JBRUYscUJBQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLGVBQWUsQ0FBQyxFQUFBOztvQkFBOUQsU0FBOEQsQ0FBQztvQkFDL0QsTUFBTSxDQUFDLGVBQVEsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDOzs7O1NBQ2hHLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywrQkFBK0IsRUFBRTtRQUNsQyxJQUFNLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN6QyxJQUFNLGFBQWEsR0FBRztZQUNwQixJQUFJLEVBQUUsSUFBSTtTQUNYLENBQUM7UUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRTdCLE1BQU0sQ0FBQyxlQUFNLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDN0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsZ0NBQWdDLEVBQUU7UUFDbkMsSUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDekMsSUFBTSxjQUFjLEdBQUc7WUFDckIsRUFBRSxFQUFFLGFBQWE7U0FDbEIsQ0FBQztRQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRTlDLE1BQU0sQ0FBQyxpQkFBTyxDQUFDLENBQUMsb0JBQW9CLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUN0RixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRTs7Ozs7b0JBQzlCLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDekMscUJBQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsZUFBZSxDQUFDLEVBQUE7O29CQUFuRCxTQUFtRCxDQUFDO29CQUNwRCxNQUFNLENBQUMsYUFBTSxDQUFDLENBQUMsb0JBQW9CLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7Ozs7U0FDNUYsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG1DQUFtQyxFQUFFOzs7OztvQkFDaEMsTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUN6QyxxQkFBTSxNQUFNLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxlQUFlLENBQUMsRUFBQTs7b0JBQTNELFNBQTJELENBQUM7b0JBRTVELE1BQU0sQ0FBQyxhQUFNLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQzs7OztTQUMzRixDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkJBQTZCLEVBQUU7Ozs7O29CQUMxQixNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ25DLEdBQUcsR0FBRyw2QkFBNkIsQ0FBQztvQkFDcEMsT0FBTyxHQUFHLEVBQUUsQ0FBQztvQkFDYixLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUNYLFVBQVUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztvQkFDN0IsT0FBTyxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO29CQUM1QixXQUFXLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ25DLHFCQUFNLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLEVBQUE7O29CQUE1RixTQUE0RixDQUFDO29CQUU3RixNQUFNLENBQUMsZ0JBQVEsQ0FBQyxDQUFDLG9CQUFvQixDQUFDO3dCQUNwQyxPQUFPLEVBQUUsY0FBYzt3QkFDdkIsR0FBRyxLQUFBO3dCQUNILFdBQVcsRUFBRSxPQUFPO3dCQUNwQixLQUFLLE9BQUE7d0JBQ0wsUUFBUSxFQUFFLGVBQWU7d0JBQ3pCLFVBQVUsWUFBQTt3QkFDVixPQUFPLFNBQUE7d0JBQ1AsV0FBVyxhQUFBO3FCQUNaLENBQUMsQ0FBQzs7OztTQUNKLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRTs7Ozs7b0JBQ2hDLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDbkMsZUFBZSxHQUFHLEVBQUUsQ0FBQztvQkFFM0IscUJBQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLGVBQWUsQ0FBQyxFQUFBOztvQkFBdEUsU0FBc0UsQ0FBQztvQkFDdkUsTUFBTSxDQUFDLGVBQVEsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDOzs7O1NBQ3hHLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRTtRQUM3QyxJQUFNLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN6QyxJQUFNLGdCQUFnQixHQUFHO1lBQ3ZCLElBQUksRUFBRTtnQkFDSixNQUFNLEVBQUUsQ0FBQzthQUNWO1NBQ0YsQ0FBQztRQUNGLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQztRQUNqQixNQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN2RCxNQUFNLENBQUMscUJBQVMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0YsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkNBQTZDLEVBQUU7UUFDaEQsSUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDekMsSUFBTSxnQkFBZ0IsR0FBRztZQUN2QixJQUFJLEVBQUU7Z0JBQ0osTUFBTSxFQUFFLENBQUM7YUFDVjtTQUNGLENBQUM7UUFDRixNQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxxQkFBUyxDQUFDLENBQUMsb0JBQW9CLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywrQkFBK0IsRUFBRTs7Ozs7b0JBQzVCLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDbkMsSUFBSSxHQUFHLFNBQVMsQ0FBQztvQkFDakIsYUFBYSxHQUFHLEVBQUUsQ0FBQztvQkFDbkIsWUFBWSxHQUFHLEVBQUUsQ0FBQztvQkFDbEIsS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFFakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFNLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLGNBQU0sT0FBQSxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQWpCLENBQWlCLENBQUMsQ0FBQztvQkFFbkYscUJBQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLEVBQUE7O29CQUE5RSxTQUE4RSxDQUFDO29CQUUvRSxNQUFNLENBQUMsZUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQzt3QkFDdkQsTUFBTSxFQUFFLGFBQWE7d0JBQ3JCLElBQUksRUFBRSxXQUFXO3FCQUNsQixDQUFDLENBQUM7b0JBRUgsTUFBTSxDQUFDLGVBQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzlELE1BQU0sQ0FBQyxlQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUMzRSxNQUFNLENBQUMsZUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7Ozs7U0FDdkUsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDZDQUE2QyxFQUFFOzs7OztvQkFDMUMsTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUNuQyxJQUFJLEdBQUcsU0FBUyxDQUFDO29CQUNqQixhQUFhLEdBQUc7d0JBQ3BCLE9BQU8sRUFBRSxLQUFLO3FCQUNmLENBQUM7b0JBQ0ksWUFBWSxHQUFHLEVBQUUsQ0FBQztvQkFDbEIsS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFFakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFNLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLGNBQU0sT0FBQSxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQWpCLENBQWlCLENBQUMsQ0FBQztvQkFFbkYscUJBQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLEVBQUE7O29CQUE5RSxTQUE4RSxDQUFDO29CQUUvRSxNQUFNLENBQUMsZUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQzt3QkFDdkQsTUFBTSxFQUFFLGFBQWE7d0JBQ3JCLElBQUksRUFBRSxXQUFXO3FCQUNsQixDQUFDLENBQUM7b0JBRUgsTUFBTSxDQUFDLGVBQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzlELE1BQU0sQ0FBQyxlQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUMzRSxNQUFNLENBQUMsZUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDOzs7O1NBQ25GLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwREFBMEQsRUFBRTs7Ozs7b0JBQ3ZELE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDbkMsSUFBSSxHQUFHLFNBQVMsQ0FBQztvQkFDakIsYUFBYSxHQUFHLEVBQUUsQ0FBQztvQkFDbkIsWUFBWSxHQUFHLEVBQUUsQ0FBQztvQkFFeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFNLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLGNBQU0sT0FBQSxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQWpCLENBQWlCLENBQUMsQ0FBQztvQkFFbkYscUJBQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLFlBQVksQ0FBQyxFQUFBOztvQkFBdEQsU0FBc0QsQ0FBQztvQkFFdkQsTUFBTSxDQUFDLGVBQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsb0JBQW9CLENBQUM7d0JBQ3ZELE1BQU0sRUFBRSxhQUFhO3dCQUNyQixJQUFJLEVBQUUsV0FBVztxQkFDbEIsQ0FBQyxDQUFDO29CQUVILE1BQU0sQ0FBQyxlQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQzs7OztTQUN2RSxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsbUJBQW1CLEVBQUU7Ozs7O29CQUNoQixNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ25DLElBQUksR0FBRyxTQUFTLENBQUM7b0JBQ2pCLGFBQWEsR0FBRyxFQUFFLENBQUM7b0JBQ25CLFlBQVksR0FBRyxFQUFFLENBQUM7b0JBQ2xCLEtBQUssR0FBRyxFQUFFLENBQUM7b0JBQ1gsV0FBVyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBRWhELElBQUksR0FBRyxJQUFJLGdDQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBRXhDLE1BQU0sQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO29CQUV2QyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsa0JBQWtCLENBQUMsVUFBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBVSxPQUFBLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBUixDQUFRLENBQUMsQ0FBQztvQkFFeEYscUJBQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLEVBQUE7O29CQUE5RSxTQUE4RSxDQUFDO29CQUUvRSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7Ozs7U0FDaEQsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9DQUFvQyxFQUFFOzs7OztvQkFDakMsTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUNuQyxLQUFLLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDcEIsYUFBYSxHQUFHLEVBQUUsQ0FBQztvQkFDbkIsWUFBWSxHQUFHLEVBQUUsQ0FBQztvQkFDbEIsS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFFakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFNLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLGNBQU0sT0FBQSxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQWpCLENBQWlCLENBQUMsQ0FBQztvQkFFeEYscUJBQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLEVBQUE7O29CQUFwRixTQUFvRixDQUFDO29CQUVyRixNQUFNLENBQUMsZUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQzt3QkFDdkQsTUFBTSxFQUFFLGFBQWE7d0JBQ3JCLElBQUksRUFBRSxXQUFXO3FCQUNsQixDQUFDLENBQUM7b0JBRUgsTUFBTSxDQUFDLGVBQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzlELE1BQU0sQ0FBQyxlQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUMzRSxNQUFNLENBQUMsZUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7OztTQUNsRSxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsbURBQW1ELEVBQUU7Ozs7O29CQUNoRCxNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ25DLEtBQUssR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNwQixhQUFhLEdBQUcsRUFBRSxDQUFDO29CQUNuQixZQUFZLEdBQUcsRUFBRSxDQUFDO29CQUV4QixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQU0sQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUMsa0JBQWtCLENBQUMsY0FBTSxPQUFBLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBakIsQ0FBaUIsQ0FBQyxDQUFDO29CQUV4RixxQkFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsWUFBWSxDQUFDLEVBQUE7O29CQUE1RCxTQUE0RCxDQUFDO29CQUU3RCxNQUFNLENBQUMsZUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQzt3QkFDdkQsTUFBTSxFQUFFLGFBQWE7d0JBQ3JCLElBQUksRUFBRSxXQUFXO3FCQUNsQixDQUFDLENBQUM7b0JBRUgsTUFBTSxDQUFDLGVBQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7Ozs7U0FDbEUsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG1DQUFtQyxFQUFFOzs7OztvQkFDaEMsTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUNuQyxLQUFLLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDcEIsYUFBYSxHQUFHLEVBQUUsQ0FBQztvQkFDbkIsWUFBWSxHQUFHLEVBQUUsQ0FBQztvQkFDbEIsS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFFakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFNLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLGNBQU0sT0FBQSxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQWpCLENBQWlCLENBQUMsQ0FBQztvQkFFbEYsV0FBVyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBRWhELElBQUksR0FBRyxJQUFJLGdDQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBRXhDLE1BQU0sQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO29CQUV2QyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsa0JBQWtCLENBQUMsVUFBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBVSxPQUFBLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBUixDQUFRLENBQUMsQ0FBQztvQkFFeEYscUJBQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLEVBQUE7O29CQUFwRixTQUFvRixDQUFDO29CQUVyRixNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7Ozs7U0FDaEQsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJmaWxlIjoibGliL2NsaWVudC5zcGVjLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOCBieSBGaWxlc3RhY2suXG4gKiBTb21lIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IEZpbGVzdGFja0Vycm9yIH0gZnJvbSAnLi8uLi9maWxlc3RhY2tfZXJyb3InO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi8uLi9jb25maWcnO1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi9jbGllbnQnO1xuaW1wb3J0IHsgQ2xvdWRDbGllbnQgfSBmcm9tICcuL2FwaS9jbG91ZCc7XG5pbXBvcnQgeyBVcGxvYWQgfSBmcm9tICcuL2FwaS91cGxvYWQvdXBsb2FkJztcbmltcG9ydCB7IHBpY2tlciB9IGZyb20gJy4vcGlja2VyJztcbmltcG9ydCB7IHByZXZpZXcgfSBmcm9tICcuL2FwaS9wcmV2aWV3JztcbmltcG9ydCB7IG1ldGFkYXRhLCByZW1vdmUsIHJldHJpZXZlIH0gZnJvbSAnLi9hcGkvZmlsZSc7XG5pbXBvcnQgeyBzdG9yZVVSTCB9IGZyb20gJy4vYXBpL3N0b3JlJztcbmltcG9ydCB7IHRyYW5zZm9ybSB9IGZyb20gJy4vYXBpL3RyYW5zZm9ybSc7XG5cbmplc3QubW9jaygnLi9hcGkvdXBsb2FkL3VwbG9hZCcpO1xuamVzdC5tb2NrKCcuL2FwaS9jbG91ZCcpO1xuamVzdC5tb2NrKCcuL2FwaS9maWxlJyk7XG5qZXN0Lm1vY2soJy4vYXBpL3N0b3JlJyk7XG5qZXN0Lm1vY2soJy4vcGlja2VyJyk7XG5qZXN0Lm1vY2soJy4vYXBpL3ByZXZpZXcnKTtcbmplc3QubW9jaygnLi9hcGkvdHJhbnNmb3JtJyk7XG5cbmRlc2NyaWJlKCdjbGllbnQnLCAoKSA9PiB7XG4gIGNvbnN0IGRlZmF1bHRBcGlrZXkgPSAnRVhBTVBMRV9BUElfS0VZJztcbiAgY29uc3QgZGVmYXVsdEhhbmRsZSA9ICdFWEFNUExFX0hBTkRMRSc7XG4gIGNvbnN0IGRlZmF1bHRTZWN1cml0eSA9IHtcbiAgICBwb2xpY3k6ICdleGFtcGxlUG9saWN5JyxcbiAgICBzaWduYXR1cmU6ICdleGFtcGxlU2lnbmF0dXJlJyxcbiAgfTtcblxuICBjb25zdCBzZXNzaW9uVVJscyA9IGNvbmZpZy51cmxzO1xuICBjb25zdCBkZWZhdWx0U2Vzc2lvbiA9IHtcbiAgICBhcGlrZXk6IGRlZmF1bHRBcGlrZXksXG4gICAgdXJsczogc2Vzc2lvblVSbHMsXG4gIH07XG5cbiAgaXQoJ3Nob3VsZCBwcm9wZXJseSBpbnN0YW50aWF0ZSBDbGllbnQnLCAoKSA9PiB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IENsaWVudChkZWZhdWx0QXBpa2V5KTtcbiAgICBleHBlY3QoY2xpZW50KS50b0JlRGVmaW5lZCgpO1xuICAgIGV4cGVjdChjbGllbnQpLnRvQmVJbnN0YW5jZU9mKENsaWVudCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3IgaWYgYXBpIGtleSBub3QgcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+IHtcbiAgICAgIHJldHVybiBuZXcgQ2xpZW50KCcnKTtcbiAgICB9KS50b1Rocm93KCdBbiBhcGlrZXkgaXMgcmVxdWlyZWQgdG8gaW5pdGlhbGl6ZSB0aGUgRmlsZXN0YWNrIGNsaWVudCcpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGFuIGVycm9yIGlmIHByb3ZpZGVkIHNlY3VyaXR5IHdpdGhvdXQgc2lnbmF0dXJlJywgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBzZWN1cml0eToge1xuICAgICAgICBwb2xpY3k6ICdleGFtcGxlUG9saWN5JyxcbiAgICAgICAgc2lnbmF0dXJlOiAnJyxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBDbGllbnQoZGVmYXVsdEFwaWtleSwgb3B0aW9ucyk7XG4gICAgfSkudG9UaHJvdygnQm90aCBwb2xpY3kgYW5kIHNpZ25hdHVyZSBhcmUgcmVxdWlyZWQgZm9yIGNsaWVudCBzZWN1cml0eScpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHBhc3MgcG9saWN5ICYgc2lnbmF0dXJlIHRvIHRoZSBzZXNzaW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBzZWN1cml0eTogZGVmYXVsdFNlY3VyaXR5LFxuICAgIH07XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IENsaWVudChkZWZhdWx0QXBpa2V5LCBvcHRpb25zKTtcbiAgICBleHBlY3QoY2xpZW50LnNlc3Npb24ucG9saWN5KS50b0JlKG9wdGlvbnMuc2VjdXJpdHkucG9saWN5KTtcbiAgICBleHBlY3QoY2xpZW50LnNlc3Npb24uc2lnbmF0dXJlKS50b0JlKG9wdGlvbnMuc2VjdXJpdHkuc2lnbmF0dXJlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBwYXNzIGNuYW1lIHRvIHRoZSBzZXNzaW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBjbmFtZTogJ3Rlc3RDbmFtZS5jb20nLFxuICAgIH07XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IENsaWVudChkZWZhdWx0QXBpa2V5LCBvcHRpb25zKTtcbiAgICBleHBlY3QoY2xpZW50LnNlc3Npb24uY25hbWUpLnRvQmUob3B0aW9ucy5jbmFtZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgYWJsZSB0byBsb2dvdXQgZm9yIHByb3ZpZWQgY2xvdWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IENsaWVudChkZWZhdWx0QXBpa2V5KTtcbiAgICBjb25zdCBjbG91ZE5hbWUgPSAnZHJvcGJveCc7XG4gICAgYXdhaXQgY2xpZW50LmxvZ291dChjbG91ZE5hbWUpO1xuXG4gICAgZXhwZWN0KENsb3VkQ2xpZW50LnByb3RvdHlwZS5sb2dvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNsb3VkTmFtZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2V0IG1ldGFkYXRhIGZvciBhIHByb3ZpZGVkIGhhbmRsZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KGRlZmF1bHRBcGlrZXkpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBzaGEyMjQ6IHRydWUsXG4gICAgfTtcblxuICAgIGF3YWl0IGNsaWVudC5tZXRhZGF0YShkZWZhdWx0SGFuZGxlLCBvcHRpb25zLCBkZWZhdWx0U2VjdXJpdHkpO1xuICAgIGV4cGVjdChtZXRhZGF0YSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZGVmYXVsdFNlc3Npb24sIGRlZmF1bHRIYW5kbGUsIG9wdGlvbnMsIGRlZmF1bHRTZWN1cml0eSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgYWJsZSB0byBvcGVuIHBpY2tlcicsICgpID0+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KGRlZmF1bHRBcGlrZXkpO1xuICAgIGNvbnN0IHBpY2tlck9wdGlvbnMgPSB7XG4gICAgICBsYW5nOiAnZGUnLFxuICAgIH07XG4gICAgY2xpZW50LnBpY2tlcihwaWNrZXJPcHRpb25zKTtcblxuICAgIGV4cGVjdChwaWNrZXIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNsaWVudCwgcGlja2VyT3B0aW9ucyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgYWJsZSB0byBvcGVuIHByZXZpZXcnLCAoKSA9PiB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IENsaWVudChkZWZhdWx0QXBpa2V5KTtcbiAgICBjb25zdCBwcmV2aWV3T3B0aW9ucyA9IHtcbiAgICAgIGlkOiAndGVzdEVsZW1lbnQnLFxuICAgIH07XG4gICAgY2xpZW50LnByZXZpZXcoZGVmYXVsdEhhbmRsZSwgcHJldmlld09wdGlvbnMpO1xuXG4gICAgZXhwZWN0KHByZXZpZXcpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGRlZmF1bHRTZXNzaW9uLCBkZWZhdWx0SGFuZGxlLCBwcmV2aWV3T3B0aW9ucyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgYWJsZSB0byByZW1vdmUgaGFuZGxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBDbGllbnQoZGVmYXVsdEFwaWtleSk7XG4gICAgYXdhaXQgY2xpZW50LnJlbW92ZShkZWZhdWx0SGFuZGxlLCBkZWZhdWx0U2VjdXJpdHkpO1xuICAgIGV4cGVjdChyZW1vdmUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGRlZmF1bHRTZXNzaW9uLCBkZWZhdWx0SGFuZGxlLCBmYWxzZSwgZGVmYXVsdFNlY3VyaXR5KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBiZSBhYmxlIHRvIHJlbW92ZSBtZXRhZGF0YScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KGRlZmF1bHRBcGlrZXkpO1xuICAgIGF3YWl0IGNsaWVudC5yZW1vdmVNZXRhZGF0YShkZWZhdWx0SGFuZGxlLCBkZWZhdWx0U2VjdXJpdHkpO1xuXG4gICAgZXhwZWN0KHJlbW92ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZGVmYXVsdFNlc3Npb24sIGRlZmF1bHRIYW5kbGUsIHRydWUsIGRlZmF1bHRTZWN1cml0eSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgYWJsZSB0byBzdG9yZSB1cmwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IENsaWVudChkZWZhdWx0QXBpa2V5KTtcbiAgICBjb25zdCB1cmwgPSAnaHR0cDovL2V4YW1wbGUuY29tL2ltZzMuanBnJztcbiAgICBjb25zdCBvcHRpb25zID0ge307XG4gICAgY29uc3QgdG9rZW4gPSB7fTtcbiAgICBjb25zdCB1cGxvYWRUYWdzID0geyB0ZXN0OiAnMTIzJyB9O1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7ICd0ZXN0JzogJzEyMycgfTtcbiAgICBjb25zdCB3b3JrZmxvd0lkcyA9IFsnMTIzJywgJzMyMSddO1xuICAgIGF3YWl0IGNsaWVudC5zdG9yZVVSTCh1cmwsIG9wdGlvbnMsIHRva2VuLCBkZWZhdWx0U2VjdXJpdHksIHVwbG9hZFRhZ3MsaGVhZGVycywgd29ya2Zsb3dJZHMpO1xuXG4gICAgZXhwZWN0KHN0b3JlVVJMKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh7XG4gICAgICBzZXNzaW9uOiBkZWZhdWx0U2Vzc2lvbixcbiAgICAgIHVybCxcbiAgICAgIHN0b3JlUGFyYW1zOiBvcHRpb25zLFxuICAgICAgdG9rZW4sXG4gICAgICBzZWN1cml0eTogZGVmYXVsdFNlY3VyaXR5LFxuICAgICAgdXBsb2FkVGFncyxcbiAgICAgIGhlYWRlcnMsXG4gICAgICB3b3JrZmxvd0lkcyxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBiZSBhYmxlIHRvIHJldHJpZXZlIGhhbmRsZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KGRlZmF1bHRBcGlrZXkpO1xuICAgIGNvbnN0IHJldHJpZXZlT3B0aW9ucyA9IHt9O1xuXG4gICAgYXdhaXQgY2xpZW50LnJldHJpZXZlKGRlZmF1bHRIYW5kbGUsIHJldHJpZXZlT3B0aW9ucywgZGVmYXVsdFNlY3VyaXR5KTtcbiAgICBleHBlY3QocmV0cmlldmUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGRlZmF1bHRTZXNzaW9uLCBkZWZhdWx0SGFuZGxlLCByZXRyaWV2ZU9wdGlvbnMsIGRlZmF1bHRTZWN1cml0eSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgYWJsZSB0byB0cmFuc2Zvcm0gdXJsIHdpdGggYjY0JywgKCkgPT4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBDbGllbnQoZGVmYXVsdEFwaWtleSk7XG4gICAgY29uc3QgdHJhbnNmb3JtT3B0aW9ucyA9IHtcbiAgICAgIGJsdXI6IHtcbiAgICAgICAgYW1vdW50OiA1LFxuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IGI2NCA9IHRydWU7XG4gICAgY2xpZW50LnRyYW5zZm9ybShkZWZhdWx0SGFuZGxlLCB0cmFuc2Zvcm1PcHRpb25zLCBiNjQpO1xuICAgIGV4cGVjdCh0cmFuc2Zvcm0pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGRlZmF1bHRTZXNzaW9uLCBkZWZhdWx0SGFuZGxlLCB0cmFuc2Zvcm1PcHRpb25zLCBiNjQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJlIGFibGUgdG8gdHJhbnNmb3JtIHVybCB3aXRob3V0IGI2NCcsICgpID0+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KGRlZmF1bHRBcGlrZXkpO1xuICAgIGNvbnN0IHRyYW5zZm9ybU9wdGlvbnMgPSB7XG4gICAgICBibHVyOiB7XG4gICAgICAgIGFtb3VudDogNSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjbGllbnQudHJhbnNmb3JtKGRlZmF1bHRIYW5kbGUsIHRyYW5zZm9ybU9wdGlvbnMpO1xuICAgIGV4cGVjdCh0cmFuc2Zvcm0pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGRlZmF1bHRTZXNzaW9uLCBkZWZhdWx0SGFuZGxlLCB0cmFuc2Zvcm1PcHRpb25zLCBmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgYWJsZSB0byB1cGxvYWQgZmlsZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KGRlZmF1bHRBcGlrZXkpO1xuICAgIGNvbnN0IGZpbGUgPSAnYW55RmlsZSc7XG4gICAgY29uc3QgdXBsb2FkT3B0aW9ucyA9IHt9O1xuICAgIGNvbnN0IHN0b3JlT3B0aW9ucyA9IHt9O1xuICAgIGNvbnN0IHRva2VuID0ge307XG5cbiAgICBqZXN0LnNweU9uKFVwbG9hZC5wcm90b3R5cGUsICd1cGxvYWQnKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkpO1xuXG4gICAgYXdhaXQgY2xpZW50LnVwbG9hZChmaWxlLCB1cGxvYWRPcHRpb25zLCBzdG9yZU9wdGlvbnMsIHRva2VuLCBkZWZhdWx0U2VjdXJpdHkpO1xuXG4gICAgZXhwZWN0KFVwbG9hZC5wcm90b3R5cGUuc2V0U2Vzc2lvbikudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgYXBpa2V5OiBkZWZhdWx0QXBpa2V5LFxuICAgICAgdXJsczogc2Vzc2lvblVSbHMsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoVXBsb2FkLnByb3RvdHlwZS5zZXRUb2tlbikudG9IYXZlQmVlbkNhbGxlZFdpdGgodG9rZW4pO1xuICAgIGV4cGVjdChVcGxvYWQucHJvdG90eXBlLnNldFNlY3VyaXR5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChkZWZhdWx0U2VjdXJpdHkpO1xuICAgIGV4cGVjdChVcGxvYWQucHJvdG90eXBlLnVwbG9hZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZmlsZSwgdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBiZSBhYmxlIHRvIHVwbG9hZCBmaWxlIHdpdGggYWx0IHRleHQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IENsaWVudChkZWZhdWx0QXBpa2V5KTtcbiAgICBjb25zdCBmaWxlID0gJ2FueUZpbGUnO1xuICAgIGNvbnN0IHVwbG9hZE9wdGlvbnMgPSB7XG4gICAgICBhbHRUZXh0OiAnYWx0JyxcbiAgICB9O1xuICAgIGNvbnN0IHN0b3JlT3B0aW9ucyA9IHt9O1xuICAgIGNvbnN0IHRva2VuID0ge307XG5cbiAgICBqZXN0LnNweU9uKFVwbG9hZC5wcm90b3R5cGUsICd1cGxvYWQnKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkpO1xuXG4gICAgYXdhaXQgY2xpZW50LnVwbG9hZChmaWxlLCB1cGxvYWRPcHRpb25zLCBzdG9yZU9wdGlvbnMsIHRva2VuLCBkZWZhdWx0U2VjdXJpdHkpO1xuXG4gICAgZXhwZWN0KFVwbG9hZC5wcm90b3R5cGUuc2V0U2Vzc2lvbikudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgYXBpa2V5OiBkZWZhdWx0QXBpa2V5LFxuICAgICAgdXJsczogc2Vzc2lvblVSbHMsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoVXBsb2FkLnByb3RvdHlwZS5zZXRUb2tlbikudG9IYXZlQmVlbkNhbGxlZFdpdGgodG9rZW4pO1xuICAgIGV4cGVjdChVcGxvYWQucHJvdG90eXBlLnNldFNlY3VyaXR5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChkZWZhdWx0U2VjdXJpdHkpO1xuICAgIGV4cGVjdChVcGxvYWQucHJvdG90eXBlLnVwbG9hZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZmlsZSwgdXBsb2FkT3B0aW9ucy5hbHRUZXh0KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBiZSBhYmxlIHRvIHVwbG9hZCBmaWxlIHdpdGhvdXQgdG9rZW4gYW5kIHNlY3VyaXR5JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBDbGllbnQoZGVmYXVsdEFwaWtleSk7XG4gICAgY29uc3QgZmlsZSA9ICdhbnlGaWxlJztcbiAgICBjb25zdCB1cGxvYWRPcHRpb25zID0ge307XG4gICAgY29uc3Qgc3RvcmVPcHRpb25zID0ge307XG5cbiAgICBqZXN0LnNweU9uKFVwbG9hZC5wcm90b3R5cGUsICd1cGxvYWQnKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkpO1xuXG4gICAgYXdhaXQgY2xpZW50LnVwbG9hZChmaWxlLCB1cGxvYWRPcHRpb25zLCBzdG9yZU9wdGlvbnMpO1xuXG4gICAgZXhwZWN0KFVwbG9hZC5wcm90b3R5cGUuc2V0U2Vzc2lvbikudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgYXBpa2V5OiBkZWZhdWx0QXBpa2V5LFxuICAgICAgdXJsczogc2Vzc2lvblVSbHMsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoVXBsb2FkLnByb3RvdHlwZS51cGxvYWQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGZpbGUsIHVuZGVmaW5lZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZW1pdCBlcnJvcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KGRlZmF1bHRBcGlrZXkpO1xuICAgIGNvbnN0IGZpbGUgPSAnYW55RmlsZSc7XG4gICAgY29uc3QgdXBsb2FkT3B0aW9ucyA9IHt9O1xuICAgIGNvbnN0IHN0b3JlT3B0aW9ucyA9IHt9O1xuICAgIGNvbnN0IHRva2VuID0ge307XG4gICAgY29uc3QgbW9ja09uRXJyb3IgPSBqZXN0LmZuKCkubW9ja05hbWUoJ21vY2tPbkVycm9yJyk7XG5cbiAgICBjb25zdCB0ZXN0ID0gbmV3IEZpbGVzdGFja0Vycm9yKCd0ZXN0Jyk7XG5cbiAgICBjbGllbnQub24oJ3VwbG9hZC5lcnJvcicsIG1vY2tPbkVycm9yKTtcblxuICAgIGplc3Quc3B5T24oVXBsb2FkLnByb3RvdHlwZSwgJ29uJykubW9ja0ltcGxlbWVudGF0aW9uKChuYW1lLCBjYiwgY3R4KTogYW55ID0+IGNiKHRlc3QpKTtcblxuICAgIGF3YWl0IGNsaWVudC51cGxvYWQoZmlsZSwgdXBsb2FkT3B0aW9ucywgc3RvcmVPcHRpb25zLCB0b2tlbiwgZGVmYXVsdFNlY3VyaXR5KTtcblxuICAgIGV4cGVjdChtb2NrT25FcnJvcikudG9IYXZlQmVlbkNhbGxlZFdpdGgodGVzdCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgYWJsZSB0byBtdWx0aXVwbG9hZCBmaWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBDbGllbnQoZGVmYXVsdEFwaWtleSk7XG4gICAgY29uc3QgZmlsZXMgPSBbJ2FueUZpbGUnXTtcbiAgICBjb25zdCB1cGxvYWRPcHRpb25zID0ge307XG4gICAgY29uc3Qgc3RvcmVPcHRpb25zID0ge307XG4gICAgY29uc3QgdG9rZW4gPSB7fTtcblxuICAgIGplc3Quc3B5T24oVXBsb2FkLnByb3RvdHlwZSwgJ211bHRpdXBsb2FkJykubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IFByb21pc2UucmVzb2x2ZSgpKTtcblxuICAgIGF3YWl0IGNsaWVudC5tdWx0aXVwbG9hZChmaWxlcywgdXBsb2FkT3B0aW9ucywgc3RvcmVPcHRpb25zLCB0b2tlbiwgZGVmYXVsdFNlY3VyaXR5KTtcblxuICAgIGV4cGVjdChVcGxvYWQucHJvdG90eXBlLnNldFNlc3Npb24pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgIGFwaWtleTogZGVmYXVsdEFwaWtleSxcbiAgICAgIHVybHM6IHNlc3Npb25VUmxzLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KFVwbG9hZC5wcm90b3R5cGUuc2V0VG9rZW4pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHRva2VuKTtcbiAgICBleHBlY3QoVXBsb2FkLnByb3RvdHlwZS5zZXRTZWN1cml0eSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZGVmYXVsdFNlY3VyaXR5KTtcbiAgICBleHBlY3QoVXBsb2FkLnByb3RvdHlwZS5tdWx0aXVwbG9hZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZmlsZXMpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNhbGwgbXVsdGl1cGxvYWQgd2l0aG91dCBzZWN1cml0eSBvciB0b2tlbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KGRlZmF1bHRBcGlrZXkpO1xuICAgIGNvbnN0IGZpbGVzID0gWydhbnlGaWxlJ107XG4gICAgY29uc3QgdXBsb2FkT3B0aW9ucyA9IHt9O1xuICAgIGNvbnN0IHN0b3JlT3B0aW9ucyA9IHt9O1xuXG4gICAgamVzdC5zcHlPbihVcGxvYWQucHJvdG90eXBlLCAnbXVsdGl1cGxvYWQnKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkpO1xuXG4gICAgYXdhaXQgY2xpZW50Lm11bHRpdXBsb2FkKGZpbGVzLCB1cGxvYWRPcHRpb25zLCBzdG9yZU9wdGlvbnMpO1xuXG4gICAgZXhwZWN0KFVwbG9hZC5wcm90b3R5cGUuc2V0U2Vzc2lvbikudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgYXBpa2V5OiBkZWZhdWx0QXBpa2V5LFxuICAgICAgdXJsczogc2Vzc2lvblVSbHMsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoVXBsb2FkLnByb3RvdHlwZS5tdWx0aXVwbG9hZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZmlsZXMpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGVtaXQgZXJyb3IgZm9yIG11bHRpdXBsb2FkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBDbGllbnQoZGVmYXVsdEFwaWtleSk7XG4gICAgY29uc3QgZmlsZXMgPSBbJ2FueUZpbGUnXTtcbiAgICBjb25zdCB1cGxvYWRPcHRpb25zID0ge307XG4gICAgY29uc3Qgc3RvcmVPcHRpb25zID0ge307XG4gICAgY29uc3QgdG9rZW4gPSB7fTtcblxuICAgIGplc3Quc3B5T24oVXBsb2FkLnByb3RvdHlwZSwgJ211bHRpdXBsb2FkJykubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IFByb21pc2UucmVzb2x2ZSgpKTtcblxuICAgIGNvbnN0IG1vY2tPbkVycm9yID0gamVzdC5mbigpLm1vY2tOYW1lKCdtb2NrT25FcnJvcicpO1xuXG4gICAgY29uc3QgdGVzdCA9IG5ldyBGaWxlc3RhY2tFcnJvcigndGVzdCcpO1xuXG4gICAgY2xpZW50Lm9uKCd1cGxvYWQuZXJyb3InLCBtb2NrT25FcnJvcik7XG5cbiAgICBqZXN0LnNweU9uKFVwbG9hZC5wcm90b3R5cGUsICdvbicpLm1vY2tJbXBsZW1lbnRhdGlvbigobmFtZSwgY2IsIGN0eCk6IGFueSA9PiBjYih0ZXN0KSk7XG5cbiAgICBhd2FpdCBjbGllbnQubXVsdGl1cGxvYWQoZmlsZXMsIHVwbG9hZE9wdGlvbnMsIHN0b3JlT3B0aW9ucywgdG9rZW4sIGRlZmF1bHRTZWN1cml0eSk7XG5cbiAgICBleHBlY3QobW9ja09uRXJyb3IpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHRlc3QpO1xuICB9KTtcbn0pO1xuIl19
;