UNPKG

emailjs-imap-client

Version:
764 lines (642 loc) 101 kB
"use strict"; var _imap = _interopRequireDefault(require("./imap")); var _common = require("./common"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /* eslint-disable no-unused-expressions */ const host = 'localhost'; const port = 10000; describe('browserbox imap unit tests', () => { var client, socketStub; /* jshint indent:false */ beforeEach(() => { client = new _imap.default(host, port); expect(client).to.exist; client.logger = { debug: () => {}, error: () => {} }; var Socket = function () {}; Socket.open = () => {}; Socket.prototype.close = () => {}; Socket.prototype.send = () => {}; Socket.prototype.suspend = () => {}; Socket.prototype.resume = () => {}; Socket.prototype.upgradeToSecure = () => {}; socketStub = sinon.createStubInstance(Socket); sinon.stub(Socket, 'open').withArgs(host, port).returns(socketStub); var promise = client.connect(Socket).then(() => { expect(Socket.open.callCount).to.equal(1); expect(socketStub.onerror).to.exist; expect(socketStub.onopen).to.exist; expect(socketStub.onclose).to.exist; expect(socketStub.ondata).to.exist; }); setTimeout(() => socketStub.onopen(), 10); return promise; }); describe.skip('#close', () => { it('should call socket.close', () => { client.socket.readyState = 'open'; setTimeout(() => socketStub.onclose(), 10); return client.close().then(() => { expect(socketStub.close.callCount).to.equal(1); }); }); it('should not call socket.close', () => { client.socket.readyState = 'not open. duh.'; setTimeout(() => socketStub.onclose(), 10); return client.close().then(() => { expect(socketStub.close.called).to.be.false; }); }); }); describe('#upgrade', () => { it('should upgrade socket', () => { client.secureMode = false; client.upgrade(); }); it('should not upgrade socket', () => { client.secureMode = true; client.upgrade(); }); }); describe('#setHandler', () => { it('should set global handler for keyword', () => { var handler = () => {}; client.setHandler('fetch', handler); expect(client._globalAcceptUntagged.FETCH).to.equal(handler); }); }); describe('#socket.onerror', () => { it('should emit error and close connection', done => { client.socket.onerror({ data: new Error('err') }); client.onerror = () => { done(); }; }); }); describe('#socket.onclose', () => { it('should emit error ', done => { client.socket.onclose(); client.onerror = () => { done(); }; }); }); describe('#_onData', () => { it('should process input', () => { sinon.stub(client, '_parseIncomingCommands'); sinon.stub(client, '_iterateIncomingBuffer'); client._onData({ data: (0, _common.toTypedArray)('foobar').buffer }); expect(client._parseIncomingCommands.calledOnce).to.be.true; expect(client._iterateIncomingBuffer.calledOnce).to.be.true; }); }); describe('rateIncomingBuffer', () => { it('should iterate chunked input', () => { appendIncomingBuffer('* 1 FETCH (UID 1)\r\n* 2 FETCH (UID 2)\r\n* 3 FETCH (UID 3)\r\n'); var iterator = client._iterateIncomingBuffer(); expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID 1)'); expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 2 FETCH (UID 2)'); expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 3 FETCH (UID 3)'); expect(iterator.next().value).to.be.undefined; }); it('should process chunked literals', () => { appendIncomingBuffer('* 1 FETCH (UID {1}\r\n1)\r\n* 2 FETCH (UID {4}\r\n2345)\r\n* 3 FETCH (UID {4}\r\n3789)\r\n'); var iterator = client._iterateIncomingBuffer(); expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID {1}\r\n1)'); expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 2 FETCH (UID {4}\r\n2345)'); expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 3 FETCH (UID {4}\r\n3789)'); expect(iterator.next().value).to.be.undefined; }); it('should process chunked literals 2', () => { appendIncomingBuffer('* 1 FETCH (UID 1)\r\n* 2 FETCH (UID {4}\r\n2345)\r\n'); var iterator = client._iterateIncomingBuffer(); expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID 1)'); expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 2 FETCH (UID {4}\r\n2345)'); expect(iterator.next().value).to.be.undefined; }); it('should process chunked literals 3', () => { appendIncomingBuffer('* 1 FETCH (UID {1}\r\n1)\r\n* 2 FETCH (UID 4)\r\n'); var iterator = client._iterateIncomingBuffer(); expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID {1}\r\n1)'); expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 2 FETCH (UID 4)'); expect(iterator.next().value).to.be.undefined; }); it('should process chunked literals 4', () => { appendIncomingBuffer('* SEARCH {1}\r\n1 {1}\r\n2\r\n'); var iterator = client._iterateIncomingBuffer(); expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* SEARCH {1}\r\n1 {1}\r\n2'); }); it('should process CRLF literal', () => { appendIncomingBuffer('* 1 FETCH (UID 20 BODY[HEADER.FIELDS (REFERENCES LIST-ID)] {2}\r\n\r\n)\r\n'); var iterator = client._iterateIncomingBuffer(); expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID 20 BODY[HEADER.FIELDS (REFERENCES LIST-ID)] {2}\r\n\r\n)'); }); it('should process CRLF literal 2', () => { appendIncomingBuffer('* 1 FETCH (UID 1 ENVELOPE ("string with {parenthesis}") BODY[HEADER.FIELDS (REFERENCES LIST-ID)] {2}\r\n\r\n)\r\n'); var iterator = client._iterateIncomingBuffer(); expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID 1 ENVELOPE ("string with {parenthesis}") BODY[HEADER.FIELDS (REFERENCES LIST-ID)] {2}\r\n\r\n)'); }); it('should parse multiple zero-length literals', () => { appendIncomingBuffer('* 126015 FETCH (UID 585599 BODY[1.2] {0}\r\n BODY[1.1] {0}\r\n)\r\n'); var iterator = client._iterateIncomingBuffer(); expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 126015 FETCH (UID 585599 BODY[1.2] {0}\r\n BODY[1.1] {0}\r\n)'); }); it('should process two commands when CRLF arrives in 2 parts', () => { appendIncomingBuffer('* 1 FETCH (UID 1)\r'); var iterator1 = client._iterateIncomingBuffer(); expect(iterator1.next().value).to.be.undefined; appendIncomingBuffer('\n* 2 FETCH (UID 2)\r\n'); var iterator2 = client._iterateIncomingBuffer(); expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* 1 FETCH (UID 1)'); expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* 2 FETCH (UID 2)'); expect(iterator2.next().value).to.be.undefined; }); it('should process literal when literal count arrives in 2 parts', () => { appendIncomingBuffer('* 1 FETCH (UID {'); var iterator1 = client._iterateIncomingBuffer(); expect(iterator1.next().value).to.be.undefined; appendIncomingBuffer('2}\r\n12)\r\n'); var iterator2 = client._iterateIncomingBuffer(); expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* 1 FETCH (UID {2}\r\n12)'); expect(iterator2.next().value).to.be.undefined; }); it('should process literal when literal count arrives in 2 parts 2', () => { appendIncomingBuffer('* 1 FETCH (UID {1'); var iterator1 = client._iterateIncomingBuffer(); expect(iterator1.next().value).to.be.undefined; appendIncomingBuffer('0}\r\n0123456789)\r\n'); var iterator2 = client._iterateIncomingBuffer(); expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* 1 FETCH (UID {10}\r\n0123456789)'); expect(iterator2.next().value).to.be.undefined; }); it('should process literal when literal count arrives in 2 parts 3', () => { appendIncomingBuffer('* 1 FETCH (UID {'); var iterator1 = client._iterateIncomingBuffer(); expect(iterator1.next().value).to.be.undefined; appendIncomingBuffer('10}\r\n1234567890)\r\n'); var iterator2 = client._iterateIncomingBuffer(); expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* 1 FETCH (UID {10}\r\n1234567890)'); expect(iterator2.next().value).to.be.undefined; }); it('should process literal when literal count arrives in 2 parts 4', () => { appendIncomingBuffer('* 1 FETCH (UID 1 BODY[HEADER.FIELDS (REFERENCES LIST-ID)] {2}\r'); var iterator1 = client._iterateIncomingBuffer(); expect(iterator1.next().value).to.be.undefined; appendIncomingBuffer('\nXX)\r\n'); var iterator2 = client._iterateIncomingBuffer(); expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* 1 FETCH (UID 1 BODY[HEADER.FIELDS (REFERENCES LIST-ID)] {2}\r\nXX)'); }); it('should process literal when literal count arrives in 3 parts', () => { appendIncomingBuffer('* 1 FETCH (UID {'); var iterator1 = client._iterateIncomingBuffer(); expect(iterator1.next().value).to.be.undefined; appendIncomingBuffer('1'); var iterator2 = client._iterateIncomingBuffer(); expect(iterator2.next().value).to.be.undefined; appendIncomingBuffer('}\r\n1)\r\n'); var iterator3 = client._iterateIncomingBuffer(); expect(String.fromCharCode.apply(null, iterator3.next().value)).to.equal('* 1 FETCH (UID {1}\r\n1)'); expect(iterator3.next().value).to.be.undefined; }); it('should process SEARCH response when it arrives in 2 parts', () => { appendIncomingBuffer('* SEARCH 1 2'); var iterator1 = client._iterateIncomingBuffer(); expect(iterator1.next().value).to.be.undefined; appendIncomingBuffer(' 3 4\r\n'); var iterator2 = client._iterateIncomingBuffer(); expect(String.fromCharCode.apply(null, iterator2.next().value)).to.equal('* SEARCH 1 2 3 4'); expect(iterator2.next().value).to.be.undefined; }); it('should not process {} in string as literal 1', () => { appendIncomingBuffer('* 1 FETCH (UID 1 ENVELOPE ("string with {parenthesis}"))\r\n'); var iterator = client._iterateIncomingBuffer(); expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID 1 ENVELOPE ("string with {parenthesis}"))'); }); it('should not process {} in string as literal 2', () => { appendIncomingBuffer('* 1 FETCH (UID 1 ENVELOPE ("string with number in parenthesis {123}"))\r\n'); var iterator = client._iterateIncomingBuffer(); expect(String.fromCharCode.apply(null, iterator.next().value)).to.equal('* 1 FETCH (UID 1 ENVELOPE ("string with number in parenthesis {123}"))'); }); function appendIncomingBuffer(content) { client._incomingBuffers.push((0, _common.toTypedArray)(content)); } }); describe('#_parseIncomingCommands', () => { it('should process a tagged item from the queue', () => { client.onready = sinon.stub(); sinon.stub(client, '_handleResponse'); function* gen() { yield (0, _common.toTypedArray)('OK Hello world!'); } client._parseIncomingCommands(gen()); expect(client.onready.callCount).to.equal(1); expect(client._handleResponse.withArgs({ tag: 'OK', command: 'Hello', attributes: [{ type: 'ATOM', value: 'world!' }] }).calledOnce).to.be.true; }); it('should process an untagged item from the queue', () => { sinon.stub(client, '_handleResponse'); function* gen() { yield (0, _common.toTypedArray)('* 1 EXISTS'); } client._parseIncomingCommands(gen()); expect(client._handleResponse.withArgs({ tag: '*', command: 'EXISTS', attributes: [], nr: 1 }).calledOnce).to.be.true; }); it('should process a plus tagged item from the queue', () => { sinon.stub(client, 'send'); function* gen() { yield (0, _common.toTypedArray)('+ Please continue'); } client._currentCommand = { data: ['literal data'] }; client._parseIncomingCommands(gen()); expect(client.send.withArgs('literal data\r\n').callCount).to.equal(1); }); it('should process an XOAUTH2 error challenge', () => { sinon.stub(client, 'send'); function* gen() { yield (0, _common.toTypedArray)('+ FOOBAR'); } client._currentCommand = { data: [], errorResponseExpectsEmptyLine: true }; client._parseIncomingCommands(gen()); expect(client.send.withArgs('\r\n').callCount).to.equal(1); }); }); describe('#_handleResponse', () => { it('should invoke global handler by default', () => { sinon.stub(client, '_processResponse'); sinon.stub(client, '_sendRequest'); client._globalAcceptUntagged.TEST = () => {}; sinon.stub(client._globalAcceptUntagged, 'TEST'); client._currentCommand = false; client._handleResponse({ tag: '*', command: 'test' }); expect(client._sendRequest.callCount).to.equal(1); expect(client._globalAcceptUntagged.TEST.withArgs({ tag: '*', command: 'test' }).callCount).to.equal(1); }); it('should invoke global handler if needed', () => { sinon.stub(client, '_processResponse'); client._globalAcceptUntagged.TEST = () => {}; sinon.stub(client._globalAcceptUntagged, 'TEST'); sinon.stub(client, '_sendRequest'); client._currentCommand = { payload: {} }; client._handleResponse({ tag: '*', command: 'test' }); expect(client._sendRequest.callCount).to.equal(0); expect(client._globalAcceptUntagged.TEST.withArgs({ tag: '*', command: 'test' }).callCount).to.equal(1); }); it('should push to payload', () => { sinon.stub(client, '_processResponse'); client._globalAcceptUntagged.TEST = () => {}; sinon.stub(client._globalAcceptUntagged, 'TEST'); client._currentCommand = { payload: { TEST: [] } }; client._handleResponse({ tag: '*', command: 'test' }); expect(client._globalAcceptUntagged.TEST.callCount).to.equal(0); expect(client._currentCommand.payload.TEST).to.deep.equal([{ tag: '*', command: 'test' }]); }); it('should invoke command callback', () => { sinon.stub(client, '_processResponse'); sinon.stub(client, '_sendRequest'); client._globalAcceptUntagged.TEST = () => {}; sinon.stub(client._globalAcceptUntagged, 'TEST'); client._currentCommand = { tag: 'A', callback: response => { expect(response).to.deep.equal({ tag: 'A', command: 'test', payload: { TEST: 'abc' } }); }, payload: { TEST: 'abc' } }; client._handleResponse({ tag: 'A', command: 'test' }); expect(client._sendRequest.callCount).to.equal(1); expect(client._globalAcceptUntagged.TEST.callCount).to.equal(0); }); }); describe('#enqueueCommand', () => { it('should reject on NO/BAD', () => { sinon.stub(client, '_sendRequest').callsFake(() => { client._clientQueue[0].callback({ command: 'NO' }); }); client._tagCounter = 100; client._clientQueue = []; client._canSend = true; return client.enqueueCommand({ command: 'abc' }, ['def'], { t: 1 }).catch(err => { expect(err).to.exist; }); }); it('should invoke sending', () => { sinon.stub(client, '_sendRequest').callsFake(() => { client._clientQueue[0].callback({}); }); client._tagCounter = 100; client._clientQueue = []; client._canSend = true; return client.enqueueCommand({ command: 'abc' }, ['def'], { t: 1 }).then(() => { expect(client._sendRequest.callCount).to.equal(1); expect(client._clientQueue.length).to.equal(1); expect(client._clientQueue[0].tag).to.equal('W101'); expect(client._clientQueue[0].request).to.deep.equal({ command: 'abc', tag: 'W101' }); expect(client._clientQueue[0].t).to.equal(1); }); }); it('should only queue', () => { sinon.stub(client, '_sendRequest'); client._tagCounter = 100; client._clientQueue = []; client._canSend = false; setTimeout(() => { client._clientQueue[0].callback({}); }, 0); return client.enqueueCommand({ command: 'abc' }, ['def'], { t: 1 }).then(() => { expect(client._sendRequest.callCount).to.equal(0); expect(client._clientQueue.length).to.equal(1); expect(client._clientQueue[0].tag).to.equal('W101'); }); }); it('should store valueAsString option in the command', () => { sinon.stub(client, '_sendRequest'); client._tagCounter = 100; client._clientQueue = []; client._canSend = false; setTimeout(() => { client._clientQueue[0].callback({}); }, 0); return client.enqueueCommand({ command: 'abc', valueAsString: false }, ['def'], { t: 1 }).then(() => { expect(client._clientQueue[0].request.valueAsString).to.equal(false); }); }); }); describe('#_sendRequest', () => { it('should enter idle if nothing is to process', () => { sinon.stub(client, '_enterIdle'); client._clientQueue = []; client._sendRequest(); expect(client._enterIdle.callCount).to.equal(1); }); it('should send data', () => { sinon.stub(client, '_clearIdle'); sinon.stub(client, 'send'); client._clientQueue = [{ request: { tag: 'W101', command: 'TEST' } }]; client._sendRequest(); expect(client._clearIdle.callCount).to.equal(1); expect(client.send.args[0][0]).to.equal('W101 TEST\r\n'); }); it('should send partial data', () => { sinon.stub(client, '_clearIdle'); sinon.stub(client, 'send'); client._clientQueue = [{ request: { tag: 'W101', command: 'TEST', attributes: [{ type: 'LITERAL', value: 'abc' }] } }]; client._sendRequest(); expect(client._clearIdle.callCount).to.equal(1); expect(client.send.args[0][0]).to.equal('W101 TEST {3}\r\n'); expect(client._currentCommand.data).to.deep.equal(['abc']); }); it('should run precheck', done => { sinon.stub(client, '_clearIdle'); client._canSend = true; client._clientQueue = [{ request: { tag: 'W101', command: 'TEST', attributes: [{ type: 'LITERAL', value: 'abc' }] }, precheck: ctx => { expect(ctx).to.exist; expect(client._canSend).to.be.true; client._sendRequest = () => { expect(client._clientQueue.length).to.equal(2); expect(client._clientQueue[0].tag).to.include('.p'); expect(client._clientQueue[0].request.tag).to.include('.p'); client._clearIdle.restore(); done(); }; client.enqueueCommand({}, undefined, { ctx: ctx }); return Promise.resolve(); } }]; client._sendRequest(); }); }); describe('#_enterIdle', () => { it('should set idle timer', done => { client.onidle = () => { done(); }; client.timeoutEnterIdle = 1; client._enterIdle(); }); }); describe('#_processResponse', () => { it('should set humanReadable', () => { var response = { tag: '*', command: 'OK', attributes: [{ type: 'TEXT', value: 'Some random text' }] }; client._processResponse(response); expect(response.humanReadable).to.equal('Some random text'); }); it('should set response code', () => { var response = { tag: '*', command: 'OK', attributes: [{ type: 'ATOM', section: [{ type: 'ATOM', value: 'CAPABILITY' }, { type: 'ATOM', value: 'IMAP4REV1' }, { type: 'ATOM', value: 'UIDPLUS' }] }, { type: 'TEXT', value: 'Some random text' }] }; client._processResponse(response); expect(response.code).to.equal('CAPABILITY'); expect(response.capability).to.deep.equal(['IMAP4REV1', 'UIDPLUS']); }); }); describe('#isError', () => { it('should detect if an object is an error', () => { expect(client.isError(new RangeError('abc'))).to.be.true; expect(client.isError('abc')).to.be.false; }); }); describe('#enableCompression', () => { it('should create inflater and deflater streams', () => { client.socket.ondata = () => {}; sinon.stub(client.socket, 'ondata'); expect(client.compressed).to.be.false; client.enableCompression(); expect(client.compressed).to.be.true; const payload = 'asdasd'; const expected = payload.split('').map(char => char.charCodeAt(0)); client.send(payload); const actualOut = socketStub.send.args[0][0]; client.socket.ondata({ data: actualOut }); expect(Buffer.from(client._socketOnData.args[0][0].data)).to.deep.equal(Buffer.from(expected)); }); }); describe('#getPreviouslyQueued', () => { const ctx = {}; it('should return undefined with empty queue and no current command', () => { client._currentCommand = undefined; client._clientQueue = []; expect(testAndGetAttribute()).to.be.undefined; }); it('should return undefined with empty queue and non-SELECT current command', () => { client._currentCommand = createCommand('TEST'); client._clientQueue = []; expect(testAndGetAttribute()).to.be.undefined; }); it('should return current command with empty queue and SELECT current command', () => { client._currentCommand = createCommand('SELECT', 'ATTR'); client._clientQueue = []; expect(testAndGetAttribute()).to.equal('ATTR'); }); it('should return current command with non-SELECT commands in queue and SELECT current command', () => { client._currentCommand = createCommand('SELECT', 'ATTR'); client._clientQueue = [createCommand('TEST01'), createCommand('TEST02')]; expect(testAndGetAttribute()).to.equal('ATTR'); }); it('should return last SELECT before ctx with multiple SELECT commands in queue (1)', () => { client._currentCommand = createCommand('SELECT', 'ATTR01'); client._clientQueue = [createCommand('SELECT', 'ATTR'), createCommand('TEST'), ctx, createCommand('SELECT', 'ATTR03')]; expect(testAndGetAttribute()).to.equal('ATTR'); }); it('should return last SELECT before ctx with multiple SELECT commands in queue (2)', () => { client._clientQueue = [createCommand('SELECT', 'ATTR02'), createCommand('SELECT', 'ATTR'), ctx, createCommand('SELECT', 'ATTR03')]; expect(testAndGetAttribute()).to.equal('ATTR'); }); it('should return last SELECT before ctx with multiple SELECT commands in queue (3)', () => { client._clientQueue = [createCommand('SELECT', 'ATTR02'), createCommand('SELECT', 'ATTR'), createCommand('TEST'), ctx, createCommand('SELECT', 'ATTR03')]; expect(testAndGetAttribute()).to.equal('ATTR'); }); function testAndGetAttribute() { const data = client.getPreviouslyQueued(['SELECT'], ctx); if (data) { return data.request.attributes[0].value; } } function createCommand(command, attribute) { const attributes = []; const data = { request: { command, attributes } }; if (attribute) { data.request.attributes.push({ type: 'STRING', value: attribute }); } return data; } }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbWFwLXVuaXQuanMiXSwibmFtZXMiOlsiaG9zdCIsInBvcnQiLCJkZXNjcmliZSIsImNsaWVudCIsInNvY2tldFN0dWIiLCJiZWZvcmVFYWNoIiwiSW1hcENsaWVudCIsImV4cGVjdCIsInRvIiwiZXhpc3QiLCJsb2dnZXIiLCJkZWJ1ZyIsImVycm9yIiwiU29ja2V0Iiwib3BlbiIsInByb3RvdHlwZSIsImNsb3NlIiwic2VuZCIsInN1c3BlbmQiLCJyZXN1bWUiLCJ1cGdyYWRlVG9TZWN1cmUiLCJzaW5vbiIsImNyZWF0ZVN0dWJJbnN0YW5jZSIsInN0dWIiLCJ3aXRoQXJncyIsInJldHVybnMiLCJwcm9taXNlIiwiY29ubmVjdCIsInRoZW4iLCJjYWxsQ291bnQiLCJlcXVhbCIsIm9uZXJyb3IiLCJvbm9wZW4iLCJvbmNsb3NlIiwib25kYXRhIiwic2V0VGltZW91dCIsInNraXAiLCJpdCIsInNvY2tldCIsInJlYWR5U3RhdGUiLCJjYWxsZWQiLCJiZSIsImZhbHNlIiwic2VjdXJlTW9kZSIsInVwZ3JhZGUiLCJoYW5kbGVyIiwic2V0SGFuZGxlciIsIl9nbG9iYWxBY2NlcHRVbnRhZ2dlZCIsIkZFVENIIiwiZG9uZSIsImRhdGEiLCJFcnJvciIsIl9vbkRhdGEiLCJidWZmZXIiLCJfcGFyc2VJbmNvbWluZ0NvbW1hbmRzIiwiY2FsbGVkT25jZSIsInRydWUiLCJfaXRlcmF0ZUluY29taW5nQnVmZmVyIiwiYXBwZW5kSW5jb21pbmdCdWZmZXIiLCJpdGVyYXRvciIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsImFwcGx5IiwibmV4dCIsInZhbHVlIiwidW5kZWZpbmVkIiwiaXRlcmF0b3IxIiwiaXRlcmF0b3IyIiwiaXRlcmF0b3IzIiwiY29udGVudCIsIl9pbmNvbWluZ0J1ZmZlcnMiLCJwdXNoIiwib25yZWFkeSIsImdlbiIsIl9oYW5kbGVSZXNwb25zZSIsInRhZyIsImNvbW1hbmQiLCJhdHRyaWJ1dGVzIiwidHlwZSIsIm5yIiwiX2N1cnJlbnRDb21tYW5kIiwiZXJyb3JSZXNwb25zZUV4cGVjdHNFbXB0eUxpbmUiLCJURVNUIiwiX3NlbmRSZXF1ZXN0IiwicGF5bG9hZCIsImRlZXAiLCJjYWxsYmFjayIsInJlc3BvbnNlIiwiY2FsbHNGYWtlIiwiX2NsaWVudFF1ZXVlIiwiX3RhZ0NvdW50ZXIiLCJfY2FuU2VuZCIsImVucXVldWVDb21tYW5kIiwidCIsImNhdGNoIiwiZXJyIiwibGVuZ3RoIiwicmVxdWVzdCIsInZhbHVlQXNTdHJpbmciLCJfZW50ZXJJZGxlIiwiX2NsZWFySWRsZSIsImFyZ3MiLCJwcmVjaGVjayIsImN0eCIsImluY2x1ZGUiLCJyZXN0b3JlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJvbmlkbGUiLCJ0aW1lb3V0RW50ZXJJZGxlIiwiX3Byb2Nlc3NSZXNwb25zZSIsImh1bWFuUmVhZGFibGUiLCJzZWN0aW9uIiwiY29kZSIsImNhcGFiaWxpdHkiLCJpc0Vycm9yIiwiUmFuZ2VFcnJvciIsImNvbXByZXNzZWQiLCJlbmFibGVDb21wcmVzc2lvbiIsImV4cGVjdGVkIiwic3BsaXQiLCJtYXAiLCJjaGFyIiwiY2hhckNvZGVBdCIsImFjdHVhbE91dCIsIkJ1ZmZlciIsImZyb20iLCJfc29ja2V0T25EYXRhIiwidGVzdEFuZEdldEF0dHJpYnV0ZSIsImNyZWF0ZUNvbW1hbmQiLCJnZXRQcmV2aW91c2x5UXVldWVkIiwiYXR0cmlidXRlIl0sIm1hcHBpbmdzIjoiOztBQUVBOztBQUNBOzs7O0FBSEE7QUFLQSxNQUFNQSxJQUFJLEdBQUcsV0FBYjtBQUNBLE1BQU1DLElBQUksR0FBRyxLQUFiO0FBRUFDLFFBQVEsQ0FBQyw0QkFBRCxFQUErQixNQUFNO0FBQzNDLE1BQUlDLE1BQUosRUFBWUMsVUFBWjtBQUVBOztBQUVBQyxFQUFBQSxVQUFVLENBQUMsTUFBTTtBQUNmRixJQUFBQSxNQUFNLEdBQUcsSUFBSUcsYUFBSixDQUFlTixJQUFmLEVBQXFCQyxJQUFyQixDQUFUO0FBQ0FNLElBQUFBLE1BQU0sQ0FBQ0osTUFBRCxD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