appclaw-vision 0.0.1

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.
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Coordinate scaling and parsing utilities.
3
+ * Adapted from appium-stark-vision/src/utils.ts
4
+ */
5
+ import { BoundingBox, ScreenSize } from './types';
6
+ /**
7
+ * Scale normalized coordinates (0-1000) to device pixel coordinates.
8
+ * Gemini returns [y_min, x_min] in 0-1000 scale.
9
+ * Source: appium-stark-vision/src/utils.ts:138-181
10
+ */
11
+ export declare function scaleCoordinates(coordinates: [number, number], screenSize: ScreenSize): BoundingBox;
12
+ /**
13
+ * Find the first substring enclosed in square brackets.
14
+ * Used to extract bounding box arrays from LLM responses.
15
+ * Source: appium-stark-vision/src/utils.ts:183-186
16
+ */
17
+ export declare function findSubstringWithBrackets(message: string): string | null;
18
+ /**
19
+ * Parse a bracket-enclosed string like "[320, 500]" into number array.
20
+ * Source: appium-stark-vision/src/utils.ts:188-194
21
+ */
22
+ export declare function sanitizeOutput(arrayAsString: string): number[];
23
+ /**
24
+ * Parse a string response from LLM into a JSON object.
25
+ * Handles escaped JSON, markdown code blocks, etc.
26
+ * Source: appium-stark-vision/src/utils.ts:251-283
27
+ */
28
+ export declare function parseStringToObject(str: string): any;
29
+ //# sourceMappingURL=coordinates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinates.d.ts","sourceRoot":"","sources":["../../src/coordinates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAElD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,UAAU,EAAE,UAAU,GACrB,WAAW,CAkBb;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGxE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAM9D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CA+BpD"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Gemini API client for stark-vision.
3
+ * Adapted from appium-stark-vision/src/llm/Gemini.ts
4
+ * Stripped: Langfuse tracing, LangfuseMedia, Zod schemas, plugin references.
5
+ */
6
+ import { StarkVisionConfig } from './types';
7
+ export declare class StarkVisionClient {
8
+ private ai;
9
+ private model;
10
+ private disableThinking;
11
+ private localClient;
12
+ private onTokenUsage;
13
+ constructor(config: StarkVisionConfig);
14
+ /** Extract and emit token usage from a Gemini response's usageMetadata. */
15
+ private emitUsage;
16
+ /**
17
+ * Core Gemini call with retry logic.
18
+ * Adapted from appium-stark-vision/src/llm/Gemini.ts:21-164
19
+ */
20
+ private createMessage;
21
+ /**
22
+ * Combined instruction + vision: parse instruction and locate element coordinates.
23
+ * Returns raw JSON string from Gemini.
24
+ * Adapted from appium-stark-vision/src/llm/Gemini.ts:251-277
25
+ */
26
+ private static detectMimeType;
27
+ understandAndLocate(instruction: string, imageBase64: string): Promise<string>;
28
+ /**
29
+ * Check if an element is visible on the screenshot.
30
+ * Adapted from appium-stark-vision/src/llm/Gemini.ts:166-211
31
+ */
32
+ isElementVisible(imageBase64: string, instruction: string, withExplanation?: boolean): Promise<string>;
33
+ /**
34
+ * Get bounding box coordinates for a specific element.
35
+ * Adapted from appium-stark-vision/src/services/BoundingBoxService.ts:142-204
36
+ */
37
+ getBoundingBox(locator: string, imageBase64: string): Promise<string>;
38
+ /**
39
+ * Get element information / answer a question about the screen.
40
+ * Adapted from appium-stark-vision/src/llm/Gemini.ts:279-309
41
+ */
42
+ getElementInfo(imageBase64: string, instruction: string, withExplanation?: boolean): Promise<string>;
43
+ /**
44
+ * Find back navigation element on the screen.
45
+ * Adapted from appium-stark-vision/src/llm/Gemini.ts:311-332
46
+ */
47
+ findBackNavigation(imageBase64: string): Promise<string>;
48
+ /**
49
+ * Generate test code from execution history.
50
+ * Text-only Gemini call (no image).
51
+ */
52
+ generateCode(systemPrompt: string, userPrompt: string): Promise<string>;
53
+ }
54
+ //# sourceMappingURL=geminiClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geminiClient.d.ts","sourceRoot":"","sources":["../../src/geminiClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,OAAO,EAAE,iBAAiB,EAAoB,MAAM,SAAS,CAAC;AAE9D,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,EAAE,CAAc;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,YAAY,CAAkD;gBAE1D,MAAM,EAAE,iBAAiB;IAerC,2EAA2E;IAC3E,OAAO,CAAC,SAAS;IAWjB;;;OAGG;YACW,aAAa;IA8D3B;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAIvB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyBpF;;;OAGG;IACG,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,eAAe,UAAQ,GACtB,OAAO,CAAC,MAAM,CAAC;IA8BlB;;;OAGG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoD3E;;;OAGG;IACG,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,eAAe,UAAQ,GACtB,OAAO,CAAC,MAAM,CAAC;IA0BlB;;;OAGG;IACG,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB9D;;;OAGG;IACG,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAc9E"}
@@ -0,0 +1,10 @@
1
+ export declare const combinedInstructionPrompt: string;
2
+ export declare const elementVisibilityPrompt: string;
3
+ export declare const elementVisibilityWithExplanationPrompt: string;
4
+ export declare const bboxPrompt: string;
5
+ export declare const backNavigationPrompt: string;
6
+ export declare const getInformationWithExplanationPrompt: string;
7
+ export declare const getInformationPrompt: string;
8
+ export declare const createWDIOTestPrompt: string;
9
+ export declare const createAppiumJavaTestPrompt: string;
10
+ //# sourceMappingURL=promptB64.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptB64.d.ts","sourceRoot":"","sources":["../../../src/generated/promptB64.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,yBAAyB,QAErC,CAAC;AACF,eAAO,MAAM,uBAAuB,QAEnC,CAAC;AACF,eAAO,MAAM,sCAAsC,QAElD,CAAC;AACF,eAAO,MAAM,UAAU,QAEtB,CAAC;AACF,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AACF,eAAO,MAAM,mCAAmC,QAE/C,CAAC;AACF,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AACF,eAAO,MAAM,oBAAoB,QAEhC,CAAC;AACF,eAAO,MAAM,0BAA0B,QAEtC,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * df-vision (npm) — Device Farm packages/stark-vision
3
+ *
4
+ * AI-powered vision element detection for device-farm.
5
+ * Core logic extracted from appium-stark-vision, stripped of Appium/Prisma/Langfuse dependencies.
6
+ */
7
+ import { findSubstringWithBrackets, parseStringToObject, sanitizeOutput, scaleCoordinates } from './coordinates';
8
+ import { StarkVisionClient } from './geminiClient';
9
+ import { detectSimpleAction, parseInstruction } from './instructionParser';
10
+ export { StarkVisionClient } from './geminiClient';
11
+ export { parseInstruction, detectSimpleAction, SUPPORTED_ACTIONS } from './instructionParser';
12
+ export { scaleCoordinates, findSubstringWithBrackets, sanitizeOutput, parseStringToObject, } from './coordinates';
13
+ /** Prompt text lives in ./prompts (internal); not re-exported so npm typings do not publish prompt bodies. */
14
+ export type { StarkVisionAction, StarkVisionConfig, VisionTokenUsage, BoundingBox, ScreenSize, ExecutionConfig, ScrollSize, CommandType, VisibilityResult, } from './types';
15
+ export { DefaultExecutionConfig } from './types';
16
+ /** CJS `default` for consumers that use `import pkg from 'df-vision'` under ESM (e.g. AppClaw). */
17
+ declare const _default: {
18
+ StarkVisionClient: typeof StarkVisionClient;
19
+ parseInstruction: typeof parseInstruction;
20
+ detectSimpleAction: typeof detectSimpleAction;
21
+ SUPPORTED_ACTIONS: string[];
22
+ scaleCoordinates: typeof scaleCoordinates;
23
+ findSubstringWithBrackets: typeof findSubstringWithBrackets;
24
+ sanitizeOutput: typeof sanitizeOutput;
25
+ parseStringToObject: typeof parseStringToObject;
26
+ DefaultExecutionConfig: import("./types").ExecutionConfig;
27
+ };
28
+ export default _default;
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAqB,MAAM,qBAAqB,CAAC;AAG9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,cAAc,EACd,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,8GAA8G;AAC9G,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,eAAe,EACf,UAAU,EACV,WAAW,EACX,gBAAgB,GACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEjD,mGAAmG;;;;;;;;;;;;AACnG,wBAUE"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Instruction parsing — converts natural language to structured actions.
3
+ * Adapted from appium-stark-vision/src/llm.ts
4
+ */
5
+ import { StarkVisionClient } from './geminiClient';
6
+ import { StarkVisionAction } from './types';
7
+ /**
8
+ * Detect simple actions (scroll, back) without calling LLM.
9
+ * Returns null if instruction doesn't match any simple pattern.
10
+ * Source: appium-stark-vision/src/llm.ts:31-47
11
+ */
12
+ export declare function detectSimpleAction(instruction: string): StarkVisionAction | null;
13
+ /**
14
+ * Parse an instruction using Gemini vision + the combined instruction prompt.
15
+ * Takes a screenshot and instruction, returns structured actions with coordinates.
16
+ * Source: appium-stark-vision/src/llm.ts:55-151 (understandUserInstruction)
17
+ */
18
+ export declare function parseInstruction(client: StarkVisionClient, instruction: string, screenshotBase64: string): Promise<StarkVisionAction[]>;
19
+ /**
20
+ * Supported actions list.
21
+ * Source: appium-stark-vision/src/services/ActionService.ts:13-36
22
+ */
23
+ export declare const SUPPORTED_ACTIONS: string[];
24
+ //# sourceMappingURL=instructionParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructionParser.d.ts","sourceRoot":"","sources":["../../src/instructionParser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAyB5C;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAoBhF;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,iBAAiB,EACzB,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAsB9B;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,UAmC7B,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * OpenAI-compatible API client for local LLM servers (LM Studio, Ollama, etc.).
3
+ * Uses raw fetch — no extra dependencies.
4
+ */
5
+ interface OpenAICompatRequestParams {
6
+ system: string;
7
+ contents: Array<{
8
+ role: string;
9
+ parts: Array<any>;
10
+ }>;
11
+ temperature?: number;
12
+ maxTokens?: number;
13
+ responseMimeType?: string;
14
+ }
15
+ export declare class OpenAICompatClient {
16
+ private baseUrl;
17
+ private model;
18
+ private apiKey;
19
+ private coordinateOrder;
20
+ constructor(baseUrl: string, model: string, apiKey: string, coordinateOrder?: 'yx' | 'xy');
21
+ /**
22
+ * Convert Google GenAI content format to OpenAI chat messages.
23
+ */
24
+ private convertToMessages;
25
+ createMessage(params: OpenAICompatRequestParams): Promise<string>;
26
+ }
27
+ export {};
28
+ //# sourceMappingURL=openaiCompatClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openaiCompatClient.d.ts","sourceRoot":"","sources":["../../src/openaiCompatClient.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,UAAU,yBAAyB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;KAAE,CAAC,CAAC;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAuBD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,eAAe,CAAc;gBAEzB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAE,IAAI,GAAG,IAAW;IAO/F;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgCnB,aAAa,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;CA8DxE"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Decode build-time Base64 prompt payloads (df-vision npm bundle avoids shipping plain-text prompts).
3
+ */
4
+ export declare function decodeVisionPrompt(b64: string): string;
5
+ //# sourceMappingURL=promptCodec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptCodec.d.ts","sourceRoot":"","sources":["../../src/promptCodec.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Public prompt exports for stark-vision / df-vision.
3
+ * Human-readable source: `prompts.raw.ts` (not compiled). Published npm bundle uses Base64 payloads
4
+ * in `generated/promptB64.ts` (regenerate: `npm run gen:prompts`).
5
+ */
6
+ export { combinedInstructionPrompt, elementVisibilityPrompt, elementVisibilityWithExplanationPrompt, bboxPrompt, backNavigationPrompt, getInformationWithExplanationPrompt, getInformationPrompt, createWDIOTestPrompt, createAppiumJavaTestPrompt, } from './generated/promptB64';
7
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/prompts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,sCAAsC,EACtC,UAAU,EACV,oBAAoB,EACpB,mCAAmC,EACnC,oBAAoB,EACpB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,86 @@
1
+ export type ScrollSize = 'SMALL' | 'MEDIUM' | 'LARGE';
2
+ /** Token usage reported by a single Gemini API call inside StarkVisionClient. */
3
+ export interface VisionTokenUsage {
4
+ inputTokens: number;
5
+ outputTokens: number;
6
+ totalTokens: number;
7
+ /** Tokens served from Gemini implicit cache (~75% cost reduction). */
8
+ cachedTokens?: number;
9
+ /** Tokens consumed by extended thinking (Gemini 2.5+ with MINIMAL/AUTO thinking). */
10
+ thoughtsTokens?: number;
11
+ }
12
+ export type CommandType = 'find' | 'getInfo';
13
+ export interface StarkVisionConfig {
14
+ apiKey: string;
15
+ model: string;
16
+ /** Disable thinking (ThinkingLevel.NONE) for faster responses. Default: false (MINIMAL). */
17
+ disableThinking?: boolean;
18
+ /** Base URL for OpenAI-compatible local servers (e.g. LM Studio: http://127.0.0.1:1234). */
19
+ baseUrl?: string;
20
+ /**
21
+ * Coordinate order returned by the local model in the coordinates array.
22
+ * 'yx' (default): model returns [y, x] as the prompt instructs.
23
+ * 'xy': model returns [x, y] despite the prompt (e.g. some Qwen variants).
24
+ * When 'xy', coordinates are swapped before scaling.
25
+ */
26
+ coordinateOrder?: 'yx' | 'xy';
27
+ /**
28
+ * Optional callback invoked after every Gemini API call with token usage.
29
+ * Use this to accumulate and display token costs for vision operations.
30
+ */
31
+ onTokenUsage?: (usage: VisionTokenUsage) => void;
32
+ }
33
+ export interface ExecutionConfig {
34
+ scrollSize: ScrollSize;
35
+ elementVisibleCheck: boolean;
36
+ maxScrolls: number;
37
+ saveToCache: boolean;
38
+ visibleExplanation: boolean;
39
+ }
40
+ export declare const DefaultExecutionConfig: ExecutionConfig;
41
+ export interface StarkVisionAction {
42
+ action: string;
43
+ value: string | null;
44
+ locators: {
45
+ element: string;
46
+ coordinates?: [number, number];
47
+ /**
48
+ * How directly the original instruction described this element (1–10).
49
+ * 1 = vague/unrelated (model had to interpret heavily),
50
+ * 10 = exact/direct description.
51
+ * Only present when the combinedInstructionPrompt includes matchScore support.
52
+ */
53
+ matchScore?: number;
54
+ }[];
55
+ }
56
+ export interface BoundingBox {
57
+ corners: {
58
+ min: {
59
+ x: number;
60
+ y: number;
61
+ };
62
+ max: {
63
+ x: number;
64
+ y: number;
65
+ };
66
+ };
67
+ center: {
68
+ x: number;
69
+ y: number;
70
+ };
71
+ container: {
72
+ width: number;
73
+ height: number;
74
+ };
75
+ }
76
+ export interface ScreenSize {
77
+ width: number;
78
+ height: number;
79
+ }
80
+ export interface VisibilityResult {
81
+ elementState: boolean | string;
82
+ systemPopUp: boolean;
83
+ popUpActionButtons: string;
84
+ typeOfPopUp: string;
85
+ }
86
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEtD,iFAAiF;AACjF,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qFAAqF;IACrF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,4FAA4F;IAC5F,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,4FAA4F;IAC5F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC9B;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,UAAU,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,eAAO,MAAM,sBAAsB,EAAE,eAMpC,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B;;;;;WAKG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,EAAE,CAAC;CACL;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE;QAAE,GAAG,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,GAAG,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IAC1E,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB"}