@code-pushup/coverage-plugin 0.120.1 → 0.122.0
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/package.json +4 -3
- package/src/index.d.ts +1 -0
- package/src/index.js +1 -0
- package/src/index.js.map +1 -1
- package/src/lib/binding.d.ts +67 -0
- package/src/lib/binding.js +201 -0
- package/src/lib/binding.js.map +1 -0
- package/src/lib/config-file.d.ts +3 -0
- package/src/lib/config-file.js +55 -0
- package/src/lib/config-file.js.map +1 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@code-pushup/coverage-plugin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.122.0",
|
|
4
4
|
"description": "Code PushUp plugin for tracking code coverage ☂",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/code-pushup/cli/tree/main/packages/plugin-coverage#readme",
|
|
@@ -34,8 +34,9 @@
|
|
|
34
34
|
},
|
|
35
35
|
"type": "module",
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@code-pushup/models": "0.
|
|
38
|
-
"@code-pushup/utils": "0.
|
|
37
|
+
"@code-pushup/models": "0.122.0",
|
|
38
|
+
"@code-pushup/utils": "0.122.0",
|
|
39
|
+
"magicast": "^0.3.5",
|
|
39
40
|
"parse-lcov": "^1.0.4",
|
|
40
41
|
"zod": "^4.2.1"
|
|
41
42
|
},
|
package/src/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { coveragePlugin } from './lib/coverage-plugin.js';
|
|
2
2
|
export default coveragePlugin;
|
|
3
|
+
export { coverageSetupBinding } from './lib/binding.js';
|
|
3
4
|
export type { CoveragePluginConfig } from './lib/config.js';
|
|
4
5
|
export { getNxCoveragePaths } from './lib/nx/coverage-paths.js';
|
package/src/index.js
CHANGED
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,eAAe,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,eAAe,cAAc,CAAC;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { PluginAnswer, PluginSetupTree } from '@code-pushup/models';
|
|
2
|
+
export declare const coverageSetupBinding: {
|
|
3
|
+
slug: string;
|
|
4
|
+
title: string;
|
|
5
|
+
packageName: string;
|
|
6
|
+
isRecommended: typeof isRecommended;
|
|
7
|
+
prompts: (targetDir: string) => Promise<({
|
|
8
|
+
key: string;
|
|
9
|
+
message: string;
|
|
10
|
+
type: "select";
|
|
11
|
+
choices: ({
|
|
12
|
+
readonly name: "Jest";
|
|
13
|
+
readonly value: "jest";
|
|
14
|
+
} | {
|
|
15
|
+
readonly name: "Vitest";
|
|
16
|
+
readonly value: "vitest";
|
|
17
|
+
} | {
|
|
18
|
+
readonly name: "other";
|
|
19
|
+
readonly value: "other";
|
|
20
|
+
})[];
|
|
21
|
+
default: "jest" | "vitest" | "other";
|
|
22
|
+
} | {
|
|
23
|
+
key: string;
|
|
24
|
+
message: string;
|
|
25
|
+
type: "input";
|
|
26
|
+
default: string;
|
|
27
|
+
choices?: undefined;
|
|
28
|
+
} | {
|
|
29
|
+
key: string;
|
|
30
|
+
message: string;
|
|
31
|
+
type: "checkbox";
|
|
32
|
+
choices: {
|
|
33
|
+
name: string;
|
|
34
|
+
value: "function" | "branch" | "line";
|
|
35
|
+
}[];
|
|
36
|
+
default: ("function" | "branch" | "line")[];
|
|
37
|
+
} | {
|
|
38
|
+
key: string;
|
|
39
|
+
message: string;
|
|
40
|
+
type: "confirm";
|
|
41
|
+
default: true;
|
|
42
|
+
choices?: undefined;
|
|
43
|
+
})[]>;
|
|
44
|
+
generateConfig: (answers: Record<string, PluginAnswer>, tree?: PluginSetupTree) => Promise<{
|
|
45
|
+
categories?: {
|
|
46
|
+
slug: string;
|
|
47
|
+
refs: {
|
|
48
|
+
slug: string;
|
|
49
|
+
weight: number;
|
|
50
|
+
type: "audit" | "group";
|
|
51
|
+
plugin: string;
|
|
52
|
+
}[];
|
|
53
|
+
title: string;
|
|
54
|
+
description?: string | undefined;
|
|
55
|
+
docsUrl?: string | undefined;
|
|
56
|
+
isSkipped?: boolean | undefined;
|
|
57
|
+
scoreTarget?: number | undefined;
|
|
58
|
+
}[] | undefined;
|
|
59
|
+
imports: {
|
|
60
|
+
moduleSpecifier: string;
|
|
61
|
+
defaultImport: string;
|
|
62
|
+
}[];
|
|
63
|
+
pluginInit: string[];
|
|
64
|
+
}>;
|
|
65
|
+
};
|
|
66
|
+
declare function isRecommended(targetDir: string): Promise<boolean>;
|
|
67
|
+
export {};
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { readdir } from 'node:fs/promises';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { answerArray, answerBoolean, answerString, hasDependency, pluralize, readJsonFile, singleQuote, } from '@code-pushup/utils';
|
|
5
|
+
import { addLcovReporter, hasLcovReporter } from './config-file.js';
|
|
6
|
+
import { ALL_COVERAGE_TYPES, COVERAGE_PLUGIN_SLUG, COVERAGE_PLUGIN_TITLE, } from './constants.js';
|
|
7
|
+
const { name: PACKAGE_NAME } = createRequire(import.meta.url)('../../package.json');
|
|
8
|
+
const CONFIG_EXT = '[mc]?[tj]s';
|
|
9
|
+
const VITEST_CONFIG = new RegExp(`^vi(test|te)\\.config\\.${CONFIG_EXT}$`);
|
|
10
|
+
const VITEST_WORKSPACE = new RegExp(`^vitest\\.workspace\\.${CONFIG_EXT}$`);
|
|
11
|
+
const JEST_CONFIG = new RegExp(`^jest\\.config\\.${CONFIG_EXT}$`);
|
|
12
|
+
const DEFAULT_REPORT_PATH = 'coverage/lcov.info';
|
|
13
|
+
const LCOV_COMMENT = '// NOTE: Ensure your test config includes "lcov" in coverage reporters.';
|
|
14
|
+
const FRAMEWORKS = [
|
|
15
|
+
{ name: 'Jest', value: 'jest' },
|
|
16
|
+
{ name: 'Vitest', value: 'vitest' },
|
|
17
|
+
{ name: 'other', value: 'other' },
|
|
18
|
+
];
|
|
19
|
+
const CATEGORIES = [
|
|
20
|
+
{
|
|
21
|
+
slug: 'code-coverage',
|
|
22
|
+
title: 'Code coverage',
|
|
23
|
+
description: 'Measures how much of your code is **covered by tests**.',
|
|
24
|
+
refs: [
|
|
25
|
+
{
|
|
26
|
+
type: 'group',
|
|
27
|
+
plugin: COVERAGE_PLUGIN_SLUG,
|
|
28
|
+
slug: 'coverage',
|
|
29
|
+
weight: 1,
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
},
|
|
33
|
+
];
|
|
34
|
+
export const coverageSetupBinding = {
|
|
35
|
+
slug: COVERAGE_PLUGIN_SLUG,
|
|
36
|
+
title: COVERAGE_PLUGIN_TITLE,
|
|
37
|
+
packageName: PACKAGE_NAME,
|
|
38
|
+
isRecommended,
|
|
39
|
+
// eslint-disable-next-line max-lines-per-function
|
|
40
|
+
prompts: async (targetDir) => {
|
|
41
|
+
const framework = await detectFramework(targetDir);
|
|
42
|
+
const configFile = await detectConfigFile(targetDir, framework);
|
|
43
|
+
return [
|
|
44
|
+
{
|
|
45
|
+
key: 'coverage.framework',
|
|
46
|
+
message: 'Test framework',
|
|
47
|
+
type: 'select',
|
|
48
|
+
choices: [...FRAMEWORKS],
|
|
49
|
+
default: framework,
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
key: 'coverage.configFile',
|
|
53
|
+
message: 'Path to test config file',
|
|
54
|
+
type: 'input',
|
|
55
|
+
default: configFile ?? '',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
key: 'coverage.reportPath',
|
|
59
|
+
message: 'Path to LCOV report file',
|
|
60
|
+
type: 'input',
|
|
61
|
+
default: framework === 'other' ? '' : DEFAULT_REPORT_PATH,
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
key: 'coverage.testCommand',
|
|
65
|
+
message: 'Command to run tests with coverage',
|
|
66
|
+
type: 'input',
|
|
67
|
+
default: defaultTestCommand(framework),
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
key: 'coverage.types',
|
|
71
|
+
message: 'Coverage types to measure',
|
|
72
|
+
type: 'checkbox',
|
|
73
|
+
choices: ALL_COVERAGE_TYPES.map(type => ({
|
|
74
|
+
name: pluralize(type),
|
|
75
|
+
value: type,
|
|
76
|
+
})),
|
|
77
|
+
default: [...ALL_COVERAGE_TYPES],
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
key: 'coverage.continueOnFail',
|
|
81
|
+
message: 'Continue if test command fails?',
|
|
82
|
+
type: 'confirm',
|
|
83
|
+
default: true,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
key: 'coverage.categories',
|
|
87
|
+
message: 'Add Code coverage categories?',
|
|
88
|
+
type: 'confirm',
|
|
89
|
+
default: true,
|
|
90
|
+
},
|
|
91
|
+
];
|
|
92
|
+
},
|
|
93
|
+
generateConfig: async (answers, tree) => {
|
|
94
|
+
const options = parseAnswers(answers);
|
|
95
|
+
const lcovConfigured = await configureLcovReporter(options, tree);
|
|
96
|
+
return {
|
|
97
|
+
imports: [
|
|
98
|
+
{ moduleSpecifier: PACKAGE_NAME, defaultImport: 'coveragePlugin' },
|
|
99
|
+
],
|
|
100
|
+
pluginInit: formatPluginInit(options, lcovConfigured),
|
|
101
|
+
...(options.categories ? { categories: CATEGORIES } : {}),
|
|
102
|
+
};
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
function parseAnswers(answers) {
|
|
106
|
+
return {
|
|
107
|
+
framework: answerString(answers, 'coverage.framework'),
|
|
108
|
+
configFile: answerString(answers, 'coverage.configFile'),
|
|
109
|
+
reportPath: answerString(answers, 'coverage.reportPath') || DEFAULT_REPORT_PATH,
|
|
110
|
+
testCommand: answerString(answers, 'coverage.testCommand'),
|
|
111
|
+
types: answerArray(answers, 'coverage.types'),
|
|
112
|
+
continueOnFail: answerBoolean(answers, 'coverage.continueOnFail'),
|
|
113
|
+
categories: answerBoolean(answers, 'coverage.categories'),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/** Returns true if lcov reporter is already present or was successfully added. */
|
|
117
|
+
async function configureLcovReporter(options, tree) {
|
|
118
|
+
const { framework, configFile } = options;
|
|
119
|
+
if (framework === 'other' || !configFile || !tree) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
const content = await tree.read(configFile);
|
|
123
|
+
if (content == null) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
if (hasLcovReporter(content, framework)) {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
const modified = addLcovReporter(content, framework);
|
|
130
|
+
if (modified === content) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
await tree.write(configFile, modified);
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
function formatPluginInit(options, lcovConfigured) {
|
|
137
|
+
const { reportPath, testCommand, types, continueOnFail } = options;
|
|
138
|
+
const hasCustomTypes = types.length > 0 && types.length < ALL_COVERAGE_TYPES.length;
|
|
139
|
+
const body = [
|
|
140
|
+
`reports: [${singleQuote(reportPath)}],`,
|
|
141
|
+
testCommand
|
|
142
|
+
? `coverageToolCommand: { command: ${singleQuote(testCommand)} },`
|
|
143
|
+
: '',
|
|
144
|
+
hasCustomTypes
|
|
145
|
+
? `coverageTypes: [${types.map(singleQuote).join(', ')}],`
|
|
146
|
+
: '',
|
|
147
|
+
continueOnFail ? '' : 'continueOnCommandFail: false,',
|
|
148
|
+
].filter(Boolean);
|
|
149
|
+
const init = [
|
|
150
|
+
'await coveragePlugin({',
|
|
151
|
+
...body.map(line => ` ${line}`),
|
|
152
|
+
'}),',
|
|
153
|
+
];
|
|
154
|
+
return lcovConfigured ? init : [LCOV_COMMENT, ...init];
|
|
155
|
+
}
|
|
156
|
+
async function isRecommended(targetDir) {
|
|
157
|
+
return (await detectFramework(targetDir)) !== 'other';
|
|
158
|
+
}
|
|
159
|
+
async function detectFramework(targetDir) {
|
|
160
|
+
const files = await readdir(targetDir, { encoding: 'utf8' });
|
|
161
|
+
const hasVitestConfig = files.some(file => VITEST_CONFIG.test(file) || VITEST_WORKSPACE.test(file));
|
|
162
|
+
const hasJestConfig = files.some(file => JEST_CONFIG.test(file));
|
|
163
|
+
if (hasVitestConfig) {
|
|
164
|
+
return 'vitest';
|
|
165
|
+
}
|
|
166
|
+
if (hasJestConfig) {
|
|
167
|
+
return 'jest';
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
const packageJson = await readJsonFile(path.join(targetDir, 'package.json'));
|
|
171
|
+
if (hasDependency(packageJson, 'vitest')) {
|
|
172
|
+
return 'vitest';
|
|
173
|
+
}
|
|
174
|
+
if (hasDependency(packageJson, 'jest')) {
|
|
175
|
+
return 'jest';
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return 'other';
|
|
180
|
+
}
|
|
181
|
+
return 'other';
|
|
182
|
+
}
|
|
183
|
+
async function detectConfigFile(targetDir, framework) {
|
|
184
|
+
if (framework === 'other') {
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
const files = await readdir(targetDir, { encoding: 'utf8' });
|
|
188
|
+
const pattern = framework === 'vitest' ? VITEST_CONFIG : JEST_CONFIG;
|
|
189
|
+
return files.find(file => pattern.test(file));
|
|
190
|
+
}
|
|
191
|
+
function defaultTestCommand(framework) {
|
|
192
|
+
switch (framework) {
|
|
193
|
+
case 'jest':
|
|
194
|
+
return 'npx jest --coverage';
|
|
195
|
+
case 'vitest':
|
|
196
|
+
return 'npx vitest run --coverage.enabled';
|
|
197
|
+
default:
|
|
198
|
+
return '';
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binding.js","sourceRoot":"","sources":["../../../src/lib/binding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare function hasLcovReporter(content: string, framework: string): boolean;
|
|
2
|
+
export declare function addLcovReporter(content: string, framework: string): string;
|
|
3
|
+
export declare function buildNestedObject(segments: string[], value: unknown): Record<string, unknown>;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { generateCode, parseModule } from 'magicast';
|
|
2
|
+
import { deepMergeObject, getDefaultExportOptions } from 'magicast/helpers';
|
|
3
|
+
const VITEST_DEFAULTS = ['text', 'html', 'clover', 'json'];
|
|
4
|
+
export function hasLcovReporter(content, framework) {
|
|
5
|
+
switch (framework) {
|
|
6
|
+
case 'vitest':
|
|
7
|
+
return /['"]lcov['"]/.test(content) && content.includes('reporter');
|
|
8
|
+
case 'jest':
|
|
9
|
+
return (!content.includes('coverageReporters') || /['"]lcov['"]/.test(content));
|
|
10
|
+
default:
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function addLcovReporter(content, framework) {
|
|
15
|
+
switch (framework) {
|
|
16
|
+
case 'vitest':
|
|
17
|
+
return addLcovToVitest(content);
|
|
18
|
+
case 'jest':
|
|
19
|
+
return addLcovToJest(content);
|
|
20
|
+
default:
|
|
21
|
+
return content;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function addLcovToVitest(content) {
|
|
25
|
+
try {
|
|
26
|
+
const mod = parseModule(content);
|
|
27
|
+
const config = getDefaultExportOptions(mod);
|
|
28
|
+
const reporter = config['test']?.['coverage']?.['reporter'];
|
|
29
|
+
const base = reporter?.['length'] ? [...reporter] : VITEST_DEFAULTS;
|
|
30
|
+
deepMergeObject(config, buildNestedObject(['test', 'coverage', 'reporter'], [...base, 'lcov']));
|
|
31
|
+
return generateCode(mod).code;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return content;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function addLcovToJest(content) {
|
|
38
|
+
try {
|
|
39
|
+
const mod = parseModule(content);
|
|
40
|
+
const config = getDefaultExportOptions(mod);
|
|
41
|
+
const reporters = config['coverageReporters'];
|
|
42
|
+
if (!reporters?.['length']) {
|
|
43
|
+
return content;
|
|
44
|
+
}
|
|
45
|
+
deepMergeObject(config, buildNestedObject(['coverageReporters'], [...reporters, 'lcov']));
|
|
46
|
+
return generateCode(mod).code;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return content;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export function buildNestedObject(segments, value) {
|
|
53
|
+
return segments.reduceRight((nested, segment) => ({ [segment]: nested }), value);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=config-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-file.js","sourceRoot":"","sources":["../../../src/lib/config-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE5E,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAE3D,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,SAAiB;IAChE,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACtE,KAAK,MAAM;YACT,OAAO,CACL,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CACvE,CAAC;QACJ;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,SAAiB;IAChE,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;QAClC,KAAK,MAAM;YACT,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;QAChC;YACE,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;QACpE,eAAe,CACb,MAAM,EACN,iBAAiB,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CACvE,CAAC;QACF,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,eAAe,CACb,MAAM,EACN,iBAAiB,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,MAAM,CAAC,CAAC,CACjE,CAAC;QACF,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAAkB,EAClB,KAAc;IAEd,OAAO,QAAQ,CAAC,WAAW,CACzB,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAC5C,KAAgC,CACjC,CAAC;AACJ,CAAC"}
|