dev-cockpit 0.2.7 → 0.2.8
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 +32 -32
- package/bin/dev-cockpit.mjs +1 -1
- package/dist/buildCli.d.ts.map +1 -1
- package/dist/{chunk-A446TCT5.js → chunk-YTMK7EXK.js} +1 -1
- package/dist/chunk-YTMK7EXK.js.map +7 -0
- package/dist/cockpit/Footer.d.ts.map +1 -1
- package/dist/cockpit/hooks/useGlobalKeys.d.ts.map +1 -1
- package/dist/cockpit/panes/FilterModal.d.ts.map +1 -1
- package/dist/cockpit/panes/Output.d.ts.map +1 -1
- package/dist/cockpit/panes/Repos.d.ts.map +1 -1
- package/dist/cockpit/panes/SearchModal.d.ts.map +1 -1
- package/dist/cockpit/state/store.d.ts.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/init-config-wizard.d.ts.map +1 -1
- package/dist/commands/init-config.d.ts.map +1 -1
- package/dist/commands/link.d.ts.map +1 -1
- package/dist/commands/migrate-config.d.ts.map +1 -1
- package/dist/commands/mount.d.ts +1 -3
- package/dist/commands/mount.d.ts.map +1 -1
- package/dist/core/config-discovery.d.ts.map +1 -1
- package/dist/core/config.d.ts +6 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/manifest.d.ts.map +1 -1
- package/dist/core/migrations.d.ts.map +1 -1
- package/dist/core/paths.d.ts.map +1 -1
- package/dist/core/subprocess.d.ts.map +1 -1
- package/dist/docker/highlights.d.ts.map +1 -1
- package/dist/health/builtin.d.ts.map +1 -1
- package/dist/index.d.ts +8 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +206 -143
- package/dist/index.js.map +2 -2
- package/dist/ink.d.ts +1 -1
- package/dist/ink.d.ts.map +1 -1
- package/dist/{link-VWT2VQH6.js → link-Y7OFHOUP.js} +4 -6
- package/dist/link-Y7OFHOUP.js.map +7 -0
- package/dist/mount/compose.d.ts.map +1 -1
- package/dist/mount/symlinks.d.ts.map +1 -1
- package/docs/commands.md +8 -8
- package/docs/config-reference.md +45 -41
- package/docs/health.md +32 -22
- package/docs/init-config.md +16 -16
- package/docs/mount.md +8 -7
- package/docs/notifications.md +3 -3
- package/docs/panes.md +5 -5
- package/docs/processes.md +7 -5
- package/examples/cockpit.schema.json +217 -57
- package/examples/cockpit.yaml +8 -10
- package/package.json +99 -93
- package/prettier-config.json +7 -0
- package/dist/chunk-A446TCT5.js.map +0 -7
- package/dist/link-VWT2VQH6.js.map +0 -7
package/package.json
CHANGED
|
@@ -1,94 +1,100 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
2
|
+
"name": "dev-cockpit",
|
|
3
|
+
"version": "0.2.8",
|
|
4
|
+
"description": "A reusable, domain-neutral terminal UI dev cockpit — tabbed pane shell, watcher streaming, optional Docker log tail with highlights, health framework with one-keystroke remediations, transition-only OS notifications, live-markdown Help. Profiles extend it with project-specific commands, repos, and health checks.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/frankfava/package--dev-cockpit.git"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/frankfava/package--dev-cockpit#readme",
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/frankfava/package--dev-cockpit/issues"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"tui",
|
|
16
|
+
"terminal",
|
|
17
|
+
"dashboard",
|
|
18
|
+
"cockpit",
|
|
19
|
+
"watcher",
|
|
20
|
+
"docker",
|
|
21
|
+
"dev",
|
|
22
|
+
"dx"
|
|
23
|
+
],
|
|
24
|
+
"type": "module",
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=20.12.0"
|
|
27
|
+
},
|
|
28
|
+
"main": "./dist/index.js",
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"exports": {
|
|
31
|
+
".": {
|
|
32
|
+
"types": "./dist/index.d.ts",
|
|
33
|
+
"import": "./dist/index.js"
|
|
34
|
+
},
|
|
35
|
+
"./ink": {
|
|
36
|
+
"types": "./dist/ink.d.ts",
|
|
37
|
+
"import": "./dist/ink.js"
|
|
38
|
+
},
|
|
39
|
+
"./react": {
|
|
40
|
+
"types": "./dist/react.d.ts",
|
|
41
|
+
"import": "./dist/react.js"
|
|
42
|
+
},
|
|
43
|
+
"./prettier-config": "./prettier-config.json"
|
|
44
|
+
},
|
|
45
|
+
"prettier": "./prettier-config.json",
|
|
46
|
+
"bin": {
|
|
47
|
+
"dev-cockpit": "bin/dev-cockpit.mjs"
|
|
48
|
+
},
|
|
49
|
+
"files": [
|
|
50
|
+
"dist/",
|
|
51
|
+
"bin/",
|
|
52
|
+
"docs/",
|
|
53
|
+
"examples/",
|
|
54
|
+
"prettier-config.json",
|
|
55
|
+
"README.md",
|
|
56
|
+
"CHANGELOG.md",
|
|
57
|
+
"LICENSE"
|
|
58
|
+
],
|
|
59
|
+
"scripts": {
|
|
60
|
+
"build": "rm -rf dist && node esbuild.config.mjs && tsc -p tsconfig.build.json --emitDeclarationOnly --declaration",
|
|
61
|
+
"dev": "node esbuild.config.mjs --watch",
|
|
62
|
+
"typecheck": "tsc --noEmit",
|
|
63
|
+
"lint": "eslint 'src/**/*.{ts,tsx}' 'tests/**/*.{ts,tsx}'",
|
|
64
|
+
"format": "prettier --write .",
|
|
65
|
+
"format:check": "prettier --check .",
|
|
66
|
+
"test": "vitest run"
|
|
67
|
+
},
|
|
68
|
+
"peerDependencies": {
|
|
69
|
+
"@inquirer/prompts": "^8.4.2",
|
|
70
|
+
"node-notifier": "^10.0.1"
|
|
71
|
+
},
|
|
72
|
+
"devDependencies": {
|
|
73
|
+
"@inquirer/prompts": "^8.4.2",
|
|
74
|
+
"@types/node": "^22.5.0",
|
|
75
|
+
"@types/node-notifier": "^8.0.5",
|
|
76
|
+
"@types/react": "^19.2.14",
|
|
77
|
+
"@typescript-eslint/eslint-plugin": "^8.3.0",
|
|
78
|
+
"@typescript-eslint/parser": "^8.3.0",
|
|
79
|
+
"chalk": "^5.3.0",
|
|
80
|
+
"chokidar": "^5.0.0",
|
|
81
|
+
"commander": "^12.1.0",
|
|
82
|
+
"esbuild": "^0.23.1",
|
|
83
|
+
"eslint": "^9.9.1",
|
|
84
|
+
"eslint-config-prettier": "^9.1.0",
|
|
85
|
+
"execa": "^9.3.0",
|
|
86
|
+
"ink": "^7.0.2",
|
|
87
|
+
"ink-testing-library": "^4.0.0",
|
|
88
|
+
"marked": "^15.0.12",
|
|
89
|
+
"marked-terminal": "^7.3.0",
|
|
90
|
+
"node-notifier": "^10.0.1",
|
|
91
|
+
"pino": "^9.3.2",
|
|
92
|
+
"prettier": "^3.3.3",
|
|
93
|
+
"react": "^19.2.6",
|
|
94
|
+
"typescript": "^5.5.4",
|
|
95
|
+
"vitest": "^2.0.5",
|
|
96
|
+
"yaml": "^2.5.0",
|
|
97
|
+
"zod": "^3.23.8",
|
|
98
|
+
"zustand": "^5.0.13"
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/core/manifest.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Read/write the global project\u2192config manifest at\n * `$XDG_DATA_HOME/dev-cockpit/manifest.json`. Keys are canonical\n * absolute paths to a workspace root; values are absolute paths to\n * the cockpit.yaml that workspace should use.\n *\n * Used by core/config-discovery.ts as the last-resort lookup when\n * the workspace doesn't carry its own cockpit.yaml at the root.\n */\n\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nconst MANIFEST_VERSION = 1 as const;\n\nexport interface Manifest {\n version: typeof MANIFEST_VERSION;\n projects: Record<string, string>;\n}\n\n/** Absolute path of `$XDG_DATA_HOME/dev-cockpit/manifest.json`. */\nexport function manifestPath(): string {\n // `||` (not `??`) so an empty-string env var falls through to the default.\n const xdgDataHome =\n process.env['XDG_DATA_HOME'] || path.join(os.homedir(), '.local', 'share');\n return path.join(xdgDataHome, 'dev-cockpit', 'manifest.json');\n}\n\n/**\n * Canonicalise an absolute path \u2014 resolves symlinks if the path exists,\n * falls back to `path.resolve()` otherwise. Ensures a symlinked workspace\n * dir (`~/work`) and its real target (`/Users/me/code/work`) hash to the\n * same manifest key.\n */\nexport function canonical(p: string): string {\n const abs = path.resolve(p);\n try {\n return fs.realpathSync(abs);\n } catch {\n return abs;\n }\n}\n\n/**\n * Read the manifest. Returns `null` when the file is missing, unreadable,\n * malformed JSON, or doesn't match the expected shape. Callers treat null\n * as \"no mapping registered\" rather than an error \u2014 the user simply\n * hasn't run `dev-cockpit link` yet.\n */\nexport function readManifest(): Manifest | null {\n const filePath = manifestPath();\n if (!fs.existsSync(filePath)) return null;\n try {\n const raw = JSON.parse(fs.readFileSync(filePath, 'utf8')) as Partial<Manifest>;\n if (raw.version !== MANIFEST_VERSION) return null;\n if (!raw.projects || typeof raw.projects !== 'object') return null;\n const projects: Record<string, string> = {};\n for (const [k, v] of Object.entries(raw.projects)) {\n if (typeof k === 'string' && typeof v === 'string') projects[k] = v;\n }\n return { version: MANIFEST_VERSION, projects };\n } catch {\n return null;\n }\n}\n\n/** Look up a workspace's config path. Returns `null` when unmapped. */\nexport function lookupConfig(workspaceRoot: string): string | null {\n const m = readManifest();\n if (!m) return null;\n return m.projects[canonical(workspaceRoot)] ?? null;\n}\n\n/**\n * Atomic write: serialise to `<file>.tmp` next to the manifest, then\n * rename onto the real path. Creates the parent dir if missing. Same\n * pattern used by dev-cockpit's mount-manifest writer.\n */\nfunction writeManifest(m: Manifest): void {\n const filePath = manifestPath();\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n const tmp = `${filePath}.tmp`;\n fs.writeFileSync(tmp, `${JSON.stringify(m, null, 2)}\\n`, 'utf8');\n fs.renameSync(tmp, filePath);\n}\n\n/**\n * Register a mapping. Both inputs are canonicalised first \u2014 the\n * workspace key is resolved through symlinks so a `~/work` symlink and\n * `/Users/me/code/work` real path resolve to the same entry.\n */\nexport function setMapping(workspaceRoot: string, configPath: string): void {\n const existing = readManifest() ?? { version: MANIFEST_VERSION, projects: {} };\n existing.projects[canonical(workspaceRoot)] = canonical(configPath);\n writeManifest(existing);\n}\n\n/** Remove a mapping. Returns `true` when an entry was deleted. */\nexport function removeMapping(workspaceRoot: string): boolean {\n const existing = readManifest();\n if (!existing) return false;\n const key = canonical(workspaceRoot);\n if (!(key in existing.projects)) return false;\n delete existing.projects[key];\n writeManifest(existing);\n return true;\n}\n\n/** Sorted mapping list, for `dev-cockpit link list`. */\nexport function listMappings(): Array<{ workspace: string; config: string }> {\n const m = readManifest();\n if (!m) return [];\n return Object.entries(m.projects)\n .map(([workspace, config]) => ({ workspace, config }))\n .sort((a, b) => a.workspace.localeCompare(b.workspace));\n}\n"],
|
|
5
|
-
"mappings": ";;;;;AAUA,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf,OAAO,UAAU;AAEjB,IAAM,mBAAmB;AAQlB,SAAS,eAAuB;AAErC,QAAM,cACJ,QAAQ,IAAI,eAAe,KAAK,KAAK,KAAK,GAAG,QAAQ,GAAG,UAAU,OAAO;AAC3E,SAAO,KAAK,KAAK,aAAa,eAAe,eAAe;AAC9D;AAQO,SAAS,UAAU,GAAmB;AAC3C,QAAM,MAAM,KAAK,QAAQ,CAAC;AAC1B,MAAI;AACF,WAAO,GAAG,aAAa,GAAG;AAAA,EAC5B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAQO,SAAS,eAAgC;AAC9C,QAAM,WAAW,aAAa;AAC9B,MAAI,CAAC,GAAG,WAAW,QAAQ,EAAG,QAAO;AACrC,MAAI;AACF,UAAM,MAAM,KAAK,MAAM,GAAG,aAAa,UAAU,MAAM,CAAC;AACxD,QAAI,IAAI,YAAY,iBAAkB,QAAO;AAC7C,QAAI,CAAC,IAAI,YAAY,OAAO,IAAI,aAAa,SAAU,QAAO;AAC9D,UAAM,WAAmC,CAAC;AAC1C,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,QAAQ,GAAG;AACjD,UAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SAAU,UAAS,CAAC,IAAI;AAAA,IACpE;AACA,WAAO,EAAE,SAAS,kBAAkB,SAAS;AAAA,EAC/C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,aAAa,eAAsC;AACjE,QAAM,IAAI,aAAa;AACvB,MAAI,CAAC,EAAG,QAAO;AACf,SAAO,EAAE,SAAS,UAAU,aAAa,CAAC,KAAK;AACjD;AAOA,SAAS,cAAc,GAAmB;AACxC,QAAM,WAAW,aAAa;AAC9B,KAAG,UAAU,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,QAAM,MAAM,GAAG,QAAQ;AACvB,KAAG,cAAc,KAAK,GAAG,KAAK,UAAU,GAAG,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAC/D,KAAG,WAAW,KAAK,QAAQ;AAC7B;AAOO,SAAS,WAAW,eAAuB,YAA0B;AAC1E,QAAM,WAAW,aAAa,KAAK,EAAE,SAAS,kBAAkB,UAAU,CAAC,EAAE;AAC7E,WAAS,SAAS,UAAU,aAAa,CAAC,IAAI,UAAU,UAAU;AAClE,gBAAc,QAAQ;AACxB;AAGO,SAAS,cAAc,eAAgC;AAC5D,QAAM,WAAW,aAAa;AAC9B,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,MAAM,UAAU,aAAa;AACnC,MAAI,EAAE,OAAO,SAAS,UAAW,QAAO;AACxC,SAAO,SAAS,SAAS,GAAG;AAC5B,gBAAc,QAAQ;AACtB,SAAO;AACT;AAGO,SAAS,eAA6D;AAC3E,QAAM,IAAI,aAAa;AACvB,MAAI,CAAC,EAAG,QAAO,CAAC;AAChB,SAAO,OAAO,QAAQ,EAAE,QAAQ,EAC7B,IAAI,CAAC,CAAC,WAAW,MAAM,OAAO,EAAE,WAAW,OAAO,EAAE,EACpD,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,cAAc,EAAE,SAAS,CAAC;AAC1D;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/commands/link.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * `dev-cockpit link` \u2014 manage the project\u2192config mapping in\n * $XDG_DATA_HOME/dev-cockpit/manifest.json.\n *\n * Sub-commands:\n * link <config-path> register a mapping for the current cwd\n * link list show all registered mappings\n * link remove unregister the current cwd\n *\n * Path canonicalisation (symlink-resolved) happens inside the manifest\n * module \u2014 the same cwd reached via a symlinked alias hashes to the\n * same key as its real path.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport {\n\tcanonical,\n\tlistMappings,\n\tmanifestPath,\n\tremoveMapping,\n\tsetMapping,\n} from '../core/manifest.js';\n\nexport interface LinkAddOptions {\n\tconfigPath: string;\n}\n\nexport function linkAddCommand(opts: LinkAddOptions): void {\n\tconst cwd = process.cwd();\n\tconst absConfig = path.resolve(cwd, opts.configPath);\n\tif (!fs.existsSync(absConfig)) {\n\t\tprocess.stderr.write(\n\t\t\t`dev-cockpit link: ${absConfig} doesn't exist. Create the config file first or pass a valid path.\\n`,\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\tsetMapping(cwd, absConfig);\n\tprocess.stdout.write(\n\t\t`dev-cockpit link: ${canonical(cwd)} \u2192 ${canonical(absConfig)}\\n`,\n\t);\n}\n\nexport function linkListCommand(): void {\n\tconst entries = listMappings();\n\tif (entries.length === 0) {\n\t\tprocess.stdout.write(\n\t\t\t`dev-cockpit link: no mappings registered (manifest at ${manifestPath()}).\\n`,\n\t\t);\n\t\treturn;\n\t}\n\tconst longest = Math.max(...entries.map((e) => e.workspace.length));\n\tfor (const { workspace, config } of entries) {\n\t\tprocess.stdout.write(`${workspace.padEnd(longest)} \u2192 ${config}\\n`);\n\t}\n}\n\nexport function linkRemoveCommand(): void {\n\tconst cwd = process.cwd();\n\tconst removed = removeMapping(cwd);\n\tif (removed) {\n\t\tprocess.stdout.write(`dev-cockpit link: removed mapping for ${canonical(cwd)}\\n`);\n\t} else {\n\t\tprocess.stdout.write(\n\t\t\t`dev-cockpit link: no mapping for ${canonical(cwd)} (nothing to remove)\\n`,\n\t\t);\n\t}\n}"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;AAcA,OAAO,QAAQ;AACf,OAAO,UAAU;AAaV,SAAS,eAAe,MAA4B;AAC1D,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,YAAY,KAAK,QAAQ,KAAK,KAAK,UAAU;AACnD,MAAI,CAAC,GAAG,WAAW,SAAS,GAAG;AAC9B,YAAQ,OAAO;AAAA,MACd,qBAAqB,SAAS;AAAA;AAAA,IAC/B;AACA,YAAQ,KAAK,CAAC;AAAA,EACf;AACA,aAAW,KAAK,SAAS;AACzB,UAAQ,OAAO;AAAA,IACd,qBAAqB,UAAU,GAAG,CAAC,WAAM,UAAU,SAAS,CAAC;AAAA;AAAA,EAC9D;AACD;AAEO,SAAS,kBAAwB;AACvC,QAAM,UAAU,aAAa;AAC7B,MAAI,QAAQ,WAAW,GAAG;AACzB,YAAQ,OAAO;AAAA,MACd,yDAAyD,aAAa,CAAC;AAAA;AAAA,IACxE;AACA;AAAA,EACD;AACA,QAAM,UAAU,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,UAAU,MAAM,CAAC;AAClE,aAAW,EAAE,WAAW,OAAO,KAAK,SAAS;AAC5C,YAAQ,OAAO,MAAM,GAAG,UAAU,OAAO,OAAO,CAAC,aAAQ,MAAM;AAAA,CAAI;AAAA,EACpE;AACD;AAEO,SAAS,oBAA0B;AACzC,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,UAAU,cAAc,GAAG;AACjC,MAAI,SAAS;AACZ,YAAQ,OAAO,MAAM,yCAAyC,UAAU,GAAG,CAAC;AAAA,CAAI;AAAA,EACjF,OAAO;AACN,YAAQ,OAAO;AAAA,MACd,oCAAoC,UAAU,GAAG,CAAC;AAAA;AAAA,IACnD;AAAA,EACD;AACD;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|