@tapflowio/ios-agent 0.18.0 → 0.20.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 +1 -1
- package/bin/TapflowNetFilter.app/Contents/CodeResources +0 -0
- package/bin/TapflowNetFilter.app/Contents/Info.plist +48 -0
- package/bin/TapflowNetFilter.app/Contents/Library/SystemExtensions/dev.tapflow.netfilter.ext.systemextension/Contents/Info.plist +58 -0
- package/bin/TapflowNetFilter.app/Contents/Library/SystemExtensions/dev.tapflow.netfilter.ext.systemextension/Contents/MacOS/dev.tapflow.netfilter.ext +0 -0
- package/bin/TapflowNetFilter.app/Contents/Library/SystemExtensions/dev.tapflow.netfilter.ext.systemextension/Contents/_CodeSignature/CodeResources +123 -0
- package/bin/TapflowNetFilter.app/Contents/Library/SystemExtensions/dev.tapflow.netfilter.ext.systemextension/Contents/embedded.provisionprofile +0 -0
- package/bin/TapflowNetFilter.app/Contents/MacOS/TapflowNetFilter +0 -0
- package/bin/TapflowNetFilter.app/Contents/PkgInfo +1 -0
- package/bin/TapflowNetFilter.app/Contents/_CodeSignature/CodeResources +151 -0
- package/bin/TapflowNetFilter.app/Contents/embedded.provisionprofile +0 -0
- package/bin/libtapflow-nethook.dylib +0 -0
- package/dist/DeviceChromeLoader.d.ts +2 -45
- package/dist/DeviceChromeLoader.d.ts.map +1 -1
- package/dist/DeviceChromeLoader.js.map +1 -1
- package/dist/IOSAgent.d.ts +196 -3
- package/dist/IOSAgent.d.ts.map +1 -1
- package/dist/IOSAgent.js +782 -128
- package/dist/IOSAgent.js.map +1 -1
- package/dist/KeyboardHelperDaemon.d.ts.map +1 -1
- package/dist/KeyboardHelperDaemon.js +2 -1
- package/dist/KeyboardHelperDaemon.js.map +1 -1
- package/dist/MjpegStreamer.d.ts.map +1 -1
- package/dist/MjpegStreamer.js +9 -1
- package/dist/MjpegStreamer.js.map +1 -1
- package/dist/SimctlWrapper.d.ts +70 -1
- package/dist/SimctlWrapper.d.ts.map +1 -1
- package/dist/SimctlWrapper.js +118 -3
- package/dist/SimctlWrapper.js.map +1 -1
- package/dist/SimulatorNetwork.d.ts +369 -0
- package/dist/SimulatorNetwork.d.ts.map +1 -0
- package/dist/SimulatorNetwork.js +899 -0
- package/dist/SimulatorNetwork.js.map +1 -0
- package/dist/TouchHelper.d.ts +53 -14
- package/dist/TouchHelper.d.ts.map +1 -1
- package/dist/TouchHelper.js +237 -59
- package/dist/TouchHelper.js.map +1 -1
- package/dist/childProcessKill.d.ts +3 -0
- package/dist/childProcessKill.d.ts.map +1 -0
- package/dist/childProcessKill.js +19 -0
- package/dist/childProcessKill.js.map +1 -0
- package/package.json +13 -10
package/dist/IOSAgent.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type { Device, DeviceAgent, UIElement } from '@tapflowio/agent-core';
|
|
1
|
+
import type { Device, DeviceAgent, NetworkControlCapability, NetworkStatePayload, UIElement } from '@tapflowio/agent-core';
|
|
2
2
|
export declare const IOS_BUTTON_ALIASES: Record<string, string>;
|
|
3
3
|
import { type SleepBlocker } from '@tapflowio/agent-core/utils';
|
|
4
4
|
import { SimctlWrapper } from './SimctlWrapper.js';
|
|
5
|
+
import { SimulatorNetwork } from './SimulatorNetwork.js';
|
|
5
6
|
export interface IOSAgentOptions {
|
|
6
7
|
fps?: number;
|
|
7
8
|
intervalMs?: number;
|
|
@@ -14,9 +15,13 @@ export interface IOSAgentOptions {
|
|
|
14
15
|
token?: string;
|
|
15
16
|
/** Handshake(연결~agent:registered) 타임아웃 ms. 기본 10초, 테스트용 주입 가능. */
|
|
16
17
|
handshakeTimeoutMs?: number;
|
|
18
|
+
/** The three-layer network control (#607). Injectable so a test can point it somewhere harmless;
|
|
19
|
+
* defaults to one wired to this agent's simctl (and, under vitest, to nothing real). */
|
|
20
|
+
network?: SimulatorNetwork;
|
|
17
21
|
}
|
|
18
|
-
export declare class IOSAgent implements DeviceAgent {
|
|
22
|
+
export declare class IOSAgent implements DeviceAgent, NetworkControlCapability {
|
|
19
23
|
private readonly simctl;
|
|
24
|
+
private readonly network;
|
|
20
25
|
private readonly fps;
|
|
21
26
|
private readonly intervalMs;
|
|
22
27
|
private readonly reconnectDelays;
|
|
@@ -25,7 +30,49 @@ export declare class IOSAgent implements DeviceAgent {
|
|
|
25
30
|
private readonly token?;
|
|
26
31
|
private readonly handshakeTimeoutMs;
|
|
27
32
|
private ws;
|
|
33
|
+
/** Send on the control socket, if there is one. The `?.` is the point: 66 call sites relied on a send
|
|
34
|
+
* being a no-op between reconnects, and this preserves that exactly.
|
|
35
|
+
*
|
|
36
|
+
* Typed with `AgentControlOutbound`, which is why this exists — an agent's literal used to reach `ws.send`
|
|
37
|
+
* with nothing checking it, and #489/#490 are what that cost. *
|
|
38
|
+
* **The guard is not defensive tidying.** `ws.send` on anything other than OPEN takes the `sendAfterClose`
|
|
39
|
+
* path, which adds the payload to a buffer nobody will flush and neither throws nor emits — so a reply
|
|
40
|
+
* sent to a closing socket is indistinguishable from a delivered one at the call site. `reportResources`
|
|
41
|
+
* has always checked; this did not, and the boot answers this file now owes a caller are exactly the
|
|
42
|
+
* messages whose purpose is to end someone's wait.
|
|
43
|
+
*
|
|
44
|
+
* The body is held character for character by `scripts/__tests__/agentSendTyped.test.mjs`, so the comment
|
|
45
|
+
* lives out here: that check strips comments and matches the body exactly, having watched three earlier
|
|
46
|
+
* drafts get bypassed by a renamed socket. */
|
|
47
|
+
private sendMsg;
|
|
48
|
+
/** Send on a socket the caller has already established. Takes the socket **as an argument** rather than
|
|
49
|
+
* reading `this.ws`, and that is deliberate: the call sites that use it sit behind an entry guard
|
|
50
|
+
* (`if (!this.ws) return`), and today deleting one of those guards is a compile error. Reading
|
|
51
|
+
* `this.ws` here — or asserting it with `!` — would make the guard optional to the compiler and turn
|
|
52
|
+
* its removal into a runtime `TypeError` instead. It also serves the `agent:register` send, which runs
|
|
53
|
+
* inside `onopen` on a local socket. */
|
|
54
|
+
private sendOn;
|
|
28
55
|
private deviceStates;
|
|
56
|
+
/**
|
|
57
|
+
* Devices **this agent booted**, by device id.
|
|
58
|
+
*
|
|
59
|
+
* Separate from `DeviceState.booted` because the two answer different questions and have different
|
|
60
|
+
* lifetimes. `booted` is liveness and is a cache: `initDeviceStates` rebuilds the whole map on
|
|
61
|
+
* every `agent:registered`, so it does not survive a reconnect. This does — the agent process is
|
|
62
|
+
* the same one across a reconnect — and it is what says *which* device is tapflow's when a
|
|
63
|
+
* developer has a second simulator of their own open.
|
|
64
|
+
*
|
|
65
|
+
* Without it, a reconnect on a two-simulator desk left the capability entry points asking simctl,
|
|
66
|
+
* getting two live devices, and refusing both. Written only where a boot succeeds; never by
|
|
67
|
+
* `ackInput`, which verifies liveness and proves nothing about ownership.
|
|
68
|
+
*
|
|
69
|
+
* **The `DeviceAgent.boot`/`shutdown` delegates do not touch this**, and that is deliberate: they
|
|
70
|
+
* hand a device id straight to simctl without opening a session, so a device they start is not one
|
|
71
|
+
* this agent is driving. Nothing in the repo calls either — the same position `stream()` is in — so
|
|
72
|
+
* wiring ownership through them would be a mechanism built for a caller that does not exist. A
|
|
73
|
+
* future caller that wants both should go through the boot handler rather than around it.
|
|
74
|
+
*/
|
|
75
|
+
private readonly ownedDevices;
|
|
29
76
|
private lastBundleIds;
|
|
30
77
|
private readonly uiTreeReader;
|
|
31
78
|
private readonly sleepBlocker;
|
|
@@ -47,6 +94,21 @@ export declare class IOSAgent implements DeviceAgent {
|
|
|
47
94
|
private startBinaryStream;
|
|
48
95
|
private wsClientOptions;
|
|
49
96
|
private openStreamWs;
|
|
97
|
+
/** Retire the boot that holds the current seq, recording what retired it, and return the new seq.
|
|
98
|
+
*
|
|
99
|
+
* **Three callers, and the third is why this is a method.** A new boot supersedes the one in flight, a
|
|
100
|
+
* shutdown abandons it, and losing the relay invalidates it — that last one lives in the reconnect path
|
|
101
|
+
* (`cleanupDeviceState`'s callers) and is easy to miss when reading `handleDeviceBoot` alone. Spreading
|
|
102
|
+
* the reason across three `state.bootSeq++` lines makes forgetting one silent; here it is a parameter. */
|
|
103
|
+
private bumpBootSeq;
|
|
104
|
+
/** Answer a boot this agent has stopped running. Called at every point that abandons one.
|
|
105
|
+
*
|
|
106
|
+
* **Only when a correlator exists**, which is the same rule the input path settled on (#489): a reply
|
|
107
|
+
* nobody is waiting for is not an answer, and the dashboard reports every *uncorrelated*
|
|
108
|
+
* `device:boot-error` as a failure — deliberately, since Android's dead-stream report has no id it could
|
|
109
|
+
* carry (#426). So sending one for a boot with no correlator would put an error toast on a tester's
|
|
110
|
+
* screen for a device that is booting normally. */
|
|
111
|
+
private abandonBoot;
|
|
50
112
|
private handleDeviceBoot;
|
|
51
113
|
private bootWithZombieRecovery;
|
|
52
114
|
private handleDeviceShutdown;
|
|
@@ -55,6 +117,34 @@ export declare class IOSAgent implements DeviceAgent {
|
|
|
55
117
|
private readonly parkedSentinels;
|
|
56
118
|
private markSentinel;
|
|
57
119
|
private sentinelParked;
|
|
120
|
+
/** The correlator on an input an ack answers, or `null` if the frame cannot be attributed.
|
|
121
|
+
*
|
|
122
|
+
* A local capture rather than a guard at the top of the dispatcher, and that is the point: a guard there
|
|
123
|
+
* would not narrow `msg.requestId` inside the case, so the shortest way to satisfy the reply's required
|
|
124
|
+
* field would be `msg.requestId!` — the assertion removed from `open-url` and then from clipboard. This
|
|
125
|
+
* hands back a `string` the case can close over.
|
|
126
|
+
*
|
|
127
|
+
* It is unvalidated JSON, so the check is real work rather than ceremony: the declaration is required and
|
|
128
|
+
* every in-repo sender is typed against it, and #444 made the relay refuse an empty one — but this agent may
|
|
129
|
+
* be talking to a relay older than that, and `mcp-server`'s tool
|
|
130
|
+
* schemas are bare `z.string()` so a model can produce `''`. */
|
|
131
|
+
private correlatorOf;
|
|
132
|
+
private ackNoSession;
|
|
133
|
+
/**
|
|
134
|
+
* Why a write was refused. The helper's boolean says only "no".
|
|
135
|
+
*
|
|
136
|
+
* `kind` matters because the two questions were decided at different times. Readiness is about now;
|
|
137
|
+
* a continuation frame's fate was decided when the gesture opened. A gesture whose opening frame
|
|
138
|
+
* was refused inside the start-up window owns nothing, so its terminal frame can never land no
|
|
139
|
+
* matter how ready the helper has since become — and reading readiness first answered `malformed`
|
|
140
|
+
* ("never retry") for precisely the case `channel-starting` exists to serve. Ownership is therefore
|
|
141
|
+
* checked first for continuations, which is also the right answer when the helper died mid-gesture
|
|
142
|
+
* and its replacement is still starting: waiting would not help either.
|
|
143
|
+
*
|
|
144
|
+
* Safe to read at the ack site rather than inside the write, because iOS writes are synchronous —
|
|
145
|
+
* but only for the question readiness answers. That is why ownership is asked separately.
|
|
146
|
+
*/
|
|
147
|
+
private refusalReason;
|
|
58
148
|
private ackInput;
|
|
59
149
|
private isBooted;
|
|
60
150
|
private handleRelayMessage;
|
|
@@ -74,13 +164,116 @@ export declare class IOSAgent implements DeviceAgent {
|
|
|
74
164
|
* (`AndroidAgent.ts:1429`); these do the same. Throwing beats falling back to simctl's `booted`
|
|
75
165
|
* alias, which would quietly act on whichever simulator happened to be up. */
|
|
76
166
|
installApp(appPath: string): Promise<void>;
|
|
167
|
+
/** The device a session is driving, or undefined when nothing is booted. */
|
|
168
|
+
/**
|
|
169
|
+
* The session's device, **only while it is up**.
|
|
170
|
+
*
|
|
171
|
+
* `deviceStates` holds one entry per *registered* simulator, not per running one, so this used to
|
|
172
|
+
* answer for a device that was shut down — or never booted. The network path is where that costs
|
|
173
|
+
* something: a toggle after a shutdown writes the kernel rule for a dead udid, and `arm()` is the
|
|
174
|
+
* only thing that clears it, which now happens on the *next* boot of that device. Until then the
|
|
175
|
+
* host is dropping flows for nothing, and a simulator that reuses the udid comes up offline.
|
|
176
|
+
*
|
|
177
|
+
* **`booted` alone is not the check, and reading it as one is a regression this shipped once.**
|
|
178
|
+
* The flag is a cache, not the truth: `initDeviceStates` runs on `agent:registered`, which is every
|
|
179
|
+
* *reconnect* and not only the first connection, so it is `false` for a simulator that has been up
|
|
180
|
+
* the whole time. Gated on the flag alone, a relay restart left the toggle answering
|
|
181
|
+
* `No booted device` for a running device and left `network:request-state` — the message a viewer's
|
|
182
|
+
* re-join sends, which exists precisely for this moment — silently unanswered, so the control never
|
|
183
|
+
* left `waiting`.
|
|
184
|
+
*
|
|
185
|
+
* So it falls back to asking simctl and caches the answer, which is what `ackInput` already does
|
|
186
|
+
* with the same flag and for the same reason. That is also why this is async.
|
|
187
|
+
*/
|
|
188
|
+
private deviceFor;
|
|
189
|
+
/**
|
|
190
|
+
* Send the current state to a session.
|
|
191
|
+
*
|
|
192
|
+
* Uncorrelated on purpose: this answers `device:ready` and a viewer's re-join, neither of which is a
|
|
193
|
+
* request anyone is waiting on. Silent with no device, for the same reason `network:error` would be
|
|
194
|
+
* addressed to nobody.
|
|
195
|
+
*/
|
|
196
|
+
private reportNetworkState;
|
|
197
|
+
/**
|
|
198
|
+
* A device that was offline stopped being enforced — tell whoever is watching it.
|
|
199
|
+
*
|
|
200
|
+
* **Uncorrelated, and it has to be**: nobody asked. `network:error` is the wrong carrier for the
|
|
201
|
+
* same reason — that type is *"a `network:set` that could not be dispatched"*, and this is not a
|
|
202
|
+
* request failing. `network:state` already supports an unsolicited frame; the viewer re-join path
|
|
203
|
+
* has been sending one since #614.
|
|
204
|
+
*
|
|
205
|
+
* **Every session holding the device, not one.** A device can sit behind two sessions, and the one
|
|
206
|
+
* that happened to make the last request is not necessarily the one whose tester is looking at it.
|
|
207
|
+
*
|
|
208
|
+
* Synchronous on purpose: `deviceFor` asks simctl before believing a device is up, and this runs
|
|
209
|
+
* from a timer while something has just gone wrong with that device. The state being reported is
|
|
210
|
+
* about the filter, not about whether the simulator is still booted.
|
|
211
|
+
*/
|
|
212
|
+
private reportEnforcementLost;
|
|
213
|
+
private handleNetworkSet;
|
|
214
|
+
/**
|
|
215
|
+
* The two capability entry points, which resolve their device the way every other one on this class
|
|
216
|
+
* does — **`soleDeviceState`, not the first key in the map.**
|
|
217
|
+
*
|
|
218
|
+
* `deviceStates` holds one entry per *registered* simulator and this Mac reports dozens, so
|
|
219
|
+
* `keys().next()` is whichever simctl listed first, almost always a shut-down one. That was wrong
|
|
220
|
+
* before the liveness check and became a hard failure after it: `deviceFor` answers `undefined` for
|
|
221
|
+
* a shut-down device, so both of these threw `No booted device` while a booted device sat right
|
|
222
|
+
* there. `soleDeviceState` filters on `booted` and refuses to guess between two, which is the
|
|
223
|
+
* policy this class already settled and wrote down — these were simply not using it.
|
|
224
|
+
*
|
|
225
|
+
* `deviceFor` stays for the wire path, where the caller names a session and the only open question
|
|
226
|
+
* is whether that device is up.
|
|
227
|
+
*/
|
|
228
|
+
setNetworkOffline(offline: boolean): Promise<NetworkStatePayload>;
|
|
229
|
+
networkState(): Promise<NetworkStatePayload>;
|
|
77
230
|
launchApp(bundleId: string): Promise<void>;
|
|
78
231
|
/** The one booted session, or undefined when there is no unambiguous answer. Callers that can
|
|
79
232
|
* reasonably do nothing (input) use this; callers that owe the user a result use
|
|
80
233
|
* `soleDeviceState`, which throws instead. */
|
|
81
234
|
private liveDeviceState;
|
|
235
|
+
/** The one device out of `live`, or the refusal. Factored so the async resolver below answers
|
|
236
|
+
* ambiguity with the same words rather than its own. */
|
|
237
|
+
private soleOf;
|
|
238
|
+
/**
|
|
239
|
+
* **The synchronous resolver, and `stream()` is the only caller left.**
|
|
240
|
+
*
|
|
241
|
+
* Everything else that resolves a device for a capability call awaits `soleLiveDeviceState`,
|
|
242
|
+
* which asks simctl rather than trusting `booted` — a flag `initDeviceStates` clears on every
|
|
243
|
+
* reconnect. `stream()` returns a `ReadableStream` and is part of `DeviceAgent`, so it cannot
|
|
244
|
+
* await without changing that interface across both agents.
|
|
245
|
+
*
|
|
246
|
+
* **It is deliberately left with the stale flag, and nothing was added to paper over that.** A
|
|
247
|
+
* refresh that marked every simulator simctl reports as booted was written and removed: it also
|
|
248
|
+
* marked the ones a developer had open in Simulator.app, which destroys the very thing `booted`
|
|
249
|
+
* disambiguates by — *the device this agent booted* — and made all the callers above refuse with
|
|
250
|
+
* "2 booted devices" on the common two-simulator desk. Fire-and-forget, it could also resurrect a
|
|
251
|
+
* flag a `device:shutdown` had just cleared, with no path back.
|
|
252
|
+
*
|
|
253
|
+
* That was a mechanism for a method **nothing in this repo calls**. A future caller needs the
|
|
254
|
+
* interface decision, not a guess: make `stream()` async across `DeviceAgent`, or give it an
|
|
255
|
+
* explicit device argument.
|
|
256
|
+
*/
|
|
82
257
|
private soleDeviceState;
|
|
83
|
-
|
|
258
|
+
/**
|
|
259
|
+
* `soleDeviceState`, but **it asks simctl before believing that nothing is booted**.
|
|
260
|
+
*
|
|
261
|
+
* `booted` is a cache and `initDeviceStates` clears it on `agent:registered` — every reconnect,
|
|
262
|
+
* not only the first connection. So after a relay restart every flag reads false while the
|
|
263
|
+
* simulators are still running, and a resolver that trusts the cache refuses a live device until
|
|
264
|
+
* something else happens to refresh it. On the wire path that is `deviceFor`; these two entry
|
|
265
|
+
* points have no session id to work from, so without this they stay broken.
|
|
266
|
+
*
|
|
267
|
+
* Only the empty case pays for the `listDevices` call: a cache that already names a booted device
|
|
268
|
+
* is not wrong, just possibly incomplete, and the ambiguity refusal is stricter for having fewer
|
|
269
|
+
* candidates rather than looser.
|
|
270
|
+
*
|
|
271
|
+
* **Every entry point that can await now comes through here** — the network pair, `installApp`,
|
|
272
|
+
* `launchApp`, `queryUITree`, `screenshot`, `openUrl`. `stream()` cannot, and `soleDeviceState`
|
|
273
|
+
* above says what that costs and why nothing was bolted on to hide it.
|
|
274
|
+
*/
|
|
275
|
+
private soleLiveDeviceState;
|
|
276
|
+
private soleLiveDeviceId;
|
|
84
277
|
queryUITree(): Promise<UIElement[]>;
|
|
85
278
|
private audioEnabled;
|
|
86
279
|
private startAudioCapture;
|
package/dist/IOSAgent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IOSAgent.d.ts","sourceRoot":"","sources":["../src/IOSAgent.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"IOSAgent.d.ts","sourceRoot":"","sources":["../src/IOSAgent.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAA4C,MAAM,EAAE,WAAW,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAsCpK,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIrD,CAAA;AACD,OAAO,EASL,KAAK,YAAY,EAUlB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EAAE,aAAa,EAA2D,MAAM,oBAAoB,CAAA;AAC3G,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AA0BxD,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,2FAA2F;IAC3F,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,2FAA2F;IAC3F,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,+FAA+F;IAC/F,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kEAAkE;IAClE,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B;6FACyF;IACzF,OAAO,CAAC,EAAE,gBAAgB,CAAA;CAC3B;AAkDD,qBAAa,QAAS,YAAW,WAAW,EAAE,wBAAwB;IACpE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAQ;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAQ;IAC3C,OAAO,CAAC,EAAE,CAAyB;IAEnC;;;;;;;;;;;;;iDAa6C;IAC7C,OAAO,CAAC,OAAO;IAKf;;;;;6CAKyC;IACzC,OAAO,CAAC,MAAM;IAGd,OAAO,CAAC,YAAY,CAAiC;IACrD;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IAIjD,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;IAGpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IACpD,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,eAAe,CAA6C;IACpE,OAAO,CAAC,iBAAiB,CAAI;gBAEjB,OAAO,GAAE,eAAoB,EAAE,MAAM,CAAC,EAAE,aAAa;IAsCjE,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAG7B;IAEK,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwG9C,OAAO,CAAC,gBAAgB;IA+BxB,UAAU,IAAI,IAAI;IAoBlB,OAAO,CAAC,kBAAkB;IAmC1B,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,cAAc;IA4BtB,OAAO,CAAC,iBAAiB;IA8EzB,OAAO,CAAC,eAAe;YAST,YAAY;IAO1B;;;;;+GAK2G;IAC3G,OAAO,CAAC,WAAW;IAKnB;;;;;;wDAMoD;IACpD,OAAO,CAAC,WAAW;YAsBL,gBAAgB;YAwKhB,sBAAsB;YAWtB,oBAAoB;IAkDlC,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2B;IAM1D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA4B;IAE5D,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,cAAc;IAWtB;;;;;;;;;;qEAUiE;IACjE,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,YAAY;IAWpB;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,aAAa;YAyBP,QAAQ;YAWR,QAAQ;IAOtB,OAAO,CAAC,kBAAkB;YA8mBZ,UAAU;IAQxB;;;;OAIG;YACW,YAAY;IA8C1B,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAChC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACzC;;;;mFAI+E;IACzE,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAShD,4EAA4E;IAC5E;;;;;;;;;;;;;;;;;;;OAmBG;YACW,SAAS;IASvB;;;;;;OAMG;YACW,kBAAkB;IAMhC;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,qBAAqB;YAOf,gBAAgB;IAoB9B;;;;;;;;;;;;;OAaG;IACG,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAIjE,YAAY,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAI5C,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD;;mDAE+C;IAC/C,OAAO,CAAC,eAAe;IAKvB;6DACyD;IACzD,OAAO,CAAC,MAAM;IAUd;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,eAAe;IAWvB;;;;;;;;;;;;;;;;OAgBG;YACW,mBAAmB;YAmBnB,gBAAgB;IAIxB,WAAW,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAczC,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,gBAAgB;YAYV,SAAS;IAiBjB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IACnC,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC;IAShC,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAItC,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAMnB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG1C"}
|