@osovv/vv-opencode 1.3.1 → 1.3.3
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/CHANGELOG.md +16 -0
- package/README.md +2 -2
- package/dist/tui/analytics/indicator.d.ts +3 -2
- package/dist/tui/analytics/indicator.js +9 -5
- package/dist/tui/analytics/indicator.js.map +1 -1
- package/dist/tui/branding/footer.d.ts +22 -6
- package/dist/tui/branding/footer.js +23 -14
- package/dist/tui/branding/footer.js.map +1 -1
- package/package.json +1 -1
- package/schemas/vvoc/v3.json +1 -1
- package/dist/tui/color.d.ts +0 -13
- package/dist/tui/color.js +0 -30
- package/dist/tui/color.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,19 @@
|
|
|
1
|
+
## <small>1.3.3 (2026-08-19)</small>
|
|
2
|
+
|
|
3
|
+
### Summary
|
|
4
|
+
|
|
5
|
+
In this release the TUI branding footer is upgraded to show a single combined version line in the sidebar — `• OpenCode <version> · vvoc vX.Y.Z` — replacing the previous standalone vvoc label in the bottom app bar. The new footer reads the OpenCode version from the running app, renders with the active theme colors, and deliberately wins the sidebar footer slot so it appears in a native-looking, always-visible location. This makes it easier for users to see at a glance which OpenCode and vvoc versions are active in a session.
|
|
6
|
+
|
|
7
|
+
* feat(tui): render combined OpenCode and vvoc versions in the sidebar footer ([ea5aa66](https://github.com/osovv/vv-opencode/commit/ea5aa66))
|
|
8
|
+
|
|
9
|
+
## <small>1.3.2 (2026-08-19)</small>
|
|
10
|
+
|
|
11
|
+
### Summary
|
|
12
|
+
|
|
13
|
+
The vvoc version label in the TUI has been relocated from the sidebar footer slot to the append-mode `app_bottom` slot, so it now appears in the bottom app bar on every screen without displacing OpenCode's own footer or prompt content, which previously owned that single-winner slot. Theme colors are now passed directly as RGBA values instead of being converted to hex strings, making both the version label and the live cache indicator render with accurate theme colors more reliably, and both slot registrations now include explicit plugin IDs as required by the OpenCode runtime.
|
|
14
|
+
|
|
15
|
+
* fix(tui): move vvoc label to append-mode app_bottom slot and apply theme fg color directly ([a01453d](https://github.com/osovv/vv-opencode/commit/a01453d))
|
|
16
|
+
|
|
1
17
|
## <small>1.3.1 (2026-08-19)</small>
|
|
2
18
|
|
|
3
19
|
### Summary
|
package/README.md
CHANGED
|
@@ -183,7 +183,7 @@ OpenCode is a strong, flexible base for agentic coding, but it intentionally lea
|
|
|
183
183
|
| **WebToolsPlugin** | Register the provider-neutral `web_search` and `web_fetch` tools, return direct image/PDF attachments, and hide OpenCode's built-in web tools at runtime unless the user explicitly configured their permissions. |
|
|
184
184
|
| **ContextTuiPlugin** | Add a native scrollable `/context` dialog with measured usage plus detailed observable per-tool and per-MCP schema/history estimates, explicitly marking data that OpenCode does not expose. |
|
|
185
185
|
| **ToolHistoryCompactionPlugin** | Shrink the replayed conversation context non-destructively by compacting old tool outputs in the model replay (old reads to `[Read <file>, lines X-Y]`, over-budget ephemeral outputs pruned), while retaining web/search/skill knowledge results. |
|
|
186
|
-
| **AnalyticsPlugin** | Persist per-step token and cache telemetry with vvoc/OpenCode version attribution, show a live `cache NN%` indicator next to the session prompt plus a
|
|
186
|
+
| **AnalyticsPlugin** | Persist per-step token and cache telemetry with vvoc/OpenCode version attribution, show a live `cache NN%` indicator next to the session prompt plus a combined OpenCode/vvoc version line in the sidebar footer, and answer "did my cache optimizations help?" via `vvoc analytics cache-hit-rate`. |
|
|
187
187
|
|
|
188
188
|
Workflow work items are opened with explicit intent. For implementation loops, controllers use:
|
|
189
189
|
|
|
@@ -265,7 +265,7 @@ Set `outputMaxChars` to `0` to disable pruning, or `"enabled": false` to disable
|
|
|
265
265
|
|
|
266
266
|
`AnalyticsPlugin` records one line per completed model step — fresh input, cache read, cache write, output, reasoning, recorded cost — to `$XDG_DATA_HOME/vvoc/analytics/usage-YYYY-MM.jsonl`, attributed with the vvoc version, the OpenCode version (from session telemetry), project, provider, model, and agent. Telemetry never leaves the machine; disable collection with `"plugins": { "analytics": false }` and delete old monthly files freely.
|
|
267
267
|
|
|
268
|
-
In the TUI you get a live `cache NN%` indicator next to the session prompt (green at 80%+, yellow at 50%+, red below, muted `n/a` before the first cache-eligible step) and a
|
|
268
|
+
In the TUI you get a live `cache NN%` indicator next to the session prompt (green at 80%+, yellow at 50%+, red below, muted `n/a` before the first cache-eligible step) and a combined footer line `• OpenCode <version> · vvoc vX.Y.Z` in the sidebar (the stock version line, extended with the vvoc version). The indicator is per-session and computed in memory.
|
|
269
269
|
|
|
270
270
|
Retrospective analysis lives in the CLI:
|
|
271
271
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { JSX } from "@opentui/solid";
|
|
2
|
+
import type { RGBA } from "@opentui/core";
|
|
2
3
|
import type { TuiPluginApi } from "@opencode-ai/plugin/tui";
|
|
3
4
|
import type { PluginOptions } from "@opencode-ai/plugin";
|
|
4
5
|
import type { IndicatorTokens } from "../../lib/analytics/types.js";
|
|
@@ -19,8 +20,8 @@ export type IndicatorLabel = {
|
|
|
19
20
|
};
|
|
20
21
|
export type IndicatorDependencies = {
|
|
21
22
|
enabled: (api: TuiPluginApi) => Promise<boolean>;
|
|
22
|
-
/** Renders the label node; defaults to the themed
|
|
23
|
-
renderLabel: (label: IndicatorLabel, color:
|
|
23
|
+
/** Renders the label node; defaults to the themed text element. */
|
|
24
|
+
renderLabel: (label: IndicatorLabel, color: RGBA) => JSX.Element;
|
|
24
25
|
};
|
|
25
26
|
export declare const DEFAULT_DEPENDENCIES: IndicatorDependencies;
|
|
26
27
|
/** Rolling per-session sums fed by step-finish parts. Same eligibility rule as metrics. */
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "@opentui/solid/jsx-runtime";
|
|
2
2
|
import { loadVvocConfigForRead } from "../../lib/config-layers.js";
|
|
3
3
|
import { isVvocPluginEnabled } from "../../lib/plugin-toggle-config.js";
|
|
4
|
-
import { rgbaToHex } from "../color.js";
|
|
5
4
|
export const DEFAULT_DEPENDENCIES = {
|
|
6
5
|
enabled: async (api) => {
|
|
7
6
|
const vvoc = await loadVvocConfigForRead({
|
|
@@ -77,7 +76,11 @@ export async function registerAnalyticsIndicator(api, options, dependencies = DE
|
|
|
77
76
|
});
|
|
78
77
|
api.lifecycle.onDispose(unsubscribe);
|
|
79
78
|
try {
|
|
80
|
-
|
|
79
|
+
// OpenCode's runtime requires a string plugin id on slot registrations, while
|
|
80
|
+
// the SDK's TuiSlotPlugin type still types id as never; cast bridges the two.
|
|
81
|
+
const plugin = {
|
|
82
|
+
id: "vvoc-analytics-indicator",
|
|
83
|
+
order: 900,
|
|
81
84
|
slots: {
|
|
82
85
|
session_prompt_right: (_ctx, props) => {
|
|
83
86
|
if (props.session_id !== currentSessionID(api))
|
|
@@ -88,7 +91,8 @@ export async function registerAnalyticsIndicator(api, options, dependencies = DE
|
|
|
88
91
|
return dependencies.renderLabel(label, toneColor(api, label.tone));
|
|
89
92
|
},
|
|
90
93
|
},
|
|
91
|
-
}
|
|
94
|
+
};
|
|
95
|
+
api.slots.register(plugin);
|
|
92
96
|
}
|
|
93
97
|
catch {
|
|
94
98
|
// Fail-soft: no indicator for this session.
|
|
@@ -103,7 +107,7 @@ function currentSessionID(api) {
|
|
|
103
107
|
}
|
|
104
108
|
return "";
|
|
105
109
|
}
|
|
106
|
-
/** Maps an indicator tone to
|
|
110
|
+
/** Maps an indicator tone to the theme RGBA color instance. */
|
|
107
111
|
function toneColor(api, tone) {
|
|
108
112
|
const theme = api.theme.current;
|
|
109
113
|
const rgba = tone === "green"
|
|
@@ -113,6 +117,6 @@ function toneColor(api, tone) {
|
|
|
113
117
|
: tone === "red"
|
|
114
118
|
? theme.error
|
|
115
119
|
: theme.textMuted;
|
|
116
|
-
return
|
|
120
|
+
return rgba;
|
|
117
121
|
}
|
|
118
122
|
//# sourceMappingURL=indicator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indicator.js","sourceRoot":"","sources":["../../../src/tui/analytics/indicator.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"indicator.js","sourceRoot":"","sources":["../../../src/tui/analytics/indicator.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,30 @@
|
|
|
1
1
|
import type { JSX } from "@opentui/solid";
|
|
2
|
+
import type { RGBA } from "@opentui/core";
|
|
2
3
|
import type { TuiPluginApi } from "@opencode-ai/plugin/tui";
|
|
4
|
+
export type BrandingVersionInfo = {
|
|
5
|
+
opencodeVersion: string;
|
|
6
|
+
vvocLabel: string;
|
|
7
|
+
};
|
|
8
|
+
export type BrandingColors = {
|
|
9
|
+
muted: RGBA;
|
|
10
|
+
success: RGBA;
|
|
11
|
+
text: RGBA;
|
|
12
|
+
};
|
|
3
13
|
export type BrandingDependencies = {
|
|
4
|
-
/** Renders the
|
|
5
|
-
renderLabel: (
|
|
14
|
+
/** Renders the combined version line; defaults to the native-looking OpenCode footer line extended with the vvoc label. */
|
|
15
|
+
renderLabel: (info: BrandingVersionInfo, colors: BrandingColors) => JSX.Element;
|
|
6
16
|
};
|
|
7
|
-
/** The
|
|
17
|
+
/** The vvoc label text, e.g. "vvoc v1.2.11". */
|
|
8
18
|
export declare function brandingFooterLabel(): string;
|
|
9
19
|
/**
|
|
10
|
-
* Registers the
|
|
11
|
-
*
|
|
12
|
-
*
|
|
20
|
+
* Registers the combined version line in the "sidebar_footer" host slot.
|
|
21
|
+
*
|
|
22
|
+
* sidebar_footer renders in single_winner mode: only the first registered
|
|
23
|
+
* plugin (lowest order) is displayed. OpenCode's internal footer registers
|
|
24
|
+
* with order 100; this plugin uses order 50 so it deterministically wins the
|
|
25
|
+
* slot and renders the stock-looking footer line extended with the vvoc
|
|
26
|
+
* version ("• OpenCode <oc> · vvoc v<x>"). Always on (independent of analytics
|
|
27
|
+
* config); returns silently when the slot API is unavailable or registration
|
|
28
|
+
* fails.
|
|
13
29
|
*/
|
|
14
30
|
export declare function registerBrandingFooter(api: TuiPluginApi, dependencies?: BrandingDependencies): void;
|
|
@@ -1,35 +1,44 @@
|
|
|
1
|
-
import { jsx as _jsx } from "@opentui/solid/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@opentui/solid/jsx-runtime";
|
|
2
2
|
import { getPackageVersionSync } from "../../lib/package.js";
|
|
3
|
-
import { rgbaToHex } from "../color.js";
|
|
4
3
|
const DEFAULT_DEPENDENCIES = {
|
|
5
|
-
renderLabel: (
|
|
4
|
+
renderLabel: (info, colors) => (_jsxs("text", { fg: colors.muted, children: [_jsx("span", { style: { fg: colors.success }, children: "\u2022" }), " ", _jsx("b", { children: "Open" }), _jsx("span", { style: { fg: colors.text }, children: _jsx("b", { children: "Code" }) }), " ", _jsx("span", { children: info.opencodeVersion }), _jsxs("span", { children: [" \u00B7 ", info.vvocLabel] })] })),
|
|
6
5
|
};
|
|
7
|
-
/** The
|
|
6
|
+
/** The vvoc label text, e.g. "vvoc v1.2.11". */
|
|
8
7
|
export function brandingFooterLabel() {
|
|
9
8
|
return `vvoc v${getPackageVersionSync()}`;
|
|
10
9
|
}
|
|
11
10
|
// START_BLOCK_REGISTER_BRANDING_FOOTER
|
|
12
11
|
/**
|
|
13
|
-
* Registers the
|
|
14
|
-
*
|
|
15
|
-
*
|
|
12
|
+
* Registers the combined version line in the "sidebar_footer" host slot.
|
|
13
|
+
*
|
|
14
|
+
* sidebar_footer renders in single_winner mode: only the first registered
|
|
15
|
+
* plugin (lowest order) is displayed. OpenCode's internal footer registers
|
|
16
|
+
* with order 100; this plugin uses order 50 so it deterministically wins the
|
|
17
|
+
* slot and renders the stock-looking footer line extended with the vvoc
|
|
18
|
+
* version ("• OpenCode <oc> · vvoc v<x>"). Always on (independent of analytics
|
|
19
|
+
* config); returns silently when the slot API is unavailable or registration
|
|
20
|
+
* fails.
|
|
16
21
|
*/
|
|
17
22
|
export function registerBrandingFooter(api, dependencies = DEFAULT_DEPENDENCIES) {
|
|
18
23
|
if (typeof api.slots?.register !== "function")
|
|
19
24
|
return;
|
|
20
25
|
try {
|
|
21
|
-
|
|
26
|
+
// OpenCode's runtime requires a string plugin id on slot registrations, while
|
|
27
|
+
// the SDK's TuiSlotPlugin type still types id as never; cast bridges the two.
|
|
28
|
+
const plugin = {
|
|
29
|
+
id: "vvoc-branding",
|
|
30
|
+
order: 50,
|
|
22
31
|
slots: {
|
|
23
|
-
sidebar_footer: () => {
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
return dependencies.renderLabel(brandingFooterLabel(), color);
|
|
32
|
+
sidebar_footer: (ctx) => {
|
|
33
|
+
const theme = ctx.theme.current;
|
|
34
|
+
return dependencies.renderLabel({ opencodeVersion: api.app.version, vvocLabel: brandingFooterLabel() }, { muted: theme.textMuted, success: theme.success, text: theme.text });
|
|
27
35
|
},
|
|
28
36
|
},
|
|
29
|
-
}
|
|
37
|
+
};
|
|
38
|
+
api.slots.register(plugin);
|
|
30
39
|
}
|
|
31
40
|
catch {
|
|
32
|
-
// Fail-soft: no footer for this session.
|
|
41
|
+
// Fail-soft: no combined footer for this session.
|
|
33
42
|
}
|
|
34
43
|
}
|
|
35
44
|
//# sourceMappingURL=footer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"footer.js","sourceRoot":"","sources":["../../../src/tui/branding/footer.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"footer.js","sourceRoot":"","sources":["../../../src/tui/branding/footer.tsx"],"names":[],"mappings":";AA0BA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAkB7D,MAAM,oBAAoB,GAAyB;IACjD,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAC7B,gBAAM,EAAE,EAAE,MAAM,CAAC,KAAK,aACpB,eAAM,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,uBAAU,OAAC,+BAAW,EACzD,eAAM,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,YAC9B,+BAAW,GACN,EAAC,GAAG,EACX,yBAAO,IAAI,CAAC,eAAe,GAAQ,EACnC,uCAAU,IAAI,CAAC,SAAS,IAAQ,IAC3B,CACR;CACF,CAAC;AAEF,gDAAgD;AAChD,MAAM,UAAU,mBAAmB;IACjC,OAAO,SAAS,qBAAqB,EAAE,EAAE,CAAC;AAC5C,CAAC;AAED,uCAAuC;AACvC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAAiB,EACjB,eAAqC,oBAAoB;IAEzD,IAAI,OAAO,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,UAAU;QAAE,OAAO;IACtD,IAAI,CAAC;QACH,8EAA8E;QAC9E,8EAA8E;QAC9E,MAAM,MAAM,GAAG;YACb,EAAE,EAAE,eAAe;YACnB,KAAK,EAAE,EAAE;YACT,KAAK,EAAE;gBACL,cAAc,EAAE,CAAC,GAAmB,EAAE,EAAE;oBACtC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;oBAChC,OAAO,YAAY,CAAC,WAAW,CAC7B,EAAE,eAAe,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,EAAE,EACtE,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CACrE,CAAC;gBACJ,CAAC;aACF;SAC6D,CAAC;QACjE,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,kDAAkD;IACpD,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
package/schemas/vvoc/v3.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "https://cdn.jsdelivr.net/npm/@osovv/vv-opencode@1.3.
|
|
3
|
+
"$id": "https://cdn.jsdelivr.net/npm/@osovv/vv-opencode@1.3.3/schemas/vvoc/v3.json",
|
|
4
4
|
"title": "vvoc config",
|
|
5
5
|
"description": "Canonical vvoc configuration document.",
|
|
6
6
|
"type": "object",
|
package/dist/tui/color.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/** RGBA-like theme color shape produced by the OpenCode TUI theme API. */
|
|
2
|
-
export type RgbaLike = {
|
|
3
|
-
r: number;
|
|
4
|
-
g: number;
|
|
5
|
-
b: number;
|
|
6
|
-
a: number;
|
|
7
|
-
};
|
|
8
|
-
/**
|
|
9
|
-
* Formats an RGBA-like theme color as a six-digit hex string.
|
|
10
|
-
* Alpha is dropped: rgba() strings and 8-digit hex parse unreliably in
|
|
11
|
-
* @opentui/core, while #rrggbb parses exactly.
|
|
12
|
-
*/
|
|
13
|
-
export declare function rgbaToHex(color: RgbaLike): string;
|
package/dist/tui/color.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
// FILE: src/tui/color.ts
|
|
2
|
-
// VERSION: 1.0.0
|
|
3
|
-
// START_MODULE_CONTRACT
|
|
4
|
-
// PURPOSE: Convert OpenTUI RGBA theme values into color strings the OpenTUI solid span style reliably parses.
|
|
5
|
-
// SCOPE: Six-digit hex formatting from RGBA components; alpha is intentionally dropped because 8-digit forms parse unreliably in @opentui/core.
|
|
6
|
-
// DEPENDS: [none]
|
|
7
|
-
// LINKS: [M-TUI-BRANDING-FOOTER, M-TUI-ANALYTICS-INDICATOR]
|
|
8
|
-
// ROLE: RUNTIME
|
|
9
|
-
// MAP_MODE: EXPORTS
|
|
10
|
-
// END_MODULE_CONTRACT
|
|
11
|
-
//
|
|
12
|
-
// START_MODULE_MAP
|
|
13
|
-
// rgbaToHex - Formats an RGBA-like theme color as #rrggbb.
|
|
14
|
-
// END_MODULE_MAP
|
|
15
|
-
//
|
|
16
|
-
// START_CHANGE_SUMMARY
|
|
17
|
-
// LAST_CHANGE: [2026-08-20-orphan-text-fix - Added reliable theme color formatting for text span foregrounds.]
|
|
18
|
-
// END_CHANGE_SUMMARY
|
|
19
|
-
/**
|
|
20
|
-
* Formats an RGBA-like theme color as a six-digit hex string.
|
|
21
|
-
* Alpha is dropped: rgba() strings and 8-digit hex parse unreliably in
|
|
22
|
-
* @opentui/core, while #rrggbb parses exactly.
|
|
23
|
-
*/
|
|
24
|
-
export function rgbaToHex(color) {
|
|
25
|
-
const channel = (value) => Math.max(0, Math.min(255, Math.round(value)))
|
|
26
|
-
.toString(16)
|
|
27
|
-
.padStart(2, "0");
|
|
28
|
-
return `#${channel(color.r)}${channel(color.g)}${channel(color.b)}`;
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=color.js.map
|
package/dist/tui/color.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"color.js","sourceRoot":"","sources":["../../src/tui/color.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,iBAAiB;AACjB,wBAAwB;AACxB,gHAAgH;AAChH,kJAAkJ;AAClJ,oBAAoB;AACpB,8DAA8D;AAC9D,kBAAkB;AAClB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,6DAA6D;AAC7D,iBAAiB;AACjB,EAAE;AACF,uBAAuB;AACvB,iHAAiH;AACjH,qBAAqB;AAUrB;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,KAAe;IACvC,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,EAAE,CAChC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;SAC1C,QAAQ,CAAC,EAAE,CAAC;SACZ,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtB,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACtE,CAAC"}
|