@meterapp/car-image 1.0.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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/dist/agent-config.js +104 -0
  4. package/dist/agent-config.js.map +1 -0
  5. package/dist/args.js +145 -0
  6. package/dist/args.js.map +1 -0
  7. package/dist/bin.js +9 -0
  8. package/dist/bin.js.map +1 -0
  9. package/dist/browser.js +20 -0
  10. package/dist/browser.js.map +1 -0
  11. package/dist/client.js +38 -0
  12. package/dist/client.js.map +1 -0
  13. package/dist/commands/agents.js +38 -0
  14. package/dist/commands/agents.js.map +1 -0
  15. package/dist/commands/billing.js +41 -0
  16. package/dist/commands/billing.js.map +1 -0
  17. package/dist/commands/catalog.js +169 -0
  18. package/dist/commands/catalog.js.map +1 -0
  19. package/dist/commands/describe.js +52 -0
  20. package/dist/commands/describe.js.map +1 -0
  21. package/dist/commands/doctor.js +53 -0
  22. package/dist/commands/doctor.js.map +1 -0
  23. package/dist/commands/help.js +58 -0
  24. package/dist/commands/help.js.map +1 -0
  25. package/dist/commands/images.js +168 -0
  26. package/dist/commands/images.js.map +1 -0
  27. package/dist/commands/index.js +44 -0
  28. package/dist/commands/index.js.map +1 -0
  29. package/dist/commands/login.js +64 -0
  30. package/dist/commands/login.js.map +1 -0
  31. package/dist/commands/maintenance.js +156 -0
  32. package/dist/commands/maintenance.js.map +1 -0
  33. package/dist/commands/onboard.js +42 -0
  34. package/dist/commands/onboard.js.map +1 -0
  35. package/dist/commands/whoami.js +41 -0
  36. package/dist/commands/whoami.js.map +1 -0
  37. package/dist/config.js +84 -0
  38. package/dist/config.js.map +1 -0
  39. package/dist/context.js +2 -0
  40. package/dist/context.js.map +1 -0
  41. package/dist/describe.js +226 -0
  42. package/dist/describe.js.map +1 -0
  43. package/dist/device-login.js +42 -0
  44. package/dist/device-login.js.map +1 -0
  45. package/dist/doctor.js +280 -0
  46. package/dist/doctor.js.map +1 -0
  47. package/dist/errors.js +54 -0
  48. package/dist/errors.js.map +1 -0
  49. package/dist/main.js +170 -0
  50. package/dist/main.js.map +1 -0
  51. package/dist/mcp/server.js +149 -0
  52. package/dist/mcp/server.js.map +1 -0
  53. package/dist/output.js +90 -0
  54. package/dist/output.js.map +1 -0
  55. package/dist/prompts.js +29 -0
  56. package/dist/prompts.js.map +1 -0
  57. package/dist/telemetry.js +50 -0
  58. package/dist/telemetry.js.map +1 -0
  59. package/dist/update.js +142 -0
  60. package/dist/update.js.map +1 -0
  61. package/dist/version.js +5 -0
  62. package/dist/version.js.map +1 -0
  63. package/package.json +56 -0
@@ -0,0 +1,226 @@
1
+ const METHODS = ["get", "post", "put", "patch", "delete", "head", "options"];
2
+ function isObject(value) {
3
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
4
+ }
5
+ /** Follows `#/components/...` references (repeatedly) inside the same document. */
6
+ export function resolveRef(doc, node, depth = 0) {
7
+ if (!isObject(node))
8
+ return {};
9
+ const ref = node.$ref;
10
+ if (typeof ref !== "string" || depth > 8)
11
+ return node;
12
+ if (!ref.startsWith("#/"))
13
+ return node;
14
+ let current = doc;
15
+ for (const segment of ref.slice(2).split("/")) {
16
+ if (!isObject(current))
17
+ return node;
18
+ current = current[segment.replace(/~1/g, "/").replace(/~0/g, "~")];
19
+ }
20
+ return isObject(current) ? resolveRef(doc, current, depth + 1) : node;
21
+ }
22
+ export function listEndpoints(doc) {
23
+ const endpoints = [];
24
+ for (const [path, item] of Object.entries(doc.paths ?? {})) {
25
+ if (!isObject(item))
26
+ continue;
27
+ for (const method of METHODS) {
28
+ const operation = item[method];
29
+ if (!isObject(operation))
30
+ continue;
31
+ endpoints.push({
32
+ method: method.toUpperCase(),
33
+ path,
34
+ operationId: typeof operation.operationId === "string" ? operation.operationId : null,
35
+ summary: typeof operation.summary === "string" ? operation.summary : "",
36
+ operation,
37
+ });
38
+ }
39
+ }
40
+ return endpoints;
41
+ }
42
+ /** Matches by operationId, `METHOD /path`, path fragment or summary words (case-insensitive). */
43
+ export function findEndpoints(doc, query) {
44
+ const needle = query.trim().toLowerCase();
45
+ if (!needle || needle === "all")
46
+ return listEndpoints(doc);
47
+ const endpoints = listEndpoints(doc);
48
+ const exact = endpoints.filter((endpoint) => endpoint.operationId?.toLowerCase() === needle || `${endpoint.method} ${endpoint.path}`.toLowerCase() === needle || endpoint.path.toLowerCase() === needle);
49
+ if (exact.length)
50
+ return exact;
51
+ return endpoints.filter((endpoint) => endpoint.path.toLowerCase().includes(needle) ||
52
+ (endpoint.operationId ?? "").toLowerCase().includes(needle) ||
53
+ endpoint.summary.toLowerCase().includes(needle));
54
+ }
55
+ export function wrap(text, width = 88, indent = "") {
56
+ const words = text.replace(/\s+/g, " ").trim().split(" ");
57
+ const lines = [];
58
+ let line = "";
59
+ for (const word of words) {
60
+ if (line && (line.length + 1 + word.length) > width - indent.length) {
61
+ lines.push(indent + line);
62
+ line = word;
63
+ }
64
+ else {
65
+ line = line ? `${line} ${word}` : word;
66
+ }
67
+ }
68
+ if (line)
69
+ lines.push(indent + line);
70
+ return lines.join("\n");
71
+ }
72
+ /** One-line human summary of a JSON Schema fragment. */
73
+ export function schemaSummary(doc, raw, depth = 0) {
74
+ const schema = resolveRef(doc, raw);
75
+ if (Object.keys(schema).length === 0)
76
+ return "any";
77
+ const parts = [];
78
+ if (Array.isArray(schema.enum)) {
79
+ parts.push(`enum: ${schema.enum.map(String).join("|")}`);
80
+ }
81
+ else if (schema.const !== undefined) {
82
+ parts.push(typeof schema.type === "string" ? `${schema.type} const ${JSON.stringify(schema.const)}` : `const ${JSON.stringify(schema.const)}`);
83
+ }
84
+ else if (Array.isArray(schema.oneOf) || Array.isArray(schema.anyOf)) {
85
+ const options = (schema.oneOf ?? schema.anyOf);
86
+ parts.push(options.map((option) => schemaSummary(doc, option, depth + 1)).join(" | "));
87
+ }
88
+ else {
89
+ const type = Array.isArray(schema.type) ? schema.type.join("|") : typeof schema.type === "string" ? schema.type : schema.properties ? "object" : schema.items ? "array" : "any";
90
+ if (type === "array") {
91
+ parts.push(`array<${depth > 2 ? "…" : schemaSummary(doc, schema.items, depth + 1)}>`);
92
+ }
93
+ else if (type === "object" && isObject(schema.properties)) {
94
+ const required = new Set(Array.isArray(schema.required) ? schema.required.map(String) : []);
95
+ const fields = Object.keys(schema.properties).map((key) => (required.has(key) ? `${key}*` : key));
96
+ parts.push(depth > 2 ? "object" : `object {${fields.join(", ")}}`);
97
+ }
98
+ else {
99
+ parts.push(type);
100
+ }
101
+ }
102
+ const bounds = [];
103
+ if (typeof schema.minimum === "number" || typeof schema.maximum === "number") {
104
+ bounds.push(`${schema.minimum ?? "…"}–${schema.maximum ?? "…"}`);
105
+ }
106
+ if (typeof schema.minLength === "number" || typeof schema.maxLength === "number") {
107
+ bounds.push(`len ${schema.minLength ?? 0}–${schema.maxLength ?? "…"}`);
108
+ }
109
+ if (typeof schema.minItems === "number" || typeof schema.maxItems === "number") {
110
+ bounds.push(`items ${schema.minItems ?? 0}–${schema.maxItems ?? "…"}`);
111
+ }
112
+ if (typeof schema.format === "string")
113
+ bounds.push(schema.format);
114
+ if (bounds.length)
115
+ parts.push(`(${bounds.join(", ")})`);
116
+ if (schema.default !== undefined)
117
+ parts.push(`default ${JSON.stringify(schema.default)}`);
118
+ return parts.join(" ");
119
+ }
120
+ function parameterRows(doc, operation) {
121
+ const raw = Array.isArray(operation.parameters) ? operation.parameters : [];
122
+ return raw.map((entry) => {
123
+ const parameter = resolveRef(doc, entry);
124
+ return {
125
+ name: String(parameter.name ?? "?"),
126
+ location: String(parameter.in ?? "query"),
127
+ required: parameter.required === true,
128
+ schema: schemaSummary(doc, parameter.schema),
129
+ description: typeof parameter.description === "string" ? parameter.description : "",
130
+ };
131
+ });
132
+ }
133
+ function pad(text, width) {
134
+ return text.length >= width ? text : text + " ".repeat(width - text.length);
135
+ }
136
+ function securityLabel(doc, operation) {
137
+ const security = Array.isArray(operation.security) ? operation.security : Array.isArray(doc.security) ? doc.security : [];
138
+ if (security.length === 0)
139
+ return "public";
140
+ const schemes = security.flatMap((entry) => (isObject(entry) ? Object.keys(entry) : []));
141
+ if (schemes.length === 0 || security.some((entry) => isObject(entry) && Object.keys(entry).length === 0))
142
+ return "public";
143
+ return `Bearer API key (${schemes.join(", ")})`;
144
+ }
145
+ /** Full human description of one operation. */
146
+ export function formatEndpoint(doc, endpoint) {
147
+ const { operation } = endpoint;
148
+ const lines = [];
149
+ lines.push(`${endpoint.method} ${endpoint.path}${endpoint.operationId ? ` (${endpoint.operationId})` : ""}`);
150
+ if (endpoint.summary)
151
+ lines.push(` ${endpoint.summary}`);
152
+ if (typeof operation.description === "string" && operation.description.trim()) {
153
+ lines.push(wrap(operation.description, 88, " "));
154
+ }
155
+ lines.push(` Auth: ${securityLabel(doc, operation)}`);
156
+ const parameters = parameterRows(doc, operation);
157
+ if (parameters.length) {
158
+ lines.push(" Parameters:");
159
+ const nameWidth = Math.max(...parameters.map((row) => row.name.length));
160
+ const schemaWidth = Math.min(48, Math.max(...parameters.map((row) => row.schema.length)));
161
+ for (const row of parameters) {
162
+ const head = ` ${pad(row.name, nameWidth)} ${pad(row.location, 6)} ${row.required ? "required" : "optional"} ${pad(row.schema, schemaWidth)}`;
163
+ lines.push(row.description ? `${head} ${row.description}` : head.trimEnd());
164
+ }
165
+ }
166
+ const requestBody = resolveRef(doc, operation.requestBody);
167
+ if (isObject(requestBody.content)) {
168
+ for (const [mediaType, media] of Object.entries(requestBody.content)) {
169
+ if (!isObject(media))
170
+ continue;
171
+ lines.push(` Request body (${mediaType}${requestBody.required === true ? ", required" : ""}): ${schemaSummary(doc, media.schema)}`);
172
+ const schema = resolveRef(doc, media.schema);
173
+ if (isObject(schema.properties)) {
174
+ const required = new Set(Array.isArray(schema.required) ? schema.required.map(String) : []);
175
+ for (const [key, value] of Object.entries(schema.properties)) {
176
+ const property = resolveRef(doc, value);
177
+ const description = typeof property.description === "string" ? ` ${property.description}` : "";
178
+ lines.push(` ${key}${required.has(key) ? "*" : ""}: ${schemaSummary(doc, value, 1)}${description}`);
179
+ }
180
+ }
181
+ }
182
+ }
183
+ if (isObject(operation.responses)) {
184
+ lines.push(" Responses:");
185
+ for (const [status, value] of Object.entries(operation.responses)) {
186
+ const response = resolveRef(doc, value);
187
+ const description = typeof response.description === "string" ? response.description : "";
188
+ lines.push(` ${pad(status, 4)} ${description}`.trimEnd());
189
+ if (isObject(response.headers)) {
190
+ const headers = Object.entries(response.headers).map(([name, header]) => `${name} (${schemaSummary(doc, resolveRef(doc, header).schema)})`);
191
+ if (headers.length)
192
+ lines.push(` headers: ${headers.join(", ")}`);
193
+ }
194
+ if (isObject(response.content)) {
195
+ const types = Object.keys(response.content);
196
+ if (types.length)
197
+ lines.push(` content: ${types.join(", ")}`);
198
+ }
199
+ }
200
+ }
201
+ for (const [key, value] of Object.entries(operation)) {
202
+ if (key.startsWith("x-") && typeof value === "string") {
203
+ lines.push(wrap(`${key.replace(/^x-/, "").replace(/-/g, " ")}: ${value}`, 88, " "));
204
+ }
205
+ }
206
+ return lines.join("\n");
207
+ }
208
+ /** `METHOD path — summary` per line, aligned. */
209
+ export function formatEndpointList(doc) {
210
+ const endpoints = listEndpoints(doc);
211
+ if (endpoints.length === 0)
212
+ return "No endpoints found in the OpenAPI document.";
213
+ const methodWidth = Math.max(...endpoints.map((endpoint) => endpoint.method.length));
214
+ const pathWidth = Math.max(...endpoints.map((endpoint) => endpoint.path.length));
215
+ const title = `${doc.info?.title ?? "API"} ${doc.info?.version ?? ""}`.trim();
216
+ const server = doc.servers?.[0]?.url;
217
+ const header = [title, server ? `Base URL: ${server}` : null, ""].filter((line) => line !== null);
218
+ const rows = endpoints.map((endpoint) => `${pad(endpoint.method, methodWidth)} ${pad(endpoint.path, pathWidth)} ${endpoint.summary}`.trimEnd());
219
+ return [...header, ...rows, "", "Run `car-image describe <operationId|path>` for parameters, headers and error codes, or `car-image describe all`."].join("\n");
220
+ }
221
+ export function formatAll(doc) {
222
+ return listEndpoints(doc)
223
+ .map((endpoint) => formatEndpoint(doc, endpoint))
224
+ .join("\n\n");
225
+ }
226
+ //# sourceMappingURL=describe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe.js","sourceRoot":"","sources":["../src/describe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { isCarImageError } from "@meterapp/car-image-sdk";
2
+ import { CliError } from "./errors.js";
3
+ export const MAX_POLL_INTERVAL_MS = 15_000;
4
+ /**
5
+ * OAuth-style device flow: start, show the code, poll until approved. Transient
6
+ * failures (network, 5xx, 429) back off and keep polling; the flow gives up
7
+ * when the server says the code expired or the deadline passes.
8
+ */
9
+ export async function runDeviceLogin(deps) {
10
+ const info = await deps.start();
11
+ await deps.onCode(info);
12
+ const startedAt = deps.now();
13
+ const deadline = startedAt + Math.max(30, info.expires_in || 600) * 1000;
14
+ let intervalMs = Math.max(1, info.interval || 3) * 1000;
15
+ let polls = 0;
16
+ while (deps.now() < deadline) {
17
+ await deps.sleep(intervalMs);
18
+ polls += 1;
19
+ let result;
20
+ try {
21
+ result = await deps.poll(info.device_code);
22
+ }
23
+ catch (error) {
24
+ const transient = isCarImageError(error) && (error.status === 0 || error.status === 429 || error.status >= 500);
25
+ if (!transient)
26
+ throw error;
27
+ intervalMs = Math.min(intervalMs * 2, MAX_POLL_INTERVAL_MS);
28
+ continue;
29
+ }
30
+ if (result.status === "approved") {
31
+ if (!result.accessToken)
32
+ throw new CliError("The server approved the login but returned no key.", 1, "Try `car-image login` again.");
33
+ return { accessToken: result.accessToken, scope: result.scope, polls };
34
+ }
35
+ if (result.status === "expired") {
36
+ throw new CliError("The login code expired before it was approved.", 1, "Run `car-image login` again and approve the code within 10 minutes.");
37
+ }
38
+ deps.onPending?.(deps.now() - startedAt);
39
+ }
40
+ throw new CliError("Timed out waiting for browser approval.", 1, "Run `car-image login` again.");
41
+ }
42
+ //# sourceMappingURL=device-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-login.js","sourceRoot":"","sources":["../src/device-login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAmD,MAAM,yBAAyB,CAAC;AAC3G,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAmBvC,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAE3C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAqB;IACxD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IAChC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAExB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;IACzE,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACxD,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7B,KAAK,IAAI,CAAC,CAAC;QACX,IAAI,MAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;YAChH,IAAI,CAAC,SAAS;gBAAE,MAAM,KAAK,CAAC;YAC5B,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,oBAAoB,CAAC,CAAC;YAC5D,SAAS;QACX,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,WAAW;gBAAE,MAAM,IAAI,QAAQ,CAAC,oDAAoD,EAAE,CAAC,EAAE,8BAA8B,CAAC,CAAC;YACrI,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QACzE,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,QAAQ,CAAC,gDAAgD,EAAE,CAAC,EAAE,qEAAqE,CAAC,CAAC;QACjJ,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,IAAI,QAAQ,CAAC,yCAAyC,EAAE,CAAC,EAAE,8BAA8B,CAAC,CAAC;AACnG,CAAC"}
package/dist/doctor.js ADDED
@@ -0,0 +1,280 @@
1
+ import { fixHintFor } from "./errors.js";
2
+ import { paint, table } from "./output.js";
3
+ const PAID_CHECKS = ["image-urls", "delivery:head", "delivery:get", "image", "feedback"];
4
+ async function readBody(response) {
5
+ const type = response.headers.get("content-type") ?? "";
6
+ if (type.includes("json")) {
7
+ try {
8
+ return { json: await response.json() };
9
+ }
10
+ catch {
11
+ return { text: "" };
12
+ }
13
+ }
14
+ if (type.startsWith("image/")) {
15
+ return { bytes: (await response.arrayBuffer()).byteLength };
16
+ }
17
+ return { text: await response.text().catch(() => "") };
18
+ }
19
+ function problemDetail(body) {
20
+ if ("json" in body && body.json && typeof body.json === "object") {
21
+ const record = body.json;
22
+ if (typeof record.detail === "string")
23
+ return record.detail;
24
+ if (typeof record.title === "string")
25
+ return record.title;
26
+ }
27
+ return null;
28
+ }
29
+ function get(value, path) {
30
+ let current = value;
31
+ for (const segment of path.split(".")) {
32
+ if (!current || typeof current !== "object")
33
+ return undefined;
34
+ current = current[segment];
35
+ }
36
+ return current;
37
+ }
38
+ function retryAfter(response) {
39
+ const raw = response.headers.get("retry-after");
40
+ return raw && /^\d+$/.test(raw) ? Number(raw) : null;
41
+ }
42
+ /** Runs one probe, timing it and converting any failure into a `fail` row. */
43
+ async function probe(deps, name, request, evaluate) {
44
+ const started = deps.now();
45
+ let check;
46
+ let response = null;
47
+ let body = null;
48
+ try {
49
+ response = await request();
50
+ body = await readBody(response);
51
+ const latencyMs = deps.now() - started;
52
+ const requestId = response.headers.get("x-request-id");
53
+ if (!response.ok) {
54
+ const detail = problemDetail(body);
55
+ check = {
56
+ name,
57
+ status: "fail",
58
+ latencyMs,
59
+ cache: null,
60
+ credits: null,
61
+ notes: `HTTP ${response.status}${detail ? `: ${detail}` : ""}`,
62
+ httpStatus: response.status,
63
+ requestId,
64
+ hint: fixHintFor(response.status, retryAfter(response)),
65
+ };
66
+ }
67
+ else {
68
+ const result = evaluate(response, body);
69
+ check = {
70
+ name,
71
+ status: result.ok ? "pass" : "fail",
72
+ latencyMs,
73
+ cache: result.cache ?? response.headers.get("x-image-source"),
74
+ credits: result.credits ?? numberHeader(response, "x-credits-charged"),
75
+ notes: result.notes,
76
+ httpStatus: response.status,
77
+ requestId: result.requestId ?? requestId,
78
+ };
79
+ }
80
+ }
81
+ catch (error) {
82
+ check = {
83
+ name,
84
+ status: "fail",
85
+ latencyMs: deps.now() - started,
86
+ cache: null,
87
+ credits: null,
88
+ notes: error instanceof Error ? error.message : String(error),
89
+ httpStatus: null,
90
+ requestId: null,
91
+ hint: fixHintFor(0),
92
+ };
93
+ }
94
+ deps.onCheck?.(check);
95
+ return { check, response, body };
96
+ }
97
+ function numberHeader(response, name) {
98
+ const raw = response.headers.get(name);
99
+ if (raw === null)
100
+ return null;
101
+ const value = Number(raw);
102
+ return Number.isFinite(value) ? value : null;
103
+ }
104
+ function skip(deps, name, notes, hint) {
105
+ const check = { name, status: "skip", latencyMs: null, cache: null, credits: null, notes, httpStatus: null, requestId: null, hint };
106
+ deps.onCheck?.(check);
107
+ return check;
108
+ }
109
+ const JSON_HEADERS = { Accept: "application/json" };
110
+ /**
111
+ * Full smoke test of every public and keyed endpoint. Spends at most 2 credits:
112
+ * one for the signed URL and one for the optional keyed image GET.
113
+ */
114
+ export async function runDoctor(deps) {
115
+ const checks = [];
116
+ const noKeyHint = "Run `car-image login` or set CAR_IMAGE_API_KEY.";
117
+ // Public surface -------------------------------------------------------
118
+ const health = await probe(deps, "health", () => deps.client.fetch("/api/health", { headers: JSON_HEADERS }), (_response, body) => {
119
+ const status = get("json" in body ? body.json : null, "status");
120
+ return { ok: status === "ok" || status === "degraded", notes: `status=${String(status ?? "unknown")}` };
121
+ });
122
+ checks.push(health.check);
123
+ checks.push((await probe(deps, "options", () => deps.client.fetch("/api/v1/images/options", { headers: JSON_HEADERS }), (_response, body) => {
124
+ const views = get("json" in body ? body.json : null, "data.views");
125
+ const colors = get("json" in body ? body.json : null, "data.colors");
126
+ const ok = Array.isArray(views) && views.length === 6 && Array.isArray(colors) && colors.length === 15;
127
+ return { ok, notes: `${Array.isArray(views) ? views.length : 0} views, ${Array.isArray(colors) ? colors.length : 0} colors` };
128
+ })).check);
129
+ let year = 2024;
130
+ const years = await probe(deps, "vehicles:years", () => deps.client.fetch("/api/v1/vehicles", { headers: JSON_HEADERS }), (_response, body) => {
131
+ const list = get("json" in body ? body.json : null, "data.years");
132
+ if (!Array.isArray(list) || list.length === 0)
133
+ return { ok: false, notes: "no years returned" };
134
+ const numbers = list.map(Number).filter(Number.isFinite);
135
+ year = numbers.includes(2024) ? 2024 : Math.max(...numbers);
136
+ return { ok: true, notes: `${numbers.length} years (${Math.min(...numbers)}–${Math.max(...numbers)})` };
137
+ });
138
+ checks.push(years.check);
139
+ let makeId = null;
140
+ const makes = await probe(deps, "vehicles:makes", () => deps.client.fetch(`/api/v1/vehicles?year=${year}`, { headers: JSON_HEADERS }), (_response, body) => {
141
+ const list = get("json" in body ? body.json : null, "data.makes");
142
+ if (!Array.isArray(list) || list.length === 0)
143
+ return { ok: false, notes: `no makes for ${year}` };
144
+ const porsche = list.find((make) => typeof make === "object" && make && /porsche/i.test(String(make.name)));
145
+ const first = (porsche ?? list[0]);
146
+ makeId = Number(first.id);
147
+ return { ok: Number.isFinite(makeId), notes: `${list.length} makes for ${year}; using ${String(first.name)} (#${String(first.id)})` };
148
+ });
149
+ checks.push(makes.check);
150
+ if (makeId !== null) {
151
+ checks.push((await probe(deps, "vehicles:models", () => deps.client.fetch(`/api/v1/vehicles?year=${year}&makeId=${makeId}`, { headers: JSON_HEADERS }), (_response, body) => {
152
+ const list = get("json" in body ? body.json : null, "data.models");
153
+ return { ok: Array.isArray(list) && list.length > 0, notes: `${Array.isArray(list) ? list.length : 0} models` };
154
+ })).check);
155
+ }
156
+ else {
157
+ checks.push(skip(deps, "vehicles:models", "skipped: no make id"));
158
+ }
159
+ checks.push((await probe(deps, "search", () => deps.client.fetch("/api/v1/vehicles?q=porsche%20911&limit=5", { headers: JSON_HEADERS }), (_response, body) => {
160
+ const results = get("json" in body ? body.json : null, "data.results");
161
+ return { ok: Array.isArray(results) && results.length > 0, notes: `${Array.isArray(results) ? results.length : 0} results for "porsche 911"` };
162
+ })).check);
163
+ // Keyed surface --------------------------------------------------------
164
+ if (!deps.hasKey) {
165
+ checks.push({ name: "auth", status: "fail", latencyMs: null, cache: null, credits: null, notes: "no API key configured", httpStatus: 401, requestId: null, hint: noKeyHint });
166
+ for (const name of ["resolve", "account", ...PAID_CHECKS]) {
167
+ checks.push(skip(deps, name, "skipped: no API key"));
168
+ }
169
+ return checks;
170
+ }
171
+ checks.push((await probe(deps, "resolve", () => deps.client.fetch("/api/v1/images/resolve", {
172
+ method: "POST",
173
+ headers: { ...JSON_HEADERS, "Content-Type": "application/json" },
174
+ body: JSON.stringify({ query: "red 2024 porsche 911 side view" }),
175
+ }), (_response, body) => {
176
+ const params = get("json" in body ? body.json : null, "data.params");
177
+ const ok = Boolean(params && /porsche/i.test(String(params.make)) && String(params.view) === "side" && String(params.color) === "red");
178
+ return { ok, notes: params ? `${String(params.make)} ${String(params.model)} ${String(params.year)} ${String(params.view)} ${String(params.color)}` : "no params" };
179
+ })).check);
180
+ checks.push((await probe(deps, "account", () => deps.client.fetch("/api/v1/account", { headers: JSON_HEADERS }), (_response, body) => {
181
+ const credits = get("json" in body ? body.json : null, "data.credits");
182
+ return { ok: typeof credits === "number", notes: typeof credits === "number" ? `credits=${credits.toLocaleString("en-US")}` : "no credits field" };
183
+ })).check);
184
+ if (deps.quick) {
185
+ for (const name of PAID_CHECKS)
186
+ checks.push(skip(deps, name, "skipped in quick mode (costs credits); run `car-image doctor`"));
187
+ return checks;
188
+ }
189
+ let deliveryUrl = null;
190
+ let urlRequestId = null;
191
+ const mint = await probe(deps, "image-urls", () => deps.client.fetch("/api/v1/image-urls", {
192
+ method: "POST",
193
+ headers: { ...JSON_HEADERS, "Content-Type": "application/json" },
194
+ body: JSON.stringify({ images: [{ make: "Porsche", model: "911", year: 2024, view: "front-3-4", width: 256 }], ttl_seconds: 600 }),
195
+ }), (_response, body) => {
196
+ const json = "json" in body ? body.json : null;
197
+ const url = get(json, "data.0.url");
198
+ const charged = get(json, "billing.credits_charged");
199
+ const remaining = get(json, "billing.credits_remaining");
200
+ urlRequestId = typeof get(json, "request_id") === "string" ? get(json, "request_id") : null;
201
+ if (typeof url !== "string")
202
+ return { ok: false, notes: "no url in response" };
203
+ deliveryUrl = url;
204
+ return {
205
+ ok: true,
206
+ notes: `minted 1 URL; ${typeof remaining === "number" ? `${remaining.toLocaleString("en-US")} credits left` : "ok"}`,
207
+ credits: typeof charged === "number" ? charged : 1,
208
+ };
209
+ });
210
+ checks.push(mint.check);
211
+ if (deliveryUrl) {
212
+ const url = deliveryUrl;
213
+ const head = await probe(deps, "delivery:head", () => deps.publicFetch(url, { method: "HEAD" }), (response) => {
214
+ const type = response.headers.get("content-type") ?? "";
215
+ return { ok: type.startsWith("image/"), notes: type ? `content-type ${type}` : "no content-type" };
216
+ });
217
+ if (head.check.status === "fail" && head.check.httpStatus === 405) {
218
+ head.check.status = "skip";
219
+ head.check.notes = "HEAD not supported (405)";
220
+ head.check.hint = undefined;
221
+ }
222
+ checks.push(head.check);
223
+ checks.push((await probe(deps, "delivery:get", () => deps.publicFetch(url), (response, body) => {
224
+ const type = response.headers.get("content-type") ?? "";
225
+ const bytes = "bytes" in body ? body.bytes : 0;
226
+ return { ok: type.startsWith("image/") && bytes > 0, notes: `${type || "unknown type"}, ${(bytes / 1024).toFixed(1)} KB` };
227
+ })).check);
228
+ }
229
+ else {
230
+ checks.push(skip(deps, "delivery:head", "skipped: no URL minted"));
231
+ checks.push(skip(deps, "delivery:get", "skipped: no URL minted"));
232
+ }
233
+ let imageRequestId = null;
234
+ if (deps.includeImage) {
235
+ const image = await probe(deps, "image", () => deps.client.fetch("/api/v1/images/car?make=Porsche&model=911&year=2024&view=front-3-4&w=256", { headers: { Accept: "image/*" } }), (response, body) => {
236
+ const type = response.headers.get("content-type") ?? "";
237
+ const bytes = "bytes" in body ? body.bytes : 0;
238
+ imageRequestId = response.headers.get("x-request-id");
239
+ const remaining = response.headers.get("x-credits-remaining");
240
+ return { ok: type.startsWith("image/") && bytes > 0, notes: `${type}, ${(bytes / 1024).toFixed(1)} KB${remaining ? `, ${remaining} credits left` : ""}` };
241
+ });
242
+ checks.push(image.check);
243
+ }
244
+ else {
245
+ checks.push(skip(deps, "image", "skipped (--no-image or declined); costs 1 credit"));
246
+ }
247
+ const feedbackBody = imageRequestId
248
+ ? { request_id: imageRequestId, verdict: "good", reason: "car-image doctor" }
249
+ : urlRequestId
250
+ ? { request_id: urlRequestId, verdict: "good", reason: "car-image doctor" }
251
+ : { make: "Porsche", model: "911", year: 2024, view: "front-3-4", verdict: "good", reason: "car-image doctor" };
252
+ checks.push((await probe(deps, "feedback", () => deps.client.fetch("/api/v1/feedback", {
253
+ method: "POST",
254
+ headers: { ...JSON_HEADERS, "Content-Type": "application/json" },
255
+ body: JSON.stringify(feedbackBody),
256
+ }), (response) => ({ ok: response.status === 201 || response.status === 200, notes: `verdict good recorded (${"request_id" in feedbackBody ? "by request id" : "by vehicle"})` }))).check);
257
+ return checks;
258
+ }
259
+ export function doctorSummary(checks) {
260
+ const passed = checks.filter((check) => check.status === "pass").length;
261
+ const failed = checks.filter((check) => check.status === "fail").length;
262
+ const skipped = checks.filter((check) => check.status === "skip").length;
263
+ return { passed, failed, skipped, ok: failed === 0 };
264
+ }
265
+ export function renderDoctorTable(checks, io) {
266
+ const rows = checks.map((check) => [
267
+ check.name,
268
+ check.status === "pass" ? paint(io, "green", "pass") : check.status === "fail" ? paint(io, "red", "FAIL") : paint(io, "dim", "skip"),
269
+ check.latencyMs === null ? "—" : `${check.latencyMs} ms`,
270
+ check.cache ?? "—",
271
+ check.credits === null || check.credits === 0 ? "—" : String(check.credits),
272
+ check.notes,
273
+ ]);
274
+ const body = table(rows, ["check", "status", "latency", "cache", "credits", "notes"]);
275
+ const hints = checks
276
+ .filter((check) => check.status === "fail" && check.hint)
277
+ .map((check) => ` ${paint(io, "yellow", "→")} ${check.name}: ${check.hint}${check.requestId ? ` (request ${check.requestId})` : ""}`);
278
+ return hints.length ? `${body}\n\nFixes:\n${hints.join("\n")}` : body;
279
+ }
280
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAW,MAAM,aAAa,CAAC;AA8BpD,MAAM,WAAW,GAAG,CAAC,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,UAAU,CAAU,CAAC;AAYlG,KAAK,UAAU,QAAQ,CAAC,QAAkB;IACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IACxD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;IAC9D,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,aAAa,CAAC,IAAU;IAC/B,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,IAA+B,CAAC;QACpD,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,MAAM,CAAC;QAC5D,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC;IAC5D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,GAAG,CAAC,KAAc,EAAE,IAAY;IACvC,IAAI,OAAO,GAAY,KAAK,CAAC;IAC7B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC9D,OAAO,GAAI,OAAmC,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,UAAU,CAAC,QAAkB;IACpC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAChD,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC;AAED,8EAA8E;AAC9E,KAAK,UAAU,KAAK,CAClB,IAAgB,EAChB,IAAY,EACZ,OAAgC,EAChC,QAAwD;IAExD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,IAAI,KAAkB,CAAC;IACvB,IAAI,QAAQ,GAAoB,IAAI,CAAC;IACrC,IAAI,IAAI,GAAgB,IAAI,CAAC;IAC7B,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,OAAO,EAAE,CAAC;QAC3B,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;QACvC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YACnC,KAAK,GAAG;gBACN,IAAI;gBACJ,MAAM,EAAE,MAAM;gBACd,SAAS;gBACT,KAAK,EAAE,IAAI;gBACX,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,QAAQ,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC9D,UAAU,EAAE,QAAQ,CAAC,MAAM;gBAC3B,SAAS;gBACT,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;aACxD,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACxC,KAAK,GAAG;gBACN,IAAI;gBACJ,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;gBACnC,SAAS;gBACT,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;gBAC7D,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,YAAY,CAAC,QAAQ,EAAE,mBAAmB,CAAC;gBACtE,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,UAAU,EAAE,QAAQ,CAAC,MAAM;gBAC3B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,SAAS;aACzC,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,GAAG;YACN,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;YAC/B,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC7D,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,IAAI;YACf,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;SACpB,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IACtB,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,YAAY,CAAC,QAAkB,EAAE,IAAY;IACpD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC;AAED,SAAS,IAAI,CAAC,IAAgB,EAAE,IAAY,EAAE,KAAa,EAAE,IAAa;IACxE,MAAM,KAAK,GAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACjJ,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IACtB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,YAAY,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;AAEpD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAgB;IAC9C,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,iDAAiD,CAAC;IAEpE,yEAAyE;IACzE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE;QAChI,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAChE,OAAO,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,UAAU,EAAE,KAAK,EAAE,UAAU,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC;IAC1G,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE1B,MAAM,CAAC,IAAI,CACT,CACE,MAAM,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE;QAC7H,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,CAAC;QACvG,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IAChI,CAAC,CAAC,CACH,CAAC,KAAK,CACR,CAAC;IAEF,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE;QAC5I,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAClE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;QAChG,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;QAC5D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,MAAM,WAAW,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1G,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEzB,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE;QACzJ,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAClE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,IAAI,EAAE,EAAE,CAAC;QACnG,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAE,IAAgC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzI,MAAM,KAAK,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAA4B,CAAC;QAC9D,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1B,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,MAAM,cAAc,IAAI,WAAW,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;IACxI,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEzB,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CACT,CACE,MAAM,KAAK,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,IAAI,WAAW,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE;YAC7J,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YACnE,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QAClH,CAAC,CAAC,CACH,CAAC,KAAK,CACR,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,CAAC,IAAI,CACT,CACE,MAAM,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE;QAC9I,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACvE,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,4BAA4B,EAAE,CAAC;IACjJ,CAAC,CAAC,CACH,CAAC,KAAK,CACR,CAAC;IAEF,yEAAyE;IACzE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,uBAAuB,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9K,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,IAAI,CACT,CACE,MAAM,KAAK,CACT,IAAI,EACJ,SAAS,EACT,GAAG,EAAE,CACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;QAC1C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,GAAG,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAChE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC;KAClE,CAAC,EACJ,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,aAAa,CAAwC,CAAC;QAC5G,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC;QACvI,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACtK,CAAC,CACF,CACF,CAAC,KAAK,CACR,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,CACE,MAAM,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE;QACtH,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACvE,OAAO,EAAE,EAAE,EAAE,OAAO,OAAO,KAAK,QAAQ,EAAE,KAAK,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC;IACrJ,CAAC,CAAC,CACH,CAAC,KAAK,CACR,CAAC;IAEF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,WAAW;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,+DAA+D,CAAC,CAAC,CAAC;QAC/H,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,KAAK,CACtB,IAAI,EACJ,YAAY,EACZ,GAAG,EAAE,CACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE;QACtC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,GAAG,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAChE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;KACnI,CAAC,EACJ,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/C,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAC;QACzD,YAAY,GAAG,OAAO,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAG,CAAC,IAAI,EAAE,YAAY,CAAY,CAAC,CAAC,CAAC,IAAI,CAAC;QACxG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;QAC/E,WAAW,GAAG,GAAG,CAAC;QAClB,OAAO;YACL,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,iBAAiB,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,EAAE;YACpH,OAAO,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SACnD,CAAC;IACJ,CAAC,CACF,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAExB,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,GAAG,GAAW,WAAW,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE;YAC5G,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YACxD,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;QACrG,CAAC,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAClE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,0BAA0B,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC;QAC9B,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,MAAM,CAAC,IAAI,CACT,CACE,MAAM,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE;YAChF,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YACxD,MAAM,KAAK,GAAG,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/C,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,IAAI,cAAc,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7H,CAAC,CAAC,CACH,CAAC,KAAK,CACR,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE,wBAAwB,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,wBAAwB,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,cAAc,GAAkB,IAAI,CAAC;IACzC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,MAAM,KAAK,CACvB,IAAI,EACJ,OAAO,EACP,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0EAA0E,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,EACvI,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE;YACjB,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YACxD,MAAM,KAAK,GAAG,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/C,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YAC9D,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;QAC5J,CAAC,CACF,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,kDAAkD,CAAC,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,YAAY,GAAG,cAAc;QACjC,CAAC,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE;QAC7E,CAAC,CAAC,YAAY;YACZ,CAAC,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE;YAC3E,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACpH,MAAM,CAAC,IAAI,CACT,CACE,MAAM,KAAK,CACT,IAAI,EACJ,UAAU,EACV,GAAG,EAAE,CACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE;QACpC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,GAAG,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAChE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;KACnC,CAAC,EACJ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,0BAA0B,YAAY,IAAI,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY,GAAG,EAAE,CAAC,CAC9K,CACF,CAAC,KAAK,CACR,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAqB;IACjD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACxE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACxE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACzE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAqB,EAAE,EAAqB;IAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI;QACV,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC;QACpI,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,KAAK;QACxD,KAAK,CAAC,KAAK,IAAI,GAAG;QAClB,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;QAC3E,KAAK,CAAC,KAAK;KACZ,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IACtF,MAAM,KAAK,GAAG,MAAM;SACjB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC;SACxD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzI,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,eAAe,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACxE,CAAC"}