@geekmidas/emailkit 0.0.6 → 0.1.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.
@@ -1,5 +1,5 @@
1
+ import { render } from "@react-email/components";
1
2
  import nodemailer from "nodemailer";
2
- import { renderToStaticMarkup } from "react-dom/server";
3
3
 
4
4
  //#region src/client.ts
5
5
  var SMTPClient = class {
@@ -25,10 +25,10 @@ var SMTPClient = class {
25
25
  };
26
26
  }
27
27
  async sendTemplate(template, options) {
28
- const templateFn = this.config.templates[template];
29
- if (!templateFn) throw new Error(`Template "${String(template)}" not found`);
30
- const element = templateFn(options.props);
31
- const html = renderToStaticMarkup(element);
28
+ const Component = this.config.templates[template];
29
+ if (!Component) throw new Error(`Template "${String(template)}" not found`);
30
+ const element = Component(options.props);
31
+ const html = await render(element);
32
32
  return this.send({
33
33
  ...options,
34
34
  html
@@ -55,4 +55,4 @@ function createEmailClient(config) {
55
55
 
56
56
  //#endregion
57
57
  export { SMTPClient, createEmailClient };
58
- //# sourceMappingURL=client-BPSe9rim.mjs.map
58
+ //# sourceMappingURL=client-BkN5BGeJ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-BkN5BGeJ.mjs","names":["config: EmailClientConfig<T>","options: SendOptions","template: K","options: Omit<SendOptions, 'template'> & {\n props: TemplatePropsFor<T, K>;\n }"],"sources":["../src/client.ts"],"sourcesContent":["import { render } from '@react-email/components';\nimport nodemailer, { type Transporter } from 'nodemailer';\nimport type {\n EmailClient,\n EmailClientConfig,\n SendOptions,\n SendResult,\n TemplateNames,\n TemplatePropsFor,\n TemplateRecord,\n} from './types';\n\nexport class SMTPClient<T extends TemplateRecord> implements EmailClient<T> {\n private transporter: Transporter;\n private config: EmailClientConfig<T>;\n\n constructor(config: EmailClientConfig<T>) {\n this.config = config;\n this.transporter = nodemailer.createTransport(config.smtp as any);\n }\n\n async send(options: SendOptions): Promise<SendResult> {\n const mailOptions = {\n ...this.config.defaults,\n ...options,\n };\n\n if (!mailOptions.from) {\n throw new Error(\n 'The \"from\" field is required in email options or defaults',\n );\n }\n\n if (!mailOptions.text && !mailOptions.html) {\n throw new Error('Either text or html content must be provided');\n }\n\n const info = await this.transporter.sendMail(mailOptions);\n\n return {\n messageId: info.messageId,\n accepted: info.accepted || [],\n rejected: info.rejected || [],\n response: info.response,\n };\n }\n\n async sendTemplate<K extends TemplateNames<T>>(\n template: K,\n options: Omit<SendOptions, 'template'> & {\n props: TemplatePropsFor<T, K>;\n },\n ): Promise<SendResult> {\n const Component = this.config.templates[template];\n if (!Component) {\n throw new Error(`Template \"${String(template)}\" not found`);\n }\n\n const element = Component(options.props);\n const html = await render(element);\n\n return this.send({\n ...options,\n html,\n });\n }\n\n async verify(): Promise<boolean> {\n try {\n await this.transporter.verify();\n return true;\n } catch {\n return false;\n }\n }\n\n async close(): Promise<void> {\n this.transporter.close();\n }\n\n getTemplateNames(): TemplateNames<T>[] {\n return Object.keys(this.config.templates) as TemplateNames<T>[];\n }\n}\n\nexport function createEmailClient<T extends TemplateRecord>(\n config: EmailClientConfig<T>,\n): SMTPClient<T> {\n return new SMTPClient(config);\n}\n"],"mappings":";;;;AAYA,IAAa,aAAb,MAA4E;CAC1E,AAAQ;CACR,AAAQ;CAER,YAAYA,QAA8B;AACxC,OAAK,SAAS;AACd,OAAK,cAAc,WAAW,gBAAgB,OAAO,KAAY;CAClE;CAED,MAAM,KAAKC,SAA2C;EACpD,MAAM,cAAc;GAClB,GAAG,KAAK,OAAO;GACf,GAAG;EACJ;AAED,OAAK,YAAY,KACf,OAAM,IAAI,MACR;AAIJ,OAAK,YAAY,SAAS,YAAY,KACpC,OAAM,IAAI,MAAM;EAGlB,MAAM,OAAO,MAAM,KAAK,YAAY,SAAS,YAAY;AAEzD,SAAO;GACL,WAAW,KAAK;GAChB,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK;EAChB;CACF;CAED,MAAM,aACJC,UACAC,SAGqB;EACrB,MAAM,YAAY,KAAK,OAAO,UAAU;AACxC,OAAK,UACH,OAAM,IAAI,OAAO,YAAY,OAAO,SAAS,CAAC;EAGhD,MAAM,UAAU,UAAU,QAAQ,MAAM;EACxC,MAAM,OAAO,MAAM,OAAO,QAAQ;AAElC,SAAO,KAAK,KAAK;GACf,GAAG;GACH;EACD,EAAC;CACH;CAED,MAAM,SAA2B;AAC/B,MAAI;AACF,SAAM,KAAK,YAAY,QAAQ;AAC/B,UAAO;EACR,QAAO;AACN,UAAO;EACR;CACF;CAED,MAAM,QAAuB;AAC3B,OAAK,YAAY,OAAO;CACzB;CAED,mBAAuC;AACrC,SAAO,OAAO,KAAK,KAAK,OAAO,UAAU;CAC1C;AACF;AAED,SAAgB,kBACdH,QACe;AACf,QAAO,IAAI,WAAW;AACvB"}
@@ -21,8 +21,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
21
21
  }) : target, mod));
22
22
 
23
23
  //#endregion
24
+ const __react_email_components = __toESM(require("@react-email/components"));
24
25
  const nodemailer = __toESM(require("nodemailer"));
25
- const react_dom_server = __toESM(require("react-dom/server"));
26
26
 
27
27
  //#region src/client.ts
28
28
  var SMTPClient = class {
@@ -48,10 +48,10 @@ var SMTPClient = class {
48
48
  };
49
49
  }
50
50
  async sendTemplate(template, options) {
51
- const templateFn = this.config.templates[template];
52
- if (!templateFn) throw new Error(`Template "${String(template)}" not found`);
53
- const element = templateFn(options.props);
54
- const html = (0, react_dom_server.renderToStaticMarkup)(element);
51
+ const Component = this.config.templates[template];
52
+ if (!Component) throw new Error(`Template "${String(template)}" not found`);
53
+ const element = Component(options.props);
54
+ const html = await (0, __react_email_components.render)(element);
55
55
  return this.send({
56
56
  ...options,
57
57
  html
@@ -89,4 +89,4 @@ Object.defineProperty(exports, 'createEmailClient', {
89
89
  return createEmailClient;
90
90
  }
91
91
  });
92
- //# sourceMappingURL=client-DBPPXw0Q.cjs.map
92
+ //# sourceMappingURL=client-sZNHPYYg.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-sZNHPYYg.cjs","names":["config: EmailClientConfig<T>","options: SendOptions","template: K","options: Omit<SendOptions, 'template'> & {\n props: TemplatePropsFor<T, K>;\n }"],"sources":["../src/client.ts"],"sourcesContent":["import { render } from '@react-email/components';\nimport nodemailer, { type Transporter } from 'nodemailer';\nimport type {\n EmailClient,\n EmailClientConfig,\n SendOptions,\n SendResult,\n TemplateNames,\n TemplatePropsFor,\n TemplateRecord,\n} from './types';\n\nexport class SMTPClient<T extends TemplateRecord> implements EmailClient<T> {\n private transporter: Transporter;\n private config: EmailClientConfig<T>;\n\n constructor(config: EmailClientConfig<T>) {\n this.config = config;\n this.transporter = nodemailer.createTransport(config.smtp as any);\n }\n\n async send(options: SendOptions): Promise<SendResult> {\n const mailOptions = {\n ...this.config.defaults,\n ...options,\n };\n\n if (!mailOptions.from) {\n throw new Error(\n 'The \"from\" field is required in email options or defaults',\n );\n }\n\n if (!mailOptions.text && !mailOptions.html) {\n throw new Error('Either text or html content must be provided');\n }\n\n const info = await this.transporter.sendMail(mailOptions);\n\n return {\n messageId: info.messageId,\n accepted: info.accepted || [],\n rejected: info.rejected || [],\n response: info.response,\n };\n }\n\n async sendTemplate<K extends TemplateNames<T>>(\n template: K,\n options: Omit<SendOptions, 'template'> & {\n props: TemplatePropsFor<T, K>;\n },\n ): Promise<SendResult> {\n const Component = this.config.templates[template];\n if (!Component) {\n throw new Error(`Template \"${String(template)}\" not found`);\n }\n\n const element = Component(options.props);\n const html = await render(element);\n\n return this.send({\n ...options,\n html,\n });\n }\n\n async verify(): Promise<boolean> {\n try {\n await this.transporter.verify();\n return true;\n } catch {\n return false;\n }\n }\n\n async close(): Promise<void> {\n this.transporter.close();\n }\n\n getTemplateNames(): TemplateNames<T>[] {\n return Object.keys(this.config.templates) as TemplateNames<T>[];\n }\n}\n\nexport function createEmailClient<T extends TemplateRecord>(\n config: EmailClientConfig<T>,\n): SMTPClient<T> {\n return new SMTPClient(config);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,IAAa,aAAb,MAA4E;CAC1E,AAAQ;CACR,AAAQ;CAER,YAAYA,QAA8B;AACxC,OAAK,SAAS;AACd,OAAK,cAAc,mBAAW,gBAAgB,OAAO,KAAY;CAClE;CAED,MAAM,KAAKC,SAA2C;EACpD,MAAM,cAAc;GAClB,GAAG,KAAK,OAAO;GACf,GAAG;EACJ;AAED,OAAK,YAAY,KACf,OAAM,IAAI,MACR;AAIJ,OAAK,YAAY,SAAS,YAAY,KACpC,OAAM,IAAI,MAAM;EAGlB,MAAM,OAAO,MAAM,KAAK,YAAY,SAAS,YAAY;AAEzD,SAAO;GACL,WAAW,KAAK;GAChB,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK;EAChB;CACF;CAED,MAAM,aACJC,UACAC,SAGqB;EACrB,MAAM,YAAY,KAAK,OAAO,UAAU;AACxC,OAAK,UACH,OAAM,IAAI,OAAO,YAAY,OAAO,SAAS,CAAC;EAGhD,MAAM,UAAU,UAAU,QAAQ,MAAM;EACxC,MAAM,OAAO,MAAM,qCAAO,QAAQ;AAElC,SAAO,KAAK,KAAK;GACf,GAAG;GACH;EACD,EAAC;CACH;CAED,MAAM,SAA2B;AAC/B,MAAI;AACF,SAAM,KAAK,YAAY,QAAQ;AAC/B,UAAO;EACR,QAAO;AACN,UAAO;EACR;CACF;CAED,MAAM,QAAuB;AAC3B,OAAK,YAAY,OAAO;CACzB;CAED,mBAAuC;AACrC,SAAO,OAAO,KAAK,KAAK,OAAO,UAAU;CAC1C;AACF;AAED,SAAgB,kBACdH,QACe;AACf,QAAO,IAAI,WAAW;AACvB"}
package/dist/client.cjs CHANGED
@@ -1,4 +1,4 @@
1
- const require_client = require('./client-DBPPXw0Q.cjs');
1
+ const require_client = require('./client-sZNHPYYg.cjs');
2
2
 
3
3
  exports.SMTPClient = require_client.SMTPClient;
4
4
  exports.createEmailClient = require_client.createEmailClient;
package/dist/client.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { SMTPClient, createEmailClient } from "./client-BPSe9rim.mjs";
1
+ import { SMTPClient, createEmailClient } from "./client-BkN5BGeJ.mjs";
2
2
 
3
3
  export { SMTPClient, createEmailClient };
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- const require_client = require('./client-DBPPXw0Q.cjs');
1
+ const require_client = require('./client-sZNHPYYg.cjs');
2
2
 
3
3
  exports.SMTPClient = require_client.SMTPClient;
4
4
  exports.createEmailClient = require_client.createEmailClient;
package/dist/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { SMTPClient, createEmailClient } from "./client-BPSe9rim.mjs";
1
+ import { SMTPClient, createEmailClient } from "./client-BkN5BGeJ.mjs";
2
2
 
3
3
  export { SMTPClient, createEmailClient };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geekmidas/emailkit",
3
- "version": "0.0.6",
3
+ "version": "0.1.0",
4
4
  "description": "Type-safe email client with SMTP support and React templates",
5
5
  "private": false,
6
6
  "type": "module",
@@ -11,6 +11,10 @@
11
11
  "require": "./dist/*.cjs"
12
12
  }
13
13
  },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://github.com/geekmidas/toolbox"
17
+ },
14
18
  "publishConfig": {
15
19
  "registry": "https://registry.npmjs.org/",
16
20
  "access": "public"
@@ -28,7 +32,8 @@
28
32
  },
29
33
  "peerDependencies": {
30
34
  "react": ">=18.0.0",
31
- "react-dom": ">=18.0.0"
35
+ "react-dom": ">=18.0.0",
36
+ "@react-email/components": "~1.0.1"
32
37
  },
33
38
  "engines": {
34
39
  "node": ">=22.0.0"
package/src/client.ts CHANGED
@@ -1,5 +1,5 @@
1
+ import { render } from '@react-email/components';
1
2
  import nodemailer, { type Transporter } from 'nodemailer';
2
- import { renderToStaticMarkup } from 'react-dom/server';
3
3
  import type {
4
4
  EmailClient,
5
5
  EmailClientConfig,
@@ -51,13 +51,13 @@ export class SMTPClient<T extends TemplateRecord> implements EmailClient<T> {
51
51
  props: TemplatePropsFor<T, K>;
52
52
  },
53
53
  ): Promise<SendResult> {
54
- const templateFn = this.config.templates[template];
55
- if (!templateFn) {
54
+ const Component = this.config.templates[template];
55
+ if (!Component) {
56
56
  throw new Error(`Template "${String(template)}" not found`);
57
57
  }
58
58
 
59
- const element = templateFn(options.props);
60
- const html = renderToStaticMarkup(element);
59
+ const element = Component(options.props);
60
+ const html = await render(element);
61
61
 
62
62
  return this.send({
63
63
  ...options,
@@ -1 +0,0 @@
1
- {"version":3,"file":"client-BPSe9rim.mjs","names":["config: EmailClientConfig<T>","options: SendOptions","template: K","options: Omit<SendOptions, 'template'> & {\n props: TemplatePropsFor<T, K>;\n }"],"sources":["../src/client.ts"],"sourcesContent":["import nodemailer, { type Transporter } from 'nodemailer';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport type {\n EmailClient,\n EmailClientConfig,\n SendOptions,\n SendResult,\n TemplateNames,\n TemplatePropsFor,\n TemplateRecord,\n} from './types';\n\nexport class SMTPClient<T extends TemplateRecord> implements EmailClient<T> {\n private transporter: Transporter;\n private config: EmailClientConfig<T>;\n\n constructor(config: EmailClientConfig<T>) {\n this.config = config;\n this.transporter = nodemailer.createTransport(config.smtp as any);\n }\n\n async send(options: SendOptions): Promise<SendResult> {\n const mailOptions = {\n ...this.config.defaults,\n ...options,\n };\n\n if (!mailOptions.from) {\n throw new Error(\n 'The \"from\" field is required in email options or defaults',\n );\n }\n\n if (!mailOptions.text && !mailOptions.html) {\n throw new Error('Either text or html content must be provided');\n }\n\n const info = await this.transporter.sendMail(mailOptions);\n\n return {\n messageId: info.messageId,\n accepted: info.accepted || [],\n rejected: info.rejected || [],\n response: info.response,\n };\n }\n\n async sendTemplate<K extends TemplateNames<T>>(\n template: K,\n options: Omit<SendOptions, 'template'> & {\n props: TemplatePropsFor<T, K>;\n },\n ): Promise<SendResult> {\n const templateFn = this.config.templates[template];\n if (!templateFn) {\n throw new Error(`Template \"${String(template)}\" not found`);\n }\n\n const element = templateFn(options.props);\n const html = renderToStaticMarkup(element);\n\n return this.send({\n ...options,\n html,\n });\n }\n\n async verify(): Promise<boolean> {\n try {\n await this.transporter.verify();\n return true;\n } catch {\n return false;\n }\n }\n\n async close(): Promise<void> {\n this.transporter.close();\n }\n\n getTemplateNames(): TemplateNames<T>[] {\n return Object.keys(this.config.templates) as TemplateNames<T>[];\n }\n}\n\nexport function createEmailClient<T extends TemplateRecord>(\n config: EmailClientConfig<T>,\n): SMTPClient<T> {\n return new SMTPClient(config);\n}\n"],"mappings":";;;;AAYA,IAAa,aAAb,MAA4E;CAC1E,AAAQ;CACR,AAAQ;CAER,YAAYA,QAA8B;AACxC,OAAK,SAAS;AACd,OAAK,cAAc,WAAW,gBAAgB,OAAO,KAAY;CAClE;CAED,MAAM,KAAKC,SAA2C;EACpD,MAAM,cAAc;GAClB,GAAG,KAAK,OAAO;GACf,GAAG;EACJ;AAED,OAAK,YAAY,KACf,OAAM,IAAI,MACR;AAIJ,OAAK,YAAY,SAAS,YAAY,KACpC,OAAM,IAAI,MAAM;EAGlB,MAAM,OAAO,MAAM,KAAK,YAAY,SAAS,YAAY;AAEzD,SAAO;GACL,WAAW,KAAK;GAChB,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK;EAChB;CACF;CAED,MAAM,aACJC,UACAC,SAGqB;EACrB,MAAM,aAAa,KAAK,OAAO,UAAU;AACzC,OAAK,WACH,OAAM,IAAI,OAAO,YAAY,OAAO,SAAS,CAAC;EAGhD,MAAM,UAAU,WAAW,QAAQ,MAAM;EACzC,MAAM,OAAO,qBAAqB,QAAQ;AAE1C,SAAO,KAAK,KAAK;GACf,GAAG;GACH;EACD,EAAC;CACH;CAED,MAAM,SAA2B;AAC/B,MAAI;AACF,SAAM,KAAK,YAAY,QAAQ;AAC/B,UAAO;EACR,QAAO;AACN,UAAO;EACR;CACF;CAED,MAAM,QAAuB;AAC3B,OAAK,YAAY,OAAO;CACzB;CAED,mBAAuC;AACrC,SAAO,OAAO,KAAK,KAAK,OAAO,UAAU;CAC1C;AACF;AAED,SAAgB,kBACdH,QACe;AACf,QAAO,IAAI,WAAW;AACvB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"client-DBPPXw0Q.cjs","names":["config: EmailClientConfig<T>","options: SendOptions","template: K","options: Omit<SendOptions, 'template'> & {\n props: TemplatePropsFor<T, K>;\n }"],"sources":["../src/client.ts"],"sourcesContent":["import nodemailer, { type Transporter } from 'nodemailer';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport type {\n EmailClient,\n EmailClientConfig,\n SendOptions,\n SendResult,\n TemplateNames,\n TemplatePropsFor,\n TemplateRecord,\n} from './types';\n\nexport class SMTPClient<T extends TemplateRecord> implements EmailClient<T> {\n private transporter: Transporter;\n private config: EmailClientConfig<T>;\n\n constructor(config: EmailClientConfig<T>) {\n this.config = config;\n this.transporter = nodemailer.createTransport(config.smtp as any);\n }\n\n async send(options: SendOptions): Promise<SendResult> {\n const mailOptions = {\n ...this.config.defaults,\n ...options,\n };\n\n if (!mailOptions.from) {\n throw new Error(\n 'The \"from\" field is required in email options or defaults',\n );\n }\n\n if (!mailOptions.text && !mailOptions.html) {\n throw new Error('Either text or html content must be provided');\n }\n\n const info = await this.transporter.sendMail(mailOptions);\n\n return {\n messageId: info.messageId,\n accepted: info.accepted || [],\n rejected: info.rejected || [],\n response: info.response,\n };\n }\n\n async sendTemplate<K extends TemplateNames<T>>(\n template: K,\n options: Omit<SendOptions, 'template'> & {\n props: TemplatePropsFor<T, K>;\n },\n ): Promise<SendResult> {\n const templateFn = this.config.templates[template];\n if (!templateFn) {\n throw new Error(`Template \"${String(template)}\" not found`);\n }\n\n const element = templateFn(options.props);\n const html = renderToStaticMarkup(element);\n\n return this.send({\n ...options,\n html,\n });\n }\n\n async verify(): Promise<boolean> {\n try {\n await this.transporter.verify();\n return true;\n } catch {\n return false;\n }\n }\n\n async close(): Promise<void> {\n this.transporter.close();\n }\n\n getTemplateNames(): TemplateNames<T>[] {\n return Object.keys(this.config.templates) as TemplateNames<T>[];\n }\n}\n\nexport function createEmailClient<T extends TemplateRecord>(\n config: EmailClientConfig<T>,\n): SMTPClient<T> {\n return new SMTPClient(config);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,IAAa,aAAb,MAA4E;CAC1E,AAAQ;CACR,AAAQ;CAER,YAAYA,QAA8B;AACxC,OAAK,SAAS;AACd,OAAK,cAAc,mBAAW,gBAAgB,OAAO,KAAY;CAClE;CAED,MAAM,KAAKC,SAA2C;EACpD,MAAM,cAAc;GAClB,GAAG,KAAK,OAAO;GACf,GAAG;EACJ;AAED,OAAK,YAAY,KACf,OAAM,IAAI,MACR;AAIJ,OAAK,YAAY,SAAS,YAAY,KACpC,OAAM,IAAI,MAAM;EAGlB,MAAM,OAAO,MAAM,KAAK,YAAY,SAAS,YAAY;AAEzD,SAAO;GACL,WAAW,KAAK;GAChB,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK,YAAY,CAAE;GAC7B,UAAU,KAAK;EAChB;CACF;CAED,MAAM,aACJC,UACAC,SAGqB;EACrB,MAAM,aAAa,KAAK,OAAO,UAAU;AACzC,OAAK,WACH,OAAM,IAAI,OAAO,YAAY,OAAO,SAAS,CAAC;EAGhD,MAAM,UAAU,WAAW,QAAQ,MAAM;EACzC,MAAM,OAAO,2CAAqB,QAAQ;AAE1C,SAAO,KAAK,KAAK;GACf,GAAG;GACH;EACD,EAAC;CACH;CAED,MAAM,SAA2B;AAC/B,MAAI;AACF,SAAM,KAAK,YAAY,QAAQ;AAC/B,UAAO;EACR,QAAO;AACN,UAAO;EACR;CACF;CAED,MAAM,QAAuB;AAC3B,OAAK,YAAY,OAAO;CACzB;CAED,mBAAuC;AACrC,SAAO,OAAO,KAAK,KAAK,OAAO,UAAU;CAC1C;AACF;AAED,SAAgB,kBACdH,QACe;AACf,QAAO,IAAI,WAAW;AACvB"}