UNPKG

18.9 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6const chalk_1 = __importDefault(require("chalk"));
7const indent_string_1 = __importDefault(require("indent-string"));
8const lodash_1 = require("lodash");
9const moment_loader_1 = __importDefault(require("../utils/moment-loader"));
10const os_family_1 = __importDefault(require("os-family"));
11const string_1 = require("../utils/string");
12const get_viewport_width_1 = __importDefault(require("../utils/get-viewport-width"));
13// NOTE: we should not expose internal state to
14// the plugin, to avoid accidental rewrites.
15// Therefore we use symbols to store them.
16/*global Symbol*/
17const stream = Symbol();
18const wordWrapEnabled = Symbol();
19const indent = Symbol();
20const errorDecorator = Symbol();
21class ReporterPluginHost {
22 constructor(plugin, outStream) {
23 this[stream] = outStream || process.stdout;
24 this[wordWrapEnabled] = false;
25 this[indent] = 0;
26 const useColors = this[stream] === process.stdout && chalk_1.default.enabled && !plugin.noColors;
27 this.chalk = new chalk_1.default.constructor({ enabled: useColors });
28 this.moment = moment_loader_1.default;
29 this.viewportWidth = get_viewport_width_1.default(this[stream]);
30 this.symbols = os_family_1.default.win ?
31 { ok: '√', err: '×' } :
32 { ok: '✓', err: '✖' };
33 lodash_1.assignIn(this, plugin);
34 this[errorDecorator] = this.createErrorDecorator();
35 }
36 // Error decorator
37 createErrorDecorator() {
38 return {
39 'span user-agent': str => this.chalk.grey(str),
40 'span subtitle': str => `- ${this.chalk.bold.red(str)} -`,
41 'div message': str => this.chalk.bold.red(str),
42 'div screenshot-info': lodash_1.identity,
43 'a screenshot-path': str => this.chalk.grey.underline(str),
44 'code': lodash_1.identity,
45 'span syntax-string': str => this.chalk.green(str),
46 'span syntax-punctuator': str => this.chalk.grey(str),
47 'span syntax-keyword': str => this.chalk.cyan(str),
48 'span syntax-number': str => this.chalk.magenta(str),
49 'span syntax-regex': str => this.chalk.magenta(str),
50 'span syntax-comment': str => this.chalk.grey.bold(str),
51 'span syntax-invalid': str => this.chalk.inverse(str),
52 'div code-frame': lodash_1.identity,
53 'div code-line': str => str + '\n',
54 'div code-line-last': lodash_1.identity,
55 'div code-line-num': str => ` ${str} |`,
56 'div code-line-num-base': str => this.chalk.bgRed(` > ${str} `) + '|',
57 'div code-line-src': lodash_1.identity,
58 'div stack': str => '\n\n' + str,
59 'div stack-line': str => str + '\n',
60 'div stack-line-last': lodash_1.identity,
61 'div stack-line-name': str => ` at ${this.chalk.bold(str)}`,
62 'div stack-line-location': str => ` (${this.chalk.grey.underline(str)})`,
63 'strong': str => this.chalk.bold(str),
64 'a': str => `"${this.chalk.underline(str)}"`
65 };
66 }
67 // String helpers
68 indentString(str, indentVal) {
69 return indent_string_1.default(str, ' ', indentVal);
70 }
71 wordWrap(str, indentVal, width) {
72 return string_1.wordWrap(str, indentVal, width);
73 }
74 escapeHtml(str) {
75 return lodash_1.escape(str);
76 }
77 formatError(err, prefix = '') {
78 const prefixLengthWithoutColors = string_1.removeTTYColors(prefix).length;
79 const maxMsgLength = this.viewportWidth - this[indent] - prefixLengthWithoutColors;
80 let msg = err.formatMessage(this[errorDecorator], maxMsgLength);
81 if (this[wordWrapEnabled])
82 msg = this.wordWrap(msg, prefixLengthWithoutColors, maxMsgLength);
83 else
84 msg = this.indentString(msg, prefixLengthWithoutColors);
85 return prefix + msg.substr(prefixLengthWithoutColors);
86 }
87 // Writing helpers
88 newline() {
89 this[stream].write('\n');
90 return this;
91 }
92 write(text) {
93 if (this[wordWrapEnabled])
94 text = this.wordWrap(text, this[indent], this.viewportWidth);
95 else
96 text = this.indentString(text, this[indent]);
97 this[stream].write(text);
98 return this;
99 }
100 useWordWrap(use) {
101 this[wordWrapEnabled] = use;
102 return this;
103 }
104 setIndent(val) {
105 this[indent] = val;
106 return this;
107 }
108 // Abstract methods implemented in plugin
109 async reportTaskStart( /* startTime, userAgents, testCount */) {
110 throw new Error('Not implemented');
111 }
112 async reportFixtureStart( /* name, path */) {
113 throw new Error('Not implemented');
114 }
115 // NOTE: It's an optional method
116 // async reportTestStart (/* name, testMeta */) {
117 // throw new Error('Not implemented');
118 // }
119 async reportTestDone( /* name, testRunInfo */) {
120 throw new Error('Not implemented');
121 }
122 async reportTaskDone( /* endTime, passed, warnings */) {
123 throw new Error('Not implemented');
124 }
125}
126exports.default = ReporterPluginHost;
127module.exports = exports.default;
128//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVwb3J0ZXIvcGx1Z2luLWhvc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsa0VBQXlDO0FBQ3pDLG1DQUFrRTtBQUNsRSwyRUFBNEM7QUFDNUMsMERBQTJCO0FBQzNCLDRDQUE0RDtBQUM1RCxxRkFBMkQ7QUFFM0QsK0NBQStDO0FBQy9DLDRDQUE0QztBQUM1QywwQ0FBMEM7QUFFMUMsaUJBQWlCO0FBQ2pCLE1BQU0sTUFBTSxHQUFZLE1BQU0sRUFBRSxDQUFDO0FBQ2pDLE1BQU0sZUFBZSxHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQ2pDLE1BQU0sTUFBTSxHQUFZLE1BQU0sRUFBRSxDQUFDO0FBQ2pDLE1BQU0sY0FBYyxHQUFJLE1BQU0sRUFBRSxDQUFDO0FBRWpDLE1BQXFCLGtCQUFrQjtJQUNuQyxZQUFhLE1BQU0sRUFBRSxTQUFTO1FBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBWSxTQUFTLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUNwRCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBWSxDQUFDLENBQUM7UUFFMUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLE9BQU8sQ0FBQyxNQUFNLElBQUksZUFBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFFdkYsSUFBSSxDQUFDLEtBQUssR0FBVyxJQUFJLGVBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsTUFBTSxHQUFVLHVCQUFNLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyw0QkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMs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Q0FBQztJQUN2QyxDQUFDO0lBRUQsZ0NBQWdDO0lBQ2hDLGlEQUFpRDtJQUNqRCwwQ0FBMEM7SUFDMUMsSUFBSTtJQUVKLEtBQUssQ0FBQyxjQUFjLEVBQUUsdUJBQXVCO1FBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsRUFBRSwrQkFBK0I7UUFDakQsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDSjtBQTNJRCxxQ0EySUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGluZGVudFN0cmluZyBmcm9tICdpbmRlbnQtc3RyaW5nJztcbmltcG9ydCB7IGlkZW50aXR5LCBlc2NhcGUgYXMgZXNjYXBlSHRtbCwgYXNzaWduSW4gfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG1vbWVudCBmcm9tICcuLi91dGlscy9tb21lbnQtbG9hZGVyJztcbmltcG9ydCBPUyBmcm9tICdvcy1mYW1pbHknO1xuaW1wb3J0IHsgd29yZFdyYXAsIHJlbW92ZVRUWUNvbG9ycyB9IGZyb20gJy4uL3V0aWxzL3N0cmluZyc7XG5pbXBvcnQgZ2V0Vmlld3BvcnRXaWR0aCBmcm9tICcuLi91dGlscy9nZXQtdmlld3BvcnQtd2lkdGgnO1xuXG4vLyBOT1RFOiB3ZSBzaG91bGQgbm90IGV4cG9zZSBpbnRlcm5hbCBzdGF0ZSB0b1xuLy8gdGhlIHBsdWdpbiwgdG8gYXZvaWQgYWNjaWRlbnRhbCByZXdyaXRlcy5cbi8vIFRoZXJlZm9yZSB3ZSB1c2Ugc3ltYm9scyB0byBzdG9yZSB0aGVtLlxuXG4vKmdsb2JhbCBTeW1ib2wqL1xuY29uc3Qgc3RyZWFtICAgICAgICAgID0gU3ltYm9sKCk7XG5jb25zdCB3b3JkV3JhcEVuYWJsZWQgPSBTeW1ib2woKTtcbmNvbnN0IGluZGVudCAgICAgICAgICA9IFN5bWJvbCgpO1xuY29uc3QgZXJyb3JEZWNvcmF0b3IgID0gU3ltYm9sKCk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcG9ydGVyUGx1Z2luSG9zdCB7XG4gICAgY29uc3RydWN0b3IgKHBsdWdpbiwgb3V0U3RyZWFtKSB7XG4gICAgICAgIHRoaXNbc3RyZWFtXSAgICAgICAgICA9IG91dFN0cmVhbSB8fCBwcm9jZXNzLnN0ZG91dDtcbiAgICAgICAgdGhpc1t3b3JkV3JhcEVuYWJsZWRdID0gZmFsc2U7XG4gICAgICAgIHRoaXNbaW5kZW50XSAgICAgICAgICA9IDA7XG5cbiAgICAgICAgY29uc3QgdXNlQ29sb3JzID0gdGhpc1tzdHJlYW1dID09PSBwcm9jZXNzLnN0ZG91dCAmJiBjaGFsay5lbmFibGVkICYmICFwbHVnaW4ubm9Db2xvcnM7XG5cbiAgICAgICAgdGhpcy5jaGFsayAgICAgICAgID0gbmV3IGNoYWxrLmNvbnN0cnVjdG9yKHsgZW5hYmxlZDogdXNlQ29sb3JzIH0pO1xuICAgICAgICB0aGlzLm1vbWVudCAgICAgICAgPSBtb21lbnQ7XG4gICAgICAgIHRoaXMudmlld3BvcnRXaWR0aCA9IGdldFZpZXdwb3J0V2lkdGgodGhpc1tzdHJlYW1dKTtcblxuICAgICAgICB0aGlzLnN5bWJvbHMgPSBPUy53aW4gP1xuICAgICAgICAgICAgeyBvazogJ+KImicsIGVycjogJ8OXJyB9IDpcbiAgICAgICAgICAgIHsgb2s6ICfinJMnLCBlcnI6ICfinJYnIH07XG5cbiAgICAgICAgYXNzaWduSW4odGhpcywgcGx1Z2luKTtcblxuICAgICAgICB0aGlzW2Vycm9yRGVjb3JhdG9yXSA9IHRoaXMuY3JlYXRlRXJyb3JEZWNvcmF0b3IoKTtcbiAgICB9XG5cbiAgICAvLyBFcnJvciBkZWNvcmF0b3JcbiAgICBjcmVhdGVFcnJvckRlY29yYXRvciAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnc3BhbiB1c2VyLWFnZW50Jzogc3RyID0+IHRoaXMuY2hhbGsuZ3JleShzdHIpLFxuXG4gICAgICAgICAgICAnc3BhbiBzdWJ0aXRsZSc6IHN0ciA9PiBgLSAke3RoaXMuY2hhbGsuYm9sZC5yZWQoc3RyKX0gLWAsXG4gICAgICAgICAgICAnZGl2IG1lc3NhZ2UnOiAgIHN0ciA9PiB0aGlzLmNoYWxrLmJvbGQucmVkKHN0ciksXG5cbiAgICAgICAgICAgICdkaXYgc2NyZWVuc2hvdC1pbmZvJzogaWRlbnRpdHksXG4gICAgICAgICAgICAnYSBzY3JlZW5zaG90LXBhdGgnOiAgIHN0ciA9PiB0aGlzLmNoYWxrLmdyZXkudW5kZXJsaW5lKHN0ciksXG5cbiAgICAgICAgICAgICdjb2RlJzogaWRlbnRpdHksXG5cbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1zdHJpbmcnOiAgICAgc3RyID0+IHRoaXMuY2hhbGsuZ3JlZW4oc3RyKSxcbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1wdW5jdHVhdG9yJzogc3RyID0+IHRoaXMuY2hhbGsuZ3JleShzdHIpLFxuICAgICAgICAgICAgJ3NwYW4gc3ludGF4LWtleXdvcmQnOiAgICBzdHIgPT4gdGhpcy5jaGFsay5jeWFuKHN0ciksXG4gICAgICAgICAgICAnc3BhbiBzeW50YXgtbnVtYmVyJzogICAgIHN0ciA9PiB0aGlzLmNoYWxrLm1hZ2VudGEoc3RyKSxcbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1yZWdleCc6ICAgICAgc3RyID0+IHRoaXMuY2hhbGsubWFnZW50YShzdHIpLFxuICAgICAgICAgICAgJ3NwYW4gc3ludGF4LWNvbW1lbnQnOiAgICBzdHIgPT4gdGhpcy5jaGFsay5ncmV5LmJvbGQoc3RyKSxcbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1pbnZhbGlkJzogICAgc3RyID0+IHRoaXMuY2hhbGsuaW52ZXJzZShzdHIpLFxuXG4gICAgICAgICAgICAnZGl2IGNvZGUtZnJhbWUnOiAgICAgICAgIGlkZW50aXR5LFxuICAgICAgICAgICAgJ2RpdiBjb2RlLWxpbmUnOiAgICAgICAgICBzdHIgPT4gc3RyICsgJ1xcbicsXG4gICAgICAgICAgICAnZGl2IGNvZGUtbGluZS1sYXN0JzogICAgIGlkZW50aXR5LFxuICAgICAgICAgICAgJ2RpdiBjb2RlLWxpbmUtbnVtJzogICAgICBzdHIgPT4gYCAgICR7c3RyfSB8YCxcbiAgICAgICAgICAgICdkaXYgY29kZS1saW5lLW51bS1iYXNlJzogc3RyID0+IHRoaXMuY2hhbGsuYmdSZWQoYCA+ICR7c3RyfSBgKSArICd8JyxcbiAgICAgICAgICAgICdkaXYgY29kZS1saW5lLXNyYyc6ICAgICAgaWRlbnRpdHksXG5cbiAgICAgICAgICAgICdkaXYgc3RhY2snOiAgICAgICAgICAgICAgIHN0ciA9PiAnXFxuXFxuJyArIHN0cixcbiAgICAgICAgICAgICdkaXYgc3RhY2stbGluZSc6ICAgICAgICAgIHN0ciA9PiBzdHIgKyAnXFxuJyxcbiAgICAgICAgICAgICdkaXYgc3RhY2stbGluZS1sYXN0JzogICAgIGlkZW50aXR5LFxuICAgICAgICAgICAgJ2RpdiBzdGFjay1saW5lLW5hbWUnOiAgICAgc3RyID0+IGAgICBhdCAke3RoaXMuY2hhbGsuYm9sZChzdHIpfWAsXG4gICAgICAgICAgICAnZGl2IHN0YWNrLWxpbmUtbG9jYXRpb24nOiBzdHIgPT4gYCAoJHt0aGlzLmNoYWxrLmdyZXkudW5kZXJsaW5lKHN0cil9KWAsXG5cbiAgICAgICAgICAgICdzdHJvbmcnOiBzdHIgPT4gdGhpcy5jaGFsay5ib2xkKHN0ciksXG4gICAgICAgICAgICAnYSc6ICAgICAgc3RyID0+IGBcIiR7dGhpcy5jaGFsay51bmRlcmxpbmUoc3RyKX1cImBcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBTdHJpbmcgaGVscGVyc1xuICAgIGluZGVudFN0cmluZyAoc3RyLCBpbmRlbnRWYWwpIHtcbiAgICAgICAgcmV0dXJuIGluZGVudFN0cmluZyhzdHIsICcgJywgaW5kZW50VmFsKTtcbiAgICB9XG5cbiAgICB3b3JkV3JhcCAoc3RyLCBpbmRlbnRWYWwsIHdpZHRoKSB7XG4gICAgICAgIHJldHVybiB3b3JkV3JhcChzdHIsIGluZGVudFZhbCwgd2lkdGgpO1xuICAgIH1cblxuICAgIGVzY2FwZUh0bWwgKHN0cikge1xuICAgICAgICByZXR1cm4gZXNjYXBlSHRtbChzdHIpO1xuICAgIH1cblxuICAgIGZvcm1hdEVycm9yIChlcnIsIHByZWZpeCA9ICcnKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeExlbmd0aFdpdGhvdXRDb2xvcnMgPSByZW1vdmVUVFlDb2xvcnMocHJlZml4KS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG1heE1zZ0xlbmd0aCAgICAgICAgICAgICAgPSB0aGlzLnZpZXdwb3J0V2lkdGggLSB0aGlzW2luZGVudF0gLSBwcmVmaXhMZW5ndGhXaXRob3V0Q29sb3JzO1xuICAgICAgICBsZXQgbXNnICAgICAgICAgICAgICAgICAgICAgICAgID0gZXJyLmZvcm1hdE1lc3NhZ2UodGhpc1tlcnJvckRlY29yYXRvcl0sIG1heE1zZ0xlbmd0aCk7XG5cbiAgICAgICAgaWYgKHRoaXNbd29yZFdyYXBFbmFibGVkXSlcbiAgICAgICAgICAgIG1zZyA9IHRoaXMud29yZFdyYXAobXNnLCBwcmVmaXhMZW5ndGhXaXRob3V0Q29sb3JzLCBtYXhNc2dMZW5ndGgpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBtc2cgPSB0aGlzLmluZGVudFN0cmluZyhtc2csIHByZWZpeExlbmd0aFdpdGhvdXRDb2xvcnMpO1xuXG4gICAgICAgIHJldHVybiBwcmVmaXggKyBtc2cuc3Vic3RyKHByZWZpeExlbmd0aFdpdGhvdXRDb2xvcnMpO1xuICAgIH1cblxuXG4gICAgLy8gV3JpdGluZyBoZWxwZXJzXG4gICAgbmV3bGluZSAoKSB7XG4gICAgICAgIHRoaXNbc3RyZWFtXS53cml0ZSgnXFxuJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd3JpdGUgKHRleHQpIHtcbiAgICAgICAgaWYgKHRoaXNbd29yZFdyYXBFbmFibGVkXSlcbiAgICAgICAgICAgIHRleHQgPSB0aGlzLndvcmRXcmFwKHRleHQsIHRoaXNbaW5kZW50XSwgdGhpcy52aWV3cG9ydFdpZHRoKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGV4dCA9IHRoaXMuaW5kZW50U3RyaW5nKHRleHQsIHRoaXNbaW5kZW50XSk7XG5cbiAgICAgICAgdGhpc1tzdHJlYW1dLndyaXRlKHRleHQpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHVzZVdvcmRXcmFwICh1c2UpIHtcbiAgICAgICAgdGhpc1t3b3JkV3JhcEVuYWJsZWRdID0gdXNlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHNldEluZGVudCAodmFsKSB7XG4gICAgICAgIHRoaXNbaW5kZW50XSA9IHZhbDtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cblxuICAgIC8vIEFic3RyYWN0IG1ldGhvZHMgaW1wbGVtZW50ZWQgaW4gcGx1Z2luXG4gICAgYXN5bmMgcmVwb3J0VGFza1N0YXJ0ICgvKiBzdGFydFRpbWUsIHVzZXJBZ2VudHMsIHRlc3RDb3VudCAqLykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH1cblxuICAgIGFzeW5jIHJlcG9ydEZpeHR1cmVTdGFydCAoLyogbmFtZSwgcGF0aCAqLykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH1cblxuICAgIC8vIE5PVEU6IEl0J3MgYW4gb3B0aW9uYWwgbWV0aG9kXG4gICAgLy8gYXN5bmMgcmVwb3J0VGVzdFN0YXJ0ICgvKiBuYW1lLCB0ZXN0TWV0YSAqLykge1xuICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgIC8vIH1cblxuICAgIGFzeW5jIHJlcG9ydFRlc3REb25lICgvKiBuYW1lLCB0ZXN0UnVuSW5mbyAqLykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH1cblxuICAgIGFzeW5jIHJlcG9ydFRhc2tEb25lICgvKiBlbmRUaW1lLCBwYXNzZWQsIHdhcm5pbmdzICovKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxufVxuIl19
\No newline at end of file