burnledger 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.
Files changed (99) hide show
  1. package/README.md +166 -0
  2. package/dist/cjs/client.d.ts +84 -0
  3. package/dist/cjs/client.d.ts.map +1 -0
  4. package/dist/cjs/client.js +275 -0
  5. package/dist/cjs/client.js.map +1 -0
  6. package/dist/cjs/crypto-browser.d.ts +7 -0
  7. package/dist/cjs/crypto-browser.d.ts.map +1 -0
  8. package/dist/cjs/crypto-browser.js +37 -0
  9. package/dist/cjs/crypto-browser.js.map +1 -0
  10. package/dist/cjs/crypto-node.d.ts +4 -0
  11. package/dist/cjs/crypto-node.d.ts.map +1 -0
  12. package/dist/cjs/crypto-node.js +30 -0
  13. package/dist/cjs/crypto-node.js.map +1 -0
  14. package/dist/cjs/crypto.d.ts +6 -0
  15. package/dist/cjs/crypto.d.ts.map +1 -0
  16. package/dist/cjs/crypto.js +4 -0
  17. package/dist/cjs/crypto.js.map +1 -0
  18. package/dist/cjs/errors.d.ts +76 -0
  19. package/dist/cjs/errors.d.ts.map +1 -0
  20. package/dist/cjs/errors.js +119 -0
  21. package/dist/cjs/errors.js.map +1 -0
  22. package/dist/cjs/http.d.ts +35 -0
  23. package/dist/cjs/http.d.ts.map +1 -0
  24. package/dist/cjs/http.js +136 -0
  25. package/dist/cjs/http.js.map +1 -0
  26. package/dist/cjs/index.browser.d.ts +31 -0
  27. package/dist/cjs/index.browser.d.ts.map +1 -0
  28. package/dist/cjs/index.browser.js +54 -0
  29. package/dist/cjs/index.browser.js.map +1 -0
  30. package/dist/cjs/index.d.ts +26 -0
  31. package/dist/cjs/index.d.ts.map +1 -0
  32. package/dist/cjs/index.js +50 -0
  33. package/dist/cjs/index.js.map +1 -0
  34. package/dist/cjs/models.d.ts +119 -0
  35. package/dist/cjs/models.d.ts.map +1 -0
  36. package/dist/cjs/models.js +144 -0
  37. package/dist/cjs/models.js.map +1 -0
  38. package/dist/cjs/package.json +1 -0
  39. package/dist/cjs/pagination.d.ts +21 -0
  40. package/dist/cjs/pagination.d.ts.map +1 -0
  41. package/dist/cjs/pagination.js +50 -0
  42. package/dist/cjs/pagination.js.map +1 -0
  43. package/dist/cjs/verify.d.ts +47 -0
  44. package/dist/cjs/verify.d.ts.map +1 -0
  45. package/dist/cjs/verify.js +471 -0
  46. package/dist/cjs/verify.js.map +1 -0
  47. package/dist/cjs/webhooks.d.ts +17 -0
  48. package/dist/cjs/webhooks.d.ts.map +1 -0
  49. package/dist/cjs/webhooks.js +39 -0
  50. package/dist/cjs/webhooks.js.map +1 -0
  51. package/dist/esm/client.d.ts +84 -0
  52. package/dist/esm/client.d.ts.map +1 -0
  53. package/dist/esm/client.js +238 -0
  54. package/dist/esm/client.js.map +1 -0
  55. package/dist/esm/crypto-browser.d.ts +7 -0
  56. package/dist/esm/crypto-browser.d.ts.map +1 -0
  57. package/dist/esm/crypto-browser.js +34 -0
  58. package/dist/esm/crypto-browser.js.map +1 -0
  59. package/dist/esm/crypto-node.d.ts +4 -0
  60. package/dist/esm/crypto-node.d.ts.map +1 -0
  61. package/dist/esm/crypto-node.js +27 -0
  62. package/dist/esm/crypto-node.js.map +1 -0
  63. package/dist/esm/crypto.d.ts +6 -0
  64. package/dist/esm/crypto.d.ts.map +1 -0
  65. package/dist/esm/crypto.js +3 -0
  66. package/dist/esm/crypto.js.map +1 -0
  67. package/dist/esm/errors.d.ts +76 -0
  68. package/dist/esm/errors.d.ts.map +1 -0
  69. package/dist/esm/errors.js +105 -0
  70. package/dist/esm/errors.js.map +1 -0
  71. package/dist/esm/http.d.ts +35 -0
  72. package/dist/esm/http.d.ts.map +1 -0
  73. package/dist/esm/http.js +132 -0
  74. package/dist/esm/http.js.map +1 -0
  75. package/dist/esm/index.browser.d.ts +31 -0
  76. package/dist/esm/index.browser.d.ts.map +1 -0
  77. package/dist/esm/index.browser.js +31 -0
  78. package/dist/esm/index.browser.js.map +1 -0
  79. package/dist/esm/index.d.ts +26 -0
  80. package/dist/esm/index.d.ts.map +1 -0
  81. package/dist/esm/index.js +26 -0
  82. package/dist/esm/index.js.map +1 -0
  83. package/dist/esm/models.d.ts +119 -0
  84. package/dist/esm/models.d.ts.map +1 -0
  85. package/dist/esm/models.js +132 -0
  86. package/dist/esm/models.js.map +1 -0
  87. package/dist/esm/pagination.d.ts +21 -0
  88. package/dist/esm/pagination.d.ts.map +1 -0
  89. package/dist/esm/pagination.js +46 -0
  90. package/dist/esm/pagination.js.map +1 -0
  91. package/dist/esm/verify.d.ts +47 -0
  92. package/dist/esm/verify.d.ts.map +1 -0
  93. package/dist/esm/verify.js +462 -0
  94. package/dist/esm/verify.js.map +1 -0
  95. package/dist/esm/webhooks.d.ts +17 -0
  96. package/dist/esm/webhooks.d.ts.map +1 -0
  97. package/dist/esm/webhooks.js +36 -0
  98. package/dist/esm/webhooks.js.map +1 -0
  99. package/package.json +62 -0
@@ -0,0 +1,238 @@
1
+ /** Async BurnLedger API client.
2
+ *
3
+ * Single class — Node.js is all-async, no sync/async split needed.
4
+ * Pagination uses AsyncIterable<T> via Paginator.
5
+ */
6
+ import { RateLimitError, TimeoutError } from "./errors.js";
7
+ import { Transport } from "./http.js";
8
+ import { parseAttestation, parseCertificateResponse, parseConsistencyProof, parseInclusionProof, parseLogEntry, parseRevocationStatus, parseSignedTreeHead, parseSystem, parseVerifyResult, parseWebhook, } from "./models.js";
9
+ import { Paginator } from "./pagination.js";
10
+ export class BurnLedger {
11
+ transport;
12
+ constructor(opts) {
13
+ this.transport = new Transport({
14
+ baseUrl: opts.baseUrl ?? "https://api.burnledger.com",
15
+ apiKey: opts.apiKey,
16
+ timeout: opts.timeout ?? 30,
17
+ maxRetries: opts.maxRetries ?? 2,
18
+ });
19
+ }
20
+ close() {
21
+ // Transport uses native fetch — no persistent connections to close.
22
+ // Method exists for API symmetry and future extensibility.
23
+ }
24
+ [Symbol.asyncDispose]() {
25
+ this.close();
26
+ return Promise.resolve();
27
+ }
28
+ // --- Systems ---
29
+ async registerSystem(opts) {
30
+ const config = resolveConnectionConfig(opts.connectionConfig, opts.dsn, opts.uri);
31
+ const body = {
32
+ name: opts.name,
33
+ connector_type: opts.connectorType,
34
+ connection_config: config,
35
+ subject_query: opts.subjectQuery,
36
+ hash_scope: opts.hashScope ?? "existence",
37
+ max_records: opts.maxRecords ?? 1_000_000,
38
+ max_bytes: opts.maxBytes ?? 10 * 1024 * 1024 * 1024,
39
+ query_timeout: opts.queryTimeout ?? "30s",
40
+ };
41
+ const data = await this.transport.request("POST", "/v1/systems", {
42
+ json: body,
43
+ });
44
+ return parseSystem(data);
45
+ }
46
+ async getSystem(systemId) {
47
+ const data = await this.transport.request("GET", `/v1/systems/${systemId}`);
48
+ return parseSystem(data);
49
+ }
50
+ listSystems(opts) {
51
+ return new Paginator(this.transport, "/v1/systems", parseSystem, {
52
+ params: { limit: opts?.limit ?? 25 },
53
+ });
54
+ }
55
+ async deregisterSystem(systemId) {
56
+ await this.transport.request("DELETE", `/v1/systems/${systemId}`);
57
+ }
58
+ async healthCheck(systemId) {
59
+ const data = await this.transport.request("POST", `/v1/systems/${systemId}/health-check`);
60
+ return parseSystem(data);
61
+ }
62
+ // --- Attestations ---
63
+ async attest(subjectIdentifier, opts) {
64
+ const body = {
65
+ subject_identifier: subjectIdentifier,
66
+ proof_mode: opts?.proofMode ?? "count",
67
+ expires_in: opts?.expiresIn ?? "72h",
68
+ };
69
+ if (opts?.systemIds !== undefined)
70
+ body.system_ids = opts.systemIds;
71
+ if (opts?.webhookUrl !== undefined)
72
+ body.webhook_url = opts.webhookUrl;
73
+ const data = await this.transport.request("POST", "/v1/attestations", {
74
+ json: body,
75
+ });
76
+ return parseAttestation(data);
77
+ }
78
+ async getAttestation(attestationId) {
79
+ const data = await this.transport.request("GET", `/v1/attestations/${attestationId}`);
80
+ return parseAttestation(data);
81
+ }
82
+ async waitFor(attestationId, opts) {
83
+ return poll({
84
+ fetch: () => this.getAttestation(attestationId),
85
+ done: (att) => att.status !== "PENDING_VERIFICATION",
86
+ operation: `waitFor(${attestationId})`,
87
+ timeout: opts?.timeout ?? 60,
88
+ pollInterval: opts?.pollInterval ?? 2,
89
+ });
90
+ }
91
+ async verify(attestationId, subjectIdentifier, opts) {
92
+ const body = { subject_identifier: subjectIdentifier };
93
+ const data = await this.transport.request("POST", `/v1/attestations/${attestationId}/verify`, { json: body });
94
+ const result = parseVerifyResult(data);
95
+ const timeout = opts?.timeout ?? 0;
96
+ if (timeout <= 0 || result.status === "CERTIFIED") {
97
+ return result;
98
+ }
99
+ return poll({
100
+ fetch: async () => {
101
+ const d = await this.transport.request("POST", `/v1/attestations/${attestationId}/verify`, { json: body });
102
+ return parseVerifyResult(d);
103
+ },
104
+ done: (r) => r.status === "CERTIFIED",
105
+ operation: `verify(${attestationId})`,
106
+ timeout,
107
+ pollInterval: opts?.pollInterval ?? 2,
108
+ });
109
+ }
110
+ // --- Certificates ---
111
+ async getCertificate(certificateId) {
112
+ const data = await this.transport.request("GET", `/v1/certificates/${certificateId}`);
113
+ return parseCertificateResponse(data);
114
+ }
115
+ listCertificates(opts) {
116
+ return new Paginator(this.transport, "/v1/certificates", parseCertificateResponse, { params: { limit: opts?.limit ?? 25 } });
117
+ }
118
+ async downloadPdf(certificateId) {
119
+ return this.transport.requestBytes("GET", `/v1/certificates/${certificateId}/pdf`);
120
+ }
121
+ async savePdf(certificateId, path) {
122
+ const pdf = await this.downloadPdf(certificateId);
123
+ const { writeFile } = await import("node:fs/promises");
124
+ await writeFile(path, pdf);
125
+ }
126
+ async getRevocationStatus(certificateId) {
127
+ const data = await this.transport.request("GET", `/v1/certificates/${certificateId}/revocation-status`);
128
+ return parseRevocationStatus(data);
129
+ }
130
+ async revokeCertificate(certificateId, opts) {
131
+ const data = await this.transport.request("POST", `/v1/certificates/${certificateId}/revoke`, { json: { reason: opts.reason } });
132
+ return parseCertificateResponse(data);
133
+ }
134
+ // --- Webhooks ---
135
+ async registerWebhook(opts) {
136
+ const data = await this.transport.request("POST", "/v1/webhooks", {
137
+ json: { url: opts.url },
138
+ });
139
+ return parseWebhook(data);
140
+ }
141
+ listWebhooks(opts) {
142
+ return new Paginator(this.transport, "/v1/webhooks", parseWebhook, {
143
+ params: { limit: opts?.limit ?? 25 },
144
+ });
145
+ }
146
+ async deleteWebhook(webhookId) {
147
+ await this.transport.request("DELETE", `/v1/webhooks/${webhookId}`);
148
+ }
149
+ // --- Transparency log (public, no auth) ---
150
+ async getLogHead() {
151
+ const data = await this.transport.request("GET", "/v1/log/head", {
152
+ authenticated: false,
153
+ });
154
+ return parseSignedTreeHead(data);
155
+ }
156
+ async getLogEntry(index) {
157
+ const data = await this.transport.request("GET", `/v1/log/entry/${index}`, { authenticated: false });
158
+ return parseLogEntry(data);
159
+ }
160
+ async getLogEntries(opts) {
161
+ const data = await this.transport.request("GET", "/v1/log/entries", {
162
+ params: { start: opts.start, end: opts.end },
163
+ authenticated: false,
164
+ });
165
+ return data.map(parseLogEntry);
166
+ }
167
+ async getInclusionProof(opts) {
168
+ const data = await this.transport.request("GET", "/v1/log/proof/inclusion", {
169
+ params: { index: opts.index, tree_size: opts.treeSize },
170
+ authenticated: false,
171
+ });
172
+ return parseInclusionProof(data);
173
+ }
174
+ async getConsistencyProof(opts) {
175
+ const data = await this.transport.request("GET", "/v1/log/proof/consistency", {
176
+ params: { old_size: opts.oldSize, new_size: opts.newSize },
177
+ authenticated: false,
178
+ });
179
+ return parseConsistencyProof(data);
180
+ }
181
+ }
182
+ // ---------------------------------------------------------------------------
183
+ // Connection config resolution
184
+ // ---------------------------------------------------------------------------
185
+ function resolveConnectionConfig(connectionConfig, dsn, uri) {
186
+ const convenience = (dsn !== undefined ? 1 : 0) + (uri !== undefined ? 1 : 0);
187
+ if (convenience > 0 && connectionConfig !== undefined) {
188
+ throw new Error("Cannot provide both connectionConfig and a convenience parameter (dsn/uri). Use one or the other.");
189
+ }
190
+ if (convenience > 1) {
191
+ throw new Error("Cannot provide both dsn and uri.");
192
+ }
193
+ if (dsn !== undefined)
194
+ return { dsn };
195
+ if (uri !== undefined)
196
+ return { uri };
197
+ if (connectionConfig !== undefined)
198
+ return connectionConfig;
199
+ return {};
200
+ }
201
+ // ---------------------------------------------------------------------------
202
+ // Polling helper
203
+ // ---------------------------------------------------------------------------
204
+ async function poll(opts) {
205
+ const deadline = Date.now() + opts.timeout * 1000;
206
+ let interval = opts.pollInterval * 1000;
207
+ while (true) {
208
+ const elapsed = (Date.now() - (deadline - opts.timeout * 1000)) / 1000;
209
+ if (Date.now() >= deadline) {
210
+ throw new TimeoutError(opts.operation, elapsed);
211
+ }
212
+ let result;
213
+ try {
214
+ result = await opts.fetch();
215
+ }
216
+ catch (err) {
217
+ if (err instanceof RateLimitError && err.retryAfter !== undefined) {
218
+ await sleep(err.retryAfter * 1000);
219
+ continue;
220
+ }
221
+ throw err;
222
+ }
223
+ if (opts.done(result)) {
224
+ return result;
225
+ }
226
+ const remaining = deadline - Date.now();
227
+ const sleepTime = Math.min(interval, remaining);
228
+ if (sleepTime <= 0) {
229
+ throw new TimeoutError(opts.operation, elapsed);
230
+ }
231
+ await sleep(sleepTime);
232
+ interval = Math.min(interval * 1.5, 30_000);
233
+ }
234
+ }
235
+ function sleep(ms) {
236
+ return new Promise((resolve) => setTimeout(resolve, ms));
237
+ }
238
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** Browser CryptoOps implementation using WebCrypto (crypto.subtle).
2
+ *
3
+ * Ed25519 support: Chrome 113+, Firefox 128+, Safari 17+.
4
+ */
5
+ import type { CryptoOps } from "./crypto.js";
6
+ export declare const browserCrypto: CryptoOps;
7
+ //# sourceMappingURL=crypto-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto-browser.d.ts","sourceRoot":"","sources":["../../src/crypto-browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,eAAO,MAAM,aAAa,EAAE,SAyB3B,CAAC"}
@@ -0,0 +1,34 @@
1
+ /** Browser CryptoOps implementation using WebCrypto (crypto.subtle).
2
+ *
3
+ * Ed25519 support: Chrome 113+, Firefox 128+, Safari 17+.
4
+ */
5
+ export const browserCrypto = {
6
+ async sha256(data) {
7
+ const hash = await crypto.subtle.digest("SHA-256", toBuffer(data));
8
+ return new Uint8Array(hash);
9
+ },
10
+ async ed25519Verify(publicKey, data, signature) {
11
+ try {
12
+ const spki = concatBytes(ED25519_DER_PREFIX, publicKey);
13
+ const key = await crypto.subtle.importKey("spki", toBuffer(spki), { name: "Ed25519" }, false, ["verify"]);
14
+ return crypto.subtle.verify("Ed25519", key, toBuffer(signature), toBuffer(data));
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ },
20
+ };
21
+ const ED25519_DER_PREFIX = new Uint8Array([
22
+ 0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03, 0x21, 0x00,
23
+ ]);
24
+ /** Ensure the Uint8Array is backed by a plain ArrayBuffer (not SharedArrayBuffer). */
25
+ function toBuffer(data) {
26
+ return data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
27
+ }
28
+ function concatBytes(a, b) {
29
+ const out = new Uint8Array(a.length + b.length);
30
+ out.set(a, 0);
31
+ out.set(b, a.length);
32
+ return out;
33
+ }
34
+ //# sourceMappingURL=crypto-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto-browser.js","sourceRoot":"","sources":["../../src/crypto-browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,MAAM,aAAa,GAAc;IACtC,KAAK,CAAC,MAAM,CAAC,IAAgB;QAC3B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACnE,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,SAAqB,EACrB,IAAgB,EAChB,SAAqB;QAErB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,WAAW,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;YACxD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CACvC,MAAM,EACN,QAAQ,CAAC,IAAI,CAAC,EACd,EAAE,IAAI,EAAE,SAAS,EAAE,EACnB,KAAK,EACL,CAAC,QAAQ,CAAC,CACX,CAAC;YACF,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACnF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF,CAAC;AAEF,MAAM,kBAAkB,GAAG,IAAI,UAAU,CAAC;IACxC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CACvE,CAAC,CAAC;AAEH,sFAAsF;AACtF,SAAS,QAAQ,CAAC,IAAgB;IAChC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAgB,CAAC;AAC9F,CAAC;AAED,SAAS,WAAW,CAAC,CAAa,EAAE,CAAa;IAC/C,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAChD,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACd,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACrB,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Node.js CryptoOps implementation wrapping node:crypto. */
2
+ import type { CryptoOps } from "./crypto.js";
3
+ export declare const nodeCrypto: CryptoOps;
4
+ //# sourceMappingURL=crypto-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto-node.d.ts","sourceRoot":"","sources":["../../src/crypto-node.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAG7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,eAAO,MAAM,UAAU,EAAE,SAuBxB,CAAC"}
@@ -0,0 +1,27 @@
1
+ /** Node.js CryptoOps implementation wrapping node:crypto. */
2
+ import { createHash, verify } from "node:crypto";
3
+ const ED25519_DER_PREFIX = new Uint8Array([
4
+ 0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03, 0x21, 0x00,
5
+ ]);
6
+ export const nodeCrypto = {
7
+ async sha256(data) {
8
+ const hash = createHash("sha256").update(data).digest();
9
+ return new Uint8Array(hash);
10
+ },
11
+ async ed25519Verify(publicKey, data, signature) {
12
+ try {
13
+ const spki = concatBytes(ED25519_DER_PREFIX, publicKey);
14
+ return verify(null, data, { key: Buffer.from(spki), format: "der", type: "spki" }, signature);
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ },
20
+ };
21
+ function concatBytes(a, b) {
22
+ const out = new Uint8Array(a.length + b.length);
23
+ out.set(a, 0);
24
+ out.set(b, a.length);
25
+ return out;
26
+ }
27
+ //# sourceMappingURL=crypto-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto-node.js","sourceRoot":"","sources":["../../src/crypto-node.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGjD,MAAM,kBAAkB,GAAG,IAAI,UAAU,CAAC;IACxC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CACvE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAc;IACnC,KAAK,CAAC,MAAM,CAAC,IAAgB;QAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QACxD,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,SAAqB,EACrB,IAAgB,EAChB,SAAqB;QAErB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,WAAW,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;YACxD,OAAO,MAAM,CACX,IAAI,EACJ,IAAI,EACJ,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EACvD,SAAS,CACV,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF,CAAC;AAEF,SAAS,WAAW,CAAC,CAAa,EAAE,CAAa;IAC/C,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAChD,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACd,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACrB,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,6 @@
1
+ /** Pluggable cryptographic operations for Node.js and browser environments. */
2
+ export interface CryptoOps {
3
+ sha256(data: Uint8Array): Promise<Uint8Array>;
4
+ ed25519Verify(publicKey: Uint8Array, data: Uint8Array, signature: Uint8Array): Promise<boolean>;
5
+ }
6
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9C,aAAa,CACX,SAAS,EAAE,UAAU,EACrB,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB"}
@@ -0,0 +1,3 @@
1
+ /** Pluggable cryptographic operations for Node.js and browser environments. */
2
+ export {};
3
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":"AAAA,+EAA+E"}
@@ -0,0 +1,76 @@
1
+ /** Exception hierarchy for the BurnLedger SDK.
2
+ *
3
+ * Maps HTTP status codes to typed errors. Every error includes
4
+ * enough context for log correlation.
5
+ */
6
+ export declare class BurnLedgerError extends Error {
7
+ constructor(message: string);
8
+ }
9
+ export declare class ApiError extends BurnLedgerError {
10
+ readonly code: string;
11
+ readonly statusCode: number;
12
+ readonly requestId: string;
13
+ constructor(opts: {
14
+ code: string;
15
+ message: string;
16
+ requestId: string;
17
+ statusCode: number;
18
+ });
19
+ }
20
+ export declare class AuthenticationError extends ApiError {
21
+ constructor(opts: {
22
+ code: string;
23
+ message: string;
24
+ requestId: string;
25
+ });
26
+ }
27
+ export declare class NotFoundError extends ApiError {
28
+ constructor(opts: {
29
+ code: string;
30
+ message: string;
31
+ requestId: string;
32
+ });
33
+ }
34
+ export declare class ConflictError extends ApiError {
35
+ constructor(opts: {
36
+ code: string;
37
+ message: string;
38
+ requestId: string;
39
+ });
40
+ }
41
+ export declare class ValidationError extends ApiError {
42
+ constructor(opts: {
43
+ code: string;
44
+ message: string;
45
+ requestId: string;
46
+ });
47
+ }
48
+ export declare class RateLimitError extends ApiError {
49
+ readonly retryAfter: number | undefined;
50
+ constructor(opts: {
51
+ code: string;
52
+ message: string;
53
+ requestId: string;
54
+ retryAfter?: number;
55
+ });
56
+ }
57
+ export declare class ServerError extends ApiError {
58
+ constructor(opts: {
59
+ code: string;
60
+ message: string;
61
+ requestId: string;
62
+ statusCode: number;
63
+ });
64
+ }
65
+ export declare class TimeoutError extends BurnLedgerError {
66
+ readonly operation: string;
67
+ readonly elapsed: number;
68
+ constructor(operation: string, elapsed: number);
69
+ }
70
+ export declare class VerificationError extends BurnLedgerError {
71
+ readonly reason: string;
72
+ constructor(reason: string);
73
+ }
74
+ /** Parse an API error envelope and throw the appropriate exception. */
75
+ export declare function raiseForError(statusCode: number, body: Record<string, unknown>, retryAfter?: number): never;
76
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,QAAS,SAAQ,eAAe;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,IAAI,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB;CASF;AAED,qBAAa,mBAAoB,SAAQ,QAAQ;gBACnC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;CAIvE;AAED,qBAAa,aAAc,SAAQ,QAAQ;gBAC7B,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;CAIvE;AAED,qBAAa,aAAc,SAAQ,QAAQ;gBAC7B,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;CAIvE;AAED,qBAAa,eAAgB,SAAQ,QAAQ;gBAC/B,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;CAIvE;AAED,qBAAa,cAAe,SAAQ,QAAQ;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;gBAE5B,IAAI,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB;CAKF;AAED,qBAAa,WAAY,SAAQ,QAAQ;gBAC3B,IAAI,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB;CAIF;AAED,qBAAa,YAAa,SAAQ,eAAe;IAC/C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAM/C;AAED,qBAAa,iBAAkB,SAAQ,eAAe;IACpD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,MAAM,EAAE,MAAM;CAK3B;AAkBD,uEAAuE;AACvE,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,CAAC,EAAE,MAAM,GAClB,KAAK,CAqBP"}
@@ -0,0 +1,105 @@
1
+ /** Exception hierarchy for the BurnLedger SDK.
2
+ *
3
+ * Maps HTTP status codes to typed errors. Every error includes
4
+ * enough context for log correlation.
5
+ */
6
+ export class BurnLedgerError extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = "BurnLedgerError";
10
+ }
11
+ }
12
+ export class ApiError extends BurnLedgerError {
13
+ code;
14
+ statusCode;
15
+ requestId;
16
+ constructor(opts) {
17
+ super(`[${opts.statusCode}] ${opts.code}: ${opts.message} (request_id=${opts.requestId})`);
18
+ this.name = "ApiError";
19
+ this.code = opts.code;
20
+ this.statusCode = opts.statusCode;
21
+ this.requestId = opts.requestId;
22
+ }
23
+ }
24
+ export class AuthenticationError extends ApiError {
25
+ constructor(opts) {
26
+ super({ ...opts, statusCode: 401 });
27
+ this.name = "AuthenticationError";
28
+ }
29
+ }
30
+ export class NotFoundError extends ApiError {
31
+ constructor(opts) {
32
+ super({ ...opts, statusCode: 404 });
33
+ this.name = "NotFoundError";
34
+ }
35
+ }
36
+ export class ConflictError extends ApiError {
37
+ constructor(opts) {
38
+ super({ ...opts, statusCode: 409 });
39
+ this.name = "ConflictError";
40
+ }
41
+ }
42
+ export class ValidationError extends ApiError {
43
+ constructor(opts) {
44
+ super({ ...opts, statusCode: 422 });
45
+ this.name = "ValidationError";
46
+ }
47
+ }
48
+ export class RateLimitError extends ApiError {
49
+ retryAfter;
50
+ constructor(opts) {
51
+ super({ ...opts, statusCode: 429 });
52
+ this.name = "RateLimitError";
53
+ this.retryAfter = opts.retryAfter;
54
+ }
55
+ }
56
+ export class ServerError extends ApiError {
57
+ constructor(opts) {
58
+ super(opts);
59
+ this.name = "ServerError";
60
+ }
61
+ }
62
+ export class TimeoutError extends BurnLedgerError {
63
+ operation;
64
+ elapsed;
65
+ constructor(operation, elapsed) {
66
+ super(`${operation}: timed out after ${elapsed.toFixed(1)}s`);
67
+ this.name = "TimeoutError";
68
+ this.operation = operation;
69
+ this.elapsed = elapsed;
70
+ }
71
+ }
72
+ export class VerificationError extends BurnLedgerError {
73
+ reason;
74
+ constructor(reason) {
75
+ super(reason);
76
+ this.name = "VerificationError";
77
+ this.reason = reason;
78
+ }
79
+ }
80
+ const STATUS_TO_CLASS = {
81
+ 401: AuthenticationError,
82
+ 404: NotFoundError,
83
+ 409: ConflictError,
84
+ 422: ValidationError,
85
+ 429: RateLimitError,
86
+ };
87
+ /** Parse an API error envelope and throw the appropriate exception. */
88
+ export function raiseForError(statusCode, body, retryAfter) {
89
+ const err = (body.error ?? {});
90
+ const code = err.code ?? "UNKNOWN";
91
+ const message = err.message ?? "";
92
+ const requestId = err.request_id ?? "";
93
+ const Cls = STATUS_TO_CLASS[statusCode];
94
+ if (Cls === RateLimitError) {
95
+ throw new RateLimitError({ code, message, requestId, retryAfter });
96
+ }
97
+ if (Cls) {
98
+ throw new Cls({ code, message, requestId });
99
+ }
100
+ if (statusCode >= 500) {
101
+ throw new ServerError({ code, message, requestId, statusCode });
102
+ }
103
+ throw new ApiError({ code, message, requestId, statusCode });
104
+ }
105
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,eAAe;IAClC,IAAI,CAAS;IACb,UAAU,CAAS;IACnB,SAAS,CAAS;IAE3B,YAAY,IAKX;QACC,KAAK,CACH,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,gBAAgB,IAAI,CAAC,SAAS,GAAG,CACpF,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,QAAQ;IAC/C,YAAY,IAA0D;QACpE,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,QAAQ;IACzC,YAAY,IAA0D;QACpE,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,QAAQ;IACzC,YAAY,IAA0D;QACpE,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC3C,YAAY,IAA0D;QACpE,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,QAAQ;IACjC,UAAU,CAAqB;IAExC,YAAY,IAKX;QACC,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,QAAQ;IACvC,YAAY,IAKX;QACC,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,eAAe;IACtC,SAAS,CAAS;IAClB,OAAO,CAAS;IAEzB,YAAY,SAAiB,EAAE,OAAe;QAC5C,KAAK,CAAC,GAAG,SAAS,qBAAqB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,eAAe;IAC3C,MAAM,CAAS;IAExB,YAAY,MAAc;QACxB,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,MAAM,eAAe,GAQjB;IACF,GAAG,EAAE,mBAAmB;IACxB,GAAG,EAAE,aAAa;IAClB,GAAG,EAAE,aAAa;IAClB,GAAG,EAAE,eAAe;IACpB,GAAG,EAAE,cAAc;CACpB,CAAC;AAEF,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAC3B,UAAkB,EAClB,IAA6B,EAC7B,UAAmB;IAEnB,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAA4B,CAAC;IAC1D,MAAM,IAAI,GAAI,GAAG,CAAC,IAAe,IAAI,SAAS,CAAC;IAC/C,MAAM,OAAO,GAAI,GAAG,CAAC,OAAkB,IAAI,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAI,GAAG,CAAC,UAAqB,IAAI,EAAE,CAAC;IAEnD,MAAM,GAAG,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAExC,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;QAC3B,MAAM,IAAI,cAAc,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;QACtB,MAAM,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,35 @@
1
+ /** HTTP transport layer wrapping native fetch.
2
+ *
3
+ * Handles: Bearer auth, response envelope unwrapping, retry on 5xx/transport
4
+ * errors, Retry-After respect on 429, and raw byte streaming for PDFs.
5
+ */
6
+ export interface TransportOptions {
7
+ baseUrl: string;
8
+ apiKey: string;
9
+ timeout: number;
10
+ maxRetries: number;
11
+ }
12
+ export declare class Transport {
13
+ private readonly baseUrl;
14
+ private readonly apiKey;
15
+ private readonly timeout;
16
+ private readonly maxRetries;
17
+ constructor(opts: TransportOptions);
18
+ /** Make a request and return the unwrapped `data` field. */
19
+ request(method: string, path: string, opts?: {
20
+ json?: unknown;
21
+ params?: Record<string, string | number>;
22
+ authenticated?: boolean;
23
+ }): Promise<unknown>;
24
+ /** Make a request and return the full response envelope (for pagination). */
25
+ requestRaw(method: string, path: string, opts?: {
26
+ json?: unknown;
27
+ params?: Record<string, string | number>;
28
+ authenticated?: boolean;
29
+ }): Promise<Record<string, unknown>>;
30
+ /** Make a request and return raw bytes (for PDF downloads). */
31
+ requestBytes(method: string, path: string, opts?: {
32
+ authenticated?: boolean;
33
+ }): Promise<Uint8Array>;
34
+ }
35
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,IAAI,EAAE,gBAAgB;IAOlC,4DAA4D;IACtD,OAAO,CACX,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;QACzC,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,GACA,OAAO,CAAC,OAAO,CAAC;IAKnB,6EAA6E;IACvE,UAAU,CACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;QACzC,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,GACA,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAiFnC,+DAA+D;IACzD,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,GACjC,OAAO,CAAC,UAAU,CAAC;CAyBvB"}