@aifinpay/agent 0.1.0-alpha.1 → 0.3.0-alpha.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 +6 -2
- package/dist/agent.d.ts +112 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +312 -0
- package/dist/agent.js.map +1 -0
- package/dist/crypto.d.ts +3 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +12 -0
- package/dist/crypto.js.map +1 -0
- package/dist/errors.d.ts +19 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +22 -0
- package/dist/errors.js.map +1 -0
- package/dist/facilitators/aifinpay.d.ts +21 -0
- package/dist/facilitators/aifinpay.d.ts.map +1 -0
- package/dist/facilitators/aifinpay.js +76 -0
- package/dist/facilitators/aifinpay.js.map +1 -0
- package/dist/facilitators/base.d.ts +35 -0
- package/dist/facilitators/base.d.ts.map +1 -0
- package/dist/facilitators/base.js +2 -0
- package/dist/facilitators/base.js.map +1 -0
- package/dist/facilitators/coinbase.d.ts +20 -0
- package/dist/facilitators/coinbase.d.ts.map +1 -0
- package/dist/facilitators/coinbase.js +67 -0
- package/dist/facilitators/coinbase.js.map +1 -0
- package/dist/facilitators/detect.d.ts +9 -0
- package/dist/facilitators/detect.d.ts.map +1 -0
- package/dist/facilitators/detect.js +33 -0
- package/dist/facilitators/detect.js.map +1 -0
- package/dist/facilitators/index.d.ts +5 -0
- package/dist/facilitators/index.d.ts.map +1 -0
- package/dist/facilitators/index.js +4 -0
- package/dist/facilitators/index.js.map +1 -0
- package/dist/index.d.ts +28 -60
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -197
- package/dist/index.js.map +1 -1
- package/dist/unifiedAgent.d.ts +222 -0
- package/dist/unifiedAgent.d.ts.map +1 -0
- package/dist/unifiedAgent.js +498 -0
- package/dist/unifiedAgent.js.map +1 -0
- package/package.json +16 -9
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { type PrivateKeyAccount } from "viem/accounts";
|
|
2
|
+
import { AiFinPayError } from "./errors.js";
|
|
3
|
+
import { Agent, type AgentOptions } from "./agent.js";
|
|
4
|
+
export type ChainId = "solana" | "polygon";
|
|
5
|
+
export interface ProviderEntry {
|
|
6
|
+
name: string;
|
|
7
|
+
display_name?: string;
|
|
8
|
+
preferred_chain: ChainId;
|
|
9
|
+
accepted_chains: ChainId[];
|
|
10
|
+
price_usd: number;
|
|
11
|
+
mode: "per_call" | "session" | "both";
|
|
12
|
+
bridge_url: string;
|
|
13
|
+
merchant_wallet: string;
|
|
14
|
+
service_type?: string;
|
|
15
|
+
url?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface CallOptions {
|
|
18
|
+
provider: string;
|
|
19
|
+
cost?: number;
|
|
20
|
+
chain?: ChainId;
|
|
21
|
+
bridgeUrl?: string;
|
|
22
|
+
body?: unknown;
|
|
23
|
+
method?: string;
|
|
24
|
+
timeoutMs?: number;
|
|
25
|
+
signal?: AbortSignal;
|
|
26
|
+
}
|
|
27
|
+
export interface BalanceSnapshot {
|
|
28
|
+
agent_balance_usd: number;
|
|
29
|
+
chains: {
|
|
30
|
+
solana: {
|
|
31
|
+
sol: number;
|
|
32
|
+
usdc: number;
|
|
33
|
+
msecco_balance: number;
|
|
34
|
+
};
|
|
35
|
+
polygon: {
|
|
36
|
+
matic: number;
|
|
37
|
+
usdc: number;
|
|
38
|
+
msecco_balance: number;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
spend_24h_usd: number;
|
|
42
|
+
budget_caps: {
|
|
43
|
+
daily_usd?: number;
|
|
44
|
+
per_call_usd?: number;
|
|
45
|
+
};
|
|
46
|
+
priced_at: number;
|
|
47
|
+
}
|
|
48
|
+
export interface ReputationSnapshot {
|
|
49
|
+
trust_score: number;
|
|
50
|
+
spend_score: number;
|
|
51
|
+
tenure_days: number;
|
|
52
|
+
verified: boolean;
|
|
53
|
+
flags: string[];
|
|
54
|
+
}
|
|
55
|
+
export interface BudgetCaps {
|
|
56
|
+
daily_usd?: number;
|
|
57
|
+
per_call_usd?: number;
|
|
58
|
+
}
|
|
59
|
+
export interface SessionHandle {
|
|
60
|
+
id: string;
|
|
61
|
+
provider: string;
|
|
62
|
+
chain: ChainId;
|
|
63
|
+
budget_usd: number;
|
|
64
|
+
spent_usd: number;
|
|
65
|
+
remaining_usd: number;
|
|
66
|
+
expires_at: number;
|
|
67
|
+
call(body: unknown): Promise<Response>;
|
|
68
|
+
close(): Promise<SessionReceipt>;
|
|
69
|
+
abandon(): Promise<void>;
|
|
70
|
+
}
|
|
71
|
+
export interface SessionReceipt {
|
|
72
|
+
session_id: string;
|
|
73
|
+
spent_usd: number;
|
|
74
|
+
refund_usd: number;
|
|
75
|
+
settlement_tx: string;
|
|
76
|
+
block: number | string;
|
|
77
|
+
}
|
|
78
|
+
export interface AiFinPayAgentOptions extends AgentOptions {
|
|
79
|
+
registryUrl?: string;
|
|
80
|
+
evmPrivateKey?: `0x${string}`;
|
|
81
|
+
budgetCaps?: BudgetCaps;
|
|
82
|
+
telemetry?: boolean;
|
|
83
|
+
polygonRpc?: string;
|
|
84
|
+
}
|
|
85
|
+
export declare class ProviderUnknownError extends AiFinPayError {
|
|
86
|
+
}
|
|
87
|
+
export declare class WrongChainBalanceError extends AiFinPayError {
|
|
88
|
+
has: ChainId[];
|
|
89
|
+
needed: ChainId;
|
|
90
|
+
constructor(has: ChainId[], needed: ChainId, msg: string);
|
|
91
|
+
}
|
|
92
|
+
export declare class InsufficientFundsError extends AiFinPayError {
|
|
93
|
+
needed_usd: number;
|
|
94
|
+
available_usd: number;
|
|
95
|
+
constructor(needed_usd: number, available_usd: number, msg: string);
|
|
96
|
+
}
|
|
97
|
+
export declare class BudgetCapExceededError extends AiFinPayError {
|
|
98
|
+
kind: "daily" | "per_call";
|
|
99
|
+
constructor(kind: "daily" | "per_call", msg: string);
|
|
100
|
+
}
|
|
101
|
+
export declare class SettlementError extends AiFinPayError {
|
|
102
|
+
reason: string;
|
|
103
|
+
txHash?: string | undefined;
|
|
104
|
+
constructor(reason: string, txHash?: string | undefined);
|
|
105
|
+
}
|
|
106
|
+
export declare class SessionExpiredError extends AiFinPayError {
|
|
107
|
+
session_id: string;
|
|
108
|
+
constructor(session_id: string);
|
|
109
|
+
}
|
|
110
|
+
export declare class AiFinPayAgent {
|
|
111
|
+
readonly inner: Agent;
|
|
112
|
+
readonly evmAccount: PrivateKeyAccount;
|
|
113
|
+
readonly registryUrl: string;
|
|
114
|
+
readonly polygonRpc: string;
|
|
115
|
+
private cachedRegistry?;
|
|
116
|
+
private budgetCaps;
|
|
117
|
+
private spend24h;
|
|
118
|
+
private telemetry;
|
|
119
|
+
private _polygonPublic?;
|
|
120
|
+
private _polygonWallet?;
|
|
121
|
+
private constructor();
|
|
122
|
+
private polygonClients;
|
|
123
|
+
/**
|
|
124
|
+
* Generate a fresh agent — new Solana keypair + new EVM keypair.
|
|
125
|
+
* Use `fromSeed()` to derive both from a single backup phrase instead.
|
|
126
|
+
*/
|
|
127
|
+
static new(opts?: AiFinPayAgentOptions): Promise<AiFinPayAgent>;
|
|
128
|
+
/**
|
|
129
|
+
* Derive both keypairs from a single 32-byte hex seed. Same seed →
|
|
130
|
+
* deterministic Solana pubkey AND EVM address. One backup phrase, two
|
|
131
|
+
* chains.
|
|
132
|
+
*
|
|
133
|
+
* Solana key = nacl.sign.keyPair.fromSeed(seed)
|
|
134
|
+
* EVM key = keccak256(seed)[:32] (independent path; not BIP-44
|
|
135
|
+
* compatible — see design notes
|
|
136
|
+
* in 23 - Unified SDK Design).
|
|
137
|
+
*
|
|
138
|
+
* TODO(phase-1): replace with BIP-39/BIP-44 derivation
|
|
139
|
+
* m/44'/501'/0'/0' (Solana) + m/44'/60'/0'/0/0 (EVM) once the
|
|
140
|
+
* wallet-import audit recommendation lands.
|
|
141
|
+
*/
|
|
142
|
+
static fromSeed(seedHex: string, opts?: AiFinPayAgentOptions): Promise<AiFinPayAgent>;
|
|
143
|
+
/**
|
|
144
|
+
* Legacy: load the Solana side from an existing keypair, then either
|
|
145
|
+
* generate a fresh EVM key or import one with `attachEvmKey`.
|
|
146
|
+
*/
|
|
147
|
+
static fromSolanaSecret(secretB58: string, opts?: AiFinPayAgentOptions): Promise<AiFinPayAgent>;
|
|
148
|
+
get id(): string;
|
|
149
|
+
get solanaAddress(): string;
|
|
150
|
+
get evmAddress(): string;
|
|
151
|
+
fetchRegistry(force?: boolean): Promise<ProviderEntry[]>;
|
|
152
|
+
resolveProvider(name: string): Promise<ProviderEntry>;
|
|
153
|
+
setBudget(caps: BudgetCaps): void;
|
|
154
|
+
private checkBudget;
|
|
155
|
+
/**
|
|
156
|
+
* Chain selection heuristic — see Obsidian/23 - Unified SDK Design §Routing.
|
|
157
|
+
*
|
|
158
|
+
* 1. Explicit override always wins (subject to provider acceptance).
|
|
159
|
+
* 2. Cost ≤ $0.005 + Solana per-call live + Solana accepted → Solana
|
|
160
|
+
* (low gas wins for tiny calls).
|
|
161
|
+
* 3. Cost > $0.05 + Polygon accepted → Polygon
|
|
162
|
+
* (better finality for high-value calls).
|
|
163
|
+
* 4. Middle band → provider.preferred_chain.
|
|
164
|
+
* 5. Fallback → first accepted chain.
|
|
165
|
+
*
|
|
166
|
+
* Solana per-call is gated on the deploy of `b2b_pay_with_split` —
|
|
167
|
+
* until then `solana` selection raises in `call()`.
|
|
168
|
+
*/
|
|
169
|
+
private pickChain;
|
|
170
|
+
/**
|
|
171
|
+
* TODO(phase-4): mint AgentPassport on the cheapest chain available
|
|
172
|
+
* with the requested `stake_usd`. For now wires only the Solana side
|
|
173
|
+
* via the existing `reserveSeatInvoice` semantics.
|
|
174
|
+
*/
|
|
175
|
+
verify(_args?: {
|
|
176
|
+
stake_usd?: number;
|
|
177
|
+
}): Promise<{
|
|
178
|
+
verified: boolean;
|
|
179
|
+
}>;
|
|
180
|
+
/**
|
|
181
|
+
* TODO(phase-1): pick a chain (preferred USDC on Polygon for stability;
|
|
182
|
+
* fallback Solana SOL). Return signed-tx instructions for the wallet.
|
|
183
|
+
*/
|
|
184
|
+
deposit(_usd: number, _opts?: {
|
|
185
|
+
asset?: "USDC" | "USDT" | "SOL" | "MATIC";
|
|
186
|
+
chain?: ChainId;
|
|
187
|
+
}): Promise<unknown>;
|
|
188
|
+
/**
|
|
189
|
+
* High-level paid call. Resolves the provider, picks a chain, builds the
|
|
190
|
+
* payment, sends to the bridge, retries with payment proof.
|
|
191
|
+
*
|
|
192
|
+
* Phase 1 implementation: Polygon per-call splitter via on-chain
|
|
193
|
+
* `B2BSplitter.payMatic()`. Solana per-call branch lights up after
|
|
194
|
+
* Phase 2 (b2b_pay_with_split deploy via Squads).
|
|
195
|
+
*/
|
|
196
|
+
call(opts: CallOptions): Promise<Response>;
|
|
197
|
+
/**
|
|
198
|
+
* TODO(phase-3): open a metered budget session.
|
|
199
|
+
*/
|
|
200
|
+
openSession(_args: {
|
|
201
|
+
provider: string;
|
|
202
|
+
budget_usd: number;
|
|
203
|
+
ttl_seconds?: number;
|
|
204
|
+
}): Promise<SessionHandle>;
|
|
205
|
+
/**
|
|
206
|
+
* Snapshot the agent's funds across both chains, USD-normalised.
|
|
207
|
+
*
|
|
208
|
+
* Phase 1.4: native MATIC + native SOL via RPC; ERC-20 / SPL token balances
|
|
209
|
+
* deferred (we don't yet need them for the unified `call()` flow which
|
|
210
|
+
* settles in MATIC). Pyth feeds are TODO; for now uses
|
|
211
|
+
* `AIFINPAY_MATIC_USD` and `AIFINPAY_SOL_USD` env, defaulting to 0.7 and 200.
|
|
212
|
+
*/
|
|
213
|
+
balance(): Promise<BalanceSnapshot>;
|
|
214
|
+
private fetchPolygonNative;
|
|
215
|
+
private fetchSolanaNative;
|
|
216
|
+
/**
|
|
217
|
+
* TODO(phase-4 / phase-5): query operator backend reputation engine.
|
|
218
|
+
*/
|
|
219
|
+
reputation(): Promise<ReputationSnapshot>;
|
|
220
|
+
private reportTelemetry;
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=unifiedAgent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unifiedAgent.d.ts","sourceRoot":"","sources":["../src/unifiedAgent.ts"],"names":[],"mappings":"AAoBA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,aAAa,EAEd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAItD,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAa,MAAM,CAAC;IACxB,YAAY,CAAC,EAAI,MAAM,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,SAAS,EAAQ,MAAM,CAAC;IACxB,IAAI,EAAa,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IACjD,UAAU,EAAO,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAI,MAAM,CAAC;IACxB,GAAG,CAAC,EAAa,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAK,MAAM,CAAC;IACpB,IAAI,CAAC,EAAQ,MAAM,CAAC;IACpB,KAAK,CAAC,EAAO,OAAO,CAAC;IACrB,SAAS,CAAC,EAAG,MAAM,CAAC;IACpB,IAAI,CAAC,EAAQ,OAAO,CAAC;IACrB,MAAM,CAAC,EAAM,MAAM,CAAC;IACpB,SAAS,CAAC,EAAG,MAAM,CAAC;IACpB,MAAM,CAAC,EAAM,WAAW,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE;QACN,MAAM,EAAE;YACN,GAAG,EAAa,MAAM,CAAC;YACvB,IAAI,EAAY,MAAM,CAAC;YACvB,cAAc,EAAE,MAAM,CAAC;SACxB,CAAC;QACF,OAAO,EAAE;YACP,KAAK,EAAW,MAAM,CAAC;YACvB,IAAI,EAAY,MAAM,CAAC;YACvB,cAAc,EAAE,MAAM,CAAC;SACxB,CAAC;KACH,CAAC;IACF,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE;QACX,SAAS,CAAC,EAAK,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAK,MAAM,CAAC;IACvB,WAAW,EAAK,MAAM,CAAC;IACvB,WAAW,EAAK,MAAM,CAAC;IACvB,QAAQ,EAAQ,OAAO,CAAC;IACxB,KAAK,EAAW,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAK,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAY,MAAM,CAAC;IACrB,QAAQ,EAAM,MAAM,CAAC;IACrB,KAAK,EAAS,OAAO,CAAC;IACtB,UAAU,EAAI,MAAM,CAAC;IACrB,SAAS,EAAK,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAI,MAAM,CAAC;IACrB,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,KAAK,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;IACjC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAK,MAAM,CAAC;IACtB,SAAS,EAAM,MAAM,CAAC;IACtB,UAAU,EAAK,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAU,MAAM,GAAG,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD,WAAW,CAAC,EAAG,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC9B,UAAU,CAAC,EAAI,UAAU,CAAC;IAC1B,SAAS,CAAC,EAAK,OAAO,CAAC;IACvB,UAAU,CAAC,EAAI,MAAM,CAAC;CACvB;AA2CD,qBAAa,oBAAqB,SAAQ,aAAa;CAAG;AAC1D,qBAAa,sBAAuB,SAAQ,aAAa;IACpC,GAAG,EAAE,OAAO,EAAE;IAAS,MAAM,EAAE,OAAO;gBAAtC,GAAG,EAAE,OAAO,EAAE,EAAS,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM;CAGvE;AACD,qBAAa,sBAAuB,SAAQ,aAAa;IACpC,UAAU,EAAE,MAAM;IAAS,aAAa,EAAE,MAAM;gBAAhD,UAAU,EAAE,MAAM,EAAS,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;CAGjF;AACD,qBAAa,sBAAuB,SAAQ,aAAa;IACpC,IAAI,EAAE,OAAO,GAAG,UAAU;gBAA1B,IAAI,EAAE,OAAO,GAAG,UAAU,EAAE,GAAG,EAAE,MAAM;CAG3D;AACD,qBAAa,eAAgB,SAAQ,aAAa;IAC7B,MAAM,EAAE,MAAM;IAAS,MAAM,CAAC,EAAE,MAAM;gBAAtC,MAAM,EAAE,MAAM,EAAS,MAAM,CAAC,EAAE,MAAM,YAAA;CAG1D;AACD,qBAAa,mBAAoB,SAAQ,aAAa;IACjC,UAAU,EAAE,MAAM;gBAAlB,UAAU,EAAE,MAAM;CAGtC;AAqBD,qBAAa,aAAa;IACxB,QAAQ,CAAC,KAAK,EAAS,KAAK,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAI,iBAAiB,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAI,MAAM,CAAC;IAC9B,OAAO,CAAE,cAAc,CAAC,CAAkB;IAC1C,OAAO,CAAE,UAAU,CAAiB;IACpC,OAAO,CAAE,QAAQ,CAA6B;IAC9C,OAAO,CAAE,SAAS,CAAe;IACjC,OAAO,CAAE,cAAc,CAAC,CAAe;IACvC,OAAO,CAAE,cAAc,CAAC,CAAe;IAEvC,OAAO;IAeP,OAAO,CAAC,cAAc;IAmBtB;;;OAGG;WACU,GAAG,CAAC,IAAI,GAAE,oBAAyB,GAAG,OAAO,CAAC,aAAa,CAAC;IAOzE;;;;;;;;;;;;;OAaG;WACU,QAAQ,CACnB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,aAAa,CAAC;IAezB;;;OAGG;WACU,gBAAgB,CAC3B,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,aAAa,CAAC;IASzB,IAAI,EAAE,IAAI,MAAM,CAGf;IACD,IAAI,aAAa,IAAI,MAAM,CAA+B;IAC1D,IAAI,UAAU,IAAO,MAAM,CAAoC;IAIzD,aAAa,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAWtD,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAW3D,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIjC,OAAO,CAAC,WAAW;IAkBnB;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,SAAS;IAqCjB;;;;OAIG;IACG,MAAM,CAAC,KAAK,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;IAM5E;;;OAGG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAMrH;;;;;;;OAOG;IACG,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAyGhD;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE;QACvB,QAAQ,EAAK,MAAM,CAAC;QACpB,UAAU,EAAG,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,aAAa,CAAC;IAM1B;;;;;;;OAOG;IACG,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC;YAsB3B,kBAAkB;YAQlB,iBAAiB;IAqB/B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAY/C,OAAO,CAAC,eAAe;CAQxB"}
|