@workbench-ai/workbench 0.0.46

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.
Files changed (39) hide show
  1. package/dist/adapter-project.d.ts +29 -0
  2. package/dist/adapter-project.d.ts.map +1 -0
  3. package/dist/adapter-project.js +363 -0
  4. package/dist/benchmark-fingerprint.d.ts +6 -0
  5. package/dist/benchmark-fingerprint.d.ts.map +1 -0
  6. package/dist/benchmark-fingerprint.js +101 -0
  7. package/dist/command-model.d.ts +5 -0
  8. package/dist/command-model.d.ts.map +1 -0
  9. package/dist/command-model.js +558 -0
  10. package/dist/dev-open/client.css +8157 -0
  11. package/dist/dev-open/client.js +252596 -0
  12. package/dist/dev-open/fonts/geist-cyrillic-wght-normal.woff2 +0 -0
  13. package/dist/dev-open/fonts/geist-latin-ext-wght-normal.woff2 +0 -0
  14. package/dist/dev-open/fonts/geist-latin-wght-normal.woff2 +0 -0
  15. package/dist/dev-open-server.d.ts +57 -0
  16. package/dist/dev-open-server.d.ts.map +1 -0
  17. package/dist/dev-open-server.js +496 -0
  18. package/dist/index.d.ts +10 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +3943 -0
  21. package/dist/init-scaffold.d.ts +22 -0
  22. package/dist/init-scaffold.d.ts.map +1 -0
  23. package/dist/init-scaffold.js +30 -0
  24. package/dist/init-template-pack.d.ts +19 -0
  25. package/dist/init-template-pack.d.ts.map +1 -0
  26. package/dist/init-template-pack.js +250 -0
  27. package/dist/local-archive.d.ts +23 -0
  28. package/dist/local-archive.d.ts.map +1 -0
  29. package/dist/local-archive.js +741 -0
  30. package/dist/project-source.d.ts +51 -0
  31. package/dist/project-source.d.ts.map +1 -0
  32. package/dist/project-source.js +700 -0
  33. package/dist/workbench.d.ts +3 -0
  34. package/dist/workbench.d.ts.map +1 -0
  35. package/dist/workbench.js +4 -0
  36. package/dist/workspace-snapshot.d.ts +10 -0
  37. package/dist/workspace-snapshot.d.ts.map +1 -0
  38. package/dist/workspace-snapshot.js +81 -0
  39. package/package.json +45 -0
@@ -0,0 +1,22 @@
1
+ export type InitSubjectKind = "skill" | "command";
2
+ export type InitAgent = string;
3
+ export interface WorkbenchInitScaffoldOptions {
4
+ kind: InitSubjectKind;
5
+ name: string;
6
+ agent?: InitAgent;
7
+ example: boolean;
8
+ }
9
+ export interface WorkbenchInitScaffoldFile {
10
+ path: string;
11
+ content: string;
12
+ }
13
+ export interface WorkbenchInitScaffold {
14
+ kind: InitSubjectKind;
15
+ name: string;
16
+ subjectRoot: string;
17
+ seedFileTarget: string;
18
+ seedDirectoryTarget: string;
19
+ files: WorkbenchInitScaffoldFile[];
20
+ }
21
+ export declare function createWorkbenchInitScaffold(options: WorkbenchInitScaffoldOptions): WorkbenchInitScaffold;
22
+ //# sourceMappingURL=init-scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-scaffold.d.ts","sourceRoot":"","sources":["../src/init-scaffold.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,SAAS,CAAC;AAClD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,KAAK,EAAE,yBAAyB,EAAE,CAAC;CACpC;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,4BAA4B,GAAG,qBAAqB,CAkBxG"}
@@ -0,0 +1,30 @@
1
+ import { defaultWorkbenchInitTemplatePack } from "./init-template-pack.js";
2
+ export function createWorkbenchInitScaffold(options) {
3
+ const template = defaultWorkbenchInitTemplatePack[options.kind];
4
+ const slug = slugify(options.name);
5
+ const agent = template.requiresAgent ? requireAgent(options) : undefined;
6
+ const context = {
7
+ name: options.name,
8
+ slug,
9
+ ...(agent ? { agent } : {}),
10
+ example: options.example,
11
+ };
12
+ return {
13
+ kind: template.kind,
14
+ name: options.name,
15
+ subjectRoot: template.subjectRoot(context),
16
+ seedFileTarget: template.seedFileTarget(context),
17
+ seedDirectoryTarget: template.seedDirectoryTarget(context),
18
+ files: template.files(context),
19
+ };
20
+ }
21
+ function requireAgent(options) {
22
+ if (options.agent && /^[a-z][a-z0-9-]*$/u.test(options.agent)) {
23
+ return options.agent;
24
+ }
25
+ throw new Error(`--agent is required for --${options.kind} and must be a lowercase adapter id.`);
26
+ }
27
+ function slugify(value) {
28
+ const slug = value.trim().toLowerCase().replace(/[^a-z0-9]+/gu, "-").replace(/^-+|-+$/gu, "");
29
+ return slug || "workbench-subject";
30
+ }
@@ -0,0 +1,19 @@
1
+ import type { InitAgent, InitSubjectKind, WorkbenchInitScaffoldFile } from "./init-scaffold.js";
2
+ interface WorkbenchInitTemplateContext {
3
+ name: string;
4
+ slug: string;
5
+ agent?: InitAgent;
6
+ example: boolean;
7
+ }
8
+ export interface WorkbenchInitTemplate {
9
+ kind: InitSubjectKind;
10
+ requiresAgent: boolean;
11
+ subjectRoot(context: WorkbenchInitTemplateContext): string;
12
+ seedFileTarget(context: WorkbenchInitTemplateContext): string;
13
+ seedDirectoryTarget(context: WorkbenchInitTemplateContext): string;
14
+ files(context: WorkbenchInitTemplateContext): WorkbenchInitScaffoldFile[];
15
+ }
16
+ export type WorkbenchInitTemplatePack = Record<InitSubjectKind, WorkbenchInitTemplate>;
17
+ export declare const defaultWorkbenchInitTemplatePack: WorkbenchInitTemplatePack;
18
+ export {};
19
+ //# sourceMappingURL=init-template-pack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-template-pack.d.ts","sourceRoot":"","sources":["../src/init-template-pack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,yBAAyB,EAC1B,MAAM,oBAAoB,CAAC;AAE5B,UAAU,4BAA4B;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,eAAe,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,OAAO,EAAE,4BAA4B,GAAG,MAAM,CAAC;IAC3D,cAAc,CAAC,OAAO,EAAE,4BAA4B,GAAG,MAAM,CAAC;IAC9D,mBAAmB,CAAC,OAAO,EAAE,4BAA4B,GAAG,MAAM,CAAC;IACnE,KAAK,CAAC,OAAO,EAAE,4BAA4B,GAAG,yBAAyB,EAAE,CAAC;CAC3E;AAED,MAAM,MAAM,yBAAyB,GAAG,MAAM,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC;AAEvF,eAAO,MAAM,gCAAgC,EAAE,yBA+C9C,CAAC"}
@@ -0,0 +1,250 @@
1
+ export const defaultWorkbenchInitTemplatePack = {
2
+ skill: {
3
+ kind: "skill",
4
+ requiresAgent: true,
5
+ subjectRoot: ({ agent }) => `subjects/${requiredAgent(agent)}/files`,
6
+ seedFileTarget: ({ agent }) => `subjects/${requiredAgent(agent)}/files/SKILL.md`,
7
+ seedDirectoryTarget: ({ agent }) => `subjects/${requiredAgent(agent)}/files`,
8
+ files: ({ name, slug, agent, example }) => {
9
+ const adapter = requiredAgent(agent);
10
+ return [
11
+ { path: "benchmark.yaml", content: skillBenchmarkSpec(name, adapter) },
12
+ { path: `subjects/${adapter}/subject.yaml`, content: skillSubjectSpec(name, adapter) },
13
+ { path: `optimizers/${adapter}.yaml`, content: optimizerSpec(name, "SKILL.md", adapter) },
14
+ { path: `subjects/${adapter}/files/SKILL.md`, content: skillMarkdown(name, slug, example) },
15
+ { path: `subjects/${adapter}/files/agents/openai.yaml`, content: skillOpenAiMetadata(name, slug) },
16
+ { path: "environment/Dockerfile", content: nodeDockerfile() },
17
+ { path: "tasks/task-001/task.yaml", content: taskYaml(skillCasePrompt(name)) },
18
+ { path: "tasks/task-001/tests/rubric.md", content: skillExpectedRubric() },
19
+ ...(example ? [
20
+ { path: "tasks/task-002/task.yaml", content: taskYaml(`Use ${name} for a second realistic prompt with different constraints.\n`) },
21
+ { path: "tasks/task-002/tests/rubric.md", content: skillExpectedRubric() },
22
+ ] : []),
23
+ ];
24
+ },
25
+ },
26
+ command: {
27
+ kind: "command",
28
+ requiresAgent: false,
29
+ subjectRoot: () => "subjects/command/files",
30
+ seedFileTarget: () => "subjects/command/files/run.js",
31
+ seedDirectoryTarget: () => "subjects/command/files",
32
+ files: ({ name, example }) => [
33
+ { path: "benchmark.yaml", content: commandBenchmarkSpec(name) },
34
+ { path: "subjects/command/subject.yaml", content: commandSubjectSpec(name) },
35
+ { path: "optimizers/command.yaml", content: commandOptimizerSpec(name) },
36
+ { path: "subjects/command/files/run.js", content: commandRunnerSource() },
37
+ { path: "environment/Dockerfile", content: nodeDockerfile() },
38
+ { path: "tasks/task-001/task.yaml", content: taskYaml("The command should produce a concise result for this task.\n") },
39
+ { path: "tasks/task-001/tests/required-output.txt", content: "command subject ran\n" },
40
+ { path: "tasks/task-001/tests/test.sh", content: commandTestScript() },
41
+ ...(example ? [
42
+ { path: "tasks/task-002/task.yaml", content: taskYaml("The command should still produce deterministic output for a second task.\n") },
43
+ { path: "tasks/task-002/tests/required-output.txt", content: "command subject ran\n" },
44
+ { path: "tasks/task-002/tests/test.sh", content: commandTestScript() },
45
+ ] : []),
46
+ ],
47
+ },
48
+ };
49
+ function requiredAgent(agent) {
50
+ if (!agent) {
51
+ throw new Error("Template requires an agent adapter id.");
52
+ }
53
+ return agent;
54
+ }
55
+ function yamlString(value) {
56
+ return JSON.stringify(value);
57
+ }
58
+ function taskYaml(task) {
59
+ return [
60
+ "version: 3",
61
+ "task: |-",
62
+ ...task.trimEnd().split("\n").map((line) => ` ${line}`),
63
+ "tests:",
64
+ " path: tests",
65
+ "",
66
+ ].join("\n");
67
+ }
68
+ function skillBenchmarkSpec(name, agent) {
69
+ return [
70
+ "version: 3",
71
+ `name: ${yamlString(name)}`,
72
+ `description: ${yamlString(`Evaluate the ${name} skill across representative tasks.`)}`,
73
+ "engine:",
74
+ " use: workbench",
75
+ " with:",
76
+ " environment:",
77
+ " dockerfile: environment/Dockerfile",
78
+ " score:",
79
+ " use: rubric",
80
+ " with:",
81
+ " instructions: Score the completed task from the current working directory and engine-private verifier files. Do not score the subject instructions by keyword matching.",
82
+ " parallelism: 2",
83
+ " judge:",
84
+ ` use: ${agent}`,
85
+ " criteria:",
86
+ " - id: task_fit",
87
+ " description: The response follows the task prompt and uses the skill's workflow.",
88
+ " weight: 1",
89
+ " - id: output_quality",
90
+ " description: The produced output is complete, readable, and directly useful.",
91
+ " weight: 1",
92
+ "",
93
+ ].join("\n");
94
+ }
95
+ function skillSubjectSpec(name, agent) {
96
+ return [
97
+ "version: 3",
98
+ `name: ${yamlString(name)}`,
99
+ "files:",
100
+ " path: files",
101
+ "run:",
102
+ ` use: ${agent}`,
103
+ " with:",
104
+ " instructions: Use paths.workspace for mutable subject files and paths.case for public task files from WORKBENCH_ADAPTER_REQUEST. Mutate the workspace to complete the task.",
105
+ "",
106
+ ].join("\n");
107
+ }
108
+ function optimizerSpec(name, editablePath, agent) {
109
+ return [
110
+ "version: 3",
111
+ `name: ${yamlString(`${name} optimizer`)}`,
112
+ `description: ${yamlString(`Improve subject files for ${name}.`)}`,
113
+ "edits:",
114
+ ` - ${editablePath}`,
115
+ "improve:",
116
+ ` use: ${agent}`,
117
+ "",
118
+ ].join("\n");
119
+ }
120
+ function commandBenchmarkSpec(name) {
121
+ return [
122
+ "version: 3",
123
+ `name: ${yamlString(name)}`,
124
+ `description: ${yamlString(`Evaluate the ${name} command implementation across representative tasks.`)}`,
125
+ "engine:",
126
+ " use: workbench",
127
+ " with:",
128
+ " environment:",
129
+ " dockerfile: environment/Dockerfile",
130
+ " score:",
131
+ " use: tests",
132
+ "",
133
+ ].join("\n");
134
+ }
135
+ function commandSubjectSpec(name) {
136
+ const runnerCommand = JSON.stringify("node run.js");
137
+ return [
138
+ "version: 3",
139
+ `name: ${yamlString(name)}`,
140
+ "files:",
141
+ " path: files",
142
+ "run:",
143
+ " use: command",
144
+ " with:",
145
+ ` command: ${runnerCommand}`,
146
+ "",
147
+ ].join("\n");
148
+ }
149
+ function commandOptimizerSpec(name) {
150
+ const optimizerCommand = JSON.stringify("node -e \"const fs=require('fs');const file='run.js';const current=fs.existsSync(file)?fs.readFileSync(file,'utf8'):'';const next=current.replace(/\\s*$/,'')+'\\n// Workbench subject revision.\\n';fs.writeFileSync(file,next);\"");
151
+ return [
152
+ "version: 3",
153
+ `name: ${yamlString(`${name} optimizer`)}`,
154
+ `description: ${yamlString(`Improve subject command files for ${name}.`)}`,
155
+ "edits:",
156
+ " - run.js",
157
+ "improve:",
158
+ " use: command",
159
+ " with:",
160
+ ` command: ${optimizerCommand}`,
161
+ "",
162
+ ].join("\n");
163
+ }
164
+ function commandTestScript() {
165
+ return [
166
+ "#!/usr/bin/env sh",
167
+ "set -eu",
168
+ "expected=$(node -e \"const fs=require('fs'),path=require('path');const r=JSON.parse(fs.readFileSync(process.env.WORKBENCH_ADAPTER_REQUEST,'utf8'));process.stdout.write(fs.readFileSync(path.join(r.paths.enginePrivate,'required-output.txt'),'utf8'));\")",
169
+ "verifier_logs=$(node -e \"const fs=require('fs'),path=require('path');const r=JSON.parse(fs.readFileSync(process.env.WORKBENCH_ADAPTER_REQUEST,'utf8'));process.stdout.write(path.join(r.paths.logs,'verifier'));\")",
170
+ "actual=$(cat command-output.txt 2>/dev/null || true)",
171
+ "mkdir -p \"$verifier_logs\"",
172
+ "case \"$actual\" in",
173
+ " *\"$expected\"*) printf '{\"reward\":1,\"exact\":1}\\n' > \"$verifier_logs/reward.json\" ;;",
174
+ " *) printf '{\"reward\":0,\"exact\":0}\\n' > \"$verifier_logs/reward.json\" ;;",
175
+ "esac",
176
+ "",
177
+ ].join("\n");
178
+ }
179
+ function nodeDockerfile() {
180
+ return [
181
+ "FROM node:22-slim",
182
+ "",
183
+ ...caCertificatesDockerfileStep(),
184
+ "",
185
+ ].join("\n");
186
+ }
187
+ function caCertificatesDockerfileStep() {
188
+ return [
189
+ "RUN apt-get update \\",
190
+ " && apt-get install -y --no-install-recommends ca-certificates \\",
191
+ " && rm -rf /var/lib/apt/lists/*",
192
+ ];
193
+ }
194
+ function skillMarkdown(name, slug, example) {
195
+ return [
196
+ "---",
197
+ `name: ${slug}`,
198
+ `description: ${yamlString(`Use this skill whenever the user asks for ${name} work, related deliverable generation, or iterative improvement of this workflow.`)}`,
199
+ "---",
200
+ "",
201
+ `# ${name}`,
202
+ "",
203
+ "Use this skill to turn the user's request into a concrete deliverable.",
204
+ "",
205
+ "## Workflow",
206
+ "",
207
+ "1. Identify the requested deliverable and success criteria.",
208
+ "2. Gather only the source context needed for this deliverable.",
209
+ "3. Produce the deliverable in the format the user can use directly.",
210
+ "4. Validate the output against the success criteria before returning it.",
211
+ "",
212
+ ...(example ? [
213
+ "## Example",
214
+ "",
215
+ "When a prompt asks for a concrete deliverable, produce the deliverable first and keep explanation secondary.",
216
+ "",
217
+ ] : []),
218
+ ].join("\n");
219
+ }
220
+ function skillOpenAiMetadata(name, slug) {
221
+ return [
222
+ `name: ${slug}`,
223
+ `description: ${yamlString(`Generate and improve ${name} deliverables.`)}`,
224
+ "",
225
+ ].join("\n");
226
+ }
227
+ function skillCasePrompt(name) {
228
+ return [
229
+ `Use the ${name} skill to produce a small but complete deliverable for a realistic request.`,
230
+ "Return the deliverable content and a one-sentence validation note.",
231
+ "",
232
+ ].join("\n");
233
+ }
234
+ function skillExpectedRubric() {
235
+ return [
236
+ "Reward complete, usable deliverables created from the task input.",
237
+ "Penalize placeholder output, missing validation, and keyword-only compliance.",
238
+ "",
239
+ ].join("\n");
240
+ }
241
+ function commandRunnerSource() {
242
+ return [
243
+ "const fs = require('fs');",
244
+ "const path = require('path');",
245
+ "",
246
+ "fs.writeFileSync(path.join(process.cwd(), 'command-output.txt'), 'command subject ran\\n');",
247
+ "console.log('command subject ran');",
248
+ "",
249
+ ].join("\n");
250
+ }
@@ -0,0 +1,23 @@
1
+ import { type SubjectRecord, type EvaluationResultRecord, type HostedWorkbenchJob, type RunSummary, type RuntimeEvent, type SurfaceSnapshotFile } from "@workbench-ai/workbench-core";
2
+ export interface LocalArchiveSnapshot {
3
+ activeId: string | null;
4
+ subjects: SubjectRecord[];
5
+ subjectFiles: Record<string, SurfaceSnapshotFile[]>;
6
+ evaluations: EvaluationResultRecord[];
7
+ runs: RunSummary[];
8
+ events: RuntimeEvent[];
9
+ }
10
+ export declare function localRuntimeDir(workspace: string): string;
11
+ export declare function loadLocalArchive(workspace: string): Promise<LocalArchiveSnapshot>;
12
+ export declare function saveLocalArchive(workspace: string, snapshot: LocalArchiveSnapshot): Promise<void>;
13
+ export declare function saveLocalJobs(workspace: string, jobs: readonly HostedWorkbenchJob[]): Promise<void>;
14
+ export declare function readLocalExecutionFiles(workspace: string, jobId: string): Promise<SurfaceSnapshotFile[]>;
15
+ export declare function upsertLocalSubject(snapshot: LocalArchiveSnapshot, subject: SubjectRecord, files: readonly SurfaceSnapshotFile[]): LocalArchiveSnapshot;
16
+ export declare function upsertLocalEvaluation(snapshot: LocalArchiveSnapshot, evaluation: EvaluationResultRecord): LocalArchiveSnapshot;
17
+ export declare function appendLocalRun(snapshot: LocalArchiveSnapshot, run: RunSummary, events: readonly RuntimeEvent[]): LocalArchiveSnapshot;
18
+ export declare function setLocalActive(snapshot: LocalArchiveSnapshot, activeId: string | null): LocalArchiveSnapshot;
19
+ export declare function readLocalSubject(snapshot: LocalArchiveSnapshot, subjectId: string): SubjectRecord;
20
+ export declare function readLocalSubjectFiles(snapshot: LocalArchiveSnapshot, subjectId: string): SurfaceSnapshotFile[];
21
+ export declare function materializeSubjectRoot(workspace: string, subjectRoot: string, files: readonly SurfaceSnapshotFile[]): Promise<string[]>;
22
+ export declare function findArchivedFile(files: readonly SurfaceSnapshotFile[], filePath: string): SurfaceSnapshotFile | null;
23
+ //# sourceMappingURL=local-archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-archive.d.ts","sourceRoot":"","sources":["../src/local-archive.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,YAAY,EAEjB,KAAK,mBAAmB,EAEzB,MAAM,8BAA8B,CAAC;AAOtC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;IACpD,WAAW,EAAE,sBAAsB,EAAE,CAAC;IACtC,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAQD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAuBvF;AAED,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,SAAS,kBAAkB,EAAE,GAClC,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAED,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAIhC;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,SAAS,mBAAmB,EAAE,GACpC,oBAAoB,CAYtB;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,oBAAoB,EAC9B,UAAU,EAAE,sBAAsB,GACjC,oBAAoB,CAQtB;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,oBAAoB,EAC9B,GAAG,EAAE,UAAU,EACf,MAAM,EAAE,SAAS,YAAY,EAAE,GAC9B,oBAAoB,CAYtB;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,oBAAoB,CAK5G;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,CAMjG;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAG9G;AAkjBD,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,SAAS,mBAAmB,EAAE,GACpC,OAAO,CAAC,MAAM,EAAE,CAAC,CAOnB;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,mBAAmB,EAAE,EACrC,QAAQ,EAAE,MAAM,GACf,mBAAmB,GAAG,IAAI,CAG5B"}