emailjs-imap-client
Version:
JavaScript IMAP client
461 lines (453 loc) • 44.7 kB
JavaScript
"use strict";
var _emailjsImapHandler = require("emailjs-imap-handler");
var _commandParser = require("./command-parser");
var _common = require("./common");
var _envelope = _interopRequireDefault(require("../res/fixtures/envelope"));
var _mimeTortureBodystructure = _interopRequireDefault(require("../res/fixtures/mime-torture-bodystructure"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* eslint-disable no-unused-expressions */
/* eslint-disable no-useless-escape */
describe('parseNAMESPACE', () => {
it('should not succeed for no namespace response', () => {
expect((0, _commandParser.parseNAMESPACE)({
payload: {
NAMESPACE: []
}
})).to.be.false;
});
it('should return single personal namespace', () => {
expect((0, _commandParser.parseNAMESPACE)({
payload: {
NAMESPACE: [{
attributes: [[[{
type: 'STRING',
value: 'INBOX.'
}, {
type: 'STRING',
value: '.'
}]], null, null]
}]
}
})).to.deep.equal({
personal: [{
prefix: 'INBOX.',
delimiter: '.'
}],
users: false,
shared: false
});
});
it('should return single personal, single users, multiple shared', () => {
expect((0, _commandParser.parseNAMESPACE)({
payload: {
NAMESPACE: [{
attributes: [// personal
[[{
type: 'STRING',
value: ''
}, {
type: 'STRING',
value: '/'
}]], // users
[[{
type: 'STRING',
value: '~'
}, {
type: 'STRING',
value: '/'
}]], // shared
[[{
type: 'STRING',
value: '#shared/'
}, {
type: 'STRING',
value: '/'
}], [{
type: 'STRING',
value: '#public/'
}, {
type: 'STRING',
value: '/'
}]]]
}]
}
})).to.deep.equal({
personal: [{
prefix: '',
delimiter: '/'
}],
users: [{
prefix: '~',
delimiter: '/'
}],
shared: [{
prefix: '#shared/',
delimiter: '/'
}, {
prefix: '#public/',
delimiter: '/'
}]
});
});
it('should handle NIL namespace hierarchy delim', () => {
expect((0, _commandParser.parseNAMESPACE)({
payload: {
NAMESPACE: [// This specific value is returned by yahoo.co.jp's
// imapgate version 0.7.68_11_1.61475 IMAP server
(0, _emailjsImapHandler.parser)((0, _common.toTypedArray)('* NAMESPACE (("" NIL)) NIL NIL'))]
}
})).to.deep.equal({
personal: [{
prefix: '',
delimiter: null
}],
users: false,
shared: false
});
});
});
describe('parseSELECT', () => {
it('should parse a complete response', () => {
expect((0, _commandParser.parseSELECT)({
code: 'READ-WRITE',
payload: {
EXISTS: [{
nr: 123
}],
FLAGS: [{
attributes: [[{
type: 'ATOM',
value: '\\Answered'
}, {
type: 'ATOM',
value: '\\Flagged'
}]]
}],
OK: [{
code: 'PERMANENTFLAGS',
permanentflags: ['\\Answered', '\\Flagged']
}, {
code: 'UIDVALIDITY',
uidvalidity: '2'
}, {
code: 'UIDNEXT',
uidnext: '38361'
}, {
code: 'HIGHESTMODSEQ',
highestmodseq: '3682918'
}]
}
})).to.deep.equal({
exists: 123,
flags: ['\\Answered', '\\Flagged'],
highestModseq: '3682918',
permanentFlags: ['\\Answered', '\\Flagged'],
readOnly: false,
uidNext: 38361,
uidValidity: 2
});
});
it('should parse response with no modseq', () => {
expect((0, _commandParser.parseSELECT)({
code: 'READ-WRITE',
payload: {
EXISTS: [{
nr: 123
}],
FLAGS: [{
attributes: [[{
type: 'ATOM',
value: '\\Answered'
}, {
type: 'ATOM',
value: '\\Flagged'
}]]
}],
OK: [{
code: 'PERMANENTFLAGS',
permanentflags: ['\\Answered', '\\Flagged']
}, {
code: 'UIDVALIDITY',
uidvalidity: '2'
}, {
code: 'UIDNEXT',
uidnext: '38361'
}]
}
})).to.deep.equal({
exists: 123,
flags: ['\\Answered', '\\Flagged'],
permanentFlags: ['\\Answered', '\\Flagged'],
readOnly: false,
uidNext: 38361,
uidValidity: 2
});
});
it('should parse response with read-only', () => {
expect((0, _commandParser.parseSELECT)({
code: 'READ-ONLY',
payload: {
EXISTS: [{
nr: 123
}],
FLAGS: [{
attributes: [[{
type: 'ATOM',
value: '\\Answered'
}, {
type: 'ATOM',
value: '\\Flagged'
}]]
}],
OK: [{
code: 'PERMANENTFLAGS',
permanentflags: ['\\Answered', '\\Flagged']
}, {
code: 'UIDVALIDITY',
uidvalidity: '2'
}, {
code: 'UIDNEXT',
uidnext: '38361'
}]
}
})).to.deep.equal({
exists: 123,
flags: ['\\Answered', '\\Flagged'],
permanentFlags: ['\\Answered', '\\Flagged'],
readOnly: true,
uidNext: 38361,
uidValidity: 2
});
});
it('should parse response with NOMODSEQ flag', () => {
expect((0, _commandParser.parseSELECT)({
code: 'READ-WRITE',
payload: {
EXISTS: [{
nr: 123
}],
FLAGS: [{
attributes: [[{
type: 'ATOM',
value: '\\Answered'
}, {
type: 'ATOM',
value: '\\Flagged'
}]]
}],
OK: [{
code: 'PERMANENTFLAGS',
permanentflags: ['\\Answered', '\\Flagged']
}, {
code: 'UIDVALIDITY',
uidvalidity: '2'
}, {
code: 'UIDNEXT',
uidnext: '38361'
}, {
code: 'NOMODSEQ'
}]
}
})).to.deep.equal({
exists: 123,
flags: ['\\Answered', '\\Flagged'],
permanentFlags: ['\\Answered', '\\Flagged'],
readOnly: false,
uidNext: 38361,
uidValidity: 2,
noModseq: true
});
});
});
describe('parseENVELOPE', () => {
it('should parsed envelope object', () => {
expect((0, _commandParser.parseENVELOPE)(_envelope.default.source)).to.deep.equal(_envelope.default.parsed);
});
});
describe('parseBODYSTRUCTURE', () => {
it('should parse bodystructure object', () => {
expect((0, _commandParser.parseBODYSTRUCTURE)(_mimeTortureBodystructure.default.source)).to.deep.equal(_mimeTortureBodystructure.default.parsed);
});
it('should parse bodystructure with unicode filename', () => {
var input = [[{
type: 'STRING',
value: 'APPLICATION'
}, {
type: 'STRING',
value: 'OCTET-STREAM'
}, null, null, null, {
type: 'STRING',
value: 'BASE64'
}, {
type: 'ATOM',
value: '40'
}, null, [{
type: 'STRING',
value: 'ATTACHMENT'
}, [{
type: 'STRING',
value: 'FILENAME'
}, {
type: 'STRING',
value: '=?ISO-8859-1?Q?BBR_Handel,_Gewerbe,_B=FCrobetriebe,?= =?ISO-8859-1?Q?_private_Bildungseinrichtungen.txt?='
}]], null], {
type: 'STRING',
value: 'MIXED'
}, [{
type: 'STRING',
value: 'BOUNDARY'
}, {
type: 'STRING',
value: '----sinikael-?=_1-14105085265110.49903922458179295'
}], null, null];
var expected = {
childNodes: [{
part: '1',
type: 'application/octet-stream',
encoding: 'base64',
size: 40,
disposition: 'attachment',
dispositionParameters: {
filename: 'BBR Handel, Gewerbe, Bürobetriebe, private Bildungseinrichtungen.txt'
}
}],
type: 'multipart/mixed',
parameters: {
boundary: '----sinikael-?=_1-14105085265110.49903922458179295'
}
};
expect((0, _commandParser.parseBODYSTRUCTURE)(input)).to.deep.equal(expected);
});
});
describe('parseFETCH', () => {
it('should return values lowercase keys', () => {
expect((0, _commandParser.parseFETCH)({
payload: {
FETCH: [{
nr: 123,
attributes: [[{
type: 'ATOM',
value: 'BODY',
section: [{
type: 'ATOM',
value: 'HEADER'
}, [{
type: 'ATOM',
value: 'DATE'
}, {
type: 'ATOM',
value: 'SUBJECT'
}]],
partial: [0, 123]
}, {
type: 'ATOM',
value: 'abc'
}]]
}]
}
})).to.deep.equal([{
'#': 123,
'body[header (date subject)]<0.123>': 'abc'
}]);
});
it('should merge multiple responses based on sequence number', () => {
expect((0, _commandParser.parseFETCH)({
payload: {
FETCH: [{
nr: 123,
attributes: [[{
type: 'ATOM',
value: 'UID'
}, {
type: 'ATOM',
value: 789
}]]
}, {
nr: 124,
attributes: [[{
type: 'ATOM',
value: 'UID'
}, {
type: 'ATOM',
value: 790
}]]
}, {
nr: 123,
attributes: [[{
type: 'ATOM',
value: 'MODSEQ'
}, {
type: 'ATOM',
value: '127'
}]]
}]
}
})).to.deep.equal([{
'#': 123,
uid: 789,
modseq: '127'
}, {
'#': 124,
uid: 790
}]);
});
});
describe('parseSEARCH', () => {
it('should parse SEARCH response', () => {
expect((0, _commandParser.parseSEARCH)({
payload: {
SEARCH: [{
attributes: [{
value: 5
}, {
value: 7
}]
}, {
attributes: [{
value: 6
}]
}]
}
})).to.deep.equal([5, 6, 7]);
});
it('should parse empty SEARCH response', () => {
expect((0, _commandParser.parseSEARCH)({
payload: {
SEARCH: [{
command: 'SEARCH',
tag: '*'
}]
}
})).to.deep.equal([]);
});
});
describe('parseCOPY', () => {
it('should parse COPY response', () => {
expect((0, _commandParser.parseCOPY)({
copyuid: ['1', '1:3', '3,4,2']
})).to.deep.equal({
srcSeqSet: '1:3',
destSeqSet: '3,4,2'
});
});
it('should return undefined when response does not contain copyuid', () => {
expect((0, _commandParser.parseCOPY)({})).to.equal(undefined);
});
it('should return undefined when response is not defined', () => {
expect((0, _commandParser.parseCOPY)()).to.equal(undefined);
});
});
describe('parseAPPEND', () => {
it('should parse APPEND response', () => {
expect((0, _commandParser.parseAPPEND)({
appenduid: ['1', '3']
})).to.equal('3');
});
it('should return undefined when response does not contain copyuid', () => {
expect((0, _commandParser.parseAPPEND)({})).to.equal(undefined);
});
it('should return undefined when response is not defined', () => {
expect((0, _commandParser.parseAPPEND)()).to.equal(undefined);
});
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tYW5kLXBhcnNlci11bml0LmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiaXQiLCJleHBlY3QiLCJwYXlsb2FkIiwiTkFNRVNQQUNFIiwidG8iLCJiZSIsImZhbHNlIiwiYXR0cmlidXRlcyIsInR5cGUiLCJ2YWx1ZSIsImRlZXAiLCJlcXVhbCIsInBlcnNvbmFsIiwicHJlZml4IiwiZGVsaW1pdGVyIiwidXNlcnMiLCJzaGFyZWQiLCJjb2RlIiwiRVhJU1RTIiwibnIiLCJGTEFHUyIsIk9LIiwicGVybWFuZW50ZmxhZ3MiLCJ1aWR2YWxpZGl0eSIsInVpZG5leHQiLCJoaWdoZXN0bW9kc2VxIiwiZXhpc3RzIiwiZmxhZ3MiLCJoaWdoZXN0TW9kc2VxIiwicGVybWFuZW50RmxhZ3MiLCJyZWFkT25seSIsInVpZE5leHQiLCJ1aWRWYWxpZGl0eSIsIm5vTW9kc2VxIiwidGVzdEVudmVsb3BlIiwic291cmNlIiwicGFyc2VkIiwibWltZVRvcnR1cmUiLCJpbnB1dCIsImV4cGVjdGVkIiwiY2hpbGROb2RlcyIsInBhcnQiLCJlbmNvZGluZyIsInNpemUiLCJkaXNwb3NpdGlvbiIsImRpc3Bvc2l0aW9uUGFyYW1ldGVycyIsImZpbGVuYW1lIiwicGFyYW1ldGVycyIsImJvdW5kYXJ5IiwiRkVUQ0giLCJzZWN0aW9uIiwicGFydGlhbCIsInVpZCIsIm1vZHNlcSIsIlNFQVJDSCIsImNvbW1hbmQiLCJ0YWciLCJjb3B5dWlkIiwic3JjU2VxU2V0IiwiZGVzdFNlcVNldCIsInVuZGVmaW5lZCIsImFwcGVuZHVpZCJdLCJtYXBwaW5ncyI6Ijs7QUFHQTs7QUFDQTs7QUFVQTs7QUFDQTs7QUFDQTs7OztBQWhCQTs7QUFDQTtBQWlCQUEsUUFBUSxDQUFDLGdCQUFELEVBQW1CLE1BQU07QUFDL0JDLEVBQUFBLEVBQUUsQ0FBQyw4Q0FBRCxFQUFpRCxNQUFNO0FBQ3ZEQyxJQUFBQSxNQUFNLENBQUMsbUNBQWU7QUFDcEJDLE1BQUFBLE9BQU8sRUFBRTtB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QUErQmlELFNBQS9CO0FBQ0QsR0FGQyxDQUFGO0FBSUE1RCxFQUFBQSxFQUFFLENBQUMsc0RBQUQsRUFBeUQsTUFBTTtBQUMvREMsSUFBQUEsTUFBTSxDQUFDLCtCQUFELENBQU4sQ0FBb0JHLEVBQXBCLENBQXVCTyxLQUF2QixDQUE2QmlELFNBQTdCO0FBQ0QsR0FGQyxDQUFGO0FBR0QsQ0FqQk8sQ0FBUjtBQW1CQTdELFFBQVEsQ0FBQyxhQUFELEVBQWdCLE1BQU07QUFDNUJDLEVBQUFBLEVBQUUsQ0FBQyw4QkFBRCxFQUFpQyxNQUFNO0FBQ3ZDQyxJQUFBQSxNQUFNLENBQUMsZ0NBQVk7QUFDakI0RCxNQUFBQSxTQUFTLEVBQUUsQ0FBQyxHQUFELEVBQU0sR0FBTjtBQURNLEtBQVosQ0FBRCxDQUFOLENBRUl6RCxFQUZKLENBRU9PLEtBRlAsQ0FFYSxHQUZiO0FBR0QsR0FKQyxDQUFGO0FBTUFYLEVBQUFBLEVBQUUsQ0FBQyxnRUFBRCxFQUFtRSxNQUFNO0FBQ3pFQyxJQUFBQSxNQUFNLENBQUMsZ0NBQVksRUFBWixDQUFELENBQU4sQ0FBd0JHLEVBQXhCLENBQTJCTyxLQUEzQixDQUFpQ2lELFNBQWpDO0FBQ0QsR0FGQyxDQUFGO0FBSUE1RCxFQUFBQSxFQUFFLENBQUMsc0RBQUQsRUFBeUQsTUFBTTtBQUMvREMsSUFBQUEsTUFBTSxDQUFDLGlDQUFELENBQU4sQ0FBc0JHLEVBQXRCLENBQXlCTyxLQUF6QixDQUErQmlELFNBQS9CO0FBQ0QsR0FGQyxDQUFGO0FBR0QsQ0FkTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11c2VsZXNzLWVzY2FwZSAqL1xuXG5pbXBvcnQgeyBwYXJzZXIgfSBmcm9tICdlbWFpbGpzLWltYXAtaGFuZGxlcidcbmltcG9ydCB7XG4gIHBhcnNlQVBQRU5ELFxuICBwYXJzZUNPUFksXG4gIHBhcnNlU0VBUkNILFxuICBwYXJzZU5BTUVTUEFDRSxcbiAgcGFyc2VFTlZFTE9QRSxcbiAgcGFyc2VTRUxFQ1QsXG4gIHBhcnNlQk9EWVNUUlVDVFVSRSxcbiAgcGFyc2VGRVRDSFxufSBmcm9tICcuL2NvbW1hbmQtcGFyc2VyJ1xuaW1wb3J0IHsgdG9UeXBlZEFycmF5IH0gZnJvbSAnLi9jb21tb24nXG5pbXBvcnQgdGVzdEVudmVsb3BlIGZyb20gJy4uL3Jlcy9maXh0dXJlcy9lbnZlbG9wZSdcbmltcG9ydCBtaW1lVG9ydHVyZSBmcm9tICcuLi9yZXMvZml4dHVyZXMvbWltZS10b3J0dXJlLWJvZHlzdHJ1Y3R1cmUnXG5cbmRlc2NyaWJlKCdwYXJzZU5BTUVTUEFDRScsICgpID0+IHtcbiAgaXQoJ3Nob3VsZCBub3Qgc3VjY2VlZCBmb3Igbm8gbmFtZXNwYWNlIHJlc3BvbnNlJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZU5BTUVTUEFDRSh7XG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIE5BTUVTUEFDRTogW11cbiAgICAgIH1cbiAgICB9KSkudG8uYmUuZmFsc2VcbiAgfSlcblxuICBpdCgnc2hvdWxkIHJldHVybiBzaW5nbGUgcGVyc29uYWwgbmFtZXNwYWNlJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZU5BTUVTUEFDRSh7XG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIE5BTUVTUEFDRTogW3tcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdJTkJPWC4nXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU1RSSU5HJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJy4nXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICBdLCBudWxsLCBudWxsXG4gICAgICAgICAgXVxuICAgICAgICB9XVxuICAgICAgfVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIHBlcnNvbmFsOiBbe1xuICAgICAgICBwcmVmaXg6ICdJTkJPWC4nLFxuICAgICAgICBkZWxpbWl0ZXI6ICcuJ1xuICAgICAgfV0sXG4gICAgICB1c2VyczogZmFsc2UsXG4gICAgICBzaGFyZWQ6IGZhbHNlXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIHJldHVybiBzaW5nbGUgcGVyc29uYWwsIHNpbmdsZSB1c2VycywgbXVsdGlwbGUgc2hhcmVkJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZU5BTUVTUEFDRSh7XG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIE5BTUVTUEFDRTogW3tcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICAvLyBwZXJzb25hbFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBbe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTVFJJTkcnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnJ1xuICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcvJ1xuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIC8vIHVzZXJzXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICd+J1xuICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcvJ1xuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIC8vIHNoYXJlZFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBbe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTVFJJTkcnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnI3NoYXJlZC8nXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU1RSSU5HJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJy8nXG4gICAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgICBbe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTVFJJTkcnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnI3B1YmxpYy8nXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU1RSSU5HJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJy8nXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICBdXG4gICAgICAgICAgXVxuICAgICAgICB9XVxuICAgICAgfVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIHBlcnNvbmFsOiBbe1xuICAgICAgICBwcmVmaXg6ICcnLFxuICAgICAgICBkZWxpbWl0ZXI6ICcvJ1xuICAgICAgfV0sXG4gICAgICB1c2VyczogW3tcbiAgICAgICAgcHJlZml4OiAnficsXG4gICAgICAgIGRlbGltaXRlcjogJy8nXG4gICAgICB9XSxcbiAgICAgIHNoYXJlZDogW3tcbiAgICAgICAgcHJlZml4OiAnI3NoYXJlZC8nLFxuICAgICAgICBkZWxpbWl0ZXI6ICcvJ1xuICAgICAgfSwge1xuICAgICAgICBwcmVmaXg6ICcjcHVibGljLycsXG4gICAgICAgIGRlbGltaXRlcjogJy8nXG4gICAgICB9XVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBoYW5kbGUgTklMIG5hbWVzcGFjZSBoaWVyYXJjaHkgZGVsaW0nLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlTkFNRVNQQUNFKHtcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgTkFNRVNQQUNFOiBbXG4gICAgICAgICAgLy8gVGhpcyBzcGVjaWZpYyB2YWx1ZSBpcyByZXR1cm5lZCBieSB5YWhvby5jby5qcCdzXG4gICAgICAgICAgLy8gaW1hcGdhdGUgdmVyc2lvbiAwLjcuNjhfMTFfMS42MTQ3NSBJTUFQIHNlcnZlclxuICAgICAgICAgIHBhcnNlcih0b1R5cGVkQXJyYXkoJyogTkFNRVNQQUNFICgoXCJcIiBOSUwpKSBOSUwgTklMJykpXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBwZXJzb25hbDogW3tcbiAgICAgICAgcHJlZml4OiAnJyxcbiAgICAgICAgZGVsaW1pdGVyOiBudWxsXG4gICAgICB9XSxcbiAgICAgIHVzZXJzOiBmYWxzZSxcbiAgICAgIHNoYXJlZDogZmFsc2VcbiAgICB9KVxuICB9KVxufSlcblxuZGVzY3JpYmUoJ3BhcnNlU0VMRUNUJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHBhcnNlIGEgY29tcGxldGUgcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlU0VMRUNUKHtcbiAgICAgIGNvZGU6ICdSRUFELVdSSVRFJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgRVhJU1RTOiBbe1xuICAgICAgICAgIG5yOiAxMjNcbiAgICAgICAgfV0sXG4gICAgICAgIEZMQUdTOiBbe1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdcXFxcQW5zd2VyZWQnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdcXFxcRmxhZ2dlZCdcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgXVxuICAgICAgICB9XSxcbiAgICAgICAgT0s6IFt7XG4gICAgICAgICAgY29kZTogJ1BFUk1BTkVOVEZMQUdTJyxcbiAgICAgICAgICBwZXJtYW5lbnRmbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgY29kZTogJ1VJRFZBTElESVRZJyxcbiAgICAgICAgICB1aWR2YWxpZGl0eTogJzInXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnVUlETkVYVCcsXG4gICAgICAgICAgdWlkbmV4dDogJzM4MzYxJ1xuICAgICAgICB9LCB7XG4gICAgICAgICAgY29kZTogJ0hJR0hFU1RNT0RTRVEnLFxuICAgICAgICAgIGhpZ2hlc3Rtb2RzZXE6ICczNjgyOTE4J1xuICAgICAgICB9XVxuICAgICAgfVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIGV4aXN0czogMTIzLFxuICAgICAgZmxhZ3M6IFsnXFxcXEFuc3dlcmVkJywgJ1xcXFxGbGFnZ2VkJ10sXG4gICAgICBoaWdoZXN0TW9kc2VxOiAnMzY4MjkxOCcsXG4gICAgICBwZXJtYW5lbnRGbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXSxcbiAgICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICAgIHVpZE5leHQ6IDM4MzYxLFxuICAgICAgdWlkVmFsaWRpdHk6IDJcbiAgICB9KVxuICB9KVxuXG4gIGl0KCdzaG91bGQgcGFyc2UgcmVzcG9uc2Ugd2l0aCBubyBtb2RzZXEnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlU0VMRUNUKHtcbiAgICAgIGNvZGU6ICdSRUFELVdSSVRFJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgRVhJU1RTOiBbe1xuICAgICAgICAgIG5yOiAxMjNcbiAgICAgICAgfV0sXG4gICAgICAgIEZMQUdTOiBbe1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdcXFxcQW5zd2VyZWQnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdcXFxcRmxhZ2dlZCdcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgXVxuICAgICAgICB9XSxcbiAgICAgICAgT0s6IFt7XG4gICAgICAgICAgY29kZTogJ1BFUk1BTkVOVEZMQUdTJyxcbiAgICAgICAgICBwZXJtYW5lbnRmbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgY29kZTogJ1VJRFZBTElESVRZJyxcbiAgICAgICAgICB1aWR2YWxpZGl0eTogJzInXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnVUlETkVYVCcsXG4gICAgICAgICAgdWlkbmV4dDogJzM4MzYxJ1xuICAgICAgICB9XVxuICAgICAgfVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIGV4aXN0czogMTIzLFxuICAgICAgZmxhZ3M6IFsnXFxcXEFuc3dlcmVkJywgJ1xcXFxGbGFnZ2VkJ10sXG4gICAgICBwZXJtYW5lbnRGbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXSxcbiAgICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICAgIHVpZE5leHQ6IDM4MzYxLFxuICAgICAgdWlkVmFsaWRpdHk6IDJcbiAgICB9KVxuICB9KVxuXG4gIGl0KCdzaG91bGQgcGFyc2UgcmVzcG9uc2Ugd2l0aCByZWFkLW9ubHknLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlU0VMRUNUKHtcbiAgICAgIGNvZGU6ICdSRUFELU9OTFknLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBFWElTVFM6IFt7XG4gICAgICAgICAgbnI6IDEyM1xuICAgICAgICB9XSxcbiAgICAgICAgRkxBR1M6IFt7XG4gICAgICAgICAgYXR0cmlidXRlczogW1xuICAgICAgICAgICAgW3tcbiAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxBbnN3ZXJlZCdcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxGbGFnZ2VkJ1xuICAgICAgICAgICAgfV1cbiAgICAgICAgICBdXG4gICAgICAgIH1dLFxuICAgICAgICBPSzogW3tcbiAgICAgICAgICBjb2RlOiAnUEVSTUFORU5URkxBR1MnLFxuICAgICAgICAgIHBlcm1hbmVudGZsYWdzOiBbJ1xcXFxBbnN3ZXJlZCcsICdcXFxcRmxhZ2dlZCddXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnVUlEVkFMSURJVFknLFxuICAgICAgICAgIHVpZHZhbGlkaXR5OiAnMidcbiAgICAgICAgfSwge1xuICAgICAgICAgIGNvZGU6ICdVSURORVhUJyxcbiAgICAgICAgICB1aWRuZXh0OiAnMzgzNjEnXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgfSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgZXhpc3RzOiAxMjMsXG4gICAgICBmbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXSxcbiAgICAgIHBlcm1hbmVudEZsYWdzOiBbJ1xcXFxBbnN3ZXJlZCcsICdcXFxcRmxhZ2dlZCddLFxuICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICB1aWROZXh0OiAzODM2MSxcbiAgICAgIHVpZFZhbGlkaXR5OiAyXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIHBhcnNlIHJlc3BvbnNlIHdpdGggTk9NT0RTRVEgZmxhZycsICgpID0+IHtcbiAgICBleHBlY3QocGFyc2VTRUxFQ1Qoe1xuICAgICAgY29kZTogJ1JFQUQtV1JJVEUnLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBFWElTVFM6IFt7XG4gICAgICAgICAgbnI6IDEyM1xuICAgICAgICB9XSxcbiAgICAgICAgRkxBR1M6IFt7XG4gICAgICAgICAgYXR0cmlidXRlczogW1xuICAgICAgICAgICAgW3tcbiAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxBbnN3ZXJlZCdcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxGbGFnZ2VkJ1xuICAgICAgICAgICAgfV1cbiAgICAgICAgICBdXG4gICAgICAgIH1dLFxuICAgICAgICBPSzogW3tcbiAgICAgICAgICBjb2RlOiAnUEVSTUFORU5URkxBR1MnLFxuICAgICAgICAgIHBlcm1hbmVudGZsYWdzOiBbJ1xcXFxBbnN3ZXJlZCcsICdcXFxcRmxhZ2dlZCddXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnVUlEVkFMSURJVFknLFxuICAgICAgICAgIHVpZHZhbGlkaXR5OiAnMidcbiAgICAgICAgfSwge1xuICAgICAgICAgIGNvZGU6ICdVSURORVhUJyxcbiAgICAgICAgICB1aWRuZXh0OiAnMzgzNjEnXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnTk9NT0RTRVEnXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgfSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgZXhpc3RzOiAxMjMsXG4gICAgICBmbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXSxcbiAgICAgIHBlcm1hbmVudEZsYWdzOiBbJ1xcXFxBbnN3ZXJlZCcsICdcXFxcRmxhZ2dlZCddLFxuICAgICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgICAgdWlkTmV4dDogMzgzNjEsXG4gICAgICB1aWRWYWxpZGl0eTogMixcbiAgICAgIG5vTW9kc2VxOiB0cnVlXG4gICAgfSlcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKCdwYXJzZUVOVkVMT1BFJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHBhcnNlZCBlbnZlbG9wZSBvYmplY3QnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlRU5WRUxPUEUodGVzdEVudmVsb3BlLnNvdXJjZSkpLnRvLmRlZXAuZXF1YWwodGVzdEVudmVsb3BlLnBhcnNlZClcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKCdwYXJzZUJPRFlTVFJVQ1RVUkUnLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgcGFyc2UgYm9keXN0cnVjdHVyZSBvYmplY3QnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlQk9EWVNUUlVDVFVSRShtaW1lVG9ydHVyZS5zb3VyY2UpKS50by5kZWVwLmVxdWFsKG1pbWVUb3J0dXJlLnBhcnNlZClcbiAgfSlcblxuICBpdCgnc2hvdWxkIHBhcnNlIGJvZHlzdHJ1Y3R1cmUgd2l0aCB1bmljb2RlIGZpbGVuYW1lJywgKCkgPT4ge1xuICAgIHZhciBpbnB1dCA9IFtcbiAgICAgIFtcbiAgICAgICAgeyB0eXBlOiAnU1RSSU5HJywgdmFsdWU6ICdBUFBMSUNBVElPTicgfSxcbiAgICAgICAgeyB0eXBlOiAnU1RSSU5HJywgdmFsdWU6ICdPQ1RFVC1TVFJFQU0nIH0sXG4gICAgICAgIG51bGwsXG4gICAgICAgIG51bGwsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHsgdHlwZTogJ1NUUklORycsIHZhbHVlOiAnQkFTRTY0JyB9LFxuICAgICAgICB7IHR5cGU6ICdBVE9NJywgdmFsdWU6ICc0MCcgfSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgW1xuICAgICAgICAgIHsgdHlwZTogJ1NUUklORycsIHZhbHVlOiAnQVRUQUNITUVOVCcgfSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogJ0ZJTEVOQU1FJyB9LFxuICAgICAgICAgICAgeyB0eXBlOiAnU1RSSU5HJywgdmFsdWU6ICc9P0lTTy04ODU5LTE/UT9CQlJfSGFuZGVsLF9HZXdlcmJlLF9CPUZDcm9iZXRyaWViZSw/PSA9P0lTTy04ODU5LTE/UT9fcHJpdmF0ZV9CaWxkdW5nc2VpbnJpY2h0dW5nZW4udHh0Pz0nIH1cbiAgICAgICAgICBdXG4gICAgICAgIF0sXG4gICAgICAgIG51bGxcbiAgICAgIF0sXG4gICAgICB7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogJ01JWEVEJyB9LFxuICAgICAgW1xuICAgICAgICB7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogJ0JPVU5EQVJZJyB9LFxuICAgICAgICB7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogJy0tLS1zaW5pa2FlbC0/PV8xLTE0MTA1MDg1MjY1MTEwLjQ5OTAzOTIyNDU4MTc5Mjk1JyB9XG4gICAgICBdLFxuICAgICAgbnVsbCxcbiAgICAgIG51bGxcbiAgICBdXG5cbiAgICB2YXIgZXhwZWN0ZWQgPSB7XG4gICAgICBjaGlsZE5vZGVzOiBbe1xuICAgICAgICBwYXJ0OiAnMScsXG4gICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLFxuICAgICAgICBlbmNvZGluZzogJ2Jhc2U2NCcsXG4gICAgICAgIHNpemU6IDQwLFxuICAgICAgICBkaXNwb3NpdGlvbjogJ2F0dGFjaG1lbnQnLFxuICAgICAgICBkaXNwb3NpdGlvblBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBmaWxlbmFtZTogJ0JCUiBIYW5kZWwsIEdld2VyYmUsIELDvHJvYmV0cmllYmUsIHByaXZhdGUgQmlsZHVuZ3NlaW5yaWNodHVuZ2VuLnR4dCdcbiAgICAgICAgfVxuICAgICAgfV0sXG4gICAgICB0eXBlOiAnbXVsdGlwYXJ0L21peGVkJyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgYm91bmRhcnk6ICctLS0tc2luaWthZWwtPz1fMS0xNDEwNTA4NTI2NTExMC40OTkwMzkyMjQ1ODE3OTI5NSdcbiAgICAgIH1cbiAgICB9XG5cbiAgICBleHBlY3QocGFyc2VCT0RZU1RSVUNUVVJFKGlucHV0KSkudG8uZGVlcC5lcXVhbChleHBlY3RlZClcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKCdwYXJzZUZFVENIJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHJldHVybiB2YWx1ZXMgbG93ZXJjYXNlIGtleXMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlRkVUQ0goe1xuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBGRVRDSDogW3tcbiAgICAgICAgICBucjogMTIzLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdCT0RZJyxcbiAgICAgICAgICAgICAgc2VjdGlvbjogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdIRUFERVInXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnREFURSdcbiAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ1NVQkpFQ1QnXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHBhcnRpYWw6IFswLCAxMjNdXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdhYmMnXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIF1cbiAgICAgICAgfV1cbiAgICAgIH1cbiAgICB9KSkudG8uZGVlcC5lcXVhbChbe1xuICAgICAgJyMnOiAxMjMsXG4gICAgICAnYm9keVtoZWFkZXIgKGRhdGUgc3ViamVjdCldPDAuMTIzPic6ICdhYmMnXG4gICAgfV0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBtZXJnZSBtdWx0aXBsZSByZXNwb25zZXMgYmFzZWQgb24gc2VxdWVuY2UgbnVtYmVyJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZUZFVENIKHtcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgRkVUQ0g6IFt7XG4gICAgICAgICAgbnI6IDEyMyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICBbe1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnVUlEJ1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiA3ODlcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgbnI6IDEyNCxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICBbe1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnVUlEJ1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiA3OTBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgbnI6IDEyMyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICBbe1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnTU9EU0VRJ1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnMTI3J1xuICAgICAgICAgICAgfV1cbiAgICAgICAgICBdXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgfSkpLnRvLmRlZXAuZXF1YWwoW3tcbiAgICAgICcjJzogMTIzLFxuICAgICAgdWlkOiA3ODksXG4gICAgICBtb2RzZXE6ICcxMjcnXG4gICAgfSwge1xuICAgICAgJyMnOiAxMjQsXG4gICAgICB1aWQ6IDc5MFxuICAgIH1dKVxuICB9KVxufSlcblxuZGVzY3JpYmUoJ3BhcnNlU0VBUkNIJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHBhcnNlIFNFQVJDSCByZXNwb25zZScsICgpID0+IHtcbiAgICBleHBlY3QocGFyc2VTRUFSQ0goe1xuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBTRUFSQ0g6IFt7XG4gICAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICAgIHZhbHVlOiA1XG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgdmFsdWU6IDdcbiAgICAgICAgICB9XVxuICAgICAgICB9LCB7XG4gICAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICAgIHZhbHVlOiA2XG4gICAgICAgICAgfV1cbiAgICAgICAgfV1cbiAgICAgIH1cbiAgICB9KSkudG8uZGVlcC5lcXVhbChbNSwgNiwgN10pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBwYXJzZSBlbXB0eSBTRUFSQ0ggcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlU0VBUkNIKHtcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgU0VBUkNIOiBbe1xuICAgICAgICAgIGNvbW1hbmQ6ICdTRUFSQ0gnLFxuICAgICAgICAgIHRhZzogJyonXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgfSkpLnRvLmRlZXAuZXF1YWwoW10pXG4gIH0pXG59KVxuXG5kZXNjcmliZSgncGFyc2VDT1BZJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHBhcnNlIENPUFkgcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlQ09QWSh7XG4gICAgICBjb3B5dWlkOiBbJzEnLCAnMTozJywgJzMsNCwyJ11cbiAgICB9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBzcmNTZXFTZXQ6ICcxOjMnLFxuICAgICAgZGVzdFNlcVNldDogJzMsNCwyJ1xuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIHdoZW4gcmVzcG9uc2UgZG9lcyBub3QgY29udGFpbiBjb3B5dWlkJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZUNPUFkoe30pKS50by5lcXVhbCh1bmRlZmluZWQpXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIHdoZW4gcmVzcG9uc2UgaXMgbm90IGRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlQ09QWSgpKS50by5lcXVhbCh1bmRlZmluZWQpXG4gIH0pXG59KVxuXG5kZXNjcmliZSgncGFyc2VBUFBFTkQnLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgcGFyc2UgQVBQRU5EIHJlc3BvbnNlJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZUFQUEVORCh7XG4gICAgICBhcHBlbmR1aWQ6IFsnMScsICczJ11cbiAgICB9KSkudG8uZXF1YWwoJzMnKVxuICB9KVxuXG4gIGl0KCdzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCB3aGVuIHJlc3BvbnNlIGRvZXMgbm90IGNvbnRhaW4gY29weXVpZCcsICgpID0+IHtcbiAgICBleHBlY3QocGFyc2VBUFBFTkQoe30pKS50by5lcXVhbCh1bmRlZmluZWQpXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIHdoZW4gcmVzcG9uc2UgaXMgbm90IGRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlQVBQRU5EKCkpLnRvLmVxdWFsKHVuZGVmaW5lZClcbiAgfSlcbn0pXG4iXX0=