@tryhakim/voice 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 (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +188 -0
  3. package/dist/audio/speech-stream-ws.d.ts +40 -0
  4. package/dist/audio/speech-stream-ws.d.ts.map +1 -0
  5. package/dist/audio/speech-stream-ws.js +565 -0
  6. package/dist/audio/speech-stream-ws.js.map +1 -0
  7. package/dist/audio/speech.d.ts +46 -0
  8. package/dist/audio/speech.d.ts.map +1 -0
  9. package/dist/audio/speech.js +125 -0
  10. package/dist/audio/speech.js.map +1 -0
  11. package/dist/audio/stream.d.ts +38 -0
  12. package/dist/audio/stream.d.ts.map +1 -0
  13. package/dist/audio/stream.js +452 -0
  14. package/dist/audio/stream.js.map +1 -0
  15. package/dist/audio/to-blob.d.ts +10 -0
  16. package/dist/audio/to-blob.d.ts.map +1 -0
  17. package/dist/audio/to-blob.js +78 -0
  18. package/dist/audio/to-blob.js.map +1 -0
  19. package/dist/audio/transcriptions.d.ts +35 -0
  20. package/dist/audio/transcriptions.d.ts.map +1 -0
  21. package/dist/audio/transcriptions.js +105 -0
  22. package/dist/audio/transcriptions.js.map +1 -0
  23. package/dist/audio/translate-stream-ws.d.ts +37 -0
  24. package/dist/audio/translate-stream-ws.d.ts.map +1 -0
  25. package/dist/audio/translate-stream-ws.js +665 -0
  26. package/dist/audio/translate-stream-ws.js.map +1 -0
  27. package/dist/audio/translate.d.ts +36 -0
  28. package/dist/audio/translate.d.ts.map +1 -0
  29. package/dist/audio/translate.js +39 -0
  30. package/dist/audio/translate.js.map +1 -0
  31. package/dist/audio/voices.d.ts +47 -0
  32. package/dist/audio/voices.d.ts.map +1 -0
  33. package/dist/audio/voices.js +91 -0
  34. package/dist/audio/voices.js.map +1 -0
  35. package/dist/chat/completions.d.ts +76 -0
  36. package/dist/chat/completions.d.ts.map +1 -0
  37. package/dist/chat/completions.js +114 -0
  38. package/dist/chat/completions.js.map +1 -0
  39. package/dist/chat/index.d.ts +2 -0
  40. package/dist/chat/index.d.ts.map +1 -0
  41. package/dist/chat/index.js +2 -0
  42. package/dist/chat/index.js.map +1 -0
  43. package/dist/chat/sse.d.ts +12 -0
  44. package/dist/chat/sse.d.ts.map +1 -0
  45. package/dist/chat/sse.js +142 -0
  46. package/dist/chat/sse.js.map +1 -0
  47. package/dist/client.d.ts +63 -0
  48. package/dist/client.d.ts.map +1 -0
  49. package/dist/client.js +80 -0
  50. package/dist/client.js.map +1 -0
  51. package/dist/errors.d.ts +99 -0
  52. package/dist/errors.d.ts.map +1 -0
  53. package/dist/errors.js +158 -0
  54. package/dist/errors.js.map +1 -0
  55. package/dist/index.d.ts +27 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +25 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/jobs.d.ts +34 -0
  60. package/dist/jobs.d.ts.map +1 -0
  61. package/dist/jobs.js +62 -0
  62. package/dist/jobs.js.map +1 -0
  63. package/dist/observability.d.ts +28 -0
  64. package/dist/observability.d.ts.map +1 -0
  65. package/dist/observability.js +107 -0
  66. package/dist/observability.js.map +1 -0
  67. package/dist/settings.d.ts +49 -0
  68. package/dist/settings.d.ts.map +1 -0
  69. package/dist/settings.js +84 -0
  70. package/dist/settings.js.map +1 -0
  71. package/dist/transport.d.ts +82 -0
  72. package/dist/transport.d.ts.map +1 -0
  73. package/dist/transport.js +289 -0
  74. package/dist/transport.js.map +1 -0
  75. package/dist/types.d.ts +969 -0
  76. package/dist/types.d.ts.map +1 -0
  77. package/dist/types.js +11 -0
  78. package/dist/types.js.map +1 -0
  79. package/dist/usage.d.ts +43 -0
  80. package/dist/usage.d.ts.map +1 -0
  81. package/dist/usage.js +85 -0
  82. package/dist/usage.js.map +1 -0
  83. package/dist/version.d.ts +13 -0
  84. package/dist/version.d.ts.map +1 -0
  85. package/dist/version.js +13 -0
  86. package/dist/version.js.map +1 -0
  87. package/dist/webhooks.d.ts +84 -0
  88. package/dist/webhooks.d.ts.map +1 -0
  89. package/dist/webhooks.js +157 -0
  90. package/dist/webhooks.js.map +1 -0
  91. package/package.json +57 -0
@@ -0,0 +1,289 @@
1
+ /**
2
+ * HTTP transport for the SDK.
3
+ *
4
+ * Contract:
5
+ * - Uses native `fetch` (Node 18+ builds it in). No `axios` / `undici`
6
+ * dependency so the SDK bundle stays small.
7
+ * - Every call attaches Authorization + User-Agent + X-Request-Id.
8
+ * - Mutating calls (POST) auto-generate an `Idempotency-Key` unless
9
+ * the caller supplied one (T39).
10
+ * - Retries on transient failures: 5xx, 429, 408, 503, and low-level
11
+ * connection errors. Back-off is exponential with jitter, honoring
12
+ * the server's `Retry-After` when present. Max 3 attempts by default.
13
+ * - 4xx (except 408 / 429) is NOT retried — those are caller errors.
14
+ * - Stream responses (TTS streaming, raw binary) are returned as a
15
+ * `Response` object so callers can `body.getReader()` or iterate
16
+ * via our adapter without us buffering the entire audio in memory.
17
+ *
18
+ * Error shape: every non-2xx raises a `HakimError` subclass built from
19
+ * the server's uniform `ApiError` JSON body. Network-level
20
+ * failures raise `ConnectionError`.
21
+ */
22
+ import { ConnectionError, errorFromPayload, HakimError, } from './errors.js';
23
+ import { SDK_NAME, SDK_VERSION } from './version.js';
24
+ /** HTTP methods considered mutating for auto-idempotency. GET / HEAD
25
+ * don't get an auto key; POST / PUT / PATCH / DELETE do. */
26
+ const MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);
27
+ export class Transport {
28
+ /** Exposed for the realtime WSS helper which needs to build a `wss://`
29
+ * URL and set the Authorization header on a raw WebSocket. Treat as
30
+ * read-only; regular HTTP calls should never touch this directly. */
31
+ apiKey;
32
+ baseURL;
33
+ timeoutMs;
34
+ maxRetries;
35
+ userAgent;
36
+ fetchImpl;
37
+ random;
38
+ sleep;
39
+ generateIdempotencyKey;
40
+ constructor(options) {
41
+ if (!options.apiKey) {
42
+ throw new TypeError('Hakim SDK: `apiKey` is required. Set it when constructing Hakim().');
43
+ }
44
+ this.apiKey = options.apiKey;
45
+ this.baseURL = trimTrailingSlash(options.baseURL);
46
+ this.timeoutMs = options.timeoutMs;
47
+ this.maxRetries = options.maxRetries;
48
+ this.userAgent = buildUserAgent(options.userAgentSuffix);
49
+ this.fetchImpl =
50
+ options.fetchImpl ??
51
+ (typeof fetch === 'function' ? fetch : undefined);
52
+ if (!this.fetchImpl) {
53
+ throw new TypeError('Hakim SDK: global `fetch` is not available. Upgrade to Node >= 18 or pass a `fetchImpl` option.');
54
+ }
55
+ this.random = options.random ?? Math.random;
56
+ this.sleep = options.sleep ?? defaultSleep;
57
+ this.generateIdempotencyKey = options.generateIdempotencyKey ?? defaultIdempotencyKey;
58
+ }
59
+ async request(opts) {
60
+ const url = this.buildURL(opts.path, opts.query);
61
+ const headers = this.buildHeaders(opts);
62
+ // Build the body. We serialize JSON here (rather than relying on
63
+ // fetch's coercion) so the Content-Length header is correct and the
64
+ // body survives a retry — fetch consumes the body on each attempt.
65
+ let body;
66
+ if (opts.json !== undefined) {
67
+ body = JSON.stringify(opts.json);
68
+ if (!headers['content-type'])
69
+ headers['content-type'] = 'application/json';
70
+ }
71
+ else if (opts.formData !== undefined) {
72
+ body = opts.formData;
73
+ // Let fetch set the multipart boundary — do NOT set content-type.
74
+ }
75
+ else if (opts.body !== undefined) {
76
+ body = opts.body;
77
+ }
78
+ const timeoutMs = opts.timeoutMs ?? this.timeoutMs;
79
+ let attempt = 0;
80
+ let lastErr;
81
+ while (attempt <= this.maxRetries) {
82
+ const controller = new AbortController();
83
+ const onAbort = () => controller.abort();
84
+ if (opts.signal) {
85
+ if (opts.signal.aborted)
86
+ controller.abort();
87
+ else
88
+ opts.signal.addEventListener('abort', onAbort);
89
+ }
90
+ const timer = setTimeout(() => controller.abort(new Error('request_timeout')), timeoutMs);
91
+ try {
92
+ const init = {
93
+ method: opts.method,
94
+ headers,
95
+ signal: controller.signal,
96
+ };
97
+ if (body !== undefined)
98
+ init.body = body;
99
+ const res = await this.fetchImpl(url, init);
100
+ if (res.ok) {
101
+ return res;
102
+ }
103
+ // Non-2xx: decide whether to retry. Retryable statuses mirror
104
+ // connection errors + 5xx + 429.
105
+ const shouldRetry = isRetryableStatus(res.status) && attempt < this.maxRetries;
106
+ if (shouldRetry) {
107
+ const retryAfterMs = readRetryAfterMs(res.headers);
108
+ const waitMs = retryAfterMs ?? this.backoffMs(attempt);
109
+ attempt++;
110
+ // Consume body to free the connection before retrying.
111
+ await res.arrayBuffer().catch(() => undefined);
112
+ await this.sleep(waitMs);
113
+ continue;
114
+ }
115
+ throw await parseErrorResponse(res);
116
+ }
117
+ catch (err) {
118
+ if (err instanceof HakimError)
119
+ throw err;
120
+ lastErr = err;
121
+ const code = classifyTransportError(err);
122
+ if (code && attempt < this.maxRetries) {
123
+ attempt++;
124
+ await this.sleep(this.backoffMs(attempt - 1));
125
+ continue;
126
+ }
127
+ throw new ConnectionError({
128
+ message: toErrorMessage(err),
129
+ requestId: headers['x-request-id'],
130
+ cause: err,
131
+ ...(code !== undefined ? { code } : {}),
132
+ });
133
+ }
134
+ finally {
135
+ clearTimeout(timer);
136
+ if (opts.signal)
137
+ opts.signal.removeEventListener('abort', onAbort);
138
+ }
139
+ }
140
+ // Loop exited without `return`/`throw`, meaning retries exhausted on
141
+ // a transient failure. Surface the last error.
142
+ throw new ConnectionError({
143
+ message: `Hakim SDK: request failed after ${this.maxRetries} retries`,
144
+ requestId: headers['x-request-id'],
145
+ cause: lastErr,
146
+ });
147
+ }
148
+ buildURL(path, query) {
149
+ const url = new URL(path.replace(/^\/+/, ''), this.baseURL + '/');
150
+ if (query) {
151
+ for (const [k, v] of Object.entries(query)) {
152
+ if (v === undefined)
153
+ continue;
154
+ url.searchParams.set(k, String(v));
155
+ }
156
+ }
157
+ return url.toString();
158
+ }
159
+ buildHeaders(opts) {
160
+ const headers = {
161
+ authorization: `Bearer ${this.apiKey}`,
162
+ 'user-agent': this.userAgent,
163
+ ...(opts.headers ?? {}),
164
+ };
165
+ // X-Request-Id: always send; the server will echo it back. Not
166
+ // regenerated on retry — that would defeat idempotency if the server
167
+ // already saw it.
168
+ if (!headers['x-request-id']) {
169
+ headers['x-request-id'] = generateRequestId();
170
+ }
171
+ // Accept header defaults. Stream / binary callers override.
172
+ if (!headers['accept']) {
173
+ headers['accept'] = opts.accept ?? 'application/json';
174
+ }
175
+ // Auto-idempotency (T39). Only attach on mutating methods that carry
176
+ // a JSON body — multipart STT uploads are single-shot writes where
177
+ // `Idempotency-Key` would be silently ignored by the server anyway.
178
+ if (MUTATING_METHODS.has(opts.method) && opts.json !== undefined) {
179
+ headers['idempotency-key'] = opts.idempotencyKey ?? this.generateIdempotencyKey();
180
+ }
181
+ else if (opts.idempotencyKey !== undefined) {
182
+ headers['idempotency-key'] = opts.idempotencyKey;
183
+ }
184
+ return headers;
185
+ }
186
+ /** Base backoff: 200ms, 600ms, 1400ms; with ±25% jitter. Cap at 10s. */
187
+ backoffMs(attempt) {
188
+ const base = Math.min(200 * Math.pow(3, attempt), 10_000);
189
+ const jitter = base * (this.random() - 0.5) * 0.5;
190
+ return Math.max(0, Math.round(base + jitter));
191
+ }
192
+ }
193
+ function trimTrailingSlash(url) {
194
+ return url.endsWith('/') ? url.slice(0, -1) : url;
195
+ }
196
+ function buildUserAgent(suffix) {
197
+ const nodeVersion = typeof process !== 'undefined' && process.versions
198
+ ? `node/${process.versions.node}`
199
+ : 'node/unknown';
200
+ const base = `${SDK_NAME.replace('@', '').replace('/', '-')}/${SDK_VERSION} (${nodeVersion})`;
201
+ return suffix ? `${base} ${suffix}` : base;
202
+ }
203
+ function isRetryableStatus(status) {
204
+ // 408 Request Timeout, 425 Too Early, 429 Too Many Requests,
205
+ // 5xx (transient server-side failures). 501 / 505 are not retried —
206
+ // those are "your request will never succeed" errors.
207
+ if (status === 408 || status === 425 || status === 429)
208
+ return true;
209
+ if (status === 501 || status === 505)
210
+ return false;
211
+ return status >= 500 && status <= 599;
212
+ }
213
+ function readRetryAfterMs(headers) {
214
+ const raw = headers.get('retry-after');
215
+ if (!raw)
216
+ return undefined;
217
+ const num = Number(raw);
218
+ if (Number.isFinite(num) && num >= 0)
219
+ return num * 1000;
220
+ const date = Date.parse(raw);
221
+ if (!Number.isNaN(date))
222
+ return Math.max(0, date - Date.now());
223
+ return undefined;
224
+ }
225
+ async function parseErrorResponse(res) {
226
+ const requestId = res.headers.get('x-request-id') ?? undefined;
227
+ const retryAfterMs = readRetryAfterMs(res.headers);
228
+ const contentType = res.headers.get('content-type') ?? '';
229
+ if (contentType.includes('application/json')) {
230
+ try {
231
+ const json = (await res.json());
232
+ if (json && json.error && json.error.type && json.error.message) {
233
+ return errorFromPayload(json.error, res.status, requestId, retryAfterMs);
234
+ }
235
+ }
236
+ catch {
237
+ // fall through to generic handling
238
+ }
239
+ }
240
+ let text = '';
241
+ try {
242
+ text = await res.text();
243
+ }
244
+ catch {
245
+ text = res.statusText;
246
+ }
247
+ return errorFromPayload({
248
+ type: res.status >= 500 ? 'api_error' : 'invalid_request_error',
249
+ code: `http_${res.status}`,
250
+ message: text || res.statusText || `HTTP ${res.status}`,
251
+ }, res.status, requestId, retryAfterMs);
252
+ }
253
+ function classifyTransportError(err) {
254
+ if (err instanceof HakimError)
255
+ return undefined;
256
+ if (err instanceof Error) {
257
+ const name = err.name;
258
+ const msg = err.message;
259
+ if (name === 'AbortError' && /request_timeout/.test(msg))
260
+ return 'request_timeout';
261
+ if (name === 'AbortError')
262
+ return 'aborted';
263
+ if (/ECONNRESET|ECONNREFUSED|ETIMEDOUT|ENOTFOUND|EAI_AGAIN|socket hang up|network/i.test(msg)) {
264
+ return 'network_error';
265
+ }
266
+ }
267
+ return 'network_error';
268
+ }
269
+ function toErrorMessage(err) {
270
+ if (err instanceof Error)
271
+ return err.message;
272
+ return typeof err === 'string' ? err : 'unknown transport error';
273
+ }
274
+ async function defaultSleep(ms) {
275
+ await new Promise((resolve) => setTimeout(resolve, ms));
276
+ }
277
+ function defaultIdempotencyKey() {
278
+ if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
279
+ return crypto.randomUUID();
280
+ }
281
+ // Fallback: timestamp + random. We only get here on platforms where
282
+ // `globalThis.crypto` is missing (very old runtimes). Good enough to
283
+ // satisfy the server-side uniqueness check.
284
+ return `${Date.now()}-${Math.random().toString(36).slice(2)}`;
285
+ }
286
+ function generateRequestId() {
287
+ return `sdk-${defaultIdempotencyKey()}`;
288
+ }
289
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,UAAU,GAEX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AA4CrD;6DAC6D;AAC7D,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAErE,MAAM,OAAO,SAAS;IACpB;;0EAEsE;IAC7D,MAAM,CAAS;IACf,OAAO,CAAS;IACR,SAAS,CAAS;IAClB,UAAU,CAAS;IACnB,SAAS,CAAS;IAClB,SAAS,CAAe;IACxB,MAAM,CAAe;IACrB,KAAK,CAAgC;IACrC,sBAAsB,CAAe;IAEtD,YAAY,OAAyB;QACnC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,SAAS,CAAC,oEAAoE,CAAC,CAAC;QAC5F,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACzD,IAAI,CAAC,SAAS;YACZ,OAAO,CAAC,SAAS;gBACjB,CAAC,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAE,KAAsB,CAAC,CAAC,CAAE,SAAmB,CAAC,CAAC;QACjF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,SAAS,CACjB,iGAAiG,CAClG,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;QAC5C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,CAAC;QAC3C,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,IAAI,qBAAqB,CAAC;IACxF,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAoB;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAExC,iEAAiE;QACjE,oEAAoE;QACpE,mEAAmE;QACnE,IAAI,IAA0B,CAAC;QAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;gBAAE,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC7E,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACvC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;YACrB,kEAAkE;QACpE,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;QACnD,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,OAAgB,CAAC;QAErB,OAAO,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACzC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;oBAAE,UAAU,CAAC,KAAK,EAAE,CAAC;;oBACvC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAE1F,IAAI,CAAC;gBACH,MAAM,IAAI,GAAgB;oBACxB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,OAAO;oBACP,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CAAC;gBACF,IAAI,IAAI,KAAK,SAAS;oBAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;gBAEzC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAE5C,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;oBACX,OAAO,GAAG,CAAC;gBACb,CAAC;gBAED,8DAA8D;gBAC9D,iCAAiC;gBACjC,MAAM,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;gBAC/E,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,YAAY,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACnD,MAAM,MAAM,GAAG,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;oBACvD,OAAO,EAAE,CAAC;oBACV,uDAAuD;oBACvD,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;oBAC/C,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACzB,SAAS;gBACX,CAAC;gBAED,MAAM,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,UAAU;oBAAE,MAAM,GAAG,CAAC;gBAEzC,OAAO,GAAG,GAAG,CAAC;gBAEd,MAAM,IAAI,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;gBACzC,IAAI,IAAI,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;oBACtC,OAAO,EAAE,CAAC;oBACV,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC9C,SAAS;gBACX,CAAC;gBAED,MAAM,IAAI,eAAe,CAAC;oBACxB,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC;oBAC5B,SAAS,EAAE,OAAO,CAAC,cAAc,CAAC;oBAClC,KAAK,EAAE,GAAG;oBACV,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACxC,CAAC,CAAC;YACL,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,IAAI,CAAC,MAAM;oBAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAED,qEAAqE;QACrE,+CAA+C;QAC/C,MAAM,IAAI,eAAe,CAAC;YACxB,OAAO,EAAE,mCAAmC,IAAI,CAAC,UAAU,UAAU;YACrE,SAAS,EAAE,OAAO,CAAC,cAAc,CAAC;YAClC,KAAK,EAAE,OAAO;SACf,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ,CAAC,IAAY,EAAE,KAA+B;QAC5D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC;QAClE,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,IAAI,CAAC,KAAK,SAAS;oBAAE,SAAS;gBAC9B,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAEO,YAAY,CAAC,IAAoB;QACvC,MAAM,OAAO,GAA2B;YACtC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;YACtC,YAAY,EAAE,IAAI,CAAC,SAAS;YAC5B,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SACxB,CAAC;QAEF,+DAA+D;QAC/D,qEAAqE;QACrE,kBAAkB;QAClB,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,cAAc,CAAC,GAAG,iBAAiB,EAAE,CAAC;QAChD,CAAC;QAED,4DAA4D;QAC5D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,kBAAkB,CAAC;QACxD,CAAC;QAED,qEAAqE;QACrE,mEAAmE;QACnE,oEAAoE;QACpE,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACjE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACpF,CAAC;aAAM,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YAC7C,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;QACnD,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,wEAAwE;IAChE,SAAS,CAAC,OAAe;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAClD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;IAChD,CAAC;CACF;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACpD,CAAC;AAED,SAAS,cAAc,CAAC,MAAe;IACrC,MAAM,WAAW,GACf,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ;QAChD,CAAC,CAAC,QAAQ,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;QACjC,CAAC,CAAC,cAAc,CAAC;IACrB,MAAM,IAAI,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,WAAW,KAAK,WAAW,GAAG,CAAC;IAC9F,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc;IACvC,6DAA6D;IAC7D,oEAAoE;IACpE,sDAAsD;IACtD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACpE,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IACnD,OAAO,MAAM,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG,CAAC;AACxC,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAgB;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,GAAG,GAAG,IAAI,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,GAAa;IAC7C,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC;IAC/D,MAAM,YAAY,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAEnD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC1D,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAqC,CAAC;YACpE,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBAChE,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;IACH,CAAC;IAED,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC;IACxB,CAAC;IACD,OAAO,gBAAgB,CACrB;QACE,IAAI,EAAE,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,uBAAuB;QAC/D,IAAI,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE;QAC1B,OAAO,EAAE,IAAI,IAAI,GAAG,CAAC,UAAU,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE;KACxD,EACD,GAAG,CAAC,MAAM,EACV,SAAS,EACT,YAAY,CACb,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAY;IAC1C,IAAI,GAAG,YAAY,UAAU;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC;QACxB,IAAI,IAAI,KAAK,YAAY,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,iBAAiB,CAAC;QACnF,IAAI,IAAI,KAAK,YAAY;YAAE,OAAO,SAAS,CAAC;QAC5C,IAAI,+EAA+E,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9F,OAAO,eAAe,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IAC7C,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,yBAAyB,CAAC;AACnE,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,EAAU;IACpC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,qBAAqB;IAC5B,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAC7E,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;IACD,oEAAoE;IACpE,qEAAqE;IACrE,4CAA4C;IAC5C,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChE,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,OAAO,qBAAqB,EAAE,EAAE,CAAC;AAC1C,CAAC"}