@framers/agentos 0.1.94 → 0.1.95
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 +10 -0
- package/dist/api/AgentOS.d.ts +13 -0
- package/dist/api/AgentOS.d.ts.map +1 -1
- package/dist/api/AgentOS.js +36 -1
- package/dist/api/AgentOS.js.map +1 -1
- package/dist/core/tools/IToolOrchestrator.d.ts +38 -1
- package/dist/core/tools/IToolOrchestrator.d.ts.map +1 -1
- package/dist/core/tools/ToolOrchestrator.d.ts +58 -1
- package/dist/core/tools/ToolOrchestrator.d.ts.map +1 -1
- package/dist/core/tools/ToolOrchestrator.js +116 -1
- package/dist/core/tools/ToolOrchestrator.js.map +1 -1
- package/dist/discovery/CapabilityDiscoveryEngine.d.ts +19 -0
- package/dist/discovery/CapabilityDiscoveryEngine.d.ts.map +1 -1
- package/dist/discovery/CapabilityDiscoveryEngine.js +54 -0
- package/dist/discovery/CapabilityDiscoveryEngine.js.map +1 -1
- package/dist/discovery/types.d.ts +8 -1
- package/dist/discovery/types.d.ts.map +1 -1
- package/dist/discovery/types.js.map +1 -1
- package/dist/emergent/ComposableToolBuilder.d.ts +125 -0
- package/dist/emergent/ComposableToolBuilder.d.ts.map +1 -0
- package/dist/emergent/ComposableToolBuilder.js +318 -0
- package/dist/emergent/ComposableToolBuilder.js.map +1 -0
- package/dist/emergent/EmergentCapabilityEngine.d.ts +168 -0
- package/dist/emergent/EmergentCapabilityEngine.d.ts.map +1 -0
- package/dist/emergent/EmergentCapabilityEngine.js +437 -0
- package/dist/emergent/EmergentCapabilityEngine.js.map +1 -0
- package/dist/emergent/EmergentJudge.d.ts +283 -0
- package/dist/emergent/EmergentJudge.d.ts.map +1 -0
- package/dist/emergent/EmergentJudge.js +463 -0
- package/dist/emergent/EmergentJudge.js.map +1 -0
- package/dist/emergent/EmergentToolRegistry.d.ts +286 -0
- package/dist/emergent/EmergentToolRegistry.d.ts.map +1 -0
- package/dist/emergent/EmergentToolRegistry.js +546 -0
- package/dist/emergent/EmergentToolRegistry.js.map +1 -0
- package/dist/emergent/ForgeToolMetaTool.d.ts +124 -0
- package/dist/emergent/ForgeToolMetaTool.d.ts.map +1 -0
- package/dist/emergent/ForgeToolMetaTool.js +170 -0
- package/dist/emergent/ForgeToolMetaTool.js.map +1 -0
- package/dist/emergent/SandboxedToolForge.d.ts +185 -0
- package/dist/emergent/SandboxedToolForge.d.ts.map +1 -0
- package/dist/emergent/SandboxedToolForge.js +383 -0
- package/dist/emergent/SandboxedToolForge.js.map +1 -0
- package/dist/emergent/index.d.ts +25 -0
- package/dist/emergent/index.d.ts.map +1 -0
- package/dist/emergent/index.js +20 -0
- package/dist/emergent/index.js.map +1 -0
- package/dist/emergent/types.d.ts +596 -0
- package/dist/emergent/types.d.ts.map +1 -0
- package/dist/emergent/types.js +36 -0
- package/dist/emergent/types.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview EmergentJudge — LLM-as-judge evaluator for forged tools.
|
|
3
|
+
* @module @framers/agentos/emergent/EmergentJudge
|
|
4
|
+
*
|
|
5
|
+
* Evaluates runtime-created tools across three distinct evaluation modes, each
|
|
6
|
+
* scaled to the risk level of the operation:
|
|
7
|
+
*
|
|
8
|
+
* - **Creation review** (`reviewCreation`): Full code audit + test output
|
|
9
|
+
* validation. Invokes a single LLM call against the judge model to score
|
|
10
|
+
* safety, correctness, determinism, and boundedness. The tool is only
|
|
11
|
+
* approved if both safety and correctness pass.
|
|
12
|
+
*
|
|
13
|
+
* - **Reuse validation** (`validateReuse`): Pure programmatic schema conformance
|
|
14
|
+
* check run on every invocation. Zero LLM calls — must be fast. Validates
|
|
15
|
+
* that the tool's output matches its declared JSON Schema type constraints.
|
|
16
|
+
*
|
|
17
|
+
* - **Promotion panel** (`reviewPromotion`): Two independent LLM calls using
|
|
18
|
+
* the promotion model — one safety auditor and one correctness reviewer.
|
|
19
|
+
* Both must approve for the promotion verdict to pass. This dual-judge
|
|
20
|
+
* gate prevents single-point-of-failure in the promotion decision.
|
|
21
|
+
*
|
|
22
|
+
* All LLM interaction is abstracted behind a `generateText` callback so the
|
|
23
|
+
* judge is model-agnostic and trivially testable with mock implementations.
|
|
24
|
+
*/
|
|
25
|
+
import type { CreationVerdict, ReuseVerdict, PromotionVerdict, EmergentTool } from './types.js';
|
|
26
|
+
import type { JSONSchemaObject } from '../core/tools/ITool.js';
|
|
27
|
+
/**
|
|
28
|
+
* A candidate tool submitted for creation review by the {@link EmergentJudge}.
|
|
29
|
+
*
|
|
30
|
+
* Contains all the information the judge needs to evaluate safety, correctness,
|
|
31
|
+
* determinism, and bounded execution: the tool's identity and schemas, its
|
|
32
|
+
* source code or composition spec, the sandbox API allowlist, and the results
|
|
33
|
+
* of any test runs.
|
|
34
|
+
*/
|
|
35
|
+
export interface ToolCandidate {
|
|
36
|
+
/** Machine-readable name for the proposed tool. */
|
|
37
|
+
name: string;
|
|
38
|
+
/** Natural language description of the tool's purpose and behaviour. */
|
|
39
|
+
description: string;
|
|
40
|
+
/** JSON Schema defining the tool's input arguments. */
|
|
41
|
+
inputSchema: JSONSchemaObject;
|
|
42
|
+
/** JSON Schema defining the tool's expected output shape (optional). */
|
|
43
|
+
outputSchema?: JSONSchemaObject;
|
|
44
|
+
/**
|
|
45
|
+
* The tool's source code (for sandbox mode) or serialized composition spec
|
|
46
|
+
* (for compose mode). Included in the LLM prompt for security auditing.
|
|
47
|
+
*/
|
|
48
|
+
source: string;
|
|
49
|
+
/**
|
|
50
|
+
* Whether the tool was built by composing existing tools (`'compose'`) or
|
|
51
|
+
* by running arbitrary code in a sandbox (`'sandbox'`).
|
|
52
|
+
*/
|
|
53
|
+
implementationMode: 'compose' | 'sandbox';
|
|
54
|
+
/**
|
|
55
|
+
* Sandbox API allowlist — the set of APIs the tool's code is permitted to
|
|
56
|
+
* invoke. Only relevant for `'sandbox'` mode tools. Used by the safety
|
|
57
|
+
* auditor to verify that the code does not exceed its declared API surface.
|
|
58
|
+
*/
|
|
59
|
+
allowlist?: string[];
|
|
60
|
+
/**
|
|
61
|
+
* Results of test runs executed against the candidate tool before review.
|
|
62
|
+
* Each entry contains the input, output, success flag, and optional error.
|
|
63
|
+
* The judge uses these to assess correctness and determinism.
|
|
64
|
+
*/
|
|
65
|
+
testResults: Array<{
|
|
66
|
+
input: unknown;
|
|
67
|
+
output: unknown;
|
|
68
|
+
success: boolean;
|
|
69
|
+
error?: string;
|
|
70
|
+
}>;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Configuration for the {@link EmergentJudge}.
|
|
74
|
+
*
|
|
75
|
+
* All LLM interaction is abstracted behind the `generateText` callback,
|
|
76
|
+
* making the judge model-agnostic and easily testable with mocks.
|
|
77
|
+
*/
|
|
78
|
+
export interface EmergentJudgeConfig {
|
|
79
|
+
/**
|
|
80
|
+
* Model ID used for the single-pass creation review.
|
|
81
|
+
* Should be a fast, cost-efficient model since correctness is primarily
|
|
82
|
+
* validated through test cases.
|
|
83
|
+
* @example "gpt-4o-mini"
|
|
84
|
+
*/
|
|
85
|
+
judgeModel: string;
|
|
86
|
+
/**
|
|
87
|
+
* Model ID used by both reviewers in the promotion panel.
|
|
88
|
+
* Should be a more capable model than `judgeModel` since promotion
|
|
89
|
+
* decisions are higher-stakes.
|
|
90
|
+
* @example "gpt-4o"
|
|
91
|
+
*/
|
|
92
|
+
promotionModel: string;
|
|
93
|
+
/**
|
|
94
|
+
* Callback that invokes an LLM to generate text from a prompt.
|
|
95
|
+
* The judge calls this for creation reviews and promotion panels.
|
|
96
|
+
*
|
|
97
|
+
* @param model - The model ID to use for generation.
|
|
98
|
+
* @param prompt - The full prompt string to send to the LLM.
|
|
99
|
+
* @returns The raw text response from the LLM.
|
|
100
|
+
*/
|
|
101
|
+
generateText: (model: string, prompt: string) => Promise<string>;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Evaluates forged tools for safety, correctness, and quality using LLM-as-judge.
|
|
105
|
+
*
|
|
106
|
+
* Three evaluation modes, each scaled to the risk level of the operation:
|
|
107
|
+
*
|
|
108
|
+
* | Mode | LLM calls | When used |
|
|
109
|
+
* |---|---|---|
|
|
110
|
+
* | `reviewCreation` | 1 | Newly forged tool — full code audit + test validation |
|
|
111
|
+
* | `validateReuse` | 0 | Every invocation — pure programmatic schema check |
|
|
112
|
+
* | `reviewPromotion` | 2 | Tier promotion — dual-judge safety + correctness panel |
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```ts
|
|
116
|
+
* const judge = new EmergentJudge({
|
|
117
|
+
* judgeModel: 'gpt-4o-mini',
|
|
118
|
+
* promotionModel: 'gpt-4o',
|
|
119
|
+
* generateText: async (model, prompt) => callLlm(model, prompt),
|
|
120
|
+
* });
|
|
121
|
+
*
|
|
122
|
+
* // Creation review
|
|
123
|
+
* const verdict = await judge.reviewCreation(candidate);
|
|
124
|
+
* if (verdict.approved) { registry.register(tool, 'session'); }
|
|
125
|
+
*
|
|
126
|
+
* // Reuse validation (no LLM call)
|
|
127
|
+
* const reuse = judge.validateReuse('tool-1', output, outputSchema);
|
|
128
|
+
* if (!reuse.valid) { throw new Error(reuse.schemaErrors.join(', ')); }
|
|
129
|
+
*
|
|
130
|
+
* // Promotion panel
|
|
131
|
+
* const promotion = await judge.reviewPromotion(tool);
|
|
132
|
+
* if (promotion.approved) { registry.promote(tool.id, 'agent'); }
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
export declare class EmergentJudge {
|
|
136
|
+
/** Resolved configuration containing model IDs and the generateText callback. */
|
|
137
|
+
private readonly config;
|
|
138
|
+
/**
|
|
139
|
+
* Create a new EmergentJudge instance.
|
|
140
|
+
*
|
|
141
|
+
* @param config - Judge configuration specifying models and the LLM callback.
|
|
142
|
+
* The `generateText` function is called for creation reviews and promotion
|
|
143
|
+
* panels but never for reuse validation (which is purely programmatic).
|
|
144
|
+
*/
|
|
145
|
+
constructor(config: EmergentJudgeConfig);
|
|
146
|
+
/**
|
|
147
|
+
* Full code + test review for a newly forged tool.
|
|
148
|
+
*
|
|
149
|
+
* Builds a structured prompt from the candidate's details (name, description,
|
|
150
|
+
* schemas, source code, sandbox allowlist, test results) and asks the LLM to
|
|
151
|
+
* evaluate four dimensions: SAFETY, CORRECTNESS, DETERMINISM, BOUNDED.
|
|
152
|
+
*
|
|
153
|
+
* The tool is approved only if both `safety.passed` AND `correctness.passed`
|
|
154
|
+
* are `true` in the LLM response.
|
|
155
|
+
*
|
|
156
|
+
* If the LLM returns malformed JSON that cannot be parsed, a rejected verdict
|
|
157
|
+
* is returned with confidence 0 and a reasoning string explaining the parse
|
|
158
|
+
* failure. This prevents bad LLM output from accidentally approving a tool.
|
|
159
|
+
*
|
|
160
|
+
* @param candidate - The tool candidate to evaluate. Must include source code
|
|
161
|
+
* and at least one test result.
|
|
162
|
+
* @returns A {@link CreationVerdict} indicating approval or rejection with
|
|
163
|
+
* per-dimension scores and reasoning.
|
|
164
|
+
*/
|
|
165
|
+
reviewCreation(candidate: ToolCandidate): Promise<CreationVerdict>;
|
|
166
|
+
/**
|
|
167
|
+
* Pure schema validation on each reuse — no LLM call.
|
|
168
|
+
*
|
|
169
|
+
* Validates that `output` conforms to the declared `schema` using basic type
|
|
170
|
+
* checking. This runs on every tool invocation so it must be fast — no LLM
|
|
171
|
+
* calls, no network I/O, no async operations.
|
|
172
|
+
*
|
|
173
|
+
* Checks performed:
|
|
174
|
+
* - If schema declares `type: 'object'`, verify output is a non-null object.
|
|
175
|
+
* - If schema declares `properties`, verify each declared property key exists
|
|
176
|
+
* on the output object.
|
|
177
|
+
* - If schema declares `required`, verify each required property key exists.
|
|
178
|
+
* - If schema declares `type: 'string'`, verify output is a string.
|
|
179
|
+
* - If schema declares `type: 'number'` or `type: 'integer'`, verify output
|
|
180
|
+
* is a number.
|
|
181
|
+
* - If schema declares `type: 'boolean'`, verify output is a boolean.
|
|
182
|
+
* - If schema declares `type: 'array'`, verify output is an array.
|
|
183
|
+
*
|
|
184
|
+
* @param _toolId - The ID of the tool being reused (reserved for future
|
|
185
|
+
* anomaly detection; currently unused).
|
|
186
|
+
* @param output - The actual output value produced by the tool invocation.
|
|
187
|
+
* @param schema - The tool's declared output JSON Schema.
|
|
188
|
+
* @returns A {@link ReuseVerdict} with `valid: true` if the output conforms,
|
|
189
|
+
* or `valid: false` with a `schemaErrors` array describing each mismatch.
|
|
190
|
+
*/
|
|
191
|
+
validateReuse(_toolId: string, output: unknown, schema: JSONSchemaObject): ReuseVerdict;
|
|
192
|
+
/**
|
|
193
|
+
* Two-judge panel for tier promotion. Both must approve.
|
|
194
|
+
*
|
|
195
|
+
* Sends two independent LLM calls in parallel using the promotion model:
|
|
196
|
+
* 1. **Safety auditor**: Reviews the tool's source code and usage history for
|
|
197
|
+
* security concerns (data exfiltration, resource exhaustion, API abuse).
|
|
198
|
+
* 2. **Correctness reviewer**: Reviews the tool's source code and all historical
|
|
199
|
+
* outputs for correctness issues (schema violations, edge case failures).
|
|
200
|
+
*
|
|
201
|
+
* Both reviewers must return `approved: true` for the promotion to pass. If
|
|
202
|
+
* either reviewer's response fails to parse as JSON, the promotion is rejected.
|
|
203
|
+
*
|
|
204
|
+
* @param tool - The emergent tool to evaluate for promotion. Must have usage
|
|
205
|
+
* stats and judge verdicts from prior reviews.
|
|
206
|
+
* @returns A {@link PromotionVerdict} containing both sub-verdicts and the
|
|
207
|
+
* combined approval decision.
|
|
208
|
+
*/
|
|
209
|
+
reviewPromotion(tool: EmergentTool): Promise<PromotionVerdict>;
|
|
210
|
+
/**
|
|
211
|
+
* Build the creation review prompt from a tool candidate.
|
|
212
|
+
*
|
|
213
|
+
* The prompt asks the LLM to act as a security auditor and evaluate the
|
|
214
|
+
* candidate across four dimensions: SAFETY, CORRECTNESS, DETERMINISM, BOUNDED.
|
|
215
|
+
*
|
|
216
|
+
* @param candidate - The tool candidate to build the prompt for.
|
|
217
|
+
* @returns The fully-formed prompt string.
|
|
218
|
+
*/
|
|
219
|
+
private buildCreationPrompt;
|
|
220
|
+
/**
|
|
221
|
+
* Build the safety auditor prompt for promotion review.
|
|
222
|
+
*
|
|
223
|
+
* Focuses the reviewer on security concerns: API surface, data exfiltration,
|
|
224
|
+
* resource exhaustion, and sandbox escape vectors.
|
|
225
|
+
*
|
|
226
|
+
* @param tool - The emergent tool being considered for promotion.
|
|
227
|
+
* @returns The safety auditor prompt string.
|
|
228
|
+
*/
|
|
229
|
+
private buildSafetyAuditorPrompt;
|
|
230
|
+
/**
|
|
231
|
+
* Build the correctness reviewer prompt for promotion review.
|
|
232
|
+
*
|
|
233
|
+
* Focuses the reviewer on functional correctness: schema conformance,
|
|
234
|
+
* edge case handling, success rate, and output consistency.
|
|
235
|
+
*
|
|
236
|
+
* @param tool - The emergent tool being considered for promotion.
|
|
237
|
+
* @returns The correctness reviewer prompt string.
|
|
238
|
+
*/
|
|
239
|
+
private buildCorrectnessReviewerPrompt;
|
|
240
|
+
/**
|
|
241
|
+
* Validate a value against a JSON Schema `type` declaration.
|
|
242
|
+
*
|
|
243
|
+
* Performs basic type checking without a full JSON Schema validator library.
|
|
244
|
+
* Supports object (with optional properties/required checks), string, number,
|
|
245
|
+
* integer, boolean, and array types.
|
|
246
|
+
*
|
|
247
|
+
* @param value - The value to validate.
|
|
248
|
+
* @param schema - The JSON Schema to validate against.
|
|
249
|
+
* @returns An array of error strings (empty if valid).
|
|
250
|
+
*/
|
|
251
|
+
private validateType;
|
|
252
|
+
/**
|
|
253
|
+
* Produce a human-readable type description for an arbitrary value.
|
|
254
|
+
*
|
|
255
|
+
* @param value - The value to describe.
|
|
256
|
+
* @returns A string like `"null"`, `"array"`, `"object"`, `"string"`, etc.
|
|
257
|
+
*/
|
|
258
|
+
private describeType;
|
|
259
|
+
/**
|
|
260
|
+
* Extract a JSON object from a potentially wrapped LLM response.
|
|
261
|
+
*
|
|
262
|
+
* LLMs sometimes wrap JSON in markdown code fences or prepend/append prose.
|
|
263
|
+
* This method attempts to find the first `{` and last `}` and extract the
|
|
264
|
+
* substring between them.
|
|
265
|
+
*
|
|
266
|
+
* @param raw - The raw LLM response string.
|
|
267
|
+
* @returns The extracted JSON substring, or the original string if no
|
|
268
|
+
* braces are found.
|
|
269
|
+
*/
|
|
270
|
+
private extractJson;
|
|
271
|
+
/**
|
|
272
|
+
* Build a rejected {@link CreationVerdict} with confidence 0.
|
|
273
|
+
*
|
|
274
|
+
* Used when the LLM call fails or returns unparseable output. By defaulting
|
|
275
|
+
* to rejection, we ensure that system-level failures never accidentally
|
|
276
|
+
* approve a tool.
|
|
277
|
+
*
|
|
278
|
+
* @param reasoning - Explanation of why the verdict defaulted to rejection.
|
|
279
|
+
* @returns A rejected CreationVerdict.
|
|
280
|
+
*/
|
|
281
|
+
private rejectedVerdict;
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=EmergentJudge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmergentJudge.d.ts","sourceRoot":"","sources":["../../src/emergent/EmergentJudge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAM/D;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IAEb,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IAEpB,uDAAuD;IACvD,WAAW,EAAE,gBAAgB,CAAC;IAE9B,wEAAwE;IACxE,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAEhC;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,kBAAkB,EAAE,SAAS,GAAG,SAAS,CAAC;IAE1C;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB;;;;OAIG;IACH,WAAW,EAAE,KAAK,CAAC;QACjB,KAAK,EAAE,OAAO,CAAC;QACf,MAAM,EAAE,OAAO,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ;AAMD;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;;;;OAKG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;;;;;OAOG;IACH,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAClE;AAiCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBAAa,aAAa;IACxB,iFAAiF;IACjF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAE7C;;;;;;OAMG;gBACS,MAAM,EAAE,mBAAmB;IAQvC;;;;;;;;;;;;;;;;;;OAkBG;IACG,cAAc,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IAyCxE;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,GAAG,YAAY;IAkBvF;;;;;;;;;;;;;;;;OAgBG;IACG,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA0DpE;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IA+B3B;;;;;;;;OAQG;IACH,OAAO,CAAC,wBAAwB;IAqBhC;;;;;;;;OAQG;IACH,OAAO,CAAC,8BAA8B;IAyBtC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,YAAY;IA4EpB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAUpB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,WAAW;IAWnB;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;CAWxB"}
|