@bernierllc/email-sender 0.2.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 (39) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +430 -0
  3. package/dist/core/email-sender.d.ts +71 -0
  4. package/dist/core/email-sender.d.ts.map +1 -0
  5. package/dist/core/email-sender.js +125 -0
  6. package/dist/core/email-sender.js.map +1 -0
  7. package/dist/index.d.ts +14 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +47 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/providers/base.d.ts +63 -0
  12. package/dist/providers/base.d.ts.map +1 -0
  13. package/dist/providers/base.js +132 -0
  14. package/dist/providers/base.js.map +1 -0
  15. package/dist/providers/mailgun.d.ts +40 -0
  16. package/dist/providers/mailgun.d.ts.map +1 -0
  17. package/dist/providers/mailgun.js +525 -0
  18. package/dist/providers/mailgun.js.map +1 -0
  19. package/dist/providers/postmark.d.ts +37 -0
  20. package/dist/providers/postmark.d.ts.map +1 -0
  21. package/dist/providers/postmark.js +482 -0
  22. package/dist/providers/postmark.js.map +1 -0
  23. package/dist/providers/sendgrid.d.ts +80 -0
  24. package/dist/providers/sendgrid.d.ts.map +1 -0
  25. package/dist/providers/sendgrid.js +407 -0
  26. package/dist/providers/sendgrid.js.map +1 -0
  27. package/dist/providers/ses.d.ts +38 -0
  28. package/dist/providers/ses.d.ts.map +1 -0
  29. package/dist/providers/ses.js +404 -0
  30. package/dist/providers/ses.js.map +1 -0
  31. package/dist/providers/smtp.d.ts +61 -0
  32. package/dist/providers/smtp.d.ts.map +1 -0
  33. package/dist/providers/smtp.js +201 -0
  34. package/dist/providers/smtp.js.map +1 -0
  35. package/dist/types/index.d.ts +99 -0
  36. package/dist/types/index.d.ts.map +1 -0
  37. package/dist/types/index.js +10 -0
  38. package/dist/types/index.js.map +1 -0
  39. package/package.json +55 -0
@@ -0,0 +1,525 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (c) 2025 Bernier LLC
4
+
5
+ This file is licensed to the client under a limited-use license.
6
+ The client may use and modify this code *only within the scope of the project it was delivered for*.
7
+ Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.MailgunProvider = void 0;
11
+ /**
12
+ * Mailgun Email Provider
13
+ * Handles email sending through Mailgun API
14
+ */
15
+ const base_1 = require("./base");
16
+ class MailgunProvider extends base_1.EmailProvider {
17
+ constructor(config) {
18
+ super(config);
19
+ this.baseUrl = this.buildBaseUrl();
20
+ }
21
+ buildBaseUrl() {
22
+ const region = this.config.region || 'us';
23
+ const endpoint = this.config.endpoint || `https://api.${region === 'eu' ? 'eu.' : ''}mailgun.net`;
24
+ return `${endpoint}/v3/${this.config.domain}`;
25
+ }
26
+ async sendEmail(message) {
27
+ try {
28
+ const mailgunMessage = this.convertToMailgunMessage(message);
29
+ const formData = new FormData();
30
+ Object.entries(mailgunMessage).forEach(([key, value]) => {
31
+ if (value !== undefined) {
32
+ if (key === 'attachment' || key === 'inline') {
33
+ // Handle attachments
34
+ if (Array.isArray(value)) {
35
+ value.forEach((attachment) => {
36
+ formData.append(key, attachment, attachment.filename);
37
+ });
38
+ }
39
+ }
40
+ else {
41
+ formData.append(key, value);
42
+ }
43
+ }
44
+ });
45
+ const response = await fetch(`${this.baseUrl}/messages`, {
46
+ method: 'POST',
47
+ headers: {
48
+ 'Authorization': `Basic ${Buffer.from(`api:${this.config.apiKey}`).toString('base64')}`
49
+ },
50
+ body: formData
51
+ });
52
+ if (!response.ok) {
53
+ const errorData = await response.text();
54
+ throw new Error(`Mailgun API error: ${response.status} - ${errorData}`);
55
+ }
56
+ const result = await response.json();
57
+ return {
58
+ success: true,
59
+ messageId: result.id,
60
+ providerResponse: result,
61
+ metadata: {
62
+ provider: 'mailgun',
63
+ domain: this.config.domain,
64
+ timestamp: new Date().toISOString()
65
+ }
66
+ };
67
+ }
68
+ catch (error) {
69
+ return {
70
+ success: false,
71
+ errorMessage: this.formatMailgunError(error),
72
+ providerResponse: error,
73
+ metadata: {
74
+ provider: 'mailgun',
75
+ domain: this.config.domain,
76
+ timestamp: new Date().toISOString()
77
+ }
78
+ };
79
+ }
80
+ }
81
+ async sendBatch(emails) {
82
+ try {
83
+ const batchSize = Math.min(emails.length, this.getCapabilities().maxBatchSize);
84
+ const results = [];
85
+ // Process emails in batches
86
+ for (let i = 0; i < emails.length; i += batchSize) {
87
+ const batch = emails.slice(i, i + batchSize);
88
+ const batchResults = await this.sendBatchChunk(batch);
89
+ results.push(...batchResults);
90
+ }
91
+ return results;
92
+ }
93
+ catch (error) {
94
+ // If batch fails, return individual error results
95
+ return emails.map(() => ({
96
+ success: false,
97
+ errorMessage: this.formatMailgunError(error),
98
+ metadata: {
99
+ provider: 'mailgun',
100
+ domain: this.config.domain,
101
+ timestamp: new Date().toISOString()
102
+ }
103
+ }));
104
+ }
105
+ }
106
+ async sendBatchChunk(emails) {
107
+ try {
108
+ const recipients = emails.map(email => email.toEmail).join(',');
109
+ const variables = emails.reduce((acc, email, index) => {
110
+ acc[`recipient_${index}`] = email.toEmail;
111
+ acc[`subject_${index}`] = email.subject;
112
+ acc[`html_content_${index}`] = email.htmlContent || '';
113
+ acc[`text_content_${index}`] = email.textContent || '';
114
+ return acc;
115
+ }, {});
116
+ const formData = new FormData();
117
+ formData.append('from', this.config.fromEmail);
118
+ formData.append('to', recipients);
119
+ formData.append('subject', 'Batch Email');
120
+ formData.append('html', this.createBatchHtmlTemplate(emails));
121
+ formData.append('text', this.createBatchTextTemplate(emails));
122
+ formData.append('recipient-variables', JSON.stringify(variables));
123
+ const response = await fetch(`${this.baseUrl}/messages`, {
124
+ method: 'POST',
125
+ headers: {
126
+ 'Authorization': `Basic ${Buffer.from(`api:${this.config.apiKey}`).toString('base64')}`
127
+ },
128
+ body: formData
129
+ });
130
+ if (!response.ok) {
131
+ const errorData = await response.text();
132
+ throw new Error(`Mailgun batch API error: ${response.status} - ${errorData}`);
133
+ }
134
+ const result = await response.json();
135
+ // Mailgun doesn't provide individual message IDs for batch sends
136
+ return emails.map(() => ({
137
+ success: true,
138
+ messageId: result.id,
139
+ providerResponse: result,
140
+ metadata: {
141
+ provider: 'mailgun',
142
+ domain: this.config.domain,
143
+ timestamp: new Date().toISOString()
144
+ }
145
+ }));
146
+ }
147
+ catch (error) {
148
+ return emails.map(() => ({
149
+ success: false,
150
+ errorMessage: this.formatMailgunError(error),
151
+ metadata: {
152
+ provider: 'mailgun',
153
+ domain: this.config.domain,
154
+ timestamp: new Date().toISOString()
155
+ }
156
+ }));
157
+ }
158
+ }
159
+ async sendTemplateEmail(templateId, toEmail, variables) {
160
+ try {
161
+ const formData = new FormData();
162
+ formData.append('from', this.config.fromEmail);
163
+ formData.append('to', toEmail);
164
+ formData.append('template', templateId);
165
+ formData.append('h:X-Mailgun-Variables', JSON.stringify(variables));
166
+ const response = await fetch(`${this.baseUrl}/messages`, {
167
+ method: 'POST',
168
+ headers: {
169
+ 'Authorization': `Basic ${Buffer.from(`api:${this.config.apiKey}`).toString('base64')}`
170
+ },
171
+ body: formData
172
+ });
173
+ if (!response.ok) {
174
+ const errorData = await response.text();
175
+ throw new Error(`Mailgun template API error: ${response.status} - ${errorData}`);
176
+ }
177
+ const result = await response.json();
178
+ return {
179
+ success: true,
180
+ messageId: result.id,
181
+ providerResponse: result,
182
+ metadata: {
183
+ provider: 'mailgun',
184
+ domain: this.config.domain,
185
+ templateId,
186
+ timestamp: new Date().toISOString()
187
+ }
188
+ };
189
+ }
190
+ catch (error) {
191
+ return {
192
+ success: false,
193
+ errorMessage: this.formatMailgunError(error),
194
+ providerResponse: error,
195
+ metadata: {
196
+ provider: 'mailgun',
197
+ domain: this.config.domain,
198
+ templateId,
199
+ timestamp: new Date().toISOString()
200
+ }
201
+ };
202
+ }
203
+ }
204
+ async createTemplate(template) {
205
+ try {
206
+ const formData = new FormData();
207
+ formData.append('name', template.name);
208
+ formData.append('description', template.subject);
209
+ formData.append('template', template.htmlContent || template.textContent || '');
210
+ const response = await fetch(`${this.baseUrl}/templates`, {
211
+ method: 'POST',
212
+ headers: {
213
+ 'Authorization': `Basic ${Buffer.from(`api:${this.config.apiKey}`).toString('base64')}`
214
+ },
215
+ body: formData
216
+ });
217
+ if (!response.ok) {
218
+ const errorData = await response.text();
219
+ throw new Error(`Mailgun template creation error: ${response.status} - ${errorData}`);
220
+ }
221
+ const result = await response.json();
222
+ return result.template.id;
223
+ }
224
+ catch (error) {
225
+ throw new Error(`Failed to create Mailgun template: ${this.formatMailgunError(error)}`);
226
+ }
227
+ }
228
+ async updateTemplate(template) {
229
+ try {
230
+ const formData = new FormData();
231
+ formData.append('description', template.subject);
232
+ formData.append('template', template.htmlContent || template.textContent || '');
233
+ const response = await fetch(`${this.baseUrl}/templates/${template.id}`, {
234
+ method: 'PUT',
235
+ headers: {
236
+ 'Authorization': `Basic ${Buffer.from(`api:${this.config.apiKey}`).toString('base64')}`
237
+ },
238
+ body: formData
239
+ });
240
+ if (!response.ok) {
241
+ const errorData = await response.text();
242
+ throw new Error(`Mailgun template update error: ${response.status} - ${errorData}`);
243
+ }
244
+ }
245
+ catch (error) {
246
+ throw new Error(`Failed to update Mailgun template: ${this.formatMailgunError(error)}`);
247
+ }
248
+ }
249
+ async deleteTemplate(templateId) {
250
+ try {
251
+ const response = await fetch(`${this.baseUrl}/templates/${templateId}`, {
252
+ method: 'DELETE',
253
+ headers: {
254
+ 'Authorization': `Basic ${Buffer.from(`api:${this.config.apiKey}`).toString('base64')}`
255
+ }
256
+ });
257
+ if (!response.ok) {
258
+ const errorData = await response.text();
259
+ throw new Error(`Mailgun template deletion error: ${response.status} - ${errorData}`);
260
+ }
261
+ }
262
+ catch (error) {
263
+ throw new Error(`Failed to delete Mailgun template: ${this.formatMailgunError(error)}`);
264
+ }
265
+ }
266
+ async getTemplate(templateId) {
267
+ try {
268
+ const response = await fetch(`${this.baseUrl}/templates/${templateId}`, {
269
+ method: 'GET',
270
+ headers: {
271
+ 'Authorization': `Basic ${Buffer.from(`api:${this.config.apiKey}`).toString('base64')}`
272
+ }
273
+ });
274
+ if (!response.ok) {
275
+ if (response.status === 404) {
276
+ return null;
277
+ }
278
+ const errorData = await response.text();
279
+ throw new Error(`Mailgun template fetch error: ${response.status} - ${errorData}`);
280
+ }
281
+ const result = await response.json();
282
+ const template = result.template;
283
+ return {
284
+ id: template.id,
285
+ name: template.name,
286
+ subject: template.description || '',
287
+ htmlContent: template.template,
288
+ textContent: template.template,
289
+ variables: [], // Mailgun doesn't provide variable list
290
+ createdAt: new Date(template.created_at),
291
+ updatedAt: new Date(template.version.created_at)
292
+ };
293
+ }
294
+ catch (error) {
295
+ throw new Error(`Failed to get Mailgun template: ${this.formatMailgunError(error)}`);
296
+ }
297
+ }
298
+ async listTemplates() {
299
+ try {
300
+ const response = await fetch(`${this.baseUrl}/templates`, {
301
+ method: 'GET',
302
+ headers: {
303
+ 'Authorization': `Basic ${Buffer.from(`api:${this.config.apiKey}`).toString('base64')}`
304
+ }
305
+ });
306
+ if (!response.ok) {
307
+ const errorData = await response.text();
308
+ throw new Error(`Mailgun templates list error: ${response.status} - ${errorData}`);
309
+ }
310
+ const result = await response.json();
311
+ const templates = [];
312
+ for (const template of result.templates || []) {
313
+ const fullTemplate = await this.getTemplate(template.id);
314
+ if (fullTemplate) {
315
+ templates.push(fullTemplate);
316
+ }
317
+ }
318
+ return templates;
319
+ }
320
+ catch (error) {
321
+ throw new Error(`Failed to list Mailgun templates: ${this.formatMailgunError(error)}`);
322
+ }
323
+ }
324
+ async getDeliveryStatus(messageId) {
325
+ try {
326
+ const response = await fetch(`${this.baseUrl}/events?message-id=${messageId}`, {
327
+ method: 'GET',
328
+ headers: {
329
+ 'Authorization': `Basic ${Buffer.from(`api:${this.config.apiKey}`).toString('base64')}`
330
+ }
331
+ });
332
+ if (!response.ok) {
333
+ return null;
334
+ }
335
+ const result = await response.json();
336
+ const events = result.items || [];
337
+ if (events.length === 0) {
338
+ return {
339
+ messageId,
340
+ status: 'pending',
341
+ metadata: {
342
+ provider: 'mailgun',
343
+ domain: this.config.domain
344
+ }
345
+ };
346
+ }
347
+ const latestEvent = events[0];
348
+ const status = this.mapMailgunEventToStatus(latestEvent.event);
349
+ return {
350
+ messageId,
351
+ status,
352
+ ...(status === 'delivered' && { deliveredAt: new Date(latestEvent.timestamp) }),
353
+ metadata: {
354
+ provider: 'mailgun',
355
+ domain: this.config.domain,
356
+ event: latestEvent.event
357
+ }
358
+ };
359
+ }
360
+ catch (error) {
361
+ return null;
362
+ }
363
+ }
364
+ async processWebhook(_payload, _signature) {
365
+ // Implement Mailgun webhook processing
366
+ // This would validate the signature and parse the webhook payload
367
+ return [];
368
+ }
369
+ async testConnection() {
370
+ try {
371
+ // Test by getting domain info
372
+ const response = await fetch(`${this.baseUrl}`, {
373
+ method: 'GET',
374
+ headers: {
375
+ 'Authorization': `Basic ${Buffer.from(`api:${this.config.apiKey}`).toString('base64')}`
376
+ }
377
+ });
378
+ return response.ok;
379
+ }
380
+ catch (error) {
381
+ return false;
382
+ }
383
+ }
384
+ validateConfiguration() {
385
+ const errors = [];
386
+ const warnings = [];
387
+ if (!this.config.apiKey) {
388
+ errors.push('Mailgun API key is required');
389
+ }
390
+ if (!this.config.domain) {
391
+ errors.push('Mailgun domain is required');
392
+ }
393
+ if (!this.config.fromEmail) {
394
+ errors.push('From email is required');
395
+ }
396
+ if (this.config.region && !['us', 'eu'].includes(this.config.region)) {
397
+ errors.push('Region must be either "us" or "eu"');
398
+ }
399
+ return {
400
+ isValid: errors.length === 0,
401
+ errors,
402
+ warnings
403
+ };
404
+ }
405
+ validateEmailMessage(message) {
406
+ const errors = [];
407
+ const warnings = [];
408
+ if (!message.toEmail) {
409
+ errors.push('Recipient email is required');
410
+ }
411
+ else if (!this.isValidEmail(message.toEmail)) {
412
+ errors.push('Invalid recipient email format');
413
+ }
414
+ if (!message.subject) {
415
+ errors.push('Email subject is required');
416
+ }
417
+ if (!message.htmlContent && !message.textContent) {
418
+ errors.push('Either HTML or text content is required');
419
+ }
420
+ return {
421
+ isValid: errors.length === 0,
422
+ errors,
423
+ warnings
424
+ };
425
+ }
426
+ getCapabilities() {
427
+ return {
428
+ supportsBatch: true,
429
+ supportsTemplates: true,
430
+ supportsWebhooks: true,
431
+ supportsAttachments: true,
432
+ supportsDeliveryTracking: true,
433
+ maxBatchSize: 1000,
434
+ maxAttachmentSize: 25 * 1024 * 1024 // 25MB
435
+ };
436
+ }
437
+ convertToMailgunMessage(message) {
438
+ const mailgunMessage = {
439
+ from: message.fromEmail || this.config.fromEmail,
440
+ to: message.toEmail,
441
+ subject: message.subject
442
+ };
443
+ if (message.htmlContent) {
444
+ mailgunMessage.html = message.htmlContent;
445
+ }
446
+ if (message.textContent) {
447
+ mailgunMessage.text = message.textContent;
448
+ }
449
+ if (message.replyTo) {
450
+ mailgunMessage['h:Reply-To'] = message.replyTo;
451
+ }
452
+ if (message.headers) {
453
+ mailgunMessage['h:X-Mailgun-Variables'] = JSON.stringify(message.headers);
454
+ }
455
+ if (message.attachments && message.attachments.length > 0) {
456
+ mailgunMessage.attachment = message.attachments.map(attachment => ({
457
+ filename: attachment.filename,
458
+ data: attachment.content,
459
+ contentType: attachment.contentType
460
+ }));
461
+ }
462
+ return mailgunMessage;
463
+ }
464
+ createBatchHtmlTemplate(emails) {
465
+ return emails.map((_, index) => `
466
+ <div style="margin-bottom: 20px;">
467
+ <h2>Email ${index + 1}</h2>
468
+ <p><strong>To:</strong> %recipient_${index}%</p>
469
+ <p><strong>Subject:</strong> %subject_${index}%</p>
470
+ <div>%html_content_${index}%</div>
471
+ </div>
472
+ `).join('');
473
+ }
474
+ createBatchTextTemplate(emails) {
475
+ return emails.map((_, index) => `
476
+ Email ${index + 1}
477
+ To: %recipient_${index}%
478
+ Subject: %subject_${index}%
479
+
480
+ %text_content_${index}%
481
+
482
+ ---
483
+ `).join('\n');
484
+ }
485
+ mapMailgunEventToStatus(event) {
486
+ switch (event) {
487
+ case 'delivered':
488
+ return 'delivered';
489
+ case 'bounced':
490
+ return 'bounced';
491
+ case 'failed':
492
+ return 'failed';
493
+ case 'opened':
494
+ return 'opened';
495
+ case 'clicked':
496
+ return 'clicked';
497
+ case 'unsubscribed':
498
+ return 'unsubscribed';
499
+ case 'complained':
500
+ return 'spam';
501
+ default:
502
+ return 'sent';
503
+ }
504
+ }
505
+ formatMailgunError(error) {
506
+ if (error.message) {
507
+ if (error.message.includes('401')) {
508
+ return 'Invalid Mailgun API key';
509
+ }
510
+ if (error.message.includes('403')) {
511
+ return 'Access denied - check API key and domain permissions';
512
+ }
513
+ if (error.message.includes('404')) {
514
+ return 'Domain not found';
515
+ }
516
+ if (error.message.includes('422')) {
517
+ return 'Invalid email parameters';
518
+ }
519
+ return error.message;
520
+ }
521
+ return 'Unknown Mailgun error';
522
+ }
523
+ }
524
+ exports.MailgunProvider = MailgunProvider;
525
+ //# sourceMappingURL=mailgun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mailgun.js","sourceRoot":"","sources":["../../src/providers/mailgun.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Postmark Email Provider
3
+ * Handles email sending through Postmark API
4
+ */
5
+ import { EmailProvider } from './base';
6
+ import type { EmailMessage, SendResult, EmailProviderConfig, EmailProviderCapabilities, EmailValidationResult, EmailTemplate, DeliveryStatus, WebhookEvent } from '../types';
7
+ interface PostmarkConfig extends EmailProviderConfig {
8
+ provider: 'postmark';
9
+ apiKey: string;
10
+ serverToken?: string;
11
+ accountToken?: string;
12
+ endpoint?: string;
13
+ }
14
+ export declare class PostmarkProvider extends EmailProvider {
15
+ private baseUrl;
16
+ constructor(config: PostmarkConfig);
17
+ sendEmail(message: EmailMessage): Promise<SendResult>;
18
+ sendBatch(emails: EmailMessage[]): Promise<SendResult[]>;
19
+ private sendBatchChunk;
20
+ sendTemplateEmail(templateId: string, toEmail: string, variables: Record<string, any>): Promise<SendResult>;
21
+ createTemplate(template: Omit<EmailTemplate, 'id' | 'createdAt' | 'updatedAt'>): Promise<string>;
22
+ updateTemplate(template: EmailTemplate): Promise<void>;
23
+ deleteTemplate(templateId: string): Promise<void>;
24
+ getTemplate(templateId: string): Promise<EmailTemplate | null>;
25
+ listTemplates(): Promise<EmailTemplate[]>;
26
+ getDeliveryStatus(messageId: string): Promise<DeliveryStatus | null>;
27
+ processWebhook(_payload: any, _signature: string): Promise<WebhookEvent[]>;
28
+ testConnection(): Promise<boolean>;
29
+ validateConfiguration(): EmailValidationResult;
30
+ validateEmailMessage(message: EmailMessage): EmailValidationResult;
31
+ getCapabilities(): EmailProviderCapabilities;
32
+ private convertToPostmarkMessage;
33
+ private mapPostmarkStatusToDeliveryStatus;
34
+ private formatPostmarkError;
35
+ }
36
+ export {};
37
+ //# sourceMappingURL=postmark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postmark.d.ts","sourceRoot":"","sources":["../../src/providers/postmark.ts"],"names":[],"mappings":"AAQA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,YAAY,EACb,MAAM,UAAU,CAAC;AAElB,UAAU,cAAe,SAAQ,mBAAmB;IAClD,QAAQ,EAAE,UAAU,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAyBD,qBAAa,gBAAiB,SAAQ,aAAa;IACjD,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,cAAc;IAK5B,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IA2CrD,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;YA0BhD,cAAc;IA2Cb,iBAAiB,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,OAAO,CAAC,UAAU,CAAC;IAmDP,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IA+BzG,cAAc,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BtD,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBjD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAmC9D,aAAa,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IA8BhC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAiCpE,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAM1E,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAgBxC,qBAAqB,IAAI,qBAAqB;IAuB9C,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,qBAAqB;IAmClE,eAAe,IAAI,yBAAyB;IAYrD,OAAO,CAAC,wBAAwB;IAyChC,OAAO,CAAC,iCAAiC;IAyBzC,OAAO,CAAC,mBAAmB;CAqB5B"}