effect-browser 0.2.0-beta.7 → 0.2.0-beta.8
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 +486 -152
- package/dist/Browser-n-bKgBNN.d.mts +372 -0
- package/dist/Browser.d.mts +3 -200
- package/dist/Browser.mjs +9 -1
- package/dist/Browser.mjs.map +1 -1
- package/dist/{BrowserData-KHk4o__c.d.mts → BrowserData-CPIIIHol.d.mts} +81 -7
- package/dist/BrowserData.d.mts +2 -2
- package/dist/BrowserData.mjs +104 -6
- package/dist/BrowserData.mjs.map +1 -1
- package/dist/{BrowserRuntime-hxkTNlRa.d.mts → BrowserRuntime-CFe9uUTv.d.mts} +16 -11
- package/dist/{BrowserRuntime-Cr76CN4I.mjs → BrowserRuntime-HJ1yYlFS.mjs} +4990 -4309
- package/dist/BrowserRuntime-HJ1yYlFS.mjs.map +1 -0
- package/dist/BrowserRuntime.d.mts +2 -2
- package/dist/BrowserRuntime.mjs +2 -1
- package/dist/Capture.d.mts +9 -7
- package/dist/Capture.mjs +157 -32
- package/dist/Capture.mjs.map +1 -1
- package/dist/{CaptureData-Dys0Ko9d.mjs → CaptureData-CYriZHX1.mjs} +25 -6
- package/dist/CaptureData-CYriZHX1.mjs.map +1 -0
- package/dist/CaptureData.d.mts +62 -3
- package/dist/CaptureData.mjs +2 -2
- package/dist/Chromium.d.mts +2 -2
- package/dist/Chromium.mjs +19 -10
- package/dist/Chromium.mjs.map +1 -1
- package/dist/Errors.d.mts +66 -17
- package/dist/Errors.mjs +47 -5
- package/dist/Errors.mjs.map +1 -1
- package/dist/Images-CaaPNeed.mjs +76 -0
- package/dist/Images-CaaPNeed.mjs.map +1 -0
- package/dist/OperationOptions-DAeRS6O9.mjs +55 -0
- package/dist/OperationOptions-DAeRS6O9.mjs.map +1 -0
- package/dist/PageControl.d.mts +6 -6
- package/dist/PageControl.mjs +16 -10
- package/dist/PageControl.mjs.map +1 -1
- package/dist/PageRegistry-B3q9DS3g.mjs +164 -0
- package/dist/PageRegistry-B3q9DS3g.mjs.map +1 -0
- package/dist/Plan-D8qQ48Ic.mjs +512 -0
- package/dist/Plan-D8qQ48Ic.mjs.map +1 -0
- package/dist/Plan.d.mts +3 -0
- package/dist/Plan.mjs +2 -0
- package/dist/PlanData-B668RxbQ.d.mts +4831 -0
- package/dist/PlanData.d.mts +3 -0
- package/dist/PlanData.mjs +268 -0
- package/dist/PlanData.mjs.map +1 -0
- package/dist/PlanInput-BJcPPncs.mjs +75 -0
- package/dist/PlanInput-BJcPPncs.mjs.map +1 -0
- package/dist/PublicSession-Bs61Eal8.mjs +5601 -0
- package/dist/PublicSession-Bs61Eal8.mjs.map +1 -0
- package/dist/Testing.d.mts +48 -6
- package/dist/Testing.mjs +651 -113
- package/dist/Testing.mjs.map +1 -1
- package/dist/Timeline-fV22Xk-S.d.mts +29 -0
- package/dist/Timeline.d.mts +4 -0
- package/dist/Timeline.mjs +20 -0
- package/dist/Timeline.mjs.map +1 -0
- package/dist/TimelineData-BsOn-YGZ.d.mts +3818 -0
- package/dist/TimelineData.d.mts +3 -0
- package/dist/TimelineData.mjs +482 -0
- package/dist/TimelineData.mjs.map +1 -0
- package/dist/index.d.mts +5 -1
- package/dist/index.mjs +5 -1
- package/package.json +17 -1
- package/dist/Association-CH3kPHXE.mjs +0 -167
- package/dist/Association-CH3kPHXE.mjs.map +0 -1
- package/dist/BrowserRuntime-Cr76CN4I.mjs.map +0 -1
- package/dist/CaptureData-Dys0Ko9d.mjs.map +0 -1
- package/dist/PageControlAssociation-DabEg5AR.mjs +0 -10
- package/dist/PageControlAssociation-DabEg5AR.mjs.map +0 -1
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
import { BrowserError, BrowserOutcome, Reasons } from "./Errors.mjs";
|
|
2
|
-
import { Exit, Schema } from "effect";
|
|
3
|
-
//#region src/internal/browser/NativeCalls.ts
|
|
4
|
-
/**
|
|
5
|
-
* A native step failed. It names no operation: the owner stamps the one the caller asked for
|
|
6
|
-
* when it admits the work, so a step's own vocabulary can never become public API.
|
|
7
|
-
*/
|
|
8
|
-
var NativeFailure = class extends Schema.TaggedError()("NativeFailure", {
|
|
9
|
-
reason: BrowserError.fields.reason,
|
|
10
|
-
outcome: Schema.optionalKey(BrowserOutcome)
|
|
11
|
-
}) {};
|
|
12
|
-
/**
|
|
13
|
-
* The only way a native failure becomes public. A fenced ticket already speaks publicly and
|
|
14
|
-
* passes through with the operation the owner gave it; a native failure keeps its reason and
|
|
15
|
-
* takes the caller's operation; anything else is the caller's fallback.
|
|
16
|
-
*/
|
|
17
|
-
const publicError = (error, operation, fallback) => {
|
|
18
|
-
if (Schema.is(BrowserError)(error)) return error;
|
|
19
|
-
const known = Schema.is(NativeFailure)(error) ? error : fallback;
|
|
20
|
-
return BrowserError.make({
|
|
21
|
-
operation,
|
|
22
|
-
reason: known.reason,
|
|
23
|
-
outcome: known.outcome ?? fallback.outcome
|
|
24
|
-
});
|
|
25
|
-
};
|
|
26
|
-
/** Shared by the Playwright driver's seams, so every native call fails in the same vocabulary. */
|
|
27
|
-
const failure = (reason, outcome) => NativeFailure.make({
|
|
28
|
-
reason,
|
|
29
|
-
...outcome === void 0 ? {} : { outcome }
|
|
30
|
-
});
|
|
31
|
-
const safeDecode = (codec, raw) => {
|
|
32
|
-
const decoded = Schema.decodeUnknownExit(codec)(raw);
|
|
33
|
-
if (Exit.isFailure(decoded)) throw failure(Reasons.Malformed.make({}));
|
|
34
|
-
return decoded.value;
|
|
35
|
-
};
|
|
36
|
-
const escapes = /\u001b\[[0-9;]*m/g;
|
|
37
|
-
const addresses = /\b[a-z][a-z0-9+.-]*:\/\/[^\s"'<>]*/gi;
|
|
38
|
-
/**
|
|
39
|
-
* An address keeps only its origin: a path, query or user name can carry a credential, such as
|
|
40
|
-
* a DevTools endpoint's browser id or a provider's signed connection URL.
|
|
41
|
-
*/
|
|
42
|
-
const originOf = (address) => {
|
|
43
|
-
try {
|
|
44
|
-
const parsed = new URL(address);
|
|
45
|
-
return parsed.host === "" ? `${parsed.protocol}…` : `${parsed.protocol}//${parsed.host}/…`;
|
|
46
|
-
} catch {
|
|
47
|
-
return "…";
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
/**
|
|
51
|
-
* The first line of what the engine said, which names the call and its reason. Playwright's
|
|
52
|
-
* call log below it repeats addresses, selectors and endpoints, so it never leaves.
|
|
53
|
-
*/
|
|
54
|
-
const nativeDetail = (error) => {
|
|
55
|
-
const line = (error instanceof Error ? error.message : typeof error === "string" ? error : void 0)?.replace(escapes, "").split("\n", 1)[0]?.trim();
|
|
56
|
-
if (line === void 0 || line === "") return void 0;
|
|
57
|
-
return line.replace(addresses, originOf).slice(0, 512);
|
|
58
|
-
};
|
|
59
|
-
/** A raw failure the engine raised, with what it said about it. */
|
|
60
|
-
const providerReason = (error) => {
|
|
61
|
-
const detail = nativeDetail(error);
|
|
62
|
-
return Reasons.Provider.make(detail === void 0 ? {} : { detail });
|
|
63
|
-
};
|
|
64
|
-
/**
|
|
65
|
-
* No raw exception from Playwright crosses this private boundary: only its sanitized first line
|
|
66
|
-
* does, as the provider reason's detail. A ticket's own fence is already a public error and
|
|
67
|
-
* passes through with the operation the owner gave it.
|
|
68
|
-
*/
|
|
69
|
-
const sanitize = (action) => Promise.resolve().then(action).catch((error) => {
|
|
70
|
-
throw Schema.is(BrowserError)(error) || Schema.is(NativeFailure)(error) ? error : failure(providerReason(error));
|
|
71
|
-
});
|
|
72
|
-
const closeWithin = async (action, milliseconds = 2e3) => {
|
|
73
|
-
let timer;
|
|
74
|
-
try {
|
|
75
|
-
await Promise.race([Promise.resolve().then(action), new Promise((_, reject) => {
|
|
76
|
-
timer = setTimeout(() => reject(failure(Reasons.Timeout.make({}))), milliseconds);
|
|
77
|
-
})]);
|
|
78
|
-
} finally {
|
|
79
|
-
clearTimeout(timer);
|
|
80
|
-
}
|
|
81
|
-
};
|
|
82
|
-
const timeout = (ticket) => {
|
|
83
|
-
ticket.check();
|
|
84
|
-
return ticket.remainingMillis();
|
|
85
|
-
};
|
|
86
|
-
//#endregion
|
|
87
|
-
//#region src/internal/browser/Images.ts
|
|
88
|
-
const malformed = () => failure(Reasons.Malformed.make({}));
|
|
89
|
-
/** A checked read: a truncated segment is malformed framing, never `undefined` arithmetic. */
|
|
90
|
-
const byteAt = (bytes, index) => {
|
|
91
|
-
const byte = bytes[index];
|
|
92
|
-
if (byte === void 0) throw malformed();
|
|
93
|
-
return byte;
|
|
94
|
-
};
|
|
95
|
-
/** Parse framing only; a caller decoding media must still validate its complete bitstream. */
|
|
96
|
-
const pngGeometry = (bytes) => {
|
|
97
|
-
if (bytes.length < 33 || [
|
|
98
|
-
137,
|
|
99
|
-
80,
|
|
100
|
-
78,
|
|
101
|
-
71,
|
|
102
|
-
13,
|
|
103
|
-
10,
|
|
104
|
-
26,
|
|
105
|
-
10
|
|
106
|
-
].some((b, i) => bytes[i] !== b) || bytes[12] !== 73 || bytes[13] !== 72 || bytes[14] !== 68 || bytes[15] !== 82) throw malformed();
|
|
107
|
-
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
108
|
-
if (view.getUint32(8) !== 13) throw malformed();
|
|
109
|
-
const width = view.getUint32(16), height = view.getUint32(20);
|
|
110
|
-
if (width === 0 || height === 0) throw malformed();
|
|
111
|
-
return {
|
|
112
|
-
width,
|
|
113
|
-
height
|
|
114
|
-
};
|
|
115
|
-
};
|
|
116
|
-
/** JPEG SOF dimensions avoid trusting the requested size or CSS viewport dimensions. */
|
|
117
|
-
const jpegGeometry = (bytes) => {
|
|
118
|
-
if (bytes.length < 4 || bytes[0] !== 255 || bytes[1] !== 216) throw malformed();
|
|
119
|
-
let offset = 2;
|
|
120
|
-
while (offset + 3 < bytes.length) {
|
|
121
|
-
if (bytes[offset++] !== 255) throw malformed();
|
|
122
|
-
while (bytes[offset] === 255) offset++;
|
|
123
|
-
const marker = bytes[offset++];
|
|
124
|
-
if (marker === void 0 || marker === 217 || marker === 218) break;
|
|
125
|
-
if (marker === 1 || marker >= 208 && marker <= 215) continue;
|
|
126
|
-
if (offset + 1 >= bytes.length) throw malformed();
|
|
127
|
-
const size = byteAt(bytes, offset) * 256 + byteAt(bytes, offset + 1);
|
|
128
|
-
if (size < 2 || offset + size > bytes.length) throw malformed();
|
|
129
|
-
if ([
|
|
130
|
-
192,
|
|
131
|
-
193,
|
|
132
|
-
194,
|
|
133
|
-
195,
|
|
134
|
-
197,
|
|
135
|
-
198,
|
|
136
|
-
199,
|
|
137
|
-
201,
|
|
138
|
-
202,
|
|
139
|
-
203,
|
|
140
|
-
205,
|
|
141
|
-
206,
|
|
142
|
-
207
|
|
143
|
-
].includes(marker)) {
|
|
144
|
-
if (size < 8) throw malformed();
|
|
145
|
-
const height = byteAt(bytes, offset + 3) * 256 + byteAt(bytes, offset + 4);
|
|
146
|
-
const width = byteAt(bytes, offset + 5) * 256 + byteAt(bytes, offset + 6);
|
|
147
|
-
if (width === 0 || height === 0) throw malformed();
|
|
148
|
-
return {
|
|
149
|
-
width,
|
|
150
|
-
height
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
offset += size;
|
|
154
|
-
}
|
|
155
|
-
throw malformed();
|
|
156
|
-
};
|
|
157
|
-
//#endregion
|
|
158
|
-
//#region src/internal/browser/Association.ts
|
|
159
|
-
const parents = /* @__PURE__ */ new WeakMap();
|
|
160
|
-
const associate = (session, parent) => {
|
|
161
|
-
parents.set(session, parent);
|
|
162
|
-
};
|
|
163
|
-
const captureParent = (session) => parents.get(session);
|
|
164
|
-
//#endregion
|
|
165
|
-
export { NativeFailure as a, providerReason as c, sanitize as d, timeout as f, pngGeometry as i, publicError as l, captureParent as n, closeWithin as o, jpegGeometry as r, failure as s, associate as t, safeDecode as u };
|
|
166
|
-
|
|
167
|
-
//# sourceMappingURL=Association-CH3kPHXE.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Association-CH3kPHXE.mjs","names":[],"sources":["../src/internal/browser/NativeCalls.ts","../src/internal/browser/Images.ts","../src/internal/browser/Association.ts"],"sourcesContent":["import { Exit, Schema } from \"effect\";\n\nimport {\n BrowserError,\n BrowserOutcome,\n Reasons,\n type BrowserOperation,\n type BrowserReason,\n} from \"../../Errors.ts\";\nimport type { ReadTicket } from \"./Owner.ts\";\n\n/**\n * A native step failed. It names no operation: the owner stamps the one the caller asked for\n * when it admits the work, so a step's own vocabulary can never become public API.\n */\nexport class NativeFailure extends Schema.TaggedError<NativeFailure>()(\"NativeFailure\", {\n reason: BrowserError.fields.reason,\n // Some native helpers run both before and after dispatch. Only their owner has that evidence.\n outcome: Schema.optionalKey(BrowserOutcome),\n}) {}\n\n/**\n * The only way a native failure becomes public. A fenced ticket already speaks publicly and\n * passes through with the operation the owner gave it; a native failure keeps its reason and\n * takes the caller's operation; anything else is the caller's fallback.\n */\nexport const publicError = (\n error: unknown,\n operation: BrowserOperation,\n fallback: Pick<BrowserError, \"reason\" | \"outcome\">,\n): BrowserError => {\n if (Schema.is(BrowserError)(error)) return error;\n const known = Schema.is(NativeFailure)(error) ? error : fallback;\n\n return BrowserError.make({\n operation,\n reason: known.reason,\n outcome: known.outcome ?? fallback.outcome,\n });\n};\n\n/** Shared by the Playwright driver's seams, so every native call fails in the same vocabulary. */\nexport const failure = (reason: BrowserReason, outcome?: BrowserOutcome) =>\n NativeFailure.make({ reason, ...(outcome === undefined ? {} : { outcome }) });\n\nexport const safeDecode = <A>(codec: Schema.Codec<A, unknown, never, never>, raw: unknown): A => {\n const decoded = Schema.decodeUnknownExit(codec)(raw);\n\n // A schema issue and a throw while reading the reply are both a malformed reply.\n if (Exit.isFailure(decoded)) throw failure(Reasons.Malformed.make({}));\n\n return decoded.value;\n};\n\n// oxlint-disable-next-line no-control-regex -- matches the terminal escape codes Playwright colours its call log with\nconst escapes = /\\u001b\\[[0-9;]*m/g;\n\nconst addresses = /\\b[a-z][a-z0-9+.-]*:\\/\\/[^\\s\"'<>]*/gi;\n\n/**\n * An address keeps only its origin: a path, query or user name can carry a credential, such as\n * a DevTools endpoint's browser id or a provider's signed connection URL.\n */\nconst originOf = (address: string): string => {\n try {\n const parsed = new URL(address);\n\n return parsed.host === \"\" ? `${parsed.protocol}…` : `${parsed.protocol}//${parsed.host}/…`;\n } catch {\n return \"…\";\n }\n};\n\n/**\n * The first line of what the engine said, which names the call and its reason. Playwright's\n * call log below it repeats addresses, selectors and endpoints, so it never leaves.\n */\nexport const nativeDetail = (error: unknown): string | undefined => {\n const message =\n error instanceof Error ? error.message : typeof error === \"string\" ? error : undefined;\n\n const line = message?.replace(escapes, \"\").split(\"\\n\", 1)[0]?.trim();\n\n if (line === undefined || line === \"\") return undefined;\n\n return line.replace(addresses, originOf).slice(0, 512);\n};\n\n/** A raw failure the engine raised, with what it said about it. */\nexport const providerReason = (error: unknown) => {\n const detail = nativeDetail(error);\n\n return Reasons.Provider.make(detail === undefined ? {} : { detail });\n};\n\n/**\n * No raw exception from Playwright crosses this private boundary: only its sanitized first line\n * does, as the provider reason's detail. A ticket's own fence is already a public error and\n * passes through with the operation the owner gave it.\n */\nexport const sanitize = <A>(action: () => Promise<A>): Promise<A> =>\n Promise.resolve()\n .then(action)\n .catch((error: unknown) => {\n throw Schema.is(BrowserError)(error) || Schema.is(NativeFailure)(error)\n ? error\n : failure(providerReason(error));\n });\n\nexport const closeWithin = async (\n action: () => Promise<unknown>,\n milliseconds = 2000,\n): Promise<void> => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n try {\n await Promise.race([\n Promise.resolve().then(action),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(failure(Reasons.Timeout.make({}))), milliseconds);\n }),\n ]);\n } finally {\n clearTimeout(timer);\n }\n};\n\n// The native timeout is finite as well as Effect's authoritative deadline. It cannot undo dispatch.\nexport const timeout = (ticket: ReadTicket) => {\n ticket.check();\n\n return ticket.remainingMillis();\n};\n","import { Reasons } from \"../../Errors.ts\";\nimport { failure } from \"./NativeCalls.ts\";\n\nconst malformed = () => failure(Reasons.Malformed.make({}));\n\n/** A checked read: a truncated segment is malformed framing, never `undefined` arithmetic. */\nconst byteAt = (bytes: Uint8Array, index: number): number => {\n const byte = bytes[index];\n\n if (byte === undefined) throw malformed();\n\n return byte;\n};\n\n/** Parse framing only; a caller decoding media must still validate its complete bitstream. */\nexport const pngGeometry = (bytes: Uint8Array): { width: number; height: number } => {\n const signature = [137, 80, 78, 71, 13, 10, 26, 10];\n\n if (\n bytes.length < 33 ||\n signature.some((b, i) => bytes[i] !== b) ||\n bytes[12] !== 73 ||\n bytes[13] !== 72 ||\n bytes[14] !== 68 ||\n bytes[15] !== 82\n )\n throw malformed();\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n\n if (view.getUint32(8) !== 13) throw malformed();\n\n const width = view.getUint32(16),\n height = view.getUint32(20);\n\n if (width === 0 || height === 0) throw malformed();\n\n return { width, height };\n};\n\n/** JPEG SOF dimensions avoid trusting the requested size or CSS viewport dimensions. */\nexport const jpegGeometry = (bytes: Uint8Array): { width: number; height: number } => {\n if (bytes.length < 4 || bytes[0] !== 255 || bytes[1] !== 216) throw malformed();\n let offset = 2;\n\n while (offset + 3 < bytes.length) {\n if (bytes[offset++] !== 255) throw malformed();\n while (bytes[offset] === 255) offset++;\n const marker = bytes[offset++];\n\n if (marker === undefined || marker === 217 || marker === 218) break;\n if (marker === 1 || (marker >= 208 && marker <= 215)) continue;\n if (offset + 1 >= bytes.length) throw malformed();\n const size = byteAt(bytes, offset) * 256 + byteAt(bytes, offset + 1);\n\n if (size < 2 || offset + size > bytes.length) throw malformed();\n if ([192, 193, 194, 195, 197, 198, 199, 201, 202, 203, 205, 206, 207].includes(marker)) {\n if (size < 8) throw malformed();\n const height = byteAt(bytes, offset + 3) * 256 + byteAt(bytes, offset + 4);\n const width = byteAt(bytes, offset + 5) * 256 + byteAt(bytes, offset + 6);\n\n if (width === 0 || height === 0) throw malformed();\n\n return { width, height };\n }\n offset += size;\n }\n throw malformed();\n};\n","import type { Effect } from \"effect\";\n\nimport type { PageInfo, Target } from \"../../BrowserData.ts\";\nimport type { BrowserError } from \"../../Errors.ts\";\nimport type { CaptureSource } from \"./Driver.ts\";\nimport type { Owner, Ticket } from \"./Owner.ts\";\n\nexport interface CaptureLease {\n readonly stop: Effect.Effect<void>;\n readonly invalidate: (reason: string) => void;\n readonly reservedBytes: number;\n}\n\nexport interface CaptureResolution {\n /** Stable native page identity used to quarantine an unconfirmed screencast across reconnects. */\n readonly key: string;\n readonly target: Target;\n readonly source: CaptureSource;\n}\n\nexport interface CaptureParent {\n readonly owner: Owner;\n readonly resolve: (\n ticket: Ticket,\n target?: PageInfo,\n ) => Effect.Effect<CaptureResolution, BrowserError>;\n readonly target: () => Target;\n readonly captureLeases: Map<string, CaptureLease>;\n captureReservedBytes: number;\n}\n\n// This is a private capability registry, not stored domain data. Exact live session identity is\n// required: spreading/cloning a session must not copy authority to mutate its capture owner,\n// leases or reservations. A public/enumerable parent field would weaken that boundary.\n// Keep this access centralized here; schemas describe data, never this mutable ownership state.\nconst parents = new WeakMap<object, CaptureParent>();\n\nexport const associate = (session: object, parent: CaptureParent): void => {\n parents.set(session, parent);\n};\n\nexport const captureParent = (session: object): CaptureParent | undefined => parents.get(session);\n"],"mappings":";;;;;;;AAeA,IAAa,gBAAb,cAAmC,OAAO,YAA2B,CAAC,CAAC,iBAAiB;CACtF,QAAQ,aAAa,OAAO;CAE5B,SAAS,OAAO,YAAY,cAAc;AAC5C,CAAC,CAAC,CAAC,CAAC;;;;;;AAOJ,MAAa,eACX,OACA,WACA,aACiB;CACjB,IAAI,OAAO,GAAG,YAAY,CAAC,CAAC,KAAK,GAAG,OAAO;CAC3C,MAAM,QAAQ,OAAO,GAAG,aAAa,CAAC,CAAC,KAAK,IAAI,QAAQ;CAExD,OAAO,aAAa,KAAK;EACvB;EACA,QAAQ,MAAM;EACd,SAAS,MAAM,WAAW,SAAS;CACrC,CAAC;AACH;;AAGA,MAAa,WAAW,QAAuB,YAC7C,cAAc,KAAK;CAAE;CAAQ,GAAI,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ;AAAG,CAAC;AAE9E,MAAa,cAAiB,OAA+C,QAAoB;CAC/F,MAAM,UAAU,OAAO,kBAAkB,KAAK,CAAC,CAAC,GAAG;CAGnD,IAAI,KAAK,UAAU,OAAO,GAAG,MAAM,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC,CAAC;CAErE,OAAO,QAAQ;AACjB;AAGA,MAAM,UAAU;AAEhB,MAAM,YAAY;;;;;AAMlB,MAAM,YAAY,YAA4B;CAC5C,IAAI;EACF,MAAM,SAAS,IAAI,IAAI,OAAO;EAE9B,OAAO,OAAO,SAAS,KAAK,GAAG,OAAO,SAAS,KAAK,GAAG,OAAO,SAAS,IAAI,OAAO,KAAK;CACzF,QAAQ;EACN,OAAO;CACT;AACF;;;;;AAMA,MAAa,gBAAgB,UAAuC;CAIlE,MAAM,QAFJ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,UAAU,WAAW,QAAQ,KAAA,EAAA,EAEzD,QAAQ,SAAS,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK;CAEnE,IAAI,SAAS,KAAA,KAAa,SAAS,IAAI,OAAO,KAAA;CAE9C,OAAO,KAAK,QAAQ,WAAW,QAAQ,CAAC,CAAC,MAAM,GAAG,GAAG;AACvD;;AAGA,MAAa,kBAAkB,UAAmB;CAChD,MAAM,SAAS,aAAa,KAAK;CAEjC,OAAO,QAAQ,SAAS,KAAK,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,CAAC;AACrE;;;;;;AAOA,MAAa,YAAe,WAC1B,QAAQ,QAAQ,CAAC,CACd,KAAK,MAAM,CAAC,CACZ,OAAO,UAAmB;CACzB,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,KAAK,KAAK,OAAO,GAAG,aAAa,CAAC,CAAC,KAAK,IAClE,QACA,QAAQ,eAAe,KAAK,CAAC;AACnC,CAAC;AAEL,MAAa,cAAc,OACzB,QACA,eAAe,QACG;CAClB,IAAI;CAEJ,IAAI;EACF,MAAM,QAAQ,KAAK,CACjB,QAAQ,QAAQ,CAAC,CAAC,KAAK,MAAM,GAC7B,IAAI,SAAgB,GAAG,WAAW;GAChC,QAAQ,iBAAiB,OAAO,QAAQ,QAAQ,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY;EAClF,CAAC,CACH,CAAC;CACH,UAAU;EACR,aAAa,KAAK;CACpB;AACF;AAGA,MAAa,WAAW,WAAuB;CAC7C,OAAO,MAAM;CAEb,OAAO,OAAO,gBAAgB;AAChC;;;ACjIA,MAAM,kBAAkB,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC,CAAC;;AAG1D,MAAM,UAAU,OAAmB,UAA0B;CAC3D,MAAM,OAAO,MAAM;CAEnB,IAAI,SAAS,KAAA,GAAW,MAAM,UAAU;CAExC,OAAO;AACT;;AAGA,MAAa,eAAe,UAAyD;CAGnF,IACE,MAAM,SAAS,MACf;EAJiB;EAAK;EAAI;EAAI;EAAI;EAAI;EAAI;EAAI;CAItC,CAAC,CAAC,MAAM,GAAG,MAAM,MAAM,OAAO,CAAC,KACvC,MAAM,QAAQ,MACd,MAAM,QAAQ,MACd,MAAM,QAAQ,MACd,MAAM,QAAQ,IAEd,MAAM,UAAU;CAClB,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;CAE1E,IAAI,KAAK,UAAU,CAAC,MAAM,IAAI,MAAM,UAAU;CAE9C,MAAM,QAAQ,KAAK,UAAU,EAAE,GAC7B,SAAS,KAAK,UAAU,EAAE;CAE5B,IAAI,UAAU,KAAK,WAAW,GAAG,MAAM,UAAU;CAEjD,OAAO;EAAE;EAAO;CAAO;AACzB;;AAGA,MAAa,gBAAgB,UAAyD;CACpF,IAAI,MAAM,SAAS,KAAK,MAAM,OAAO,OAAO,MAAM,OAAO,KAAK,MAAM,UAAU;CAC9E,IAAI,SAAS;CAEb,OAAO,SAAS,IAAI,MAAM,QAAQ;EAChC,IAAI,MAAM,cAAc,KAAK,MAAM,UAAU;EAC7C,OAAO,MAAM,YAAY,KAAK;EAC9B,MAAM,SAAS,MAAM;EAErB,IAAI,WAAW,KAAA,KAAa,WAAW,OAAO,WAAW,KAAK;EAC9D,IAAI,WAAW,KAAM,UAAU,OAAO,UAAU,KAAM;EACtD,IAAI,SAAS,KAAK,MAAM,QAAQ,MAAM,UAAU;EAChD,MAAM,OAAO,OAAO,OAAO,MAAM,IAAI,MAAM,OAAO,OAAO,SAAS,CAAC;EAEnE,IAAI,OAAO,KAAK,SAAS,OAAO,MAAM,QAAQ,MAAM,UAAU;EAC9D,IAAI;GAAC;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;EAAG,CAAC,CAAC,SAAS,MAAM,GAAG;GACtF,IAAI,OAAO,GAAG,MAAM,UAAU;GAC9B,MAAM,SAAS,OAAO,OAAO,SAAS,CAAC,IAAI,MAAM,OAAO,OAAO,SAAS,CAAC;GACzE,MAAM,QAAQ,OAAO,OAAO,SAAS,CAAC,IAAI,MAAM,OAAO,OAAO,SAAS,CAAC;GAExE,IAAI,UAAU,KAAK,WAAW,GAAG,MAAM,UAAU;GAEjD,OAAO;IAAE;IAAO;GAAO;EACzB;EACA,UAAU;CACZ;CACA,MAAM,UAAU;AAClB;;;AChCA,MAAM,0BAAU,IAAI,QAA+B;AAEnD,MAAa,aAAa,SAAiB,WAAgC;CACzE,QAAQ,IAAI,SAAS,MAAM;AAC7B;AAEA,MAAa,iBAAiB,YAA+C,QAAQ,IAAI,OAAO"}
|