adr
Version:
轻量级架构记录工具 - Command-line tools for working with Architecture Decision Records
189 lines • 15.9 kB
JavaScript
import { __awaiter } from "tslib";
let sinon = require('sinon');
let fs = require('fs');
let walkSync = require('walk-sync');
let LRU = require('lru-cache');
let OpenInEditor = require('open-in-editor');
import test from 'ava';
import ADR from '../index';
let Utils = ADR.Utils;
let Config = ADR.Config;
test('generateFileName: test for Chinese utf-8', t => {
let str = Utils.generateFileName('你無可奈何asd fsadf');
t.deepEqual(str, '你無可奈何asd-fsadf');
});
test('generateFileName: test for newline', t => {
let str = Utils.generateFileName('adr new fdsa \n ADR');
t.deepEqual(str, 'adr-new-fdsa-adr');
});
test('getSavePath: when no exist config file', t => {
let fsExistSpy = sinon.stub(fs, 'existsSync').returns(false);
let fsReadSpy = sinon.stub(fs, 'readFileSync').returns(JSON.stringify({
path: 'some'
}));
let dir = Config.getSavePath();
t.deepEqual(dir.includes('docs/adr/'), true);
fsExistSpy.restore();
fsReadSpy.restore();
});
test('getSavePath: when exist config file', t => {
let fsExistSpy = sinon.stub(fs, 'existsSync').returns(true);
let cacheSpy = sinon.stub(LRU.prototype, 'get').returns({
path: 'some-path'
});
let fsReadSpy = sinon.stub(fs, 'readFileSync').returns(JSON.stringify({
path: 'some-path'
}));
let dir = Config.getSavePath();
t.deepEqual(dir.indexOf('some-path') !== -1, true);
fsExistSpy.restore();
fsReadSpy.restore();
cacheSpy.restore();
});
test('createIndexByNumber: should return correct pad 1', t => {
let str = Utils.createIndexByNumber(1);
t.deepEqual(str, '0001');
});
test('createIndexByNumber: should return correct pad 11', t => {
let str = Utils.createIndexByNumber(11);
t.deepEqual(str, '0011');
});
test('createIndexByNumber: should return correct pad 999', t => {
let str = Utils.createIndexByNumber(999);
t.deepEqual(str, '0999');
});
test('getLatestIndex: when exist config file', t => {
let entriesSpy = sinon.stub(walkSync, 'entries').returns([
{
relativePath: '001-编写完整的单元测试.md',
basePath: '/Users/fdhuang/learing/adr/docs/adr/',
mode: 33188,
size: 246,
mtime: 1511435254653
},
{
relativePath: 'README.md',
basePath: '/Users/fdhuang/learing/adr/docs/adr/',
mode: 33188,
size: 246,
mtime: 1511435254653
}
]);
let lastNumber = Utils.getLatestIndex();
t.deepEqual(1, lastNumber);
entriesSpy.restore();
});
test('getLatestIndex: when exist config file with asciidoc', t => {
let ADRGetDocExtensionSpy = sinon.stub(ADR.Config, 'getDocExtension').returns('adoc');
let entriesSpy = sinon.stub(walkSync, 'entries').returns([
{
relativePath: '001-编写完整的单元测试.adoc',
basePath: '/Users/fdhuang/learing/adr/docs/adr/',
mode: 33188,
size: 246,
mtime: 1511435254653
},
{
relativePath: 'README.adoc',
basePath: '/Users/fdhuang/learing/adr/docs/adr/',
mode: 33188,
size: 246,
mtime: 1511435254653
}
]);
let lastNumber = Utils.getLatestIndex();
t.deepEqual(1, lastNumber);
entriesSpy.restore();
ADRGetDocExtensionSpy.restore();
});
test('getNewNumber: when exist last number', t => {
let entriesSpy = sinon.stub(walkSync, 'entries').returns([
{
relativePath: '001-编写完整的单元测试.md',
basePath: '/Users/fdhuang/learing/adr/docs/adr/',
mode: 33188,
size: 246,
mtime: 1511435254653
},
{
relativePath: 'README.md',
basePath: '/Users/fdhuang/learing/adr/docs/adr/',
mode: 33188,
size: 246,
mtime: 1511435254653
}
]);
let newIndexString = Utils.getNewIndexString();
t.deepEqual('0002', newIndexString);
entriesSpy.restore();
});
test('getNewNumber: when exist last number with asciidoc', t => {
let ADRGetDocExtensionSpy = sinon.stub(ADR.Config, 'getDocExtension').returns('adoc');
let entriesSpy = sinon.stub(walkSync, 'entries').returns([
{
relativePath: '001-编写完整的单元测试.adoc',
basePath: '/Users/fdhuang/learing/adr/docs/adr/',
mode: 33188,
size: 246,
mtime: 1511435254653
},
{
relativePath: 'README.adoc',
basePath: '/Users/fdhuang/learing/adr/docs/adr/',
mode: 33188,
size: 246,
mtime: 1511435254653
}
]);
let newIndexString = Utils.getNewIndexString();
t.deepEqual('0002', newIndexString);
entriesSpy.restore();
ADRGetDocExtensionSpy.restore();
});
test('getNewNumber: when exist last number 001', t => {
let entriesSpy = sinon.stub(walkSync, 'entries').returns([]);
let newIndexString = Utils.getNewIndexString();
t.deepEqual('0001', newIndexString);
entriesSpy.restore();
});
test('getLanguage: should enable get language', t => {
let fsExistSpy = sinon.stub(fs, 'existsSync').returns(true);
let cacheSpy = sinon.stub(LRU.prototype, 'get').returns({
path: 'some',
language: 'test'
});
let fsReadSpy = sinon.stub(fs, 'readFileSync').returns(JSON.stringify({
path: 'some',
language: 'test'
}));
let language = Config.getLanguage() ? Config.getLanguage() : '';
if (!language)
language = '';
t.deepEqual(language, 'test');
fsExistSpy.restore();
fsReadSpy.restore();
cacheSpy.restore();
});
test('createDateString: should return correct date string', t => {
let clock = sinon.useFakeTimers(new Date(2099, 0, 1));
let language = Utils.createDateString();
t.deepEqual(language, '2099-01-01');
clock.restore();
});
test('openInEditor: should open in editor successfully', t => {
let filename = 'test-open-in-editor.md';
let openInEditorSpy = sinon.stub(OpenInEditor, 'configure').returns({ open: (filePath) => __awaiter(void 0, void 0, void 0, function* () {
t.is(filePath, filename);
}) });
Utils.openInEditor(filename);
openInEditorSpy.restore();
});
test('openInEditor: should open in editor successfully with asciidoc', t => {
let filename = 'test-open-in-editor.adoc';
let openInEditorSpy = sinon.stub(OpenInEditor, 'configure').returns({ open: (filePath) => __awaiter(void 0, void 0, void 0, function* () {
t.is(filePath, filename);
}) });
Utils.openInEditor(filename);
openInEditorSpy.restore();
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0cy91dGlscy5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDNUIsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ3RCLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQTtBQUNuQyxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUE7QUFDOUIsSUFBSSxZQUFZLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUE7QUFFNUMsT0FBTyxJQUFJLE1BQU0sS0FBSyxDQUFBO0FBQ3RCLE9BQU8sR0FBRyxNQUFNLFVBQVUsQ0FBQTtBQUUxQixJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFBO0FBQ3JCLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUE7QUFFdkIsSUFBSSxDQUFDLDBDQUEwQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ25ELElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBQ2xELENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLENBQUE7QUFDcEMsQ0FBQyxDQUFDLENBQUE7QUFFRixJQUFJLENBQUMsb0NBQW9DLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDN0MsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLENBQUE7SUFDdkQsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtBQUN0QyxDQUFDLENBQUMsQ0FBQTtBQUVGLElBQUksQ0FBQyx3Q0FBd0MsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUNqRCxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDNUQsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDcEUsSUFBSSxFQUFFLE1BQU07S0FDYixDQUFDLENBQUMsQ0FBQTtJQUVILElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUM5QixDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDNUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQ3BCLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtBQUNyQixDQUFDLENBQUMsQ0FBQTtBQUVGLElBQUksQ0FBQyxxQ0FBcUMsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUM5QyxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDM0QsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUN0RCxJQUFJLEVBQUUsV0FBVztLQUNsQixDQUFDLENBQUE7SUFDRixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNwRSxJQUFJLEVBQUUsV0FBVztLQUNsQixDQUFDLENBQUMsQ0FBQTtJQUVILElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUM5QixDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDbEQsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQ3BCLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNuQixRQUFRLENBQUMsT0FBTyxFQUFFLENBQUE7QUFDcEIsQ0FBQyxDQUFDLENBQUE7QUFFRixJQUFJLENBQUMsa0RBQWtELEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDM0QsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3RDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFBO0FBQzFCLENBQUMsQ0FBQyxDQUFBO0FBRUYsSUFBSSxDQUFDLG1EQUFtRCxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQzVELElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUN2QyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQTtBQUMxQixDQUFDLENBQUMsQ0FBQTtBQUVGLElBQUksQ0FBQyxvREFBb0QsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUM3RCxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDeEMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUE7QUFDMUIsQ0FBQyxDQUFDLENBQUE7QUFFRixJQUFJLENBQUMsd0NBQXdDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDakQsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3ZEO1lBQ0UsWUFBWSxFQUFFLGtCQUFrQjtZQUNoQyxRQUFRLEVBQUUsc0NBQXNDO1lBQ2hELElBQUksRUFBRSxLQUFLO1lBQ1gsSUFBSSxFQUFFLEdBQUc7WUFDVCxLQUFLLEVBQUUsYUFBYTtTQUNyQjtRQUNEO1lBQ0UsWUFBWSxFQUFFLFdBQVc7WUFDekIsUUFBUSxFQUFFLHNDQUFzQztZQUNoRCxJQUFJLEVBQUUsS0FBSztZQUNYLElBQUksRUFBRSxHQUFHO1lBQ1QsS0FBSyxFQUFFLGFBQWE7U0FDckI7S0FDRixDQUFDLENBQUE7SUFFRixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUE7SUFDdkMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDMUIsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFBO0FBQ3RCLENBQUMsQ0FBQyxDQUFBO0FBRUYsSUFBSSxDQUFDLHNEQUFzRCxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQy9ELElBQUkscUJBQXFCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3JGLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUN2RDtZQUNFLFlBQVksRUFBRSxvQkFBb0I7WUFDbEMsUUFBUSxFQUFFLHNDQUFzQztZQUNoRCxJQUFJLEVBQUUsS0FBSztZQUNYLElBQUksRUFBRSxHQUFHO1lBQ1QsS0FBSyxFQUFFLGFBQWE7U0FDckI7UUFDRDtZQUNFLFlBQVksRUFBRSxhQUFhO1lBQzNCLFFBQVEsRUFBRSxzQ0FBc0M7WUFDaEQsSUFBSSxFQUFFLEtBQUs7WUFDWCxJQUFJLEVBQUUsR0FBRztZQUNULEtBQUssRUFBRSxhQUFhO1NBQ3JCO0tBQ0YsQ0FBQyxDQUFBO0lBRUYsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFBO0lBQ3ZDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQzFCLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNwQixxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtBQUNqQyxDQUFDLENBQUMsQ0FBQTtBQUVGLElBQUksQ0FBQyxzQ0FBc0MsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUMvQyxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDdkQ7WUFDRSxZQUFZLEVBQUUsa0JBQWtCO1lBQ2hDLFFBQVEsRUFBRSxzQ0FBc0M7WUFDaEQsSUFBSSxFQUFFLEtBQUs7WUFDWCxJQUFJLEVBQUUsR0FBRztZQUNULEtBQUssRUFBRSxhQUFhO1NBQ3JCO1FBQ0Q7WUFDRSxZQUFZLEVBQUUsV0FBVztZQUN6QixRQUFRLEVBQUUsc0NBQXNDO1lBQ2hELElBQUksRUFBRSxLQUFLO1lBQ1gsSUFBSSxFQUFFLEdBQUc7WUFDVCxLQUFLLEVBQUUsYUFBYTtTQUNyQjtLQUNGLENBQUMsQ0FBQTtJQUVGLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO0lBQzlDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFBO0lBQ25DLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtBQUN0QixDQUFDLENBQUMsQ0FBQTtBQUVGLElBQUksQ0FBQyxvREFBb0QsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUM3RCxJQUFJLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNyRixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDdkQ7WUFDRSxZQUFZLEVBQUUsb0JBQW9CO1lBQ2xDLFFBQVEsRUFBRSxzQ0FBc0M7WUFDaEQsSUFBSSxFQUFFLEtBQUs7WUFDWCxJQUFJLEVBQUUsR0FBRztZQUNULEtBQUssRUFBRSxhQUFhO1NBQ3JCO1FBQ0Q7WUFDRSxZQUFZLEVBQUUsYUFBYTtZQUMzQixRQUFRLEVBQUUsc0NBQXNDO1lBQ2hELElBQUksRUFBRSxLQUFLO1lBQ1gsSUFBSSxFQUFFLEdBQUc7WUFDVCxLQUFLLEVBQUUsYUFBYTtTQUNyQjtLQUNGLENBQUMsQ0FBQTtJQUVGLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO0lBQzlDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFBO0lBQ25DLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNwQixxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtBQUNqQyxDQUFDLENBQUMsQ0FBQTtBQUVGLElBQUksQ0FBQywwQ0FBMEMsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUNuRCxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFNUQsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUE7SUFDOUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUE7SUFDbkMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFBO0FBQ3RCLENBQUMsQ0FBQyxDQUFBO0FBRUYsSUFBSSxDQUFDLHlDQUF5QyxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ2xELElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUMzRCxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3RELElBQUksRUFBRSxNQUFNO1FBQ1osUUFBUSxFQUFFLE1BQU07S0FDakIsQ0FBQyxDQUFBO0lBQ0YsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDcEUsSUFBSSxFQUFFLE1BQU07UUFDWixRQUFRLEVBQUUsTUFBTTtLQUNqQixDQUFDLENBQUMsQ0FBQTtJQUVILElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDL0QsSUFBSSxDQUFDLFFBQVE7UUFBRSxRQUFRLEdBQUcsRUFBRSxDQUFBO0lBQzVCLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBQzdCLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNwQixTQUFTLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDbkIsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFBO0FBQ3BCLENBQUMsQ0FBQyxDQUFBO0FBRUYsSUFBSSxDQUFDLHFEQUFxRCxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQzlELElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRW5ELElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO0lBQ3ZDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFBO0lBQ25DLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQTtBQUNqQixDQUFDLENBQUMsQ0FBQTtBQUVGLElBQUksQ0FBQyxrREFBa0QsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUMzRCxJQUFJLFFBQVEsR0FBRyx3QkFBd0IsQ0FBQTtJQUV2QyxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBQyxJQUFJLEVBQUUsQ0FBTyxRQUFnQixFQUFFLEVBQUU7WUFDcEcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDMUIsQ0FBQyxDQUFBLEVBQUMsQ0FBQyxDQUFBO0lBRUgsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUM1QixlQUFlLENBQUMsT0FBTyxFQUFFLENBQUE7QUFDM0IsQ0FBQyxDQUFDLENBQUE7QUFFRixJQUFJLENBQUMsZ0VBQWdFLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDekUsSUFBSSxRQUFRLEdBQUcsMEJBQTBCLENBQUE7SUFFekMsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUMsSUFBSSxFQUFFLENBQU8sUUFBZ0IsRUFBRSxFQUFFO1lBQ3BHLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQzFCLENBQUMsQ0FBQSxFQUFDLENBQUMsQ0FBQTtJQUVILEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDNUIsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFBO0FBQzNCLENBQUMsQ0FBQyxDQUFBIn0=