@semiont/api-client 0.2.1 → 0.2.2

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 (73) hide show
  1. package/dist/{types.d.ts → index-DHh0ToZB.d.ts} +460 -6
  2. package/dist/index.d.ts +909 -13
  3. package/dist/index.js +1598 -60
  4. package/dist/index.js.map +1 -1
  5. package/dist/utils/index.d.ts +1 -12
  6. package/dist/utils/index.js +597 -26
  7. package/dist/utils/index.js.map +1 -1
  8. package/package.json +11 -8
  9. package/dist/__tests__/client.test.d.ts +0 -28
  10. package/dist/__tests__/client.test.d.ts.map +0 -1
  11. package/dist/__tests__/client.test.js +0 -567
  12. package/dist/__tests__/client.test.js.map +0 -1
  13. package/dist/__tests__/sse-client.test.d.ts +0 -7
  14. package/dist/__tests__/sse-client.test.d.ts.map +0 -1
  15. package/dist/__tests__/sse-client.test.js +0 -421
  16. package/dist/__tests__/sse-client.test.js.map +0 -1
  17. package/dist/__tests__/sse-stream.test.d.ts +0 -7
  18. package/dist/__tests__/sse-stream.test.d.ts.map +0 -1
  19. package/dist/__tests__/sse-stream.test.js +0 -394
  20. package/dist/__tests__/sse-stream.test.js.map +0 -1
  21. package/dist/__tests__/svg-selectors.test.d.ts +0 -5
  22. package/dist/__tests__/svg-selectors.test.d.ts.map +0 -1
  23. package/dist/__tests__/svg-selectors.test.js +0 -124
  24. package/dist/__tests__/svg-selectors.test.js.map +0 -1
  25. package/dist/branded-types.d.ts +0 -70
  26. package/dist/branded-types.d.ts.map +0 -1
  27. package/dist/branded-types.js +0 -62
  28. package/dist/branded-types.js.map +0 -1
  29. package/dist/client.d.ts +0 -243
  30. package/dist/client.d.ts.map +0 -1
  31. package/dist/client.js +0 -460
  32. package/dist/client.js.map +0 -1
  33. package/dist/index.d.ts.map +0 -1
  34. package/dist/mime-utils.d.ts +0 -27
  35. package/dist/mime-utils.d.ts.map +0 -1
  36. package/dist/mime-utils.js +0 -49
  37. package/dist/mime-utils.js.map +0 -1
  38. package/dist/sse/index.d.ts +0 -343
  39. package/dist/sse/index.d.ts.map +0 -1
  40. package/dist/sse/index.js +0 -404
  41. package/dist/sse/index.js.map +0 -1
  42. package/dist/sse/stream.d.ts +0 -58
  43. package/dist/sse/stream.d.ts.map +0 -1
  44. package/dist/sse/stream.js +0 -187
  45. package/dist/sse/stream.js.map +0 -1
  46. package/dist/sse/types.d.ts +0 -295
  47. package/dist/sse/types.d.ts.map +0 -1
  48. package/dist/sse/types.js +0 -10
  49. package/dist/sse/types.js.map +0 -1
  50. package/dist/types.d.ts.map +0 -1
  51. package/dist/types.js +0 -7
  52. package/dist/types.js.map +0 -1
  53. package/dist/utils/annotations.d.ts +0 -191
  54. package/dist/utils/annotations.d.ts.map +0 -1
  55. package/dist/utils/annotations.js +0 -404
  56. package/dist/utils/annotations.js.map +0 -1
  57. package/dist/utils/events.d.ts +0 -74
  58. package/dist/utils/events.d.ts.map +0 -1
  59. package/dist/utils/events.js +0 -329
  60. package/dist/utils/events.js.map +0 -1
  61. package/dist/utils/index.d.ts.map +0 -1
  62. package/dist/utils/locales.d.ts +0 -31
  63. package/dist/utils/locales.d.ts.map +0 -1
  64. package/dist/utils/locales.js +0 -83
  65. package/dist/utils/locales.js.map +0 -1
  66. package/dist/utils/resources.d.ts +0 -34
  67. package/dist/utils/resources.d.ts.map +0 -1
  68. package/dist/utils/resources.js +0 -63
  69. package/dist/utils/resources.js.map +0 -1
  70. package/dist/utils/validation.d.ts +0 -57
  71. package/dist/utils/validation.d.ts.map +0 -1
  72. package/dist/utils/validation.js +0 -89
  73. package/dist/utils/validation.js.map +0 -1
package/dist/client.js DELETED
@@ -1,460 +0,0 @@
1
- "use strict";
2
- /**
3
- * Common API client for Semiont backend
4
- *
5
- * This client can be used by:
6
- * - MCP server (Node.js)
7
- * - Demo scripts (Node.js)
8
- * - Frontend (Next.js/React - can wrap with hooks)
9
- *
10
- * Uses ky for HTTP requests with built-in retry, timeout, and error handling.
11
- */
12
- var __importDefault = (this && this.__importDefault) || function (mod) {
13
- return (mod && mod.__esModule) ? mod : { "default": mod };
14
- };
15
- Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.SemiontApiClient = exports.APIError = void 0;
17
- const ky_1 = __importDefault(require("ky"));
18
- const sse_1 = require("./sse");
19
- // API Error class
20
- class APIError extends Error {
21
- status;
22
- statusText;
23
- details;
24
- constructor(message, status, statusText, details) {
25
- super(message);
26
- this.status = status;
27
- this.statusText = statusText;
28
- this.details = details;
29
- this.name = 'APIError';
30
- }
31
- }
32
- exports.APIError = APIError;
33
- /**
34
- * Semiont API Client
35
- *
36
- * Provides type-safe methods for all Semiont backend API endpoints.
37
- */
38
- class SemiontApiClient {
39
- http;
40
- baseUrl;
41
- accessToken = null;
42
- /**
43
- * SSE streaming client for real-time operations
44
- *
45
- * Separate from the main HTTP client to clearly mark streaming endpoints.
46
- * Uses native fetch() instead of ky for SSE support.
47
- *
48
- * @example
49
- * ```typescript
50
- * const stream = client.sse.detectAnnotations(
51
- * resourceId,
52
- * { entityTypes: ['Person', 'Organization'] }
53
- * );
54
- *
55
- * stream.onProgress((p) => console.log(p.message));
56
- * stream.onComplete((r) => console.log(`Found ${r.foundCount} entities`));
57
- * stream.close();
58
- * ```
59
- */
60
- sse;
61
- constructor(config) {
62
- const { baseUrl, accessToken, timeout = 30000, retry = 2 } = config;
63
- // Store baseUrl for constructing full URLs
64
- // Remove trailing slash for consistent URL construction
65
- this.baseUrl = (baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl);
66
- // Don't use prefixUrl - we'll construct full URLs or use provided full URIs
67
- this.http = ky_1.default.create({
68
- timeout,
69
- retry,
70
- hooks: {
71
- beforeRequest: [
72
- (request) => {
73
- if (this.accessToken) {
74
- request.headers.set('Authorization', `Bearer ${this.accessToken}`);
75
- }
76
- },
77
- ],
78
- beforeError: [
79
- async (error) => {
80
- const { response } = error;
81
- if (response) {
82
- const body = await response.json().catch(() => ({}));
83
- throw new APIError(body.message || `HTTP ${response.status}: ${response.statusText}`, response.status, response.statusText, body);
84
- }
85
- return error;
86
- },
87
- ],
88
- },
89
- });
90
- if (accessToken) {
91
- this.accessToken = accessToken;
92
- }
93
- // Initialize SSE client (uses native fetch, not ky)
94
- this.sse = new sse_1.SSEClient({
95
- baseUrl: this.baseUrl,
96
- accessToken: this.accessToken || undefined
97
- });
98
- }
99
- /**
100
- * Set the access token for authenticated requests
101
- */
102
- setAccessToken(token) {
103
- this.accessToken = token;
104
- this.sse.setAccessToken(token);
105
- }
106
- /**
107
- * Clear the access token
108
- */
109
- clearAccessToken() {
110
- this.accessToken = null;
111
- this.sse.clearAccessToken();
112
- }
113
- // ============================================================================
114
- // AUTHENTICATION
115
- // ============================================================================
116
- async authenticatePassword(email, password) {
117
- const response = await this.http.post(`${this.baseUrl}/api/tokens/password`, { json: { email, password } }).json();
118
- if (response.token) {
119
- this.setAccessToken(response.token);
120
- }
121
- return response;
122
- }
123
- async refreshToken(token) {
124
- const response = await this.http.post(`${this.baseUrl}/api/tokens/refresh`, { json: { refreshToken: token } }).json();
125
- if (response.access_token) {
126
- this.setAccessToken(response.access_token);
127
- }
128
- return response;
129
- }
130
- async authenticateGoogle(credential) {
131
- const response = await this.http.post(`${this.baseUrl}/api/tokens/google`, { json: { credential } }).json();
132
- if (response.token) {
133
- this.setAccessToken(response.token);
134
- }
135
- return response;
136
- }
137
- async generateMCPToken() {
138
- return this.http.post(`${this.baseUrl}/api/tokens/mcp-generate`).json();
139
- }
140
- // ============================================================================
141
- // USERS
142
- // ============================================================================
143
- async getMe() {
144
- return this.http.get(`${this.baseUrl}/api/users/me`).json();
145
- }
146
- async acceptTerms() {
147
- return this.http.post(`${this.baseUrl}/api/users/accept-terms`).json();
148
- }
149
- async logout() {
150
- return this.http.post(`${this.baseUrl}/api/users/logout`).json();
151
- }
152
- // ============================================================================
153
- // RESOURCES
154
- // ============================================================================
155
- /**
156
- * Create a new resource with binary content support
157
- *
158
- * @param data - Resource creation data
159
- * @param data.name - Resource name
160
- * @param data.file - File object or Buffer with binary content
161
- * @param data.format - MIME type (e.g., 'text/markdown', 'image/png')
162
- * @param data.entityTypes - Optional array of entity types
163
- * @param data.language - Optional ISO 639-1 language code
164
- * @param data.creationMethod - Optional creation method
165
- * @param data.sourceAnnotationId - Optional source annotation ID
166
- * @param data.sourceResourceId - Optional source resource ID
167
- */
168
- async createResource(data) {
169
- // Build FormData
170
- const formData = new FormData();
171
- formData.append('name', data.name);
172
- formData.append('format', data.format);
173
- // Handle File or Buffer
174
- if (data.file instanceof File) {
175
- formData.append('file', data.file);
176
- }
177
- else if (Buffer.isBuffer(data.file)) {
178
- // Node.js environment: convert Buffer to Blob
179
- const blob = new Blob([data.file], { type: data.format });
180
- formData.append('file', blob, data.name);
181
- }
182
- else {
183
- throw new Error('file must be a File or Buffer');
184
- }
185
- // Optional fields
186
- if (data.entityTypes && data.entityTypes.length > 0) {
187
- formData.append('entityTypes', JSON.stringify(data.entityTypes));
188
- }
189
- if (data.language) {
190
- formData.append('language', data.language);
191
- }
192
- if (data.creationMethod) {
193
- formData.append('creationMethod', data.creationMethod);
194
- }
195
- if (data.sourceAnnotationId) {
196
- formData.append('sourceAnnotationId', data.sourceAnnotationId);
197
- }
198
- if (data.sourceResourceId) {
199
- formData.append('sourceResourceId', data.sourceResourceId);
200
- }
201
- // POST with multipart/form-data (ky automatically sets Content-Type)
202
- return this.http.post(`${this.baseUrl}/resources`, { body: formData }).json();
203
- }
204
- async getResource(resourceUri) {
205
- // resourceUri is already a full URI, use it directly
206
- return this.http.get(resourceUri).json();
207
- }
208
- /**
209
- * Get resource representation using W3C content negotiation
210
- * Returns raw binary content (images, PDFs, text, etc.) with content type
211
- *
212
- * @param resourceUri - Full resource URI
213
- * @param options - Options including Accept header for content negotiation
214
- * @returns Object with data (ArrayBuffer) and contentType (string)
215
- *
216
- * @example
217
- * ```typescript
218
- * // Get markdown representation
219
- * const { data, contentType } = await client.getResourceRepresentation(rUri, { accept: 'text/markdown' });
220
- * const markdown = new TextDecoder().decode(data);
221
- *
222
- * // Get image representation
223
- * const { data, contentType } = await client.getResourceRepresentation(rUri, { accept: 'image/png' });
224
- * const blob = new Blob([data], { type: contentType });
225
- *
226
- * // Get PDF representation
227
- * const { data, contentType } = await client.getResourceRepresentation(rUri, { accept: 'application/pdf' });
228
- * ```
229
- */
230
- async getResourceRepresentation(resourceUri, options) {
231
- // resourceUri is already a full URI, use it directly with Accept header
232
- const response = await this.http.get(resourceUri, {
233
- headers: {
234
- Accept: options?.accept || 'text/plain'
235
- }
236
- });
237
- const contentType = response.headers.get('content-type') || 'application/octet-stream';
238
- const data = await response.arrayBuffer();
239
- return { data, contentType };
240
- }
241
- /**
242
- * Get resource representation as a stream using W3C content negotiation
243
- * Returns streaming binary content (for large files: videos, large PDFs, etc.)
244
- *
245
- * Use this for large files to avoid loading entire content into memory.
246
- * The stream is consumed incrementally and the backend connection stays open
247
- * until the stream is fully consumed or closed.
248
- *
249
- * @param resourceUri - Full resource URI
250
- * @param options - Options including Accept header for content negotiation
251
- * @returns Object with stream (ReadableStream) and contentType (string)
252
- *
253
- * @example
254
- * ```typescript
255
- * // Stream large file
256
- * const { stream, contentType } = await client.getResourceRepresentationStream(rUri, {
257
- * accept: 'video/mp4'
258
- * });
259
- *
260
- * // Consume stream chunk by chunk (never loads entire file into memory)
261
- * for await (const chunk of stream) {
262
- * // Process chunk
263
- * console.log(`Received ${chunk.length} bytes`);
264
- * }
265
- *
266
- * // Or pipe to a file in Node.js
267
- * const fileStream = fs.createWriteStream('output.mp4');
268
- * const reader = stream.getReader();
269
- * while (true) {
270
- * const { done, value } = await reader.read();
271
- * if (done) break;
272
- * fileStream.write(value);
273
- * }
274
- * ```
275
- */
276
- async getResourceRepresentationStream(resourceUri, options) {
277
- // resourceUri is already a full URI, use it directly with Accept header
278
- const response = await this.http.get(resourceUri, {
279
- headers: {
280
- Accept: options?.accept || 'text/plain'
281
- }
282
- });
283
- const contentType = response.headers.get('content-type') || 'application/octet-stream';
284
- if (!response.body) {
285
- throw new Error('Response body is null - cannot create stream');
286
- }
287
- return { stream: response.body, contentType };
288
- }
289
- async listResources(limit, archived, query) {
290
- const searchParams = new URLSearchParams();
291
- if (limit)
292
- searchParams.append('limit', limit.toString());
293
- if (archived !== undefined)
294
- searchParams.append('archived', archived.toString());
295
- if (query)
296
- searchParams.append('q', query);
297
- return this.http.get(`${this.baseUrl}/resources`, { searchParams }).json();
298
- }
299
- async updateResource(resourceUri, data) {
300
- // resourceUri is already a full URI, use it directly
301
- return this.http.patch(resourceUri, { json: data }).json();
302
- }
303
- async getResourceEvents(resourceUri) {
304
- // resourceUri is already a full URI, use it directly
305
- return this.http.get(`${resourceUri}/events`).json();
306
- }
307
- async getResourceAnnotations(resourceUri) {
308
- // resourceUri is already a full URI, use it directly
309
- return this.http.get(`${resourceUri}/annotations`).json();
310
- }
311
- async getAnnotationLLMContext(resourceUri, annotationId, options) {
312
- const searchParams = new URLSearchParams();
313
- if (options?.contextWindow) {
314
- searchParams.append('contextWindow', options.contextWindow.toString());
315
- }
316
- // resourceUri is already a full URI, use it directly
317
- return this.http.get(`${resourceUri}/annotations/${annotationId}/llm-context`, { searchParams }).json();
318
- }
319
- async getResourceReferencedBy(resourceUri) {
320
- // resourceUri is already a full URI, use it directly
321
- return this.http.get(`${resourceUri}/referenced-by`).json();
322
- }
323
- async generateCloneToken(resourceUri) {
324
- // resourceUri is already a full URI, use it directly
325
- return this.http.post(`${resourceUri}/clone-with-token`).json();
326
- }
327
- async getResourceByToken(token) {
328
- return this.http.get(`${this.baseUrl}/api/resources/token/${token}`).json();
329
- }
330
- async createResourceFromToken(data) {
331
- return this.http.post(`${this.baseUrl}/api/resources/create-from-token`, { json: data }).json();
332
- }
333
- // ============================================================================
334
- // ANNOTATIONS
335
- // ============================================================================
336
- async createAnnotation(resourceUri, data) {
337
- // resourceUri is already a full URI, use it directly
338
- return this.http.post(`${resourceUri}/annotations`, { json: data }).json();
339
- }
340
- async getAnnotation(annotationUri) {
341
- // annotationUri is already a full URI, use it directly
342
- return this.http.get(annotationUri).json();
343
- }
344
- async getResourceAnnotation(annotationUri) {
345
- // annotationUri is already a full URI, use it directly
346
- return this.http.get(annotationUri).json();
347
- }
348
- async listAnnotations(resourceUri, motivation) {
349
- const searchParams = new URLSearchParams();
350
- if (motivation)
351
- searchParams.append('motivation', motivation);
352
- // resourceUri is already a full URI, use it directly
353
- return this.http.get(`${resourceUri}/annotations`, { searchParams }).json();
354
- }
355
- async deleteAnnotation(annotationUri) {
356
- // annotationUri is already a full URI, use it directly
357
- await this.http.delete(annotationUri);
358
- }
359
- async updateAnnotationBody(annotationUri, data) {
360
- // annotationUri is already a full URI, use it directly
361
- return this.http.put(`${annotationUri}/body`, {
362
- json: data,
363
- }).json();
364
- }
365
- async getAnnotationHistory(annotationUri) {
366
- // annotationUri is already a full URI, use it directly
367
- return this.http.get(`${annotationUri}/history`).json();
368
- }
369
- // ============================================================================
370
- // ENTITY TYPES
371
- // ============================================================================
372
- async addEntityType(type) {
373
- return this.http.post(`${this.baseUrl}/api/entity-types`, { json: { type } }).json();
374
- }
375
- async addEntityTypesBulk(types) {
376
- return this.http.post(`${this.baseUrl}/api/entity-types/bulk`, { json: { tags: types } }).json();
377
- }
378
- async listEntityTypes() {
379
- return this.http.get(`${this.baseUrl}/api/entity-types`).json();
380
- }
381
- // ============================================================================
382
- // ADMIN
383
- // ============================================================================
384
- async listUsers() {
385
- return this.http.get(`${this.baseUrl}/api/admin/users`).json();
386
- }
387
- async getUserStats() {
388
- return this.http.get(`${this.baseUrl}/api/admin/users/stats`).json();
389
- }
390
- /**
391
- * Update a user by ID
392
- * Note: Users use DID identifiers (did:web:domain:users:id), not HTTP URIs.
393
- */
394
- async updateUser(id, data) {
395
- return this.http.patch(`${this.baseUrl}/api/admin/users/${id}`, { json: data }).json();
396
- }
397
- async getOAuthConfig() {
398
- return this.http.get(`${this.baseUrl}/api/admin/oauth/config`).json();
399
- }
400
- // ============================================================================
401
- // JOB STATUS
402
- // ============================================================================
403
- async getJobStatus(id) {
404
- return this.http.get(`${this.baseUrl}/api/jobs/${id}`).json();
405
- }
406
- /**
407
- * Poll a job until it completes or fails
408
- * @param id - The job ID to poll
409
- * @param options - Polling options
410
- * @returns The final job status
411
- */
412
- async pollJobUntilComplete(id, options) {
413
- const interval = options?.interval ?? 1000;
414
- const timeout = options?.timeout ?? 60000;
415
- const startTime = Date.now();
416
- while (true) {
417
- const status = await this.getJobStatus(id);
418
- // Call progress callback if provided
419
- if (options?.onProgress) {
420
- options.onProgress(status);
421
- }
422
- // Check if job is in a terminal state
423
- if (status.status === 'complete' || status.status === 'failed' || status.status === 'cancelled') {
424
- return status;
425
- }
426
- // Check timeout
427
- if (Date.now() - startTime > timeout) {
428
- throw new Error(`Job polling timeout after ${timeout}ms`);
429
- }
430
- // Wait before next poll
431
- await new Promise(resolve => setTimeout(resolve, interval));
432
- }
433
- }
434
- // ============================================================================
435
- // LLM CONTEXT
436
- // ============================================================================
437
- async getResourceLLMContext(resourceUri, options) {
438
- const searchParams = new URLSearchParams();
439
- if (options?.depth !== undefined)
440
- searchParams.append('depth', options.depth.toString());
441
- if (options?.maxResources !== undefined)
442
- searchParams.append('maxResources', options.maxResources.toString());
443
- if (options?.includeContent !== undefined)
444
- searchParams.append('includeContent', options.includeContent.toString());
445
- if (options?.includeSummary !== undefined)
446
- searchParams.append('includeSummary', options.includeSummary.toString());
447
- return this.http.get(`${resourceUri}/llm-context`, { searchParams }).json();
448
- }
449
- // ============================================================================
450
- // SYSTEM STATUS
451
- // ============================================================================
452
- async healthCheck() {
453
- return this.http.get(`${this.baseUrl}/api/health`).json();
454
- }
455
- async getStatus() {
456
- return this.http.get(`${this.baseUrl}/api/status`).json();
457
- }
458
- }
459
- exports.SemiontApiClient = SemiontApiClient;
460
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;AAEH,4CAAyC;AAiBzC,+BAAkC;AAWlC,kBAAkB;AAClB,MAAa,QAAS,SAAQ,KAAK;IAGxB;IACA;IACA;IAJT,YACE,OAAe,EACR,MAAc,EACd,UAAkB,EAClB,OAAiB;QAExB,KAAK,CAAC,OAAO,CAAC,CAAC;QAJR,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAQ;QAClB,YAAO,GAAP,OAAO,CAAU;QAGxB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAVD,4BAUC;AASD;;;;GAIG;AACH,MAAa,gBAAgB;IACnB,IAAI,CAAa;IACjB,OAAO,CAAU;IACjB,WAAW,GAAuB,IAAI,CAAC;IAE/C;;;;;;;;;;;;;;;;;OAiBG;IACa,GAAG,CAAY;IAE/B,YAAY,MAA8B;QACxC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,GAAG,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC;QAEpE,2CAA2C;QAC3C,wDAAwD;QACxD,IAAI,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAY,CAAC;QAEnF,4EAA4E;QAC5E,IAAI,CAAC,IAAI,GAAG,YAAE,CAAC,MAAM,CAAC;YACpB,OAAO;YACP,KAAK;YACL,KAAK,EAAE;gBACL,aAAa,EAAE;oBACb,CAAC,OAAO,EAAE,EAAE;wBACV,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;4BACrB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;wBACrE,CAAC;oBACH,CAAC;iBACF;gBACD,WAAW,EAAE;oBACX,KAAK,EAAE,KAAK,EAAE,EAAE;wBACd,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;wBAC3B,IAAI,QAAQ,EAAE,CAAC;4BACb,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAQ,CAAC;4BAC5D,MAAM,IAAI,QAAQ,CAChB,IAAI,CAAC,OAAO,IAAI,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,EACjE,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,UAAU,EACnB,IAAI,CACL,CAAC;wBACJ,CAAC;wBACD,OAAO,KAAK,CAAC;oBACf,CAAC;iBACF;aACF;SACF,CAAC,CAAC;QAEH,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QACjC,CAAC;QAED,oDAAoD;QACpD,IAAI,CAAC,GAAG,GAAG,IAAI,eAAS,CAAC;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,SAAS;SAC3C,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,KAAkB;QAC/B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC9B,CAAC;IAED,+EAA+E;IAC/E,iBAAiB;IACjB,+EAA+E;IAE/E,KAAK,CAAC,oBAAoB,CAAC,KAAY,EAAE,QAAgB;QACvD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,sBAAsB,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAO,CAAC;QACxH,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAmB;QACpC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,qBAAqB,EAAE,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAO,CAAC;QAC3H,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC1B,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAA4B;QACnD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,oBAAoB,EAAE,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAO,CAAC;QACjH,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,0BAA0B,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1E,CAAC;IAED,+EAA+E;IAC/E,QAAQ;IACR,+EAA+E;IAE/E,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,eAAe,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,yBAAyB,CAAC,CAAC,IAAI,EAAE,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,MAAM;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC;IACnE,CAAC;IAED,+EAA+E;IAC/E,YAAY;IACZ,+EAA+E;IAE/E;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,cAAc,CAAC,IASpB;QACC,iBAAiB;QACjB,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAEvC,wBAAwB;QACxB,IAAI,IAAI,CAAC,IAAI,YAAY,IAAI,EAAE,CAAC;YAC9B,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,8CAA8C;YAC9C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1D,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,kBAAkB;QAClB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,QAAQ,CAAC,MAAM,CAAC,oBAAoB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7D,CAAC;QAED,qEAAqE;QACrE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChF,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,WAAwB;QACxC,qDAAqD;QACrD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,KAAK,CAAC,yBAAyB,CAC7B,WAAwB,EACxB,OAAoC;QAEpC,wEAAwE;QACxE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE;YAChD,OAAO,EAAE;gBACP,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,YAAY;aACxC;SACF,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,0BAA0B,CAAC;QACvF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;QAE1C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC/B,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCG;IACH,KAAK,CAAC,+BAA+B,CACnC,WAAwB,EACxB,OAAoC;QAEpC,wEAAwE;QACxE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE;YAChD,OAAO,EAAE;gBACP,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,YAAY;aACxC;SACF,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,0BAA0B,CAAC;QAEvF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,KAAc,EACd,QAAkB,EAClB,KAAmB;QAEnB,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAC3C,IAAI,KAAK;YAAE,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1D,IAAI,QAAQ,KAAK,SAAS;YAAE,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjF,IAAI,KAAK;YAAE,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAE3C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,WAAwB,EACxB,IAAuD;QAEvD,qDAAqD;QACrD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,WAAwB;QAC9C,qDAAqD;QACrD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,sBAAsB,CAC1B,WAAwB;QAExB,qDAAqD;QACrD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,uBAAuB,CAC3B,WAAwB,EACxB,YAAoB,EACpB,OAAoC;QAEpC,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAC3C,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;YAC3B,YAAY,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,qDAAqD;QACrD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,GAAG,WAAW,gBAAgB,YAAY,cAAc,EACxD,EAAE,YAAY,EAAE,CACjB,CAAC,IAAI,EAAE,CAAC;IACX,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,WAAwB;QACpD,qDAAqD;QACrD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,gBAAgB,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,WAAwB;QAC/C,qDAAqD;QACrD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,WAAW,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,KAAiB;QACxC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,wBAAwB,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,uBAAuB,CAC3B,IAAuE;QAEvE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,kCAAkC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAClG,CAAC;IAED,+EAA+E;IAC/E,cAAc;IACd,+EAA+E;IAE/E,KAAK,CAAC,gBAAgB,CACpB,WAAwB,EACxB,IAAkE;QAElE,qDAAqD;QACrD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,WAAW,cAAc,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,aAA4B;QAC9C,uDAAuD;QACvD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,aAAoC;QAC9D,uDAAuD;QACvD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,WAAwB,EACxB,UAAuB;QAEvB,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAC3C,IAAI,UAAU;YAAE,YAAY,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAE9D,qDAAqD;QACrD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,cAAc,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,aAAoC;QACzD,uDAAuD;QACvD,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,aAAoC,EACpC,IAA6F;QAE7F,uDAAuD;QACvD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,OAAO,EAAE;YAC5C,IAAI,EAAE,IAAI;SACX,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,aAAoC;QAEpC,uDAAuD;QACvD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1D,CAAC;IAED,+EAA+E;IAC/E,eAAe;IACf,+EAA+E;IAE/E,KAAK,CAAC,aAAa,CAAC,IAAgB;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,mBAAmB,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvF,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,KAAmB;QAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,wBAAwB,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnG,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC;IAClE,CAAC;IAED,+EAA+E;IAC/E,QAAQ;IACR,+EAA+E;IAE/E,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,kBAAkB,CAAC,CAAC,IAAI,EAAE,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,wBAAwB,CAAC,CAAC,IAAI,EAAE,CAAC;IACvE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CACd,EAAW,EACX,IAA6D;QAE7D,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,oBAAoB,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACzF,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,yBAAyB,CAAC,CAAC,IAAI,EAAE,CAAC;IACxE,CAAC;IAED,+EAA+E;IAC/E,aAAa;IACb,+EAA+E;IAE/E,KAAK,CAAC,YAAY,CAAC,EAAS;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,oBAAoB,CACxB,EAAS,EACT,OAIC;QAED,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC;QAC3C,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAE3C,qCAAqC;YACrC,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;gBACxB,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;YAED,sCAAsC;YACtC,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAChG,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,gBAAgB;YAChB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,6BAA6B,OAAO,IAAI,CAAC,CAAC;YAC5D,CAAC;YAED,wBAAwB;YACxB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,cAAc;IACd,+EAA+E;IAE/E,KAAK,CAAC,qBAAqB,CACzB,WAAwB,EACxB,OAKC;QAED,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAC3C,IAAI,OAAO,EAAE,KAAK,KAAK,SAAS;YAAE,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzF,IAAI,OAAO,EAAE,YAAY,KAAK,SAAS;YAAE,YAAY,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9G,IAAI,OAAO,EAAE,cAAc,KAAK,SAAS;YAAE,YAAY,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpH,IAAI,OAAO,EAAE,cAAc,KAAK,SAAS;YAAE,YAAY,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEpH,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,cAAc,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9E,CAAC;IAED,+EAA+E;IAC/E,gBAAgB;IAChB,+EAA+E;IAE/E,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,CAAC;CACF;AAriBD,4CAqiBC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1C,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,mBAAmB,CAAC,CAAC;AAC3E,MAAM,MAAM,4BAA4B,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,8BAA8B,CAAC,CAAC;AAGjG,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,SAAS,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,YAAY,EACV,8BAA8B,EAC9B,6BAA6B,EAC7B,eAAe,EAChB,MAAM,OAAO,CAAC;AAGf,cAAc,SAAS,CAAC;AACxB,OAAO,EACL,uBAAuB,EACvB,eAAe,EACf,cAAc,EACd,eAAe,EACf,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AAGtB,cAAc,iBAAiB,CAAC"}
@@ -1,27 +0,0 @@
1
- /**
2
- * MIME type utilities for Semiont
3
- *
4
- * Initial support for:
5
- * - text/plain
6
- * - text/markdown
7
- * - image/png
8
- * - image/jpeg
9
- */
10
- /**
11
- * Map MIME type to file extension
12
- */
13
- export declare function getExtensionForMimeType(mimeType: string): string;
14
- /**
15
- * Detect if MIME type is an image (png or jpeg only for now)
16
- */
17
- export declare function isImageMimeType(mimeType: string): boolean;
18
- /**
19
- * Detect if MIME type is text-based (plain or markdown only for now)
20
- */
21
- export declare function isTextMimeType(mimeType: string): boolean;
22
- /**
23
- * Get category for MIME type (for routing to appropriate viewer)
24
- */
25
- export type MimeCategory = 'text' | 'image' | 'unsupported';
26
- export declare function getMimeCategory(mimeType: string): MimeCategory;
27
- //# sourceMappingURL=mime-utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mime-utils.d.ts","sourceRoot":"","sources":["../src/mime-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAShE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,aAAa,CAAC;AAE5D,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAQ9D"}
@@ -1,49 +0,0 @@
1
- "use strict";
2
- /**
3
- * MIME type utilities for Semiont
4
- *
5
- * Initial support for:
6
- * - text/plain
7
- * - text/markdown
8
- * - image/png
9
- * - image/jpeg
10
- */
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.getExtensionForMimeType = getExtensionForMimeType;
13
- exports.isImageMimeType = isImageMimeType;
14
- exports.isTextMimeType = isTextMimeType;
15
- exports.getMimeCategory = getMimeCategory;
16
- /**
17
- * Map MIME type to file extension
18
- */
19
- function getExtensionForMimeType(mimeType) {
20
- const map = {
21
- 'text/plain': 'txt',
22
- 'text/markdown': 'md',
23
- 'image/png': 'png',
24
- 'image/jpeg': 'jpg',
25
- };
26
- return map[mimeType] || 'dat'; // fallback to .dat for unknown types
27
- }
28
- /**
29
- * Detect if MIME type is an image (png or jpeg only for now)
30
- */
31
- function isImageMimeType(mimeType) {
32
- return mimeType === 'image/png' || mimeType === 'image/jpeg';
33
- }
34
- /**
35
- * Detect if MIME type is text-based (plain or markdown only for now)
36
- */
37
- function isTextMimeType(mimeType) {
38
- return mimeType === 'text/plain' || mimeType === 'text/markdown';
39
- }
40
- function getMimeCategory(mimeType) {
41
- if (isTextMimeType(mimeType)) {
42
- return 'text';
43
- }
44
- if (isImageMimeType(mimeType)) {
45
- return 'image';
46
- }
47
- return 'unsupported';
48
- }
49
- //# sourceMappingURL=mime-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mime-utils.js","sourceRoot":"","sources":["../src/mime-utils.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAKH,0DASC;AAKD,0CAEC;AAKD,wCAEC;AAOD,0CAQC;AAzCD;;GAEG;AACH,SAAgB,uBAAuB,CAAC,QAAgB;IACtD,MAAM,GAAG,GAA2B;QAClC,YAAY,EAAE,KAAK;QACnB,eAAe,EAAE,IAAI;QACrB,WAAW,EAAE,KAAK;QAClB,YAAY,EAAE,KAAK;KACpB,CAAC;IAEF,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,CAAC,qCAAqC;AACtE,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,QAAgB;IAC9C,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,YAAY,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,QAAgB;IAC7C,OAAO,QAAQ,KAAK,YAAY,IAAI,QAAQ,KAAK,eAAe,CAAC;AACnE,CAAC;AAOD,SAAgB,eAAe,CAAC,QAAgB;IAC9C,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC"}