@inco/js 0.8.0-devnet-12 → 0.8.0-devnet-20

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 (77) hide show
  1. package/README.md +18 -76
  2. package/dist/cjs/advancedacl/session-key.d.ts +1 -1
  3. package/dist/cjs/advancedacl/session-key.js +3 -2
  4. package/dist/cjs/binary.d.ts +2 -4
  5. package/dist/cjs/binary.js +11 -6
  6. package/dist/cjs/encryption/index.d.ts +1 -1
  7. package/dist/cjs/encryption/index.js +17 -16
  8. package/dist/cjs/generated/abis/lightning.d.ts +70 -17
  9. package/dist/cjs/generated/abis/lightning.js +44 -19
  10. package/dist/cjs/generated/abis/test-elist.d.ts +10 -2
  11. package/dist/cjs/generated/abis/test-elist.js +8 -3
  12. package/dist/cjs/generated/abis/verifier.d.ts +8 -4
  13. package/dist/cjs/generated/abis/verifier.js +4 -4
  14. package/dist/cjs/generated/lightning.d.ts +60 -0
  15. package/dist/cjs/generated/lightning.js +64 -1
  16. package/dist/cjs/generated/local-node.d.ts +4 -4
  17. package/dist/cjs/generated/local-node.js +4 -4
  18. package/dist/cjs/index.d.ts +1 -1
  19. package/dist/cjs/index.js +11 -2
  20. package/dist/cjs/kms/quorumClient.d.ts +1 -10
  21. package/dist/cjs/kms/quorumClient.js +21 -237
  22. package/dist/cjs/kms/quorumConsistency.d.ts +58 -0
  23. package/dist/cjs/kms/quorumConsistency.js +200 -0
  24. package/dist/cjs/kms/thresholdPromises.d.ts +4 -3
  25. package/dist/cjs/kms/thresholdPromises.js +25 -15
  26. package/dist/cjs/lite/hadu.d.ts +1 -1
  27. package/dist/cjs/lite/hadu.js +3 -3
  28. package/dist/cjs/lite/index.d.ts +0 -2
  29. package/dist/cjs/lite/index.js +1 -15
  30. package/dist/cjs/lite/lightning.d.ts +1 -1
  31. package/dist/cjs/lite/lightning.js +10 -33
  32. package/dist/esm/advancedacl/session-key.d.ts +1 -1
  33. package/dist/esm/advancedacl/session-key.js +3 -2
  34. package/dist/esm/binary.d.ts +2 -4
  35. package/dist/esm/binary.js +11 -6
  36. package/dist/esm/encryption/index.d.ts +1 -1
  37. package/dist/esm/encryption/index.js +2 -2
  38. package/dist/esm/generated/abis/lightning.d.ts +70 -17
  39. package/dist/esm/generated/abis/lightning.js +44 -19
  40. package/dist/esm/generated/abis/test-elist.d.ts +10 -2
  41. package/dist/esm/generated/abis/test-elist.js +8 -3
  42. package/dist/esm/generated/abis/verifier.d.ts +8 -4
  43. package/dist/esm/generated/abis/verifier.js +4 -4
  44. package/dist/esm/generated/lightning.d.ts +60 -0
  45. package/dist/esm/generated/lightning.js +64 -1
  46. package/dist/esm/generated/local-node.d.ts +4 -4
  47. package/dist/esm/generated/local-node.js +4 -4
  48. package/dist/esm/index.d.ts +1 -1
  49. package/dist/esm/index.js +2 -2
  50. package/dist/esm/kms/quorumClient.d.ts +1 -10
  51. package/dist/esm/kms/quorumClient.js +21 -237
  52. package/dist/esm/kms/quorumConsistency.d.ts +58 -0
  53. package/dist/esm/kms/quorumConsistency.js +193 -0
  54. package/dist/esm/kms/thresholdPromises.d.ts +4 -3
  55. package/dist/esm/kms/thresholdPromises.js +25 -15
  56. package/dist/esm/lite/hadu.d.ts +1 -1
  57. package/dist/esm/lite/hadu.js +2 -2
  58. package/dist/esm/lite/index.d.ts +0 -2
  59. package/dist/esm/lite/index.js +1 -3
  60. package/dist/esm/lite/lightning.d.ts +1 -1
  61. package/dist/esm/lite/lightning.js +4 -27
  62. package/dist/types/advancedacl/session-key.d.ts +1 -1
  63. package/dist/types/binary.d.ts +2 -4
  64. package/dist/types/encryption/index.d.ts +1 -1
  65. package/dist/types/generated/abis/lightning.d.ts +70 -17
  66. package/dist/types/generated/abis/test-elist.d.ts +10 -2
  67. package/dist/types/generated/abis/verifier.d.ts +8 -4
  68. package/dist/types/generated/lightning.d.ts +60 -0
  69. package/dist/types/generated/local-node.d.ts +4 -4
  70. package/dist/types/index.d.ts +1 -1
  71. package/dist/types/kms/quorumClient.d.ts +1 -10
  72. package/dist/types/kms/quorumConsistency.d.ts +58 -0
  73. package/dist/types/kms/thresholdPromises.d.ts +4 -3
  74. package/dist/types/lite/hadu.d.ts +1 -1
  75. package/dist/types/lite/index.d.ts +0 -2
  76. package/dist/types/lite/lightning.d.ts +1 -1
  77. package/package.json +12 -12
@@ -4,18 +4,18 @@ exports.KmsQuorumClient = void 0;
4
4
  const binary_js_1 = require("../binary.js");
5
5
  const encryption_js_1 = require("../encryption/encryption.js");
6
6
  const handle_js_1 = require("../handle.js");
7
- const xwing_js_1 = require("../lite/xwing.js");
8
7
  const retry_js_1 = require("../retry.js");
9
8
  const client_js_1 = require("./client.js");
9
+ const quorumConsistency_js_1 = require("./quorumConsistency.js");
10
10
  const thresholdPromises_js_1 = require("./thresholdPromises.js");
11
11
  /**
12
- * Checks if the threshold is at least a majority of signers and warns if not.
12
+ * Checks if the threshold is at least a majority of signers and throws an error if not.
13
+ * This is important to ensure that the quorum client provides the expected security guarantees.
13
14
  */
14
15
  function checkMajorityThreshold(threshold, signerCount) {
15
16
  const majority = Math.floor(signerCount / 2) + 1;
16
17
  if (threshold < majority) {
17
- console.warn(`Security warning: threshold (${threshold}) is less than majority (${majority}) of ${signerCount} signers. ` +
18
- `A threshold below majority weakens quorum security guarantees.`);
18
+ throw new Error(`Threshold (${threshold}) must be at least a majority (${majority}) of ${signerCount} signers to ensure security guarantees.`);
19
19
  }
20
20
  }
21
21
  class KmsQuorumClient {
@@ -71,7 +71,6 @@ class KmsQuorumClient {
71
71
  if (threshold < 1 || threshold > urls.length) {
72
72
  throw new Error(`Threshold must be between 1 and ${urls.length} (number of URLs)`);
73
73
  }
74
- checkMajorityThreshold(threshold, urls.length);
75
74
  const attesters = urls.map((url, index) => {
76
75
  return { url, signer: signers[index] };
77
76
  });
@@ -92,41 +91,31 @@ class KmsQuorumClient {
92
91
  if (threshold < 1 || threshold > kmsClients.length) {
93
92
  throw new Error(`Threshold must be between 1 and ${kmsClients.length} (number of KMS clients)`);
94
93
  }
95
- checkMajorityThreshold(threshold, kmsClients.length);
96
94
  return new KmsQuorumClient(kmsClients, threshold);
97
95
  }
98
96
  async attestedDecrypt(request, backoffConfig, reencryptKeypair) {
99
97
  const thresholdResults = await this.executeKmsOperationWithThreshold(async (kms) => {
100
98
  return await kms.client.attestedDecrypt(request);
101
99
  }, backoffConfig);
102
- // Extract responses and signers
103
- const thresholdResponses = thresholdResults.map((r) => r.response);
104
- const signers = thresholdResults.map((r) => r.signer);
105
100
  // Verify that responses are consistent across quorum (plaintext or ciphertext)
106
- const reference = await this.verifyResponseConsistency(thresholdResponses, reencryptKeypair);
107
- return this.buildAggregatedAttestations(reference, thresholdResponses, signers);
101
+ const { reference, winningResults } = await (0, quorumConsistency_js_1.verifyDecryptResponseConsistency)(thresholdResults, this.threshold, reencryptKeypair);
102
+ return this.buildAggregatedAttestations(reference, winningResults.map((r) => r.response), winningResults.map((r) => r.signer));
108
103
  }
109
104
  async attestedCompute(request, backoffConfig, reencryptKeypair) {
110
105
  const thresholdResults = await this.executeKmsOperationWithThreshold(async (kms) => {
111
106
  return await kms.client.attestedCompute(request);
112
107
  }, backoffConfig);
113
- // Extract responses and signers
114
- const thresholdResponses = thresholdResults.map((r) => r.response);
115
- const signers = thresholdResults.map((r) => r.signer);
116
108
  // Verify that responses are consistent across quorum
117
- const reference = await this.verifyComputeResponseConsistency(thresholdResponses, request, reencryptKeypair);
118
- return this.buildAggregatedComputeAttestation(reference, thresholdResponses, signers);
109
+ const { reference, winningResults } = await (0, quorumConsistency_js_1.verifyComputeResponseConsistency)(thresholdResults, this.threshold, request, reencryptKeypair);
110
+ return this.buildAggregatedComputeAttestation(reference, winningResults.map((r) => r.response), winningResults.map((r) => r.signer));
119
111
  }
120
112
  async attestedReveal(request, backoffConfig) {
121
113
  const thresholdResults = await this.executeKmsOperationWithThreshold(async (kms) => {
122
114
  return await kms.client.attestedReveal(request);
123
115
  }, backoffConfig);
124
- // Extract responses and signers
125
- const thresholdResponses = thresholdResults.map((r) => r.response);
126
- const signers = thresholdResults.map((r) => r.signer);
127
116
  // Verify that responses are consistent across quorum (plaintext only for reveal)
128
- const reference = await this.verifyResponseConsistency(thresholdResponses);
129
- return this.buildAggregatedAttestations(reference, thresholdResponses, signers);
117
+ const { reference, winningResults } = await (0, quorumConsistency_js_1.verifyDecryptResponseConsistency)(thresholdResults, this.threshold);
118
+ return this.buildAggregatedAttestations(reference, winningResults.map((r) => r.response), winningResults.map((r) => r.signer));
130
119
  }
131
120
  /**
132
121
  * Generic method to execute a KMS operation across all clients with retry and threshold logic.
@@ -216,14 +205,14 @@ class KmsQuorumClient {
216
205
  const encryptedCovalidatorSignatures = this.collectAndSortSignatures(encryptedSignatures, signers);
217
206
  const reencryption = refAtt.value.value;
218
207
  const ct = reencryption.userCiphertext;
219
- const fheType = (0, handle_js_1.getHandleType)((0, binary_js_1.parseHex)(refAtt.handle));
208
+ const handleType = (0, handle_js_1.getHandleType)((0, binary_js_1.parseHex)(refAtt.handle));
220
209
  return {
221
210
  handle: refAtt.handle,
222
211
  encryptedPlaintext: {
223
212
  ciphertext: {
224
213
  value: (0, binary_js_1.bytesToHex)(ct),
225
- scheme: 2, // EncryptionScheme: XWING
226
- type: fheType,
214
+ scheme: encryption_js_1.encryptionSchemes.xwing, // EncryptionScheme: XWING
215
+ type: handleType,
227
216
  },
228
217
  },
229
218
  encryptedSignatures: encryptedCovalidatorSignatures,
@@ -244,13 +233,13 @@ class KmsQuorumClient {
244
233
  throw new Error('No value in reference attestation');
245
234
  }
246
235
  // Collect signatures and sort by signer address
247
- // We know all responses have decryption attestations from verifyComputeResponseConsistency
236
+ // All responses are guaranteed to have decryption attestations by verifyComputeResponseConsistency
248
237
  const signatures = [];
249
238
  for (const resp of thresholdResponses) {
250
239
  const att = resp.decryptionAttestation;
251
- if (att) {
252
- signatures.push(att.signature);
253
- }
240
+ if (!att)
241
+ throw new Error('Missing decryption attestation in winning response');
242
+ signatures.push(att.signature);
254
243
  }
255
244
  const covalidatorSignatures = this.collectAndSortSignatures(signatures, signers);
256
245
  if (refAtt.value.case === 'plaintext') {
@@ -262,7 +251,7 @@ class KmsQuorumClient {
262
251
  if (!ct) {
263
252
  throw new Error('No ciphertext in reencryption');
264
253
  }
265
- const fheType = (0, handle_js_1.getHandleType)((0, binary_js_1.parseHex)(refAtt.handle));
254
+ const handleType = (0, handle_js_1.getHandleType)((0, binary_js_1.parseHex)(refAtt.handle));
266
255
  // Collect encrypted signatures and sort by signer address
267
256
  const encryptedSignatures = thresholdResponses.map((resp) => {
268
257
  if (resp.decryptionAttestation?.value.case === 'reencryption') {
@@ -279,8 +268,8 @@ class KmsQuorumClient {
279
268
  encryptedPlaintext: {
280
269
  ciphertext: {
281
270
  value: (0, binary_js_1.bytesToHex)(ct),
282
- scheme: encryption_js_1.encryptionSchemes.xwing, // EncryptionScheme: ECIES
283
- type: fheType,
271
+ scheme: encryption_js_1.encryptionSchemes.xwing, // EncryptionScheme: XWING
272
+ type: handleType,
284
273
  },
285
274
  },
286
275
  encryptedSignatures: encryptedCovalidatorSignatures,
@@ -289,211 +278,6 @@ class KmsQuorumClient {
289
278
  }
290
279
  throw new Error(`Unexpected attestation type: ${refAtt.value.case}, expected 'plaintext' or 'reencryption'`);
291
280
  }
292
- async verifyResponseConsistency(thresholdResponses, reencryptKeypair) {
293
- if (thresholdResponses.length === 0) {
294
- throw new Error('No responses collected to verify');
295
- }
296
- const reference = thresholdResponses[0];
297
- for (let r = 1; r < thresholdResponses.length; r++) {
298
- if (thresholdResponses[r].decryptionAttestations.length !==
299
- reference.decryptionAttestations.length) {
300
- throw new Error('Inconsistent number of decryption attestations across KMS responses');
301
- }
302
- }
303
- for (let i = 0; i < reference.decryptionAttestations.length; i++) {
304
- const refAtt = reference.decryptionAttestations[i];
305
- if (!refAtt.value) {
306
- throw new Error('No value in reference attestation');
307
- }
308
- const refCase = refAtt.value.case;
309
- // Verify that all responses have the same case (plaintext or reencryption)
310
- for (let r = 1; r < thresholdResponses.length; r++) {
311
- const att = thresholdResponses[r].decryptionAttestations[i];
312
- if (!att.value) {
313
- throw new Error('No value in attestation');
314
- }
315
- if (att.value.case !== refCase) {
316
- throw new Error(`Inconsistent attestation types: reference has '${refCase}' but response ${r} has '${att.value.case}'`);
317
- }
318
- }
319
- // Verify consistency based on the case
320
- if (refCase === 'plaintext') {
321
- this.verifyPlaintextConsistency(i, reference, thresholdResponses);
322
- }
323
- else if (refCase === 'reencryption') {
324
- await this.verifyCiphertextConsistency(i, reference, thresholdResponses, reencryptKeypair);
325
- }
326
- else {
327
- throw new Error(`Unexpected attestation type: ${refCase}, expected 'plaintext' or 'reencryption'`);
328
- }
329
- }
330
- return reference;
331
- }
332
- async verifyComputeResponseConsistency(thresholdResponses, request, reencryptKeypair) {
333
- if (thresholdResponses.length === 0) {
334
- throw new Error('No responses collected to verify');
335
- }
336
- const reference = thresholdResponses[0];
337
- const refAtt = reference.decryptionAttestation;
338
- if (!refAtt) {
339
- throw new Error('No decryption attestation in reference response');
340
- }
341
- if (!refAtt.value) {
342
- throw new Error('No value in reference attestation');
343
- }
344
- const refCase = refAtt.value.case;
345
- // Precompute reference values based on the case
346
- let refBytes;
347
- let refReencryption;
348
- let refCt;
349
- let refFheType;
350
- if (refCase === 'plaintext') {
351
- refBytes = refAtt.value.value.value;
352
- }
353
- else if (refCase === 'reencryption') {
354
- refReencryption = refAtt.value.value;
355
- refCt = refReencryption.userCiphertext;
356
- if (!refCt) {
357
- throw new Error('No ciphertext in reference reencryption');
358
- }
359
- refFheType = (0, handle_js_1.getHandleType)((0, binary_js_1.parseHex)(refAtt.handle));
360
- }
361
- else {
362
- throw new Error(`Unexpected attestation type: ${refCase}, expected 'plaintext' or 'reencryption'`);
363
- }
364
- // If no reencryptPubKey is provided in the request (or it's empty), reject reencryption attestations
365
- const hasReencryptPubKey = request?.reencryptPubKey && request.reencryptPubKey.length > 0;
366
- if (refCase === 'reencryption' && !hasReencryptPubKey) {
367
- throw new Error("Unexpected attestation type: reencryption, expected 'plaintext'");
368
- }
369
- // Verify that all responses have a decryption attestation and are consistent
370
- for (let r = 1; r < thresholdResponses.length; r++) {
371
- const att = thresholdResponses[r].decryptionAttestation;
372
- if (!att) {
373
- throw new Error('No decryption attestation in response');
374
- }
375
- if (!att.value) {
376
- throw new Error('No value in attestation');
377
- }
378
- if (att.value.case !== refCase) {
379
- throw new Error(`Inconsistent attestation types: reference has '${refCase}' but response ${r} has '${att.value.case}'`);
380
- }
381
- // Verify handles match
382
- if (att.handle !== refAtt.handle) {
383
- throw new Error('Handles differ across KMS responses');
384
- }
385
- // Verify consistency based on the case
386
- if (refCase === 'plaintext') {
387
- if (!refBytes) {
388
- throw new Error('No reference plaintext bytes to compare');
389
- }
390
- if (att.value.case !== 'plaintext') {
391
- throw new Error('Expected plaintext attestation but received non-plaintext');
392
- }
393
- const bytes = att.value.value.value;
394
- this.verifyPlaintextBytesConsistency(refBytes, bytes);
395
- }
396
- else if (refCase === 'reencryption') {
397
- if (!refCt || refFheType === undefined) {
398
- throw new Error('No reference reencryption data to compare');
399
- }
400
- if (att.value.case !== 'reencryption') {
401
- throw new Error('Expected reencryption attestation but received non-reencryption');
402
- }
403
- const reencryption = att.value.value;
404
- const ct = reencryption.userCiphertext;
405
- if (!ct) {
406
- throw new Error('No ciphertext in reencryption');
407
- }
408
- const fheType = (0, handle_js_1.getHandleType)((0, binary_js_1.parseHex)(att.handle));
409
- // Verify FHE type matches
410
- if (fheType !== refFheType) {
411
- throw new Error('FHE types differ across KMS responses');
412
- }
413
- // Verify handles match
414
- if (att.handle !== refAtt.handle) {
415
- throw new Error('Handles differ across KMS responses');
416
- }
417
- // If keypair provided, decrypt and verify plaintext consistency
418
- if (reencryptKeypair) {
419
- const refPlaintext = await (0, xwing_js_1.decrypt)(reencryptKeypair, refCt);
420
- const plaintext = await (0, xwing_js_1.decrypt)(reencryptKeypair, ct);
421
- this.verifyPlaintextBytesConsistency(refPlaintext, plaintext);
422
- }
423
- }
424
- }
425
- return reference;
426
- }
427
- /**
428
- * Verifies that two plaintext byte arrays are identical.
429
- * Uses constant-time comparison to prevent timing side-channel attacks.
430
- */
431
- verifyPlaintextBytesConsistency(refBytes, bytes) {
432
- if (refBytes.length !== bytes.length) {
433
- throw new Error('Plaintexts length differ across KMS responses');
434
- }
435
- // Compare all bytes before deciding to throw, preventing timing side-channel
436
- let mismatch = 0;
437
- for (let b = 0; b < refBytes.length; b++) {
438
- mismatch |= refBytes[b] ^ bytes[b];
439
- }
440
- if (mismatch !== 0) {
441
- throw new Error('Plaintexts differ across KMS responses');
442
- }
443
- }
444
- verifyPlaintextConsistency(index, reference, thresholdResponses) {
445
- const refAtt = reference.decryptionAttestations[index];
446
- if (refAtt.value?.case !== 'plaintext') {
447
- throw new Error('Expected plaintext attestation');
448
- }
449
- const refBytes = refAtt.value.value.value;
450
- for (let r = 1; r < thresholdResponses.length; r++) {
451
- const att = thresholdResponses[r].decryptionAttestations[index];
452
- if (att.value?.case !== 'plaintext') {
453
- throw new Error('Expected plaintext attestation but received non-plaintext');
454
- }
455
- const bytes = att.value.value.value;
456
- this.verifyPlaintextBytesConsistency(refBytes, bytes);
457
- }
458
- }
459
- async verifyCiphertextConsistency(index, reference, thresholdResponses, reencryptKeypair) {
460
- const refAtt = reference.decryptionAttestations[index];
461
- if (refAtt.value?.case !== 'reencryption') {
462
- throw new Error('Expected reencryption attestation');
463
- }
464
- const refReencryption = refAtt.value.value;
465
- const refCt = refReencryption.userCiphertext;
466
- if (!refCt) {
467
- throw new Error('No ciphertext in reference reencryption');
468
- }
469
- const refFheType = (0, handle_js_1.getHandleType)((0, binary_js_1.parseHex)(refAtt.handle));
470
- for (let r = 1; r < thresholdResponses.length; r++) {
471
- const att = thresholdResponses[r].decryptionAttestations[index];
472
- if (att.value?.case !== 'reencryption') {
473
- throw new Error('Expected reencryption attestation but received non-reencryption');
474
- }
475
- const reencryption = att.value.value;
476
- const ct = reencryption.userCiphertext;
477
- if (!ct) {
478
- throw new Error('No ciphertext in reencryption');
479
- }
480
- const fheType = (0, handle_js_1.getHandleType)((0, binary_js_1.parseHex)(att.handle));
481
- // Verify FHE type matches
482
- if (fheType !== refFheType) {
483
- throw new Error('FHE types differ across KMS responses');
484
- }
485
- // Verify handles match
486
- if (att.handle !== refAtt.handle) {
487
- throw new Error('Handles differ across KMS responses');
488
- }
489
- // If keypair provided, decrypt and verify plaintext consistency
490
- if (reencryptKeypair) {
491
- const refPlaintext = await (0, xwing_js_1.decrypt)(reencryptKeypair, refCt);
492
- const plaintext = await (0, xwing_js_1.decrypt)(reencryptKeypair, ct);
493
- this.verifyPlaintextBytesConsistency(refPlaintext, plaintext);
494
- }
495
- }
496
- }
497
281
  }
498
282
  exports.KmsQuorumClient = KmsQuorumClient;
499
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvcnVtQ2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ttcy9xdW9ydW1DbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EsNENBS3NCO0FBTXRCLCtEQUdxQztBQVVyQyw0Q0FBNkM7QUFFN0MsK0NBQTJDO0FBRTNDLDBDQUErQztBQUMvQywyQ0FBMkQ7QUFDM0QsaUVBQThEO0FBTzlEOztHQUVHO0FBQ0gsU0FBUyxzQkFBc0IsQ0FBQyxTQUFpQixFQUFFLFdBQW1CO0lBQ3BFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqRCxJQUFJLFNBQVMsR0FBRyxRQUFRLEVBQUUsQ0FBQztRQUN6QixPQUFPLENBQUMsSUFBSSxDQUNWLGdDQUFnQyxTQUFTLDRCQUE0QixRQUFRLFFBQVEsV0FBVyxZQUFZO1lBQzFHLGdFQUFnRSxDQUNuRSxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRCxNQUFhLGVBQWU7SUFDVCxJQUFJLENBQVE7SUFDWixTQUFTLENBQVM7SUFRbkMsaUJBQWlCO0lBQ2pCLFlBQ0Usa0JBQW9FLEVBQ3BFLFNBQWlCO1FBRWpCLElBQUksa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBRUQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxJQUFJLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMzRCxNQUFNLElBQUksS0FBSyxDQUNiLG1DQUFtQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FDL0QsQ0FBQztRQUNKLENBQUM7UUFFRCxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFN0QsMkZBQTJGO1FBQzNGLElBQ0Us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
283
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvcnVtQ2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ttcy9xdW9ydW1DbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EsNENBS3NCO0FBTXRCLCtEQUdxQztBQVVyQyw0Q0FBNkM7QUFHN0MsMENBQStDO0FBQy9DLDJDQUEyRDtBQUMzRCxpRUFHZ0M7QUFDaEMsaUVBQThEO0FBTzlEOzs7R0FHRztBQUNILFNBQVMsc0JBQXNCLENBQUMsU0FBaUIsRUFBRSxXQUFtQjtJQUNwRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakQsSUFBSSxTQUFTLEdBQUcsUUFBUSxFQUFFLENBQUM7UUFDekIsTUFBTSxJQUFJLEtBQUssQ0FDYixjQUFjLFNBQVMsa0NBQWtDLFFBQVEsUUFBUSxXQUFXLHlDQUF5QyxDQUM5SCxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRCxNQUFhLGVBQWU7SUFDVCxJQUFJLENBQVE7SUFDWixTQUFTLENBQVM7SUFRbkMsaUJBQWlCO0lBQ2pCLFlBQ0Usa0JBQW9FLEVBQ3BFLFNBQWlCO1FBRWpCLElBQUksa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBRUQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxJQUFJLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMzRCxNQUFNLElBQUksS0FBSyxDQUNiLG1DQUFtQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FDL0QsQ0FBQztRQUNKLENBQUM7UUFFRCxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFN0QsMkZBQTJGO1FBQzNGLElBQ0Usa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDN0IsaUJBQWlCLElBQUksa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQzFDLENBQUM7WUFDRCwwQkFBMEI7WUFDMUIsTUFBTSxVQUFVLEdBQUcsa0JBQWlDLENBQUM7WUFDckQsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN0QyxNQUFNO2dCQUNOLE1BQU0sRUFBRSxNQUFNLENBQUMsYUFBYTthQUM3QixDQUFDLENBQUMsQ0FBQztRQUNOLENBQUM7YUFBTSxDQUFDO1lBQ04saURBQWlEO1lBQ2pELE1BQU0sU0FBUyxHQUFHLGtCQUdmLENBQUM7WUFDSixJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDckMsT0FBTztvQkFDTCxNQUFNLEVBQUUsSUFBQSx3QkFBWSxFQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQztvQkFDbkQsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO2lCQUN4QixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsTUFBTSxDQUFDLFFBQVEsQ0FDYixJQUFjLEVBQ2QsT0FBa0IsRUFDbEIsU0FBaUI7UUFFakIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksS0FBSyxDQUNiLHlCQUF5QixPQUFPLENBQUMsTUFBTSxtQ0FBbUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUN6RixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksU0FBUyxHQUFHLENBQUMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdDLE1BQU0sSUFBSSxLQUFLLENBQ2IsbUNBQW1DLElBQUksQ0FBQyxNQUFNLG1CQUFtQixDQUNsRSxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDeEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksZUFBZSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQ25CLFVBQXVCLEVBQ3ZCLFNBQWlCO1FBRWpCLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUVELElBQUksU0FBUyxHQUFHLENBQUMsSUFBSSxTQUFTLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25ELE1BQU0sSUFBSSxLQUFLLENBQ2IsbUNBQW1DLFVBQVUsQ0FBQyxNQUFNLDBCQUEwQixDQUMvRSxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sSUFBSSxlQUFlLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZSxDQUNuQixPQUErQixFQUMvQixhQUFzQyxFQUN0QyxnQkFBK0I7UUFPL0IsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FDbEUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ1osT0FBTyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELENBQUMsRUFDRCxhQUFhLENBQ2QsQ0FBQztRQUVGLCtFQUErRTtRQUMvRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxHQUNqQyxNQUFNLElBQUEsdURBQWdDLEVBQ3BDLGdCQUdFLEVBQ0YsSUFBSSxDQUFDLFNBQVMsRUFDZCxnQkFBZ0IsQ0FDakIsQ0FBQztRQUVKLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUNyQyxTQUFTLEVBQ1QsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUNyQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQ3BDLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWUsQ0FDbkIsT0FBK0IsRUFDL0IsYUFBc0MsRUFDdEMsZ0JBQStCO1FBSy9CLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0NBQWdDLENBQ2xFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUNaLE9BQU8sTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRCxDQUFDLEVBQ0QsYUFBYSxDQUNkLENBQUM7UUFFRixxREFBcUQ7UUFDckQsTUFBTSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsR0FDakMsTUFBTSxJQUFBLHVEQUFnQyxFQUNwQyxnQkFHRSxFQUNGLElBQUksQ0FBQyxTQUFTLEVBQ2QsT0FBTyxFQUNQLGdCQUFnQixDQUNqQixDQUFDO1FBRUosT0FBTyxJQUFJLENBQUMsaUNBQWlDLENBQzNDLFNBQVMsRUFDVCxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQ3JDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FDcEMsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsY0FBYyxDQUNsQixPQUE4QixFQUM5QixhQUFzQztRQU90QyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLGdDQUFnQyxDQUNsRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDWixPQUFPLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxFQUNELGFBQWEsQ0FDZCxDQUFDO1FBRUYsaUZBQWlGO1FBQ2pGLE1BQU0sRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLEdBQ2pDLE1BQU0sSUFBQSx1REFBZ0MsRUFDcEMsZ0JBR0UsRUFDRixJQUFJLENBQUMsU0FBUyxDQUNmLENBQUM7UUFFSixPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FDckMsU0FBUyxFQUNULGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFDckMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUNwQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNLLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FDNUMsU0FBMkMsRUFDM0MsYUFBc0M7UUFFdEMsaUVBQWlFO1FBQ2pFLCtDQUErQztRQUMvQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2xELElBQUksQ0FBQztnQkFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUEsMkJBQWdCLEVBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQ2pELE9BQU8sTUFBTSxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzlCLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDbEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFDLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMxRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sSUFBQSwyQ0FBb0IsRUFHOUIsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssd0JBQXdCLENBQzlCLFVBQXdCLEVBQ3hCLE9BQWtCO1FBRWxCLE1BQU0scUJBQXFCLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEUsU0FBUztZQUNULE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDO1NBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBRUosK0VBQStFO1FBQy9FLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakMsSUFBSSxPQUFPLEdBQUcsT0FBTztnQkFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksT0FBTyxHQUFHLE9BQU87Z0JBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEMsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQztRQUVILDRCQUE0QjtRQUM1QixPQUFPLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7T0FFRztJQUNLLHlCQUF5QixDQUMvQixxQkFBaUQsRUFDakQscUJBQW1DO1FBRW5DLElBQ0UsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLO1lBQzVCLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUNoRCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUMvRCxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxNQUFtQixDQUFDO1FBQ3pELE1BQU0sVUFBVSxHQUFHLElBQUEseUJBQWEsRUFBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxNQUFNLFdBQVcsR0FBRyxJQUFBLHlCQUFhLEVBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEQsTUFBTSxTQUFTLEdBQUcsSUFBQSxpQ0FBaUIsRUFDakMsaUNBQWlCLENBQUMsS0FBSyxFQUN2QixVQUE4QixFQUM5QixXQUFXLENBQ1osQ0FBQztRQUVGLE9BQU87WUFDTCxNQUFNO1lBQ04sU0FBUztZQUNULHFCQUFxQjtTQUN1QyxDQUFDO0lBQ2pFLENBQUM7SUFFTywyQkFBMkIsQ0FDakMsU0FBMkQsRUFDM0Qsa0JBQXdFLEVBQ3hFLE9BQWtCO1FBS2xCLE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQztRQUNqRSxPQUFPLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5RCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFFRCxnREFBZ0Q7WUFDaEQsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUN2QyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FDbkQsQ0FBQztZQUNGLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUN6RCxVQUFVLEVBQ1YsT0FBTyxDQUNSLENBQUM7WUFFRixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUN0QyxPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUscUJBQXFCLENBQUMsQ0FBQztZQUN2RSxDQUFDO2lCQUFNLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFLENBQUM7Z0JBQ2hELDBEQUEwRDtnQkFDMUQsTUFBTSxtQkFBbUIsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDMUQsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxjQUFjLEVBQUUsQ0FBQzt3QkFDakUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7d0JBQ2hFLE9BQU8sWUFBWSxDQUFDLGtCQUFrQixDQUFDO29CQUN6QyxDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FDYixtREFBbUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FDaEcsQ0FBQztvQkFDSixDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO2dCQUVILE1BQU0sOEJBQThCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUNsRSxtQkFBbUIsRUFDbkIsT0FBTyxDQUNSLENBQUM7Z0JBRUYsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7Z0JBQ3hDLE1BQU0sRUFBRSxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUM7Z0JBQ3ZDLE1BQU0sVUFBVSxHQUFHLElBQUEseUJBQWEsRUFBQyxJQUFBLG9CQUFRLEVBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzFELE9BQU87b0JBQ0wsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFtQjtvQkFDbEMsa0JBQWtCLEVBQUU7d0JBQ2xCLFVBQVUsRUFBRTs0QkFDVixLQUFLLEVBQUUsSUFBQSxzQkFBVSxFQUFDLEVBQUUsQ0FBQzs0QkFDckIsTUFBTSxFQUFFLGlDQUFpQixDQUFDLEtBQUssRUFBRSwwQkFBMEI7NEJBQzNELElBQUksRUFBRSxVQUE4Qjt5QkFDckM7cUJBQ3FEO29CQUN4RCxtQkFBbUIsRUFBRSw4QkFBOEI7b0JBQ25ELHFCQUFxQjtpQkFDZ0QsQ0FBQztZQUMxRSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FDYixnQ0FBZ0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLDBDQUEwQyxDQUM1RixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGlDQUFpQyxDQUN2QyxTQUFrQyxFQUNsQyxrQkFBNkMsRUFDN0MsT0FBa0I7UUFJbEIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLHFCQUFxQixDQUFDO1FBQy9DLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUVELGdEQUFnRDtRQUNoRCxtR0FBbUc7UUFDbkcsTUFBTSxVQUFVLEdBQWlCLEVBQUUsQ0FBQztRQUNwQyxLQUFLLE1BQU0sSUFBSSxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDdEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDO1lBQ3ZDLElBQUksQ0FBQyxHQUFHO2dCQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztZQUN4RSxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQ3pELFVBQVUsRUFDVixPQUFPLENBQ1IsQ0FBQztRQUVGLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDdEMsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFLENBQUM7WUFDekMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDeEMsTUFBTSxFQUFFLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQztZQUN2QyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ1IsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1lBQ25ELENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFBLHlCQUFhLEVBQUMsSUFBQSxvQkFBUSxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBRTFELDBEQUEwRDtZQUMxRCxNQUFNLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUMxRCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsSUFBSSxLQUFLLGNBQWMsRUFBRSxDQUFDO29CQUM5RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQztvQkFDN0QsT0FBTyxZQUFZLENBQUMsa0JBQWtCLENBQUM7Z0JBQ3pDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLElBQUksS0FBSyxDQUNiLG1EQUFtRCxJQUFJLENBQUMscUJBQXFCLEVBQUUsS0FBSyxDQUFDLElBQUksR0FBRyxDQUM3RixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sOEJBQThCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUNsRSxtQkFBbUIsRUFDbkIsT0FBTyxDQUNSLENBQUM7WUFFRixPQUFPO2dCQUNMLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBbUI7Z0JBQ2xDLGtCQUFrQixFQUFFO29CQUNsQixVQUFVLEVBQUU7d0JBQ1YsS0FBSyxFQUFFLElBQUEsc0JBQVUsRUFBQyxFQUFFLENBQUM7d0JBQ3JCLE1BQU0sRUFBRSxpQ0FBaUIsQ0FBQyxLQUFLLEVBQUUsMEJBQTBCO3dCQUMzRCxJQUFJLEVBQUUsVUFBOEI7cUJBQ3JDO2lCQUNxRDtnQkFDeEQsbUJBQW1CLEVBQUUsOEJBQThCO2dCQUNuRCxxQkFBcUI7YUFDZ0QsQ0FBQztRQUMxRSxDQUFDO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FDYixnQ0FBZ0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLDBDQUEwQyxDQUM1RixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBOWJELDBDQThiQyJ9
@@ -0,0 +1,58 @@
1
+ import type { Address } from 'viem';
2
+ import type { AttestedComputeRequest, AttestedComputeResponse, AttestedDecryptResponse, AttestedRevealResponse, DecryptionAttestation as ProtoDecryptionAttestation } from '../generated/es/inco/kms/lite/v1/kms_service_pb.js';
3
+ import type { XwingKeypair } from '../lite/xwing.js';
4
+ /**
5
+ * Computes a canonical key for a single attestation.
6
+ * For plaintext/reencryption+keypair, the key is handle:hex(value).
7
+ * For reencryption without a keypair (XWing ciphertexts are non-deterministic),
8
+ * falls back to handle:op-type as a structural stand-in.
9
+ */
10
+ export declare function computeAttestationKey(att: ProtoDecryptionAttestation, reencryptKeypair?: XwingKeypair): Promise<string>;
11
+ /**
12
+ * Validates that all responses in a winning bucket have the same attestation
13
+ * count and types as the quorum-elected reference (bucket[0]).
14
+ */
15
+ export declare function validateDecryptResponseStructure<T extends AttestedDecryptResponse | AttestedRevealResponse>(bucket: Array<{
16
+ response: T;
17
+ signer: Address;
18
+ }>): void;
19
+ /**
20
+ * Validates that all responses in a winning bucket have a decryption
21
+ * attestation with the same case as the quorum-elected reference (bucket[0]),
22
+ * and that the case is consistent with the request's reencryptPubKey.
23
+ */
24
+ export declare function validateComputeResponseStructure(bucket: Array<{
25
+ response: AttestedComputeResponse;
26
+ signer: Address;
27
+ }>, request?: AttestedComputeRequest): void;
28
+ /**
29
+ * Verifies decrypt/reveal response consistency using hash-bucket voting.
30
+ * Collects all N responses, buckets them by content key, and returns the
31
+ * winning bucket (the first one with >= threshold votes).
32
+ *
33
+ * This is robust against a faulty first-responding node: even if responses[0]
34
+ * disagrees, a quorum of agreeing responses will form a winning bucket.
35
+ */
36
+ export declare function verifyDecryptResponseConsistency<T extends AttestedDecryptResponse | AttestedRevealResponse>(allResults: Array<{
37
+ response: T;
38
+ signer: Address;
39
+ }>, threshold: number, reencryptKeypair?: XwingKeypair): Promise<{
40
+ reference: T;
41
+ winningResults: Array<{
42
+ response: T;
43
+ signer: Address;
44
+ }>;
45
+ }>;
46
+ /**
47
+ * Verifies compute response consistency using hash-bucket voting.
48
+ */
49
+ export declare function verifyComputeResponseConsistency(allResults: Array<{
50
+ response: AttestedComputeResponse;
51
+ signer: Address;
52
+ }>, threshold: number, request?: AttestedComputeRequest, reencryptKeypair?: XwingKeypair): Promise<{
53
+ reference: AttestedComputeResponse;
54
+ winningResults: Array<{
55
+ response: AttestedComputeResponse;
56
+ signer: Address;
57
+ }>;
58
+ }>;