@percy/logger 1.0.0-beta.70 → 1.0.0-beta.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.js +5 -3
- package/dist/bundle.js +55 -30
- package/dist/index.js +1 -6
- package/dist/logger.js +25 -10
- package/dist/util.js +4 -3
- package/package.json +10 -10
- package/test/client.js +25 -17
- package/test/helpers.js +2 -2
package/dist/browser.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.default = void 0;
|
|
6
|
+
exports.default = exports.PercyBrowserLogger = void 0;
|
|
7
7
|
|
|
8
8
|
var _util = require("./util");
|
|
9
9
|
|
|
@@ -11,7 +11,7 @@ var _logger = _interopRequireDefault(require("./logger"));
|
|
|
11
11
|
|
|
12
12
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
13
|
|
|
14
|
-
class
|
|
14
|
+
class PercyBrowserLogger extends _logger.default {
|
|
15
15
|
write(level, message) {
|
|
16
16
|
let out = ['warn', 'error'].includes(level) ? level : 'log';
|
|
17
17
|
let colors = [];
|
|
@@ -28,4 +28,6 @@ class BrowserLogger extends _logger.default {
|
|
|
28
28
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
exports.
|
|
31
|
+
exports.PercyBrowserLogger = PercyBrowserLogger;
|
|
32
|
+
var _default = PercyBrowserLogger;
|
|
33
|
+
exports.default = _default;
|
package/dist/bundle.js
CHANGED
|
@@ -29,10 +29,11 @@
|
|
|
29
29
|
const ANSI_REG = new RegExp('[\\u001B\\u009B][[\\]()#;?]*((?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)' + '|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))', 'g'); // color names by ansi escape code
|
|
30
30
|
|
|
31
31
|
const ANSI_COLORS = {
|
|
32
|
-
'
|
|
33
|
-
'
|
|
32
|
+
'91m': 'red',
|
|
33
|
+
'32m': 'green',
|
|
34
|
+
'93m': 'yellow',
|
|
34
35
|
'34m': 'blue',
|
|
35
|
-
'
|
|
36
|
+
'95m': 'magenta',
|
|
36
37
|
'90m': 'grey'
|
|
37
38
|
}; // colorize each line of a string using an ansi escape sequence
|
|
38
39
|
|
|
@@ -43,7 +44,8 @@
|
|
|
43
44
|
} // map ansi colors to bound colorize functions
|
|
44
45
|
|
|
45
46
|
|
|
46
|
-
const colors = entries(ANSI_COLORS).reduce((colors,
|
|
47
|
+
const colors = entries(ANSI_COLORS).reduce((colors, _ref) => {
|
|
48
|
+
let [code, name] = _ref;
|
|
47
49
|
return assign(colors, {
|
|
48
50
|
[name]: colorize.bind(null, code)
|
|
49
51
|
});
|
|
@@ -108,8 +110,8 @@
|
|
|
108
110
|
|
|
109
111
|
|
|
110
112
|
loglevel(level) {
|
|
111
|
-
if (
|
|
112
|
-
this.level
|
|
113
|
+
if (level) this.level = level;
|
|
114
|
+
return this.level;
|
|
113
115
|
} // Change namespaces by generating an array of namespace regular expressions from a
|
|
114
116
|
// comma separated debug string
|
|
115
117
|
|
|
@@ -142,9 +144,13 @@
|
|
|
142
144
|
return Object.keys(LOG_LEVELS).reduce((group, level) => Object.assign(group, {
|
|
143
145
|
[level]: this.log.bind(this, name, level)
|
|
144
146
|
}), {
|
|
145
|
-
progress: this.progress.bind(this, name),
|
|
146
147
|
deprecated: this.deprecated.bind(this, name),
|
|
147
|
-
shouldLog: this.shouldLog.bind(this, name)
|
|
148
|
+
shouldLog: this.shouldLog.bind(this, name),
|
|
149
|
+
progress: this.progress.bind(this, name),
|
|
150
|
+
format: this.format.bind(this, name),
|
|
151
|
+
loglevel: this.loglevel.bind(this),
|
|
152
|
+
stdout: this.constructor.stdout,
|
|
153
|
+
stderr: this.constructor.stderr
|
|
148
154
|
});
|
|
149
155
|
} // Query for a set of logs by filtering the in-memory store
|
|
150
156
|
|
|
@@ -154,10 +160,18 @@
|
|
|
154
160
|
} // Formats messages before they are logged to stdio
|
|
155
161
|
|
|
156
162
|
|
|
157
|
-
format(
|
|
163
|
+
format(debug, level, message, elapsed) {
|
|
158
164
|
let label = 'percy';
|
|
159
165
|
let suffix = '';
|
|
160
166
|
|
|
167
|
+
if (arguments.length === 1) {
|
|
168
|
+
// format(message)
|
|
169
|
+
[debug, message] = [null, debug];
|
|
170
|
+
} else if (arguments.length === 2) {
|
|
171
|
+
// format(debug, message)
|
|
172
|
+
[level, message] = [null, level];
|
|
173
|
+
}
|
|
174
|
+
|
|
161
175
|
if (this.level === 'debug') {
|
|
162
176
|
// include debug info in the label
|
|
163
177
|
if (debug) label += `:${debug}`; // include elapsed time since last log
|
|
@@ -191,7 +205,7 @@
|
|
|
191
205
|
} = this.constructor;
|
|
192
206
|
|
|
193
207
|
if (stdout.isTTY || !this._progress) {
|
|
194
|
-
message && (message = this.format(
|
|
208
|
+
message && (message = this.format(debug, message));
|
|
195
209
|
if (stdout.isTTY) stdout.cursorTo(0);else message && (message = message + '\n');
|
|
196
210
|
if (message) stdout.write(message);
|
|
197
211
|
if (stdout.isTTY) stdout.clearLine(1);
|
|
@@ -224,7 +238,8 @@
|
|
|
224
238
|
// information to store with the message and other info
|
|
225
239
|
|
|
226
240
|
|
|
227
|
-
log(debug, level, message
|
|
241
|
+
log(debug, level, message) {
|
|
242
|
+
let meta = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
228
243
|
// message might be an error object
|
|
229
244
|
let isError = typeof message !== 'string' && (level === 'error' || level === 'debug');
|
|
230
245
|
let error = isError && message; // if remote, send logs there
|
|
@@ -259,7 +274,7 @@
|
|
|
259
274
|
if (this.shouldLog(debug, level)) {
|
|
260
275
|
let elapsed = timestamp - (this.lastlog || timestamp);
|
|
261
276
|
if (isError && this.level !== 'debug') message = error.toString();
|
|
262
|
-
this.write(level, this.format(
|
|
277
|
+
this.write(level, this.format(debug, error ? 'error' : level, message, elapsed));
|
|
263
278
|
this.lastlog = timestamp;
|
|
264
279
|
}
|
|
265
280
|
} // Writes a message to stdio based on the loglevel
|
|
@@ -295,9 +310,10 @@
|
|
|
295
310
|
}
|
|
296
311
|
})); // attach remote logging handler
|
|
297
312
|
|
|
298
|
-
socket.onmessage =
|
|
299
|
-
|
|
300
|
-
|
|
313
|
+
socket.onmessage = _ref => {
|
|
314
|
+
let {
|
|
315
|
+
data
|
|
316
|
+
} = _ref;
|
|
301
317
|
let {
|
|
302
318
|
log,
|
|
303
319
|
logAll
|
|
@@ -313,7 +329,8 @@
|
|
|
313
329
|
} // Connects to a remote logger
|
|
314
330
|
|
|
315
331
|
|
|
316
|
-
async remote(createSocket
|
|
332
|
+
async remote(createSocket) {
|
|
333
|
+
let timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;
|
|
317
334
|
if (this.isRemote) return; // if not already connected, wait until the timeout
|
|
318
335
|
|
|
319
336
|
let err = await new Promise(resolve => {
|
|
@@ -355,9 +372,10 @@
|
|
|
355
372
|
} // attach an incoming message handler
|
|
356
373
|
|
|
357
374
|
|
|
358
|
-
this.socket.onmessage =
|
|
359
|
-
|
|
360
|
-
|
|
375
|
+
this.socket.onmessage = _ref2 => {
|
|
376
|
+
let {
|
|
377
|
+
data
|
|
378
|
+
} = _ref2;
|
|
361
379
|
let {
|
|
362
380
|
env
|
|
363
381
|
} = JSON.parse(data); // update local environment info
|
|
@@ -380,10 +398,11 @@
|
|
|
380
398
|
|
|
381
399
|
var logger$1 = /*#__PURE__*/Object.freeze({
|
|
382
400
|
__proto__: null,
|
|
401
|
+
PercyLogger: PercyLogger,
|
|
383
402
|
'default': PercyLogger
|
|
384
403
|
});
|
|
385
404
|
|
|
386
|
-
class
|
|
405
|
+
class PercyBrowserLogger extends PercyLogger {
|
|
387
406
|
write(level, message) {
|
|
388
407
|
let out = ['warn', 'error'].includes(level) ? level : 'log';
|
|
389
408
|
let colors = [];
|
|
@@ -402,7 +421,8 @@
|
|
|
402
421
|
|
|
403
422
|
var browser = /*#__PURE__*/Object.freeze({
|
|
404
423
|
__proto__: null,
|
|
405
|
-
|
|
424
|
+
PercyBrowserLogger: PercyBrowserLogger,
|
|
425
|
+
'default': PercyBrowserLogger
|
|
406
426
|
});
|
|
407
427
|
|
|
408
428
|
var require$$0 = /*@__PURE__*/getAugmentedNamespace(browser);
|
|
@@ -418,16 +438,21 @@
|
|
|
418
438
|
}
|
|
419
439
|
|
|
420
440
|
Object.assign(logger, {
|
|
421
|
-
format: (
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
return new Logger().
|
|
441
|
+
format: function () {
|
|
442
|
+
return new Logger().format(...arguments);
|
|
443
|
+
},
|
|
444
|
+
query: function () {
|
|
445
|
+
return new Logger().query(...arguments);
|
|
446
|
+
},
|
|
447
|
+
connect: function () {
|
|
448
|
+
return new Logger().connect(...arguments);
|
|
449
|
+
},
|
|
450
|
+
remote: function () {
|
|
451
|
+
return new Logger().remote(...arguments);
|
|
452
|
+
},
|
|
453
|
+
loglevel: function () {
|
|
454
|
+
return new Logger().loglevel(...arguments);
|
|
429
455
|
}
|
|
430
|
-
|
|
431
456
|
});
|
|
432
457
|
Object.defineProperties(logger, {
|
|
433
458
|
Logger: {
|
package/dist/index.js
CHANGED
|
@@ -13,12 +13,7 @@ Object.assign(logger, {
|
|
|
13
13
|
query: (...args) => new Logger().query(...args),
|
|
14
14
|
connect: (...args) => new Logger().connect(...args),
|
|
15
15
|
remote: (...args) => new Logger().remote(...args),
|
|
16
|
-
|
|
17
|
-
loglevel(level, flags = {}) {
|
|
18
|
-
if (flags.debug) level = 'debug';else if (flags.verbose) level = 'debug';else if (flags.quiet) level = 'warn';else if (flags.silent) level = 'silent';
|
|
19
|
-
return new Logger().loglevel(level);
|
|
20
|
-
}
|
|
21
|
-
|
|
16
|
+
loglevel: (...args) => new Logger().loglevel(...args)
|
|
22
17
|
});
|
|
23
18
|
Object.defineProperties(logger, {
|
|
24
19
|
Logger: {
|
package/dist/logger.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.default = void 0;
|
|
6
|
+
exports.default = exports.PercyLogger = void 0;
|
|
7
7
|
|
|
8
8
|
var _util = require("./util");
|
|
9
9
|
|
|
@@ -53,8 +53,8 @@ class PercyLogger {
|
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
loglevel(level) {
|
|
56
|
-
if (
|
|
57
|
-
this.level
|
|
56
|
+
if (level) this.level = level;
|
|
57
|
+
return this.level;
|
|
58
58
|
} // Change namespaces by generating an array of namespace regular expressions from a
|
|
59
59
|
// comma separated debug string
|
|
60
60
|
|
|
@@ -87,9 +87,13 @@ class PercyLogger {
|
|
|
87
87
|
return Object.keys(LOG_LEVELS).reduce((group, level) => Object.assign(group, {
|
|
88
88
|
[level]: this.log.bind(this, name, level)
|
|
89
89
|
}), {
|
|
90
|
-
progress: this.progress.bind(this, name),
|
|
91
90
|
deprecated: this.deprecated.bind(this, name),
|
|
92
|
-
shouldLog: this.shouldLog.bind(this, name)
|
|
91
|
+
shouldLog: this.shouldLog.bind(this, name),
|
|
92
|
+
progress: this.progress.bind(this, name),
|
|
93
|
+
format: this.format.bind(this, name),
|
|
94
|
+
loglevel: this.loglevel.bind(this),
|
|
95
|
+
stdout: this.constructor.stdout,
|
|
96
|
+
stderr: this.constructor.stderr
|
|
93
97
|
});
|
|
94
98
|
} // Query for a set of logs by filtering the in-memory store
|
|
95
99
|
|
|
@@ -99,10 +103,18 @@ class PercyLogger {
|
|
|
99
103
|
} // Formats messages before they are logged to stdio
|
|
100
104
|
|
|
101
105
|
|
|
102
|
-
format(
|
|
106
|
+
format(debug, level, message, elapsed) {
|
|
103
107
|
let label = 'percy';
|
|
104
108
|
let suffix = '';
|
|
105
109
|
|
|
110
|
+
if (arguments.length === 1) {
|
|
111
|
+
// format(message)
|
|
112
|
+
[debug, message] = [null, debug];
|
|
113
|
+
} else if (arguments.length === 2) {
|
|
114
|
+
// format(debug, message)
|
|
115
|
+
[level, message] = [null, level];
|
|
116
|
+
}
|
|
117
|
+
|
|
106
118
|
if (this.level === 'debug') {
|
|
107
119
|
// include debug info in the label
|
|
108
120
|
if (debug) label += `:${debug}`; // include elapsed time since last log
|
|
@@ -136,7 +148,7 @@ class PercyLogger {
|
|
|
136
148
|
} = this.constructor;
|
|
137
149
|
|
|
138
150
|
if (stdout.isTTY || !this._progress) {
|
|
139
|
-
message && (message = this.format(
|
|
151
|
+
message && (message = this.format(debug, message));
|
|
140
152
|
if (stdout.isTTY) stdout.cursorTo(0);else message && (message = message + '\n');
|
|
141
153
|
if (message) stdout.write(message);
|
|
142
154
|
if (stdout.isTTY) stdout.clearLine(1);
|
|
@@ -204,7 +216,7 @@ class PercyLogger {
|
|
|
204
216
|
if (this.shouldLog(debug, level)) {
|
|
205
217
|
let elapsed = timestamp - (this.lastlog || timestamp);
|
|
206
218
|
if (isError && this.level !== 'debug') message = error.toString();
|
|
207
|
-
this.write(level, this.format(
|
|
219
|
+
this.write(level, this.format(debug, error ? 'error' : level, message, elapsed));
|
|
208
220
|
this.lastlog = timestamp;
|
|
209
221
|
}
|
|
210
222
|
} // Writes a message to stdio based on the loglevel
|
|
@@ -319,8 +331,11 @@ class PercyLogger {
|
|
|
319
331
|
|
|
320
332
|
}
|
|
321
333
|
|
|
322
|
-
exports.
|
|
334
|
+
exports.PercyLogger = PercyLogger;
|
|
323
335
|
|
|
324
336
|
_defineProperty(PercyLogger, "stdout", process.stdout);
|
|
325
337
|
|
|
326
|
-
_defineProperty(PercyLogger, "stderr", process.stderr);
|
|
338
|
+
_defineProperty(PercyLogger, "stderr", process.stderr);
|
|
339
|
+
|
|
340
|
+
var _default = PercyLogger;
|
|
341
|
+
exports.default = _default;
|
package/dist/util.js
CHANGED
|
@@ -13,10 +13,11 @@ const ANSI_REG = new RegExp('[\\u001B\\u009B][[\\]()#;?]*((?:(?:[a-zA-Z\\d]*(?:;
|
|
|
13
13
|
|
|
14
14
|
exports.ANSI_REG = ANSI_REG;
|
|
15
15
|
const ANSI_COLORS = {
|
|
16
|
-
'
|
|
17
|
-
'
|
|
16
|
+
'91m': 'red',
|
|
17
|
+
'32m': 'green',
|
|
18
|
+
'93m': 'yellow',
|
|
18
19
|
'34m': 'blue',
|
|
19
|
-
'
|
|
20
|
+
'95m': 'magenta',
|
|
20
21
|
'90m': 'grey'
|
|
21
22
|
}; // colorize each line of a string using an ansi escape sequence
|
|
22
23
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@percy/logger",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.74",
|
|
4
4
|
"license": "MIT",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/percy/cli",
|
|
8
|
+
"directory": "packages/logger"
|
|
9
|
+
},
|
|
10
|
+
"publishConfig": {
|
|
11
|
+
"access": "public"
|
|
12
|
+
},
|
|
5
13
|
"main": "dist/index.js",
|
|
6
14
|
"browser": "dist/bundle.js",
|
|
7
15
|
"files": [
|
|
@@ -18,18 +26,10 @@
|
|
|
18
26
|
"test": "node ../../scripts/test",
|
|
19
27
|
"test:coverage": "yarn test --coverage"
|
|
20
28
|
},
|
|
21
|
-
"publishConfig": {
|
|
22
|
-
"access": "public"
|
|
23
|
-
},
|
|
24
29
|
"rollup": {
|
|
25
30
|
"output": {
|
|
26
31
|
"name": "PercyLogger"
|
|
27
32
|
}
|
|
28
33
|
},
|
|
29
|
-
"
|
|
30
|
-
"type": "git",
|
|
31
|
-
"url": "https://github.com/percy/cli",
|
|
32
|
-
"directory": "packages/logger"
|
|
33
|
-
},
|
|
34
|
-
"gitHead": "34f37a98ff71281cebadd39e53bb55a65b0d3456"
|
|
34
|
+
"gitHead": "f8d1e38e93e5d731b8519d3fa8637e8a478efcde"
|
|
35
35
|
}
|
package/test/client.js
CHANGED
|
@@ -37,10 +37,11 @@
|
|
|
37
37
|
const ANSI_REG$1 = new RegExp('[\\u001B\\u009B][[\\]()#;?]*((?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)' + '|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))', 'g'); // color names by ansi escape code
|
|
38
38
|
|
|
39
39
|
const ANSI_COLORS = {
|
|
40
|
-
'
|
|
41
|
-
'
|
|
40
|
+
'91m': 'red',
|
|
41
|
+
'32m': 'green',
|
|
42
|
+
'93m': 'yellow',
|
|
42
43
|
'34m': 'blue',
|
|
43
|
-
'
|
|
44
|
+
'95m': 'magenta',
|
|
44
45
|
'90m': 'grey'
|
|
45
46
|
}; // colorize each line of a string using an ansi escape sequence
|
|
46
47
|
|
|
@@ -51,7 +52,8 @@
|
|
|
51
52
|
} // map ansi colors to bound colorize functions
|
|
52
53
|
|
|
53
54
|
|
|
54
|
-
const colors = entries(ANSI_COLORS).reduce((colors,
|
|
55
|
+
const colors = entries(ANSI_COLORS).reduce((colors, _ref) => {
|
|
56
|
+
let [code, name] = _ref;
|
|
55
57
|
return assign(colors, {
|
|
56
58
|
[name]: colorize.bind(null, code)
|
|
57
59
|
});
|
|
@@ -77,10 +79,11 @@
|
|
|
77
79
|
const NEWLINE_REG = /\r\n/g;
|
|
78
80
|
const LASTLINE_REG = /\n$/;
|
|
79
81
|
|
|
80
|
-
function sanitizeLog(str
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
function sanitizeLog(str) {
|
|
83
|
+
let {
|
|
84
|
+
ansi,
|
|
85
|
+
elapsed
|
|
86
|
+
} = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
84
87
|
// normalize line endings
|
|
85
88
|
str = str.replace(NEWLINE_REG, '\n'); // strip ansi colors
|
|
86
89
|
|
|
@@ -118,7 +121,11 @@
|
|
|
118
121
|
return object[method];
|
|
119
122
|
}
|
|
120
123
|
|
|
121
|
-
let spy = Object.assign(function spy(
|
|
124
|
+
let spy = Object.assign(function spy() {
|
|
125
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
126
|
+
args[_key] = arguments[_key];
|
|
127
|
+
}
|
|
128
|
+
|
|
122
129
|
spy.calls.push(args);
|
|
123
130
|
if (func) return func.apply(this, args);
|
|
124
131
|
}, {
|
|
@@ -180,14 +187,15 @@
|
|
|
180
187
|
|
|
181
188
|
let logs = Array.from(helpers.messages);
|
|
182
189
|
logger.loglevel('debug');
|
|
183
|
-
write(logger.format('
|
|
184
|
-
logs.reduce((lastlog, {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
190
|
+
write(logger.format('testing', 'warn', '--- DUMPING LOGS ---'));
|
|
191
|
+
logs.reduce((lastlog, _ref) => {
|
|
192
|
+
let {
|
|
193
|
+
debug,
|
|
194
|
+
level,
|
|
195
|
+
message,
|
|
196
|
+
timestamp
|
|
197
|
+
} = _ref;
|
|
198
|
+
write(logger.format(debug, level, message, timestamp - lastlog));
|
|
191
199
|
return timestamp;
|
|
192
200
|
}, logs[0].timestamp);
|
|
193
201
|
}
|
package/test/helpers.js
CHANGED
|
@@ -109,10 +109,10 @@ const helpers = {
|
|
|
109
109
|
|
|
110
110
|
logger.loglevel('debug');
|
|
111
111
|
|
|
112
|
-
write(logger.format('
|
|
112
|
+
write(logger.format('testing', 'warn', '--- DUMPING LOGS ---'));
|
|
113
113
|
|
|
114
114
|
logs.reduce((lastlog, { debug, level, message, timestamp }) => {
|
|
115
|
-
write(logger.format(
|
|
115
|
+
write(logger.format(debug, level, message, timestamp - lastlog));
|
|
116
116
|
return timestamp;
|
|
117
117
|
}, logs[0].timestamp);
|
|
118
118
|
}
|