@mariozechner/pi 0.2.4 → 0.5.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 +392 -294
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +348 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/models.d.ts +39 -0
- package/dist/commands/models.d.ts.map +1 -0
- package/dist/commands/models.js +612 -0
- package/dist/commands/models.js.map +1 -0
- package/dist/commands/pods.d.ts +21 -0
- package/dist/commands/pods.d.ts.map +1 -0
- package/dist/commands/pods.js +175 -0
- package/dist/commands/pods.js.map +1 -0
- package/dist/commands/prompt.d.ts +7 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/prompt.js +55 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +74 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/model-configs.d.ts +22 -0
- package/dist/model-configs.d.ts.map +1 -0
- package/dist/model-configs.js +75 -0
- package/dist/model-configs.js.map +1 -0
- package/dist/models.json +305 -0
- package/dist/ssh.d.ts +24 -0
- package/dist/ssh.d.ts.map +1 -0
- package/dist/ssh.js +115 -0
- package/dist/ssh.js.map +1 -0
- package/dist/types.d.ts +23 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +38 -40
- package/LICENSE +0 -21
- package/pi.js +0 -1379
- package/pod_setup.sh +0 -74
- package/vllm_manager.py +0 -662
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { spawn } from "child_process";
|
|
4
|
+
import { readFileSync } from "fs";
|
|
5
|
+
import { dirname, join } from "path";
|
|
6
|
+
import { fileURLToPath } from "url";
|
|
7
|
+
import { listModels, startModel, stopModel, viewLogs } from "./commands/models.js";
|
|
8
|
+
import { listPods, removePodCommand, setupPod, switchActivePod } from "./commands/pods.js";
|
|
9
|
+
import { promptModel } from "./commands/prompt.js";
|
|
10
|
+
import { getActivePod, loadConfig } from "./config.js";
|
|
11
|
+
import { sshExecStream } from "./ssh.js";
|
|
12
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
13
|
+
const __dirname = dirname(__filename);
|
|
14
|
+
const packageJson = JSON.parse(readFileSync(join(__dirname, "../package.json"), "utf-8"));
|
|
15
|
+
function printHelp() {
|
|
16
|
+
console.log(`pi v${packageJson.version} - Manage vLLM deployments on GPU pods
|
|
17
|
+
|
|
18
|
+
Pod Management:
|
|
19
|
+
pi pods setup <name> "<ssh>" --mount "<mount>" Setup pod with mount command
|
|
20
|
+
Options:
|
|
21
|
+
--vllm release Install latest vLLM release >=0.10.0 (default)
|
|
22
|
+
--vllm nightly Install vLLM nightly build (latest features)
|
|
23
|
+
--vllm gpt-oss Install vLLM 0.10.1+gptoss with PyTorch nightly (GPT-OSS only)
|
|
24
|
+
pi pods List all pods (* = active)
|
|
25
|
+
pi pods active <name> Switch active pod
|
|
26
|
+
pi pods remove <name> Remove pod from local config
|
|
27
|
+
pi shell [<name>] Open shell on pod (active or specified)
|
|
28
|
+
pi ssh [<name>] "<command>" Run SSH command on pod
|
|
29
|
+
|
|
30
|
+
Model Management:
|
|
31
|
+
pi start <model> --name <name> [options] Start a model
|
|
32
|
+
--memory <percent> GPU memory allocation (30%, 50%, 90%)
|
|
33
|
+
--context <size> Context window (4k, 8k, 16k, 32k, 64k, 128k)
|
|
34
|
+
--gpus <count> Number of GPUs to use (predefined models only)
|
|
35
|
+
--vllm <args...> Pass remaining args to vLLM (ignores other options)
|
|
36
|
+
pi stop [<name>] Stop model (or all if no name)
|
|
37
|
+
pi list List running models
|
|
38
|
+
pi logs <name> Stream model logs
|
|
39
|
+
pi agent <name> ["<message>"...] [options] Chat with model using agent & tools
|
|
40
|
+
pi agent <name> [options] Interactive chat mode
|
|
41
|
+
--continue, -c Continue previous session
|
|
42
|
+
--json Output as JSONL
|
|
43
|
+
(All pi-agent options are supported)
|
|
44
|
+
|
|
45
|
+
All model commands support --pod <name> to override the active pod.
|
|
46
|
+
|
|
47
|
+
Environment:
|
|
48
|
+
HF_TOKEN HuggingFace token for model downloads
|
|
49
|
+
PI_API_KEY API key for vLLM endpoints
|
|
50
|
+
PI_CONFIG_DIR Config directory (default: ~/.pi)`);
|
|
51
|
+
}
|
|
52
|
+
// Parse command line arguments
|
|
53
|
+
const args = process.argv.slice(2);
|
|
54
|
+
if (args.length === 0 || args[0] === "--help" || args[0] === "-h") {
|
|
55
|
+
printHelp();
|
|
56
|
+
process.exit(0);
|
|
57
|
+
}
|
|
58
|
+
if (args[0] === "--version" || args[0] === "-v") {
|
|
59
|
+
console.log(packageJson.version);
|
|
60
|
+
process.exit(0);
|
|
61
|
+
}
|
|
62
|
+
const command = args[0];
|
|
63
|
+
const subcommand = args[1];
|
|
64
|
+
// Main command handler
|
|
65
|
+
try {
|
|
66
|
+
// Handle "pi pods" commands
|
|
67
|
+
if (command === "pods") {
|
|
68
|
+
if (!subcommand) {
|
|
69
|
+
// pi pods - list all pods
|
|
70
|
+
listPods();
|
|
71
|
+
}
|
|
72
|
+
else if (subcommand === "setup") {
|
|
73
|
+
// pi pods setup <name> "<ssh>" [--mount "<mount>"] [--models-path <path>] [--vllm release|nightly|gpt-oss]
|
|
74
|
+
const name = args[2];
|
|
75
|
+
const sshCmd = args[3];
|
|
76
|
+
if (!name || !sshCmd) {
|
|
77
|
+
console.error('Usage: pi pods setup <name> "<ssh>" [--mount "<mount>"] [--models-path <path>] [--vllm release|nightly|gpt-oss]');
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
// Parse options
|
|
81
|
+
const options = {};
|
|
82
|
+
for (let i = 4; i < args.length; i++) {
|
|
83
|
+
if (args[i] === "--mount" && i + 1 < args.length) {
|
|
84
|
+
options.mount = args[i + 1];
|
|
85
|
+
i++;
|
|
86
|
+
}
|
|
87
|
+
else if (args[i] === "--models-path" && i + 1 < args.length) {
|
|
88
|
+
options.modelsPath = args[i + 1];
|
|
89
|
+
i++;
|
|
90
|
+
}
|
|
91
|
+
else if (args[i] === "--vllm" && i + 1 < args.length) {
|
|
92
|
+
const vllmType = args[i + 1];
|
|
93
|
+
if (vllmType === "release" || vllmType === "nightly" || vllmType === "gpt-oss") {
|
|
94
|
+
options.vllm = vllmType;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
console.error(chalk.red(`Invalid vLLM type: ${vllmType}`));
|
|
98
|
+
console.error("Valid options: release, nightly, gpt-oss");
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
i++;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// If --mount provided but no --models-path, try to extract path from mount command
|
|
105
|
+
if (options.mount && !options.modelsPath) {
|
|
106
|
+
// Extract last part of mount command as models path
|
|
107
|
+
const parts = options.mount.trim().split(" ");
|
|
108
|
+
const lastPart = parts[parts.length - 1];
|
|
109
|
+
if (lastPart?.startsWith("/")) {
|
|
110
|
+
options.modelsPath = lastPart;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
await setupPod(name, sshCmd, options);
|
|
114
|
+
}
|
|
115
|
+
else if (subcommand === "active") {
|
|
116
|
+
// pi pods active <name>
|
|
117
|
+
const name = args[2];
|
|
118
|
+
if (!name) {
|
|
119
|
+
console.error("Usage: pi pods active <name>");
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
switchActivePod(name);
|
|
123
|
+
}
|
|
124
|
+
else if (subcommand === "remove") {
|
|
125
|
+
// pi pods remove <name>
|
|
126
|
+
const name = args[2];
|
|
127
|
+
if (!name) {
|
|
128
|
+
console.error("Usage: pi pods remove <name>");
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
removePodCommand(name);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
console.error(`Unknown pods subcommand: ${subcommand}`);
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
// Parse --pod override for model commands
|
|
140
|
+
let podOverride;
|
|
141
|
+
const podIndex = args.indexOf("--pod");
|
|
142
|
+
if (podIndex !== -1 && podIndex + 1 < args.length) {
|
|
143
|
+
podOverride = args[podIndex + 1];
|
|
144
|
+
// Remove --pod and its value from args
|
|
145
|
+
args.splice(podIndex, 2);
|
|
146
|
+
}
|
|
147
|
+
// Handle SSH/shell commands and model commands
|
|
148
|
+
switch (command) {
|
|
149
|
+
case "shell": {
|
|
150
|
+
// pi shell [<name>] - open interactive shell
|
|
151
|
+
const podName = args[1];
|
|
152
|
+
let podInfo = null;
|
|
153
|
+
if (podName) {
|
|
154
|
+
const config = loadConfig();
|
|
155
|
+
const pod = config.pods[podName];
|
|
156
|
+
if (pod) {
|
|
157
|
+
podInfo = { name: podName, pod };
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
podInfo = getActivePod();
|
|
162
|
+
}
|
|
163
|
+
if (!podInfo) {
|
|
164
|
+
if (podName) {
|
|
165
|
+
console.error(chalk.red(`Pod '${podName}' not found`));
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
console.error(chalk.red("No active pod. Use 'pi pods active <name>' to set one."));
|
|
169
|
+
}
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
console.log(chalk.green(`Connecting to pod '${podInfo.name}'...`));
|
|
173
|
+
// Execute SSH in interactive mode
|
|
174
|
+
const sshArgs = podInfo.pod.ssh.split(" ").slice(1); // Remove 'ssh' from command
|
|
175
|
+
const sshProcess = spawn("ssh", sshArgs, {
|
|
176
|
+
stdio: "inherit",
|
|
177
|
+
env: process.env,
|
|
178
|
+
});
|
|
179
|
+
sshProcess.on("exit", (code) => {
|
|
180
|
+
process.exit(code || 0);
|
|
181
|
+
});
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
case "ssh": {
|
|
185
|
+
// pi ssh [<name>] "<command>" - run command via SSH
|
|
186
|
+
let podName;
|
|
187
|
+
let sshCommand;
|
|
188
|
+
if (args.length === 2) {
|
|
189
|
+
// pi ssh "<command>" - use active pod
|
|
190
|
+
sshCommand = args[1];
|
|
191
|
+
}
|
|
192
|
+
else if (args.length === 3) {
|
|
193
|
+
// pi ssh <name> "<command>"
|
|
194
|
+
podName = args[1];
|
|
195
|
+
sshCommand = args[2];
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
console.error('Usage: pi ssh [<name>] "<command>"');
|
|
199
|
+
process.exit(1);
|
|
200
|
+
}
|
|
201
|
+
let podInfo = null;
|
|
202
|
+
if (podName) {
|
|
203
|
+
const config = loadConfig();
|
|
204
|
+
const pod = config.pods[podName];
|
|
205
|
+
if (pod) {
|
|
206
|
+
podInfo = { name: podName, pod };
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
podInfo = getActivePod();
|
|
211
|
+
}
|
|
212
|
+
if (!podInfo) {
|
|
213
|
+
if (podName) {
|
|
214
|
+
console.error(chalk.red(`Pod '${podName}' not found`));
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
console.error(chalk.red("No active pod. Use 'pi pods active <name>' to set one."));
|
|
218
|
+
}
|
|
219
|
+
process.exit(1);
|
|
220
|
+
}
|
|
221
|
+
console.log(chalk.gray(`Running on pod '${podInfo.name}': ${sshCommand}`));
|
|
222
|
+
// Execute command and stream output
|
|
223
|
+
const exitCode = await sshExecStream(podInfo.pod.ssh, sshCommand);
|
|
224
|
+
process.exit(exitCode);
|
|
225
|
+
break;
|
|
226
|
+
}
|
|
227
|
+
case "start": {
|
|
228
|
+
// pi start <model> --name <name> [options]
|
|
229
|
+
const modelId = args[1];
|
|
230
|
+
if (!modelId) {
|
|
231
|
+
// Show available models
|
|
232
|
+
const { showKnownModels } = await import("./commands/models.js");
|
|
233
|
+
await showKnownModels();
|
|
234
|
+
process.exit(0);
|
|
235
|
+
}
|
|
236
|
+
// Parse options
|
|
237
|
+
let name;
|
|
238
|
+
let memory;
|
|
239
|
+
let context;
|
|
240
|
+
let gpus;
|
|
241
|
+
const vllmArgs = [];
|
|
242
|
+
let inVllmArgs = false;
|
|
243
|
+
for (let i = 2; i < args.length; i++) {
|
|
244
|
+
if (inVllmArgs) {
|
|
245
|
+
vllmArgs.push(args[i]);
|
|
246
|
+
}
|
|
247
|
+
else if (args[i] === "--name" && i + 1 < args.length) {
|
|
248
|
+
name = args[i + 1];
|
|
249
|
+
i++;
|
|
250
|
+
}
|
|
251
|
+
else if (args[i] === "--memory" && i + 1 < args.length) {
|
|
252
|
+
memory = args[i + 1];
|
|
253
|
+
i++;
|
|
254
|
+
}
|
|
255
|
+
else if (args[i] === "--context" && i + 1 < args.length) {
|
|
256
|
+
context = args[i + 1];
|
|
257
|
+
i++;
|
|
258
|
+
}
|
|
259
|
+
else if (args[i] === "--gpus" && i + 1 < args.length) {
|
|
260
|
+
gpus = parseInt(args[i + 1]);
|
|
261
|
+
if (Number.isNaN(gpus) || gpus < 1) {
|
|
262
|
+
console.error(chalk.red("--gpus must be a positive number"));
|
|
263
|
+
process.exit(1);
|
|
264
|
+
}
|
|
265
|
+
i++;
|
|
266
|
+
}
|
|
267
|
+
else if (args[i] === "--vllm") {
|
|
268
|
+
inVllmArgs = true;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
if (!name) {
|
|
272
|
+
console.error("--name is required");
|
|
273
|
+
process.exit(1);
|
|
274
|
+
}
|
|
275
|
+
// Warn if --vllm is used with other parameters
|
|
276
|
+
if (vllmArgs.length > 0 && (memory || context || gpus)) {
|
|
277
|
+
console.log(chalk.yellow("⚠ Warning: --memory, --context, and --gpus are ignored when --vllm is specified"));
|
|
278
|
+
console.log(chalk.yellow(" Using only custom vLLM arguments"));
|
|
279
|
+
console.log("");
|
|
280
|
+
}
|
|
281
|
+
await startModel(modelId, name, {
|
|
282
|
+
pod: podOverride,
|
|
283
|
+
memory,
|
|
284
|
+
context,
|
|
285
|
+
gpus,
|
|
286
|
+
vllmArgs: vllmArgs.length > 0 ? vllmArgs : undefined,
|
|
287
|
+
});
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
case "stop": {
|
|
291
|
+
// pi stop [name] - stop specific model or all models
|
|
292
|
+
const name = args[1];
|
|
293
|
+
if (!name) {
|
|
294
|
+
// Stop all models on the active pod
|
|
295
|
+
const { stopAllModels } = await import("./commands/models.js");
|
|
296
|
+
await stopAllModels({ pod: podOverride });
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
await stopModel(name, { pod: podOverride });
|
|
300
|
+
}
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
case "list":
|
|
304
|
+
// pi list
|
|
305
|
+
await listModels({ pod: podOverride });
|
|
306
|
+
break;
|
|
307
|
+
case "logs": {
|
|
308
|
+
// pi logs <name>
|
|
309
|
+
const name = args[1];
|
|
310
|
+
if (!name) {
|
|
311
|
+
console.error("Usage: pi logs <name>");
|
|
312
|
+
process.exit(1);
|
|
313
|
+
}
|
|
314
|
+
await viewLogs(name, { pod: podOverride });
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
case "agent": {
|
|
318
|
+
// pi agent <name> [messages...] [options]
|
|
319
|
+
const name = args[1];
|
|
320
|
+
if (!name) {
|
|
321
|
+
console.error("Usage: pi agent <name> [messages...] [options]");
|
|
322
|
+
process.exit(1);
|
|
323
|
+
}
|
|
324
|
+
const apiKey = process.env.PI_API_KEY;
|
|
325
|
+
// Pass all args after the model name
|
|
326
|
+
const agentArgs = args.slice(2);
|
|
327
|
+
// If no messages provided, it's interactive mode
|
|
328
|
+
await promptModel(name, agentArgs, {
|
|
329
|
+
pod: podOverride,
|
|
330
|
+
apiKey,
|
|
331
|
+
}).catch(() => {
|
|
332
|
+
// Error already handled in promptModel, just exit cleanly
|
|
333
|
+
process.exit(0);
|
|
334
|
+
});
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
default:
|
|
338
|
+
console.error(`Unknown command: ${command}`);
|
|
339
|
+
printHelp();
|
|
340
|
+
process.exit(1);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
catch (error) {
|
|
345
|
+
console.error("Error:", error);
|
|
346
|
+
process.exit(1);
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Start a model
|
|
3
|
+
*/
|
|
4
|
+
export declare const startModel: (modelId: string, name: string, options: {
|
|
5
|
+
pod?: string;
|
|
6
|
+
vllmArgs?: string[];
|
|
7
|
+
memory?: string;
|
|
8
|
+
context?: string;
|
|
9
|
+
gpus?: number;
|
|
10
|
+
}) => Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Stop a model
|
|
13
|
+
*/
|
|
14
|
+
export declare const stopModel: (name: string, options: {
|
|
15
|
+
pod?: string;
|
|
16
|
+
}) => Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Stop all models on a pod
|
|
19
|
+
*/
|
|
20
|
+
export declare const stopAllModels: (options: {
|
|
21
|
+
pod?: string;
|
|
22
|
+
}) => Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* List all models
|
|
25
|
+
*/
|
|
26
|
+
export declare const listModels: (options: {
|
|
27
|
+
pod?: string;
|
|
28
|
+
}) => Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* View model logs
|
|
31
|
+
*/
|
|
32
|
+
export declare const viewLogs: (name: string, options: {
|
|
33
|
+
pod?: string;
|
|
34
|
+
}) => Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Show known models and their hardware requirements
|
|
37
|
+
*/
|
|
38
|
+
export declare const showKnownModels: () => Promise<void>;
|
|
39
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"AA0EA;;GAEG;AACH,eAAO,MAAM,UAAU,GACtB,SAAS,MAAM,EACf,MAAM,MAAM,EACZ,SAAS;IACR,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,kBAuRD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,GAAU,MAAM,MAAM,EAAE,SAAS;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,kBA0BtE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,GAAU,SAAS;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,kBA2B5D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,GAAU,SAAS;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,kBAwEzD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAU,MAAM,MAAM,EAAE,SAAS;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,kBA+BrE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,qBA4J3B,CAAC"}
|