@limenet-ch/baseline 2.9.0 → 2.11.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/README.md +9 -6
- package/js/dist/checks/does-not-exclude-unknown-checks-check.d.ts +11 -0
- package/js/dist/checks/does-not-exclude-unknown-checks-check.js +33 -0
- package/js/dist/checks/does-not-exclude-unknown-checks-check.js.map +1 -0
- package/js/dist/checks/registry.js +32 -23
- package/js/dist/checks/registry.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -123,9 +123,10 @@ State lives in `.baseline.json` at the project root (a JS project has no `config
|
|
|
123
123
|
| `hasNpmScripts` | identical |
|
|
124
124
|
| `hasCiJobs` | same GitLab CI templates, without the `php` job |
|
|
125
125
|
| `hasTrivyConfig` | identical, canonical config included: its `vendor/**`, `storage/logs/` and `.ddev/` skips are inert in a JS project |
|
|
126
|
-
| `ciSetsNodeVersion` |
|
|
126
|
+
| `ciSetsNodeVersion` | **npm-only**: the Laravel runner does not register it |
|
|
127
127
|
| `isCiLintComplete` | asserts the JS toolchain in the npm script, not pint/phpstan in a composer script |
|
|
128
128
|
| `callsBaseline` | hooks the `ci-lint` npm script, since npm has no `post-update-cmd` |
|
|
129
|
+
| `doesNotExcludeUnknownChecks` | identical, against this runner's smaller registry: a name only the Laravel runner knows is as dead here as one that exists nowhere |
|
|
129
130
|
| `usesReleaseIt` | **inverted**: fails if `@release-it/bumper` is configured, because `package.json` is already release-it's source of truth |
|
|
130
131
|
|
|
131
132
|
Deliberately not ported: everything composer-, artisan-, Rector-, PHPStan- or Spatie-Health-shaped;
|
|
@@ -141,10 +142,11 @@ This package validates your Laravel installation against the following checks:
|
|
|
141
142
|
- **`usesPest()`** - Validates Pest testing framework is configured (not PHPUnit directly)
|
|
142
143
|
- **`usesPestPhpstanPlugin()`** - Validates `pestphp/pest-plugin-phpstan` is installed when Pest 5+ and PHPStan are both present (warns if not applicable)
|
|
143
144
|
- **`usesPestRectorPlugin()`** - Validates `pestphp/pest-plugin-rector` is installed when Pest 5+ and Rector are both present (warns if not applicable)
|
|
144
|
-
- 🔧 **`usesRector()`** - Validates Rector automated code modernization is installed *(partial: fixes ci-lint script if packages installed)*
|
|
145
|
+
- 🔧 **`usesRector()`** - Validates Rector automated code modernization is installed, with `driftingly/rector-laravel` constrained to at least `^2.6.1` — the release where `LaravelSetProvider` is gone and its rules arrive through `LaravelSetList::COMPOSER_BASED` instead *(partial: fixes ci-lint script if packages installed)*
|
|
145
146
|
- **`usesLarastan()`** - Validates Larastan static analysis tool is configured
|
|
146
147
|
- **`usesPhpstanExtensions()`** - Validates PHPStan extensions are installed
|
|
147
148
|
- **`phpstanLevelAtLeastEight()`** - Validates PHPStan is configured to at least level 8
|
|
149
|
+
- 🔧 **`phpstanParsesModelCastsMethod()`** - Validates `phpstan.neon` sets `parseModelCastsMethod: true`: `ModelCastsPropertyToCastsMethodRector` rewrites `protected $casts = [...]` into a `casts(): array` method, and without this parameter Larastan reads only the generated `@return array<string, string>` — not a constant array — so every cast is lost and datetime attributes report as strings *(inserts the parameter into the `parameters` block)*
|
|
148
150
|
- 🔧 **`checkPhpunit()`** - Validates PHPUnit configuration with coverage reports *(adds missing XML nodes and APP_KEY)*
|
|
149
151
|
- 🔧 **`hasRectorConfigWithComposerBased()`** - Validates Rector `withComposerBased(phpunit, symfony, laravel)` is configured *(appends call to rector.php)*
|
|
150
152
|
- 🔧 **`hasRectorConfigWithConfiguredRules()`** - Validates Rector `withConfiguredRule()` calls are present for `RouteActionCallableRector` and `WhereToWhereLikeRector` *(appends calls to rector.php)*
|
|
@@ -152,12 +154,11 @@ This package validates your Laravel installation against the following checks:
|
|
|
152
154
|
- 🔧 **`hasRectorConfigWithImportNames()`** - Validates Rector `withImportNames(importShortClasses: false)` is configured *(appends call to rector.php)*
|
|
153
155
|
- 🔧 **`hasRectorConfigWithPhpSets()`** - Validates Rector `withPhpSets()` is called *(appends call to rector.php)*
|
|
154
156
|
- 🔧 **`hasRectorConfigWithAttributesSets()`** - Validates Rector `withAttributesSets()` is called *(appends call to rector.php)*
|
|
155
|
-
- 🔧 **`
|
|
156
|
-
- 🔧 **`hasRectorConfigWithRules()`** - Validates Rector `withRules([AddGenericReturnTypeToRelationsRector, MinutesToSecondsInCacheRector, UseForwardsCallsTraitRector])` is configured *(appends call to rector.php)*
|
|
157
|
+
- 🔧 **`hasRectorConfigWithRules()`** - Validates Rector `withRules([MinutesToSecondsInCacheRector, UseForwardsCallsTraitRector])` is configured *(appends call to rector.php)*
|
|
157
158
|
- 🔧 **`hasRectorConfigWithSets()`** - Validates Rector `withSets([LaravelBaselineSetList::REMOVE_DEFAULT_DOCBLOCKS, LaravelSetList::LARAVEL_*])` is configured with all required sets *(appends call to rector.php)*
|
|
158
159
|
- 🔧 **`hasRectorConfigWithPaths()`** - Validates Rector `withPaths([app, database, routes, tests])` is configured *(appends call to rector.php)*
|
|
159
160
|
- 🔧 **`hasRectorConfigWithPestSet()`** - Validates Rector `withSets([PestSetList::CODING_STYLE])` is configured when Pest 5+ and Rector are both present *(appends call to rector.php; warns if not applicable)*
|
|
160
|
-
- 🔧 **`hasRectorConfigWithSkip()`** - Validates Rector `withSkip()` contains required skipped rules (always: 6 Laravel rules
|
|
161
|
+
- 🔧 **`hasRectorConfigWithSkip()`** - Validates Rector `withSkip()` contains required skipped rules (always: 6 Laravel rules plus `StringToClassConstantRector`, which maps the Laravel 5.2-era string events context-free and so rewrites any matching literal — `view('auth.login')` becomes `Illuminate\Auth\Events\Login::class`; Laravel 13+: `TablePropertyToTableAttributeRector`; `AddGenericBuilderToScopesRector`, new in rector-laravel 2.6 and shipped in `LARAVEL_TYPE_DECLARATIONS`, which downgrades an already-correct `Builder<$this>` to `Builder<static>`; `MigrateToSimplifiedAttributeRector`, which rewrites working `getFooAttribute()`/`setFooAttribute()` accessors into a single `Attribute` method; when server.php exists: `ServerVariableToRequestFacadeRector`) *(appends an imported `withSkip()` call, or merges the missing classes into one that already exists)*
|
|
161
162
|
|
|
162
163
|
### IDE & Developer Tools
|
|
163
164
|
- 🔧 **`hasEditorconfig()`** - Validates `.editorconfig` exists with required settings (`root = true`, `charset`, `end_of_line`, `indent_style`, `insert_final_newline`, `trim_trailing_whitespace`) *(creates `.editorconfig` with canonical content if missing or incomplete)*
|
|
@@ -212,7 +213,8 @@ This package validates your Laravel installation against the following checks:
|
|
|
212
213
|
- **`callsSentryHook()`** - Warns if Sentry error tracking is missing (optional)
|
|
213
214
|
- **`phpVersionMatchesCi()`** - Validates PHP version consistency with CI configuration
|
|
214
215
|
- **`isCiLintComplete()`** - Validates complete linting pipeline
|
|
215
|
-
- 🔧 **`
|
|
216
|
+
- 🔧 **`doesNotUseRectorSetProviders()`** - Fails while `rector.php` still passes `LaravelSetProvider` to `withSetProviders()`: `driftingly/rector-laravel` 2.6.0 deleted the class, so Rector aborts before doing any work, and `withComposerBased(laravel: true)` already loads the rules it used to provide *(removes the argument, and the call once nothing is left in it; the orphaned import is left to Pint/Rector)*
|
|
217
|
+
- 🔧 **`doesNotDuplicateRectorSetRules()`** - Fails while `rector.php` lists `AddGenericReturnTypeToRelationsRector` in `withRules()`: it already ships in `LaravelSetList::LARAVEL_TYPE_DECLARATIONS`, which `hasRectorConfigWithSets()` mandates, and Rector 2.6 warns about the duplicate *(removes the entry; the orphaned import is left to Pint/Rector)*
|
|
216
218
|
- **`doesNotUseIgnition()`** - Validates Ignition debugger is NOT installed
|
|
217
219
|
|
|
218
220
|
### Local Development
|
|
@@ -239,6 +241,7 @@ This package validates your Laravel installation against the following checks:
|
|
|
239
241
|
- **`usesReadableEncryptedEnvFile()`** - Validates the encrypted env file uses the readable line-per-variable format produced by `ddev artisan env:encrypt --readable` (variable names stay visible in diffs), not the opaque blob format. Passes when no encrypted file exists (existence is `hasEncryptedEnvFile`'s concern).
|
|
240
242
|
- **`doesNotPinOldMailTemplate()`** - Fails if a published mail view that pins the old template (`resources/views/vendor/mail/html/themes/default.css` or `html/header.blade.php`) exists, preventing adoption of Laravel's modernized mail template.
|
|
241
243
|
- 🔧 **`callsBaseline()`** - Validates self-validation runs after updates *(adds/upgrades post-update-cmd entry to include `--fix`)*
|
|
244
|
+
- 🔧 **`doesNotExcludeUnknownChecks()`** - Fails when `config/baseline.php` excludes a name no registered check answers to: excludes are matched against the registry, so an entry left behind by a check this package renamed or removed silences nothing and only hides that the exclusion is no longer in force *(drops the dead entries, leaving the remaining excludes and the periodic state intact)*
|
|
242
245
|
- **`doesNotCallPeriodicBaselineOnUpdate()`** - Fails if `php artisan limenet:laravel-baseline:periodic` is in the `post-update-cmd` scripts (it shouldn't be — periodic checks fail CI automatically when expired)
|
|
243
246
|
- 🔧 **`doesNotHaveGuidelinesScript()`** - Fails if the removed `php artisan limenet:laravel-baseline:guidelines` command is still in `post-update-cmd` (removed in v2.1.0) *(removes the entry from composer.json)*
|
|
244
247
|
- 🔧 **`isInstalledAsRegularDependency()`** - Validates `limenet/laravel-baseline` is in `require` (not `require-dev`) *(moves from require-dev to require in composer.json)*
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type CheckResult, FixableCheck } from './check.js';
|
|
2
|
+
/**
|
|
3
|
+
* An exclude naming a check this runner does not register silences nothing: the
|
|
4
|
+
* name is matched against the registry, so once a check is renamed, removed, or
|
|
5
|
+
* copied over from the Laravel runner's list, the entry is dead config that
|
|
6
|
+
* outlives the reason it was added.
|
|
7
|
+
*/
|
|
8
|
+
export declare class DoesNotExcludeUnknownChecksCheck extends FixableCheck {
|
|
9
|
+
static readonly checkName = "doesNotExcludeUnknownChecks";
|
|
10
|
+
fix(dry?: boolean): CheckResult;
|
|
11
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { readState, STATE_FILE, writeState } from '../state.js';
|
|
2
|
+
import { FixableCheck } from './check.js';
|
|
3
|
+
import { checkNames } from './registry.js';
|
|
4
|
+
/**
|
|
5
|
+
* An exclude naming a check this runner does not register silences nothing: the
|
|
6
|
+
* name is matched against the registry, so once a check is renamed, removed, or
|
|
7
|
+
* copied over from the Laravel runner's list, the entry is dead config that
|
|
8
|
+
* outlives the reason it was added.
|
|
9
|
+
*/
|
|
10
|
+
export class DoesNotExcludeUnknownChecksCheck extends FixableCheck {
|
|
11
|
+
static checkName = 'doesNotExcludeUnknownChecks';
|
|
12
|
+
fix(dry = false) {
|
|
13
|
+
const state = readState(this.project);
|
|
14
|
+
const excludes = state.excludes ?? [];
|
|
15
|
+
const known = checkNames();
|
|
16
|
+
const dead = excludes.filter((name) => !known.includes(name));
|
|
17
|
+
if (dead.length === 0) {
|
|
18
|
+
return 'pass';
|
|
19
|
+
}
|
|
20
|
+
for (const name of dead) {
|
|
21
|
+
this.comment(`Remove "${name}" from the excludes in ${STATE_FILE}: no check by that name is registered, so the entry excludes nothing`);
|
|
22
|
+
}
|
|
23
|
+
if (dry) {
|
|
24
|
+
return 'fail';
|
|
25
|
+
}
|
|
26
|
+
writeState(this.project, {
|
|
27
|
+
...state,
|
|
28
|
+
excludes: excludes.filter((name) => known.includes(name)),
|
|
29
|
+
});
|
|
30
|
+
return this.fix(true);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=does-not-exclude-unknown-checks-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"does-not-exclude-unknown-checks-check.js","sourceRoot":"","sources":["../../src/checks/does-not-exclude-unknown-checks-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAoB,YAAY,EAAE,MAAM,YAAY,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C;;;;;GAKG;AACH,MAAM,OAAO,gCAAiC,SAAQ,YAAY;IAC9D,MAAM,CAAmB,SAAS,GAAG,6BAA6B,CAAA;IAElE,GAAG,CAAC,GAAG,GAAG,KAAK;QACX,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAA;QACrC,MAAM,KAAK,GAAG,UAAU,EAAE,CAAA;QAC1B,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;QAE7D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,MAAM,CAAA;QACjB,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,CACR,WAAW,IAAI,0BAA0B,UAAU,sEAAsE,CAC5H,CAAA;QACL,CAAC;QAED,IAAI,GAAG,EAAE,CAAC;YACN,OAAO,MAAM,CAAA;QACjB,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE;YACrB,GAAG,KAAK;YACR,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SAC5D,CAAC,CAAA;QAEF,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;CACJ"}
|
|
@@ -3,6 +3,7 @@ import { BiomeUsesLocalSchemaCheck } from './biome-uses-local-schema-check.js';
|
|
|
3
3
|
import { CallsBaselineCheck } from './calls-baseline-check.js';
|
|
4
4
|
import { CiSetsNodeVersionCheck } from './ci-sets-node-version-check.js';
|
|
5
5
|
import { DeniesEnvReadsInClaudeSettingsCheck } from './denies-env-reads-in-claude-settings-check.js';
|
|
6
|
+
import { DoesNotExcludeUnknownChecksCheck } from './does-not-exclude-unknown-checks-check.js';
|
|
6
7
|
import { DoesNotHaveCopilotOrJunieAgentFilesCheck } from './does-not-have-copilot-or-junie-agent-files-check.js';
|
|
7
8
|
import { DoesNotUseBothBaselineRunnersCheck } from './does-not-use-both-baseline-runners-check.js';
|
|
8
9
|
import { HardensNpmSupplyChainCheck } from './hardens-npm-supply-chain-check.js';
|
|
@@ -21,36 +22,44 @@ import { UsesReleaseItCheck } from './uses-release-it-check.js';
|
|
|
21
22
|
* This is intentionally a subset of the PHP runner's registry: only the checks
|
|
22
23
|
* that mean something in a project with no PHP and no DDEV are here. See the
|
|
23
24
|
* README for the ported / not-ported table.
|
|
25
|
+
*
|
|
26
|
+
* Built on first call rather than at module scope: doesNotExcludeUnknownChecks
|
|
27
|
+
* imports this module back to learn which names are real, and a top-level array
|
|
28
|
+
* would capture that binding while it is still uninitialised — leaving a hole in
|
|
29
|
+
* the registry whenever the check module is the one loaded first.
|
|
24
30
|
*/
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
31
|
+
function checks() {
|
|
32
|
+
return [
|
|
33
|
+
AllowsToolingInClaudeSettingsCheck,
|
|
34
|
+
BiomeUsesLocalSchemaCheck,
|
|
35
|
+
CallsBaselineCheck,
|
|
36
|
+
CiSetsNodeVersionCheck,
|
|
37
|
+
DeniesEnvReadsInClaudeSettingsCheck,
|
|
38
|
+
DoesNotExcludeUnknownChecksCheck,
|
|
39
|
+
DoesNotHaveCopilotOrJunieAgentFilesCheck,
|
|
40
|
+
DoesNotUseBothBaselineRunnersCheck,
|
|
41
|
+
HardensNpmSupplyChainCheck,
|
|
42
|
+
HasCiJobsCheck,
|
|
43
|
+
HasEditorconfigCheck,
|
|
44
|
+
HasNpmScriptsCheck,
|
|
45
|
+
HasTrivyConfigCheck,
|
|
46
|
+
IsCiLintCompleteCheck,
|
|
47
|
+
NodeVersionCheck,
|
|
48
|
+
RunsCiLintHookInClaudeSettingsCheck,
|
|
49
|
+
UpdatesDependenciesCheck,
|
|
50
|
+
UsesReleaseItCheck,
|
|
51
|
+
];
|
|
52
|
+
}
|
|
44
53
|
export function allChecks() {
|
|
45
|
-
return
|
|
54
|
+
return checks();
|
|
46
55
|
}
|
|
47
56
|
export function checkNames() {
|
|
48
|
-
return checks.map((check) => check.checkName);
|
|
57
|
+
return checks().map((check) => check.checkName);
|
|
49
58
|
}
|
|
50
59
|
export function findCheck(name) {
|
|
51
|
-
return checks.find((check) => check.checkName === name);
|
|
60
|
+
return checks().find((check) => check.checkName === name);
|
|
52
61
|
}
|
|
53
62
|
export function createChecks(project, comments) {
|
|
54
|
-
return checks.map((Constructor) => new Constructor(project, comments));
|
|
63
|
+
return checks().map((Constructor) => new Constructor(project, comments));
|
|
55
64
|
}
|
|
56
65
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/checks/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kCAAkC,EAAE,MAAM,8CAA8C,CAAA;AACjG,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAA;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AACxE,OAAO,EAAE,mCAAmC,EAAE,MAAM,gDAAgD,CAAA;AACpG,OAAO,EAAE,wCAAwC,EAAE,MAAM,uDAAuD,CAAA;AAChH,OAAO,EAAE,kCAAkC,EAAE,MAAM,+CAA+C,CAAA;AAClG,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAA;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,mCAAmC,EAAE,MAAM,iDAAiD,CAAA;AACrG,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAA;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAO/D
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/checks/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kCAAkC,EAAE,MAAM,8CAA8C,CAAA;AACjG,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAA;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AACxE,OAAO,EAAE,mCAAmC,EAAE,MAAM,gDAAgD,CAAA;AACpG,OAAO,EAAE,gCAAgC,EAAE,MAAM,4CAA4C,CAAA;AAC7F,OAAO,EAAE,wCAAwC,EAAE,MAAM,uDAAuD,CAAA;AAChH,OAAO,EAAE,kCAAkC,EAAE,MAAM,+CAA+C,CAAA;AAClG,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAA;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,mCAAmC,EAAE,MAAM,iDAAiD,CAAA;AACrG,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAA;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAO/D;;;;;;;;;;;GAWG;AACH,SAAS,MAAM;IACX,OAAO;QACH,kCAAkC;QAClC,yBAAyB;QACzB,kBAAkB;QAClB,sBAAsB;QACtB,mCAAmC;QACnC,gCAAgC;QAChC,wCAAwC;QACxC,kCAAkC;QAClC,0BAA0B;QAC1B,cAAc;QACd,oBAAoB;QACpB,kBAAkB;QAClB,mBAAmB;QACnB,qBAAqB;QACrB,gBAAgB;QAChB,mCAAmC;QACnC,wBAAwB;QACxB,kBAAkB;KACrB,CAAA;AACL,CAAC;AAED,MAAM,UAAU,SAAS;IACrB,OAAO,MAAM,EAAE,CAAA;AACnB,CAAC;AAED,MAAM,UAAU,UAAU;IACtB,OAAO,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IAClC,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,CAAA;AAC7D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB,EAAE,QAA0B;IACrE,OAAO,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;AAC5E,CAAC"}
|