@wp-tester/results 0.0.1 → 0.0.3
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/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/streaming.d.ts +198 -0
- package/dist/streaming.d.ts.map +1 -0
- package/dist/streaming.js +620 -0
- package/dist/streaming.js.map +1 -0
- package/dist/streaming.spec.d.ts +5 -0
- package/dist/streaming.spec.d.ts.map +1 -0
- package/dist/streaming.spec.js +217 -0
- package/dist/streaming.spec.js.map +1 -0
- package/dist/summary.d.ts +13 -0
- package/dist/summary.d.ts.map +1 -0
- package/dist/summary.js +40 -0
- package/dist/summary.js.map +1 -0
- package/dist/teamcity-parser.d.ts +70 -0
- package/dist/teamcity-parser.d.ts.map +1 -0
- package/dist/teamcity-parser.js +256 -0
- package/dist/teamcity-parser.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/vitest-streaming-reporter.d.ts +67 -0
- package/dist/vitest-streaming-reporter.d.ts.map +1 -0
- package/dist/vitest-streaming-reporter.js +236 -0
- package/dist/vitest-streaming-reporter.js.map +1 -0
- package/package.json +5 -4
package/dist/index.d.ts
CHANGED
|
@@ -8,5 +8,9 @@ import { Report } from "ctrf";
|
|
|
8
8
|
export type { Report, Results, Summary, Test, TestStatus, Tool, } from 'ctrf';
|
|
9
9
|
export { vitestToCTRF } from './parsers/vitest.js';
|
|
10
10
|
export { mergeReports } from './merge.js';
|
|
11
|
+
export { StreamingReporter, stdoutWriter, createTestFromEvent, type StreamEvent, type TestEvent, type SuiteEvent, type RunEvent, type StreamWriter, type StreamingReporterOptions, } from './streaming.js';
|
|
12
|
+
export { VitestStreamingReporter, createVitestStreamingReporter, } from './vitest-streaming-reporter.js';
|
|
13
|
+
export { TeamCityParser, createTeamCityParserStream, parseTeamCityOutput, } from './teamcity-parser.js';
|
|
14
|
+
export { printSummary } from './summary.js';
|
|
11
15
|
export declare const EMPTY_REPORT: Report;
|
|
12
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,YAAY,EACV,MAAM,EACN,OAAO,EACP,OAAO,EACP,IAAI,EACJ,UAAU,EACV,IAAI,GACL,MAAM,MAAM,CAAC;AAEd,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,YAAY,EACV,MAAM,EACN,OAAO,EACP,OAAO,EACP,IAAI,EACJ,UAAU,EACV,IAAI,GACL,MAAM,MAAM,CAAC;AAEd,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,EACnB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,wBAAwB,GAC9B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,eAAO,MAAM,YAAY,EAAE,MAmB1B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,10 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export { vitestToCTRF } from './parsers/vitest.js';
|
|
8
8
|
export { mergeReports } from './merge.js';
|
|
9
|
+
export { StreamingReporter, stdoutWriter, createTestFromEvent, } from './streaming.js';
|
|
10
|
+
export { VitestStreamingReporter, createVitestStreamingReporter, } from './vitest-streaming-reporter.js';
|
|
11
|
+
export { TeamCityParser, createTeamCityParserStream, parseTeamCityOutput, } from './teamcity-parser.js';
|
|
12
|
+
export { printSummary } from './summary.js';
|
|
9
13
|
export const EMPTY_REPORT = {
|
|
10
14
|
results: {
|
|
11
15
|
summary: {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,GAOpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,CAAC,MAAM,YAAY,GAAW;IAClC,OAAO,EAAE;QACP,OAAO,EAAE;YACP,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE;YACjB,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;YAChB,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,CAAC;SACT;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,uBAAuB;SAC9B;QACD,KAAK,EAAE,EAAE;KACV;IACD,YAAY,EAAE,MAAM;IACpB,WAAW,EAAE,OAAO;CACrB,CAAC"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming Test Reporter
|
|
3
|
+
*
|
|
4
|
+
* Provides real-time test result output in a uniform format.
|
|
5
|
+
* Works with both Vitest and PHPUnit test runners.
|
|
6
|
+
*
|
|
7
|
+
* Uses a unified state model with full screen rerendering for clean
|
|
8
|
+
* parallel test execution without output interference.
|
|
9
|
+
*/
|
|
10
|
+
import type { Test, Report } from "ctrf";
|
|
11
|
+
/**
|
|
12
|
+
* Test event emitted during test execution
|
|
13
|
+
*/
|
|
14
|
+
export interface TestEvent {
|
|
15
|
+
type: "test:start" | "test:pass" | "test:fail" | "test:skip" | "test:pending";
|
|
16
|
+
name: string;
|
|
17
|
+
suiteName?: string;
|
|
18
|
+
duration?: number;
|
|
19
|
+
message?: string;
|
|
20
|
+
trace?: string;
|
|
21
|
+
fileId?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Suite event emitted during test execution
|
|
25
|
+
*/
|
|
26
|
+
export interface SuiteEvent {
|
|
27
|
+
type: "suite:start" | "suite:end";
|
|
28
|
+
name: string;
|
|
29
|
+
fileId?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* File event emitted when a test file starts/ends
|
|
33
|
+
*/
|
|
34
|
+
export interface FileEvent {
|
|
35
|
+
type: "file:start" | "file:end";
|
|
36
|
+
fileId: string;
|
|
37
|
+
fileName?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Run event emitted at start/end of test run
|
|
41
|
+
*/
|
|
42
|
+
export interface RunEvent {
|
|
43
|
+
type: "run:start" | "run:end";
|
|
44
|
+
toolName?: string;
|
|
45
|
+
report?: Report;
|
|
46
|
+
}
|
|
47
|
+
export type StreamEvent = TestEvent | SuiteEvent | FileEvent | RunEvent;
|
|
48
|
+
/**
|
|
49
|
+
* Output writer interface for streaming results
|
|
50
|
+
*/
|
|
51
|
+
export interface StreamWriter {
|
|
52
|
+
write(text: string): void;
|
|
53
|
+
writeLine(text: string): void;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Default stdout writer
|
|
57
|
+
*/
|
|
58
|
+
export declare const stdoutWriter: StreamWriter;
|
|
59
|
+
/**
|
|
60
|
+
* Options for StreamingReporter constructor
|
|
61
|
+
*/
|
|
62
|
+
export interface StreamingReporterOptions {
|
|
63
|
+
writer?: StreamWriter;
|
|
64
|
+
showRunBoundaries?: boolean;
|
|
65
|
+
showSummary?: boolean;
|
|
66
|
+
enabled?: boolean;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Streaming test reporter for real-time test output
|
|
70
|
+
*
|
|
71
|
+
* Uses a unified state model where all test state is centralized and
|
|
72
|
+
* the entire output is rerendered on each update. This approach:
|
|
73
|
+
* - Eliminates output interference between parallel test runs
|
|
74
|
+
* - Simplifies state management (no per-file buffering)
|
|
75
|
+
* - Maintains dynamic UI with loaders/spinners
|
|
76
|
+
* - Makes the code much easier to understand and maintain
|
|
77
|
+
*/
|
|
78
|
+
export declare class StreamingReporter {
|
|
79
|
+
private writer;
|
|
80
|
+
private enabled;
|
|
81
|
+
private showRunBoundaries;
|
|
82
|
+
private showSummary;
|
|
83
|
+
private state;
|
|
84
|
+
private lastOutputLineCount;
|
|
85
|
+
private spinnerFrame;
|
|
86
|
+
private spinnerInterval;
|
|
87
|
+
constructor(options?: StreamingReporterOptions);
|
|
88
|
+
/**
|
|
89
|
+
* Enable or disable run boundaries (header and summary)
|
|
90
|
+
*/
|
|
91
|
+
setShowRunBoundaries(show: boolean): void;
|
|
92
|
+
/**
|
|
93
|
+
* Process a stream event
|
|
94
|
+
*/
|
|
95
|
+
onEvent(event: StreamEvent): void;
|
|
96
|
+
/**
|
|
97
|
+
* Start the spinner animation
|
|
98
|
+
*/
|
|
99
|
+
private startSpinner;
|
|
100
|
+
/**
|
|
101
|
+
* Stop the spinner animation
|
|
102
|
+
*/
|
|
103
|
+
private stopSpinner;
|
|
104
|
+
/**
|
|
105
|
+
* Clear the previous output
|
|
106
|
+
*/
|
|
107
|
+
private clearPreviousOutput;
|
|
108
|
+
/**
|
|
109
|
+
* Render the current state to output
|
|
110
|
+
*/
|
|
111
|
+
private render;
|
|
112
|
+
/**
|
|
113
|
+
* Render a file's tests to output lines
|
|
114
|
+
*/
|
|
115
|
+
private renderFile;
|
|
116
|
+
/**
|
|
117
|
+
* Render a suite and its tests
|
|
118
|
+
*/
|
|
119
|
+
private renderSuite;
|
|
120
|
+
/**
|
|
121
|
+
* Render a single test
|
|
122
|
+
*/
|
|
123
|
+
private renderTest;
|
|
124
|
+
/**
|
|
125
|
+
* Get or create a file state
|
|
126
|
+
*/
|
|
127
|
+
private getOrCreateFile;
|
|
128
|
+
/**
|
|
129
|
+
* Find or create a suite in a file
|
|
130
|
+
*/
|
|
131
|
+
private getOrCreateSuite;
|
|
132
|
+
/**
|
|
133
|
+
* Called when test run starts
|
|
134
|
+
*/
|
|
135
|
+
onRunStart(toolName?: string): void;
|
|
136
|
+
/**
|
|
137
|
+
* Called when test run ends
|
|
138
|
+
*/
|
|
139
|
+
onRunEnd(): void;
|
|
140
|
+
/**
|
|
141
|
+
* Called when a test file starts
|
|
142
|
+
*/
|
|
143
|
+
onFileStart(fileId: string, fileName?: string): void;
|
|
144
|
+
/**
|
|
145
|
+
* Called when a test file ends
|
|
146
|
+
*/
|
|
147
|
+
onFileEnd(_fileId: string): void;
|
|
148
|
+
/**
|
|
149
|
+
* Called when a test suite starts
|
|
150
|
+
*/
|
|
151
|
+
onSuiteStart(name: string, fileId?: string): void;
|
|
152
|
+
/**
|
|
153
|
+
* Called when a test suite ends
|
|
154
|
+
*/
|
|
155
|
+
onSuiteEnd(name: string, fileId?: string): void;
|
|
156
|
+
/**
|
|
157
|
+
* Called when a test starts
|
|
158
|
+
*/
|
|
159
|
+
onTestStart(name: string, suiteName?: string, fileId?: string): void;
|
|
160
|
+
/**
|
|
161
|
+
* Called when a test passes
|
|
162
|
+
*/
|
|
163
|
+
onTestPass(name: string, duration: number, suiteName?: string, fileId?: string): void;
|
|
164
|
+
/**
|
|
165
|
+
* Called when a test fails
|
|
166
|
+
*/
|
|
167
|
+
onTestFail(name: string, duration: number, message?: string, trace?: string, suiteName?: string, fileId?: string): void;
|
|
168
|
+
/**
|
|
169
|
+
* Called when a test is skipped
|
|
170
|
+
*/
|
|
171
|
+
onTestSkip(name: string, reason?: string, suiteName?: string, fileId?: string): void;
|
|
172
|
+
/**
|
|
173
|
+
* Called when a test is pending
|
|
174
|
+
*/
|
|
175
|
+
onTestPending(name: string, suiteName?: string, fileId?: string): void;
|
|
176
|
+
/**
|
|
177
|
+
* Print final summary
|
|
178
|
+
*/
|
|
179
|
+
private printSummary;
|
|
180
|
+
/**
|
|
181
|
+
* Get the current report in CTRF format
|
|
182
|
+
*/
|
|
183
|
+
getReport(): Report;
|
|
184
|
+
/**
|
|
185
|
+
* Get current counts for external tracking
|
|
186
|
+
*/
|
|
187
|
+
getCounts(): {
|
|
188
|
+
total: number;
|
|
189
|
+
passed: number;
|
|
190
|
+
failed: number;
|
|
191
|
+
skipped: number;
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Create a CTRF Test object from event data
|
|
196
|
+
*/
|
|
197
|
+
export declare function createTestFromEvent(event: TestEvent): Test;
|
|
198
|
+
//# sourceMappingURL=streaming.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,EAAE,MAAM,MAAM,CAAC;AAQrD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,cAAc,CAAC;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,aAAa,GAAG,WAAW,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,YAAY,GAAG,UAAU,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,WAAW,GAAG,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,YAO1B,CAAC;AAYF;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA+CD;;;;;;;;;GASG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,WAAW,CAAQ;IAG3B,OAAO,CAAC,KAAK,CAAgB;IAG7B,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,eAAe,CAA+B;gBAE1C,OAAO,GAAE,wBAA6B;IAiBlD;;OAEG;IACH,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAIzC;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IA6CjC;;OAEG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAOnB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,CAAC,MAAM;IAwCd;;OAEG;IACH,OAAO,CAAC,UAAU;IAMlB;;OAEG;IACH,OAAO,CAAC,WAAW;IAqBnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAuClB;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;OAEG;IACH,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAcnC;;OAEG;IACH,QAAQ,IAAI,IAAI;IA0BhB;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAIpD;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKhC;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAgBjD;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IA0B/C;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAmBpE;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAkCrF;;OAEG;IACH,UAAU,CACR,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,IAAI;IAsCP;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAkCpF;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAuBtE;;OAEG;IACH,OAAO,CAAC,YAAY;IAkBpB;;OAEG;IACH,SAAS,IAAI,MAAM;IA+CnB;;OAEG;IACH,SAAS,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;CAQhF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAmB1D"}
|