@digitaldefiance/node-ecies-lib 2.1.42 → 3.0.1
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.
- package/README.md +161 -8
- package/package.json +4 -4
- package/src/builders/ecies-builder.d.ts +5 -3
- package/src/builders/ecies-builder.d.ts.map +1 -1
- package/src/builders/ecies-builder.js +10 -4
- package/src/builders/ecies-builder.js.map +1 -1
- package/src/builders/member-builder.d.ts +9 -3
- package/src/builders/member-builder.d.ts.map +1 -1
- package/src/builders/member-builder.js +29 -6
- package/src/builders/member-builder.js.map +1 -1
- package/src/i18n/ecies-i18n-factory.d.ts +20 -1
- package/src/i18n/ecies-i18n-factory.d.ts.map +1 -1
- package/src/i18n/ecies-i18n-factory.js +34 -241
- package/src/i18n/ecies-i18n-factory.js.map +1 -1
- package/src/i18n/node-ecies-i18n-setup.d.ts.map +1 -1
- package/src/i18n/node-ecies-i18n-setup.js +26 -7
- package/src/i18n/node-ecies-i18n-setup.js.map +1 -1
- package/src/i18n/translations/de.d.ts +3 -0
- package/src/i18n/translations/de.d.ts.map +1 -0
- package/src/i18n/translations/de.js +52 -0
- package/src/i18n/translations/de.js.map +1 -0
- package/src/i18n/translations/en-GB.d.ts +3 -0
- package/src/i18n/translations/en-GB.d.ts.map +1 -0
- package/src/i18n/translations/en-GB.js +56 -0
- package/src/i18n/translations/en-GB.js.map +1 -0
- package/src/i18n/translations/en-US.d.ts +6 -0
- package/src/i18n/translations/en-US.d.ts.map +1 -0
- package/src/i18n/translations/en-US.js +59 -0
- package/src/i18n/translations/en-US.js.map +1 -0
- package/src/i18n/translations/es.d.ts +3 -0
- package/src/i18n/translations/es.d.ts.map +1 -0
- package/src/i18n/translations/es.js +52 -0
- package/src/i18n/translations/es.js.map +1 -0
- package/src/i18n/translations/fr.d.ts +3 -0
- package/src/i18n/translations/fr.d.ts.map +1 -0
- package/src/i18n/translations/fr.js +52 -0
- package/src/i18n/translations/fr.js.map +1 -0
- package/src/i18n/translations/index.d.ts +7 -0
- package/src/i18n/translations/index.d.ts.map +1 -0
- package/src/i18n/translations/index.js +16 -0
- package/src/i18n/translations/index.js.map +1 -0
- package/src/i18n/translations/ja.d.ts +3 -0
- package/src/i18n/translations/ja.d.ts.map +1 -0
- package/src/i18n/translations/ja.js +52 -0
- package/src/i18n/translations/ja.js.map +1 -0
- package/src/i18n/translations/uk.d.ts +3 -0
- package/src/i18n/translations/uk.d.ts.map +1 -0
- package/src/i18n/translations/uk.js +52 -0
- package/src/i18n/translations/uk.js.map +1 -0
- package/src/i18n/translations/zh-cn.d.ts +3 -0
- package/src/i18n/translations/zh-cn.d.ts.map +1 -0
- package/src/i18n/translations/zh-cn.js +52 -0
- package/src/i18n/translations/zh-cn.js.map +1 -0
- package/src/index.d.ts +7 -1
- package/src/index.d.ts.map +1 -1
- package/src/index.js +15 -1
- package/src/index.js.map +1 -1
- package/src/interfaces/backend-member-operational.d.ts +11 -0
- package/src/interfaces/backend-member-operational.d.ts.map +1 -1
- package/src/interfaces/encrypted-chunk.d.ts +12 -0
- package/src/interfaces/encrypted-chunk.d.ts.map +1 -0
- package/src/interfaces/encrypted-chunk.js +3 -0
- package/src/interfaces/encrypted-chunk.js.map +1 -0
- package/src/interfaces/index.d.ts +4 -0
- package/src/interfaces/index.d.ts.map +1 -1
- package/src/interfaces/index.js +4 -0
- package/src/interfaces/index.js.map +1 -1
- package/src/interfaces/multi-recipient-chunk.d.ts +10 -0
- package/src/interfaces/multi-recipient-chunk.d.ts.map +1 -0
- package/src/interfaces/multi-recipient-chunk.js +3 -0
- package/src/interfaces/multi-recipient-chunk.js.map +1 -0
- package/src/interfaces/stream-config.d.ts +6 -0
- package/src/interfaces/stream-config.d.ts.map +1 -0
- package/src/interfaces/stream-config.js +8 -0
- package/src/interfaces/stream-config.js.map +1 -0
- package/src/interfaces/stream-progress.d.ts +8 -0
- package/src/interfaces/stream-progress.d.ts.map +1 -0
- package/src/interfaces/stream-progress.js +3 -0
- package/src/interfaces/stream-progress.js.map +1 -0
- package/src/member.d.ts +11 -0
- package/src/member.d.ts.map +1 -1
- package/src/member.js +23 -0
- package/src/member.js.map +1 -1
- package/src/services/aes-gcm.d.ts.map +1 -1
- package/src/services/aes-gcm.js +36 -0
- package/src/services/aes-gcm.js.map +1 -1
- package/src/services/chunk-processor.d.ts +15 -0
- package/src/services/chunk-processor.d.ts.map +1 -0
- package/src/services/chunk-processor.js +36 -0
- package/src/services/chunk-processor.js.map +1 -0
- package/src/services/ecies/crypto-core.d.ts.map +1 -1
- package/src/services/ecies/crypto-core.js +17 -2
- package/src/services/ecies/crypto-core.js.map +1 -1
- package/src/services/ecies/service.d.ts +3 -2
- package/src/services/ecies/service.d.ts.map +1 -1
- package/src/services/ecies/service.js +10 -19
- package/src/services/ecies/service.js.map +1 -1
- package/src/services/ecies/single-recipient.d.ts.map +1 -1
- package/src/services/ecies/single-recipient.js +29 -12
- package/src/services/ecies/single-recipient.js.map +1 -1
- package/src/services/encryption-stream.d.ts +31 -0
- package/src/services/encryption-stream.d.ts.map +1 -0
- package/src/services/encryption-stream.js +201 -0
- package/src/services/encryption-stream.js.map +1 -0
- package/src/services/index.d.ts +4 -0
- package/src/services/index.d.ts.map +1 -1
- package/src/services/index.js +4 -0
- package/src/services/index.js.map +1 -1
- package/src/services/multi-recipient-processor.d.ts +37 -0
- package/src/services/multi-recipient-processor.d.ts.map +1 -0
- package/src/services/multi-recipient-processor.js +223 -0
- package/src/services/multi-recipient-processor.js.map +1 -0
- package/src/services/pbkdf2.d.ts.map +1 -1
- package/src/services/pbkdf2.js.map +1 -1
- package/src/services/progress-tracker.d.ts +9 -0
- package/src/services/progress-tracker.d.ts.map +1 -0
- package/src/services/progress-tracker.js +41 -0
- package/src/services/progress-tracker.js.map +1 -0
- package/src/test-mocks/mock-backend-member.d.ts +2 -0
- package/src/test-mocks/mock-backend-member.d.ts.map +1 -1
- package/src/test-mocks/mock-backend-member.js +6 -0
- package/src/test-mocks/mock-backend-member.js.map +1 -1
package/README.md
CHANGED
|
@@ -7,12 +7,15 @@ Part of [Express Suite](https://github.com/Digital-Defiance/express-suite)
|
|
|
7
7
|
## Features
|
|
8
8
|
|
|
9
9
|
- **ECIES Encryption/Decryption**: Secure elliptic curve integrated encryption scheme using Node.js crypto primitives.
|
|
10
|
+
- **Streaming Encryption**: Memory-efficient encryption for large files (<10MB RAM for any size) ✨ NEW in v3.0
|
|
10
11
|
- **Multi-recipient Encryption**: Encrypt data for multiple recipients simultaneously with efficient handling.
|
|
12
|
+
- **Multi-recipient Streaming**: Encrypt once for up to 65,535 recipients with shared symmetric key ✨ NEW in v3.0
|
|
11
13
|
- **PBKDF2 Key Derivation**: Password-based key derivation with multiple configurable security profiles.
|
|
12
14
|
- **Digital Signatures**: Sign and verify data using elliptic curve cryptography.
|
|
13
15
|
- **Secure Memory Management**: Uses `SecureBuffer` and `SecureString` for sensitive data to ensure zeroization and protection.
|
|
14
16
|
- **Runtime Configuration Registry**: Centralized, immutable constants with runtime override capabilities for advanced customization.
|
|
15
17
|
- **Plugin-Based Internationalization (i18n)**: Full support for multi-language translations with type-safe, plugin-based architecture.
|
|
18
|
+
- **Security Hardening**: 16 comprehensive security validations across all layers ✨ NEW in v3.0
|
|
16
19
|
|
|
17
20
|
## Binary Compatibility
|
|
18
21
|
|
|
@@ -30,6 +33,35 @@ npm install @digitaldefiance/node-ecies-lib
|
|
|
30
33
|
|
|
31
34
|
## Quick Start
|
|
32
35
|
|
|
36
|
+
### v3.0 Streaming Encryption (NEW)
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
import { ECIESService, Member, MemberType, EmailString } from '@digitaldefiance/node-ecies-lib';
|
|
40
|
+
import { createReadStream } from 'fs';
|
|
41
|
+
|
|
42
|
+
const eciesService = new ECIESService();
|
|
43
|
+
const { member, mnemonic } = Member.newMember(
|
|
44
|
+
eciesService,
|
|
45
|
+
MemberType.User,
|
|
46
|
+
'Alice',
|
|
47
|
+
new EmailString('alice@example.com')
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
// Stream encrypt large file with <10MB RAM
|
|
51
|
+
const fileStream = createReadStream('large-file.bin');
|
|
52
|
+
const chunks: Buffer[] = [];
|
|
53
|
+
|
|
54
|
+
for await (const chunk of member.encryptDataStream(fileStream)) {
|
|
55
|
+
chunks.push(chunk.data);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Stream decrypt
|
|
59
|
+
const decryptedChunks: Buffer[] = [];
|
|
60
|
+
for await (const chunk of member.decryptDataStream(chunks)) {
|
|
61
|
+
decryptedChunks.push(chunk);
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
33
65
|
### v2.0 Simplified API
|
|
34
66
|
|
|
35
67
|
```typescript
|
|
@@ -60,16 +92,28 @@ console.log(decrypted.toString()); // "Hello, secure world!"
|
|
|
60
92
|
```typescript
|
|
61
93
|
import { ECIESBuilder, MemberBuilder, MemberType } from '@digitaldefiance/node-ecies-lib';
|
|
62
94
|
|
|
63
|
-
// Build service with custom configuration
|
|
64
|
-
const eciesService =
|
|
65
|
-
.
|
|
95
|
+
// Build service with custom configuration and constants
|
|
96
|
+
const eciesService = ECIESBuilder.create()
|
|
97
|
+
.withServiceConfig({ /* optional config */ })
|
|
98
|
+
.withConstants({ /* optional constants */ })
|
|
66
99
|
.build();
|
|
67
100
|
|
|
68
101
|
// Build member with fluent API
|
|
69
|
-
const { member, mnemonic } =
|
|
102
|
+
const { member, mnemonic } = MemberBuilder.create()
|
|
103
|
+
.withEciesService(eciesService)
|
|
70
104
|
.withType(MemberType.User)
|
|
71
105
|
.withName('Alice')
|
|
72
106
|
.withEmail('alice@example.com')
|
|
107
|
+
.generateMnemonic() // Optional: auto-generate mnemonic
|
|
108
|
+
.build();
|
|
109
|
+
|
|
110
|
+
// Or provide your own mnemonic
|
|
111
|
+
const { member: member2, mnemonic: mnemonic2 } = MemberBuilder.create()
|
|
112
|
+
.withEciesService(eciesService)
|
|
113
|
+
.withType(MemberType.User)
|
|
114
|
+
.withName('Bob')
|
|
115
|
+
.withEmail('bob@example.com')
|
|
116
|
+
.withMnemonic(existingMnemonic)
|
|
73
117
|
.build();
|
|
74
118
|
```
|
|
75
119
|
|
|
@@ -372,14 +416,17 @@ const singleRecipient = new EciesSingleRecipientCore(config);
|
|
|
372
416
|
```typescript
|
|
373
417
|
import { ECIESBuilder, MemberBuilder } from '@digitaldefiance/node-ecies-lib';
|
|
374
418
|
|
|
375
|
-
const service =
|
|
376
|
-
.
|
|
419
|
+
const service = ECIESBuilder.create()
|
|
420
|
+
.withServiceConfig({ /* optional config */ })
|
|
421
|
+
.withConstants({ /* optional constants */ })
|
|
377
422
|
.build();
|
|
378
423
|
|
|
379
|
-
const { member } =
|
|
424
|
+
const { member } = MemberBuilder.create()
|
|
425
|
+
.withEciesService(service)
|
|
380
426
|
.withType(MemberType.User)
|
|
381
427
|
.withName('Alice')
|
|
382
428
|
.withEmail('alice@example.com')
|
|
429
|
+
.generateMnemonic() // Auto-generate mnemonic
|
|
383
430
|
.build();
|
|
384
431
|
```
|
|
385
432
|
|
|
@@ -435,9 +482,115 @@ No performance regression in v2.0:
|
|
|
435
482
|
|
|
436
483
|
## ChangeLog
|
|
437
484
|
|
|
485
|
+
### Version 3.0.1
|
|
486
|
+
|
|
487
|
+
**Builder Improvements:**
|
|
488
|
+
- **ECIESBuilder**: Separated `serviceConfig` (IECIESConfig) from `eciesConsts` (IECIESConstants)
|
|
489
|
+
- Added `withServiceConfig()` method for runtime configuration
|
|
490
|
+
- Renamed internal property from `eciesParams` to `eciesConsts` for clarity
|
|
491
|
+
- Improved constant merging with proper defaults
|
|
492
|
+
- **MemberBuilder**: Enhanced with new methods
|
|
493
|
+
- Renamed `withECIES()` to `withEciesService()` for consistency
|
|
494
|
+
- Added `generateMnemonic()` method for auto-generation
|
|
495
|
+
- Added `withMnemonic()` method to provide custom mnemonics
|
|
496
|
+
- Added `withCreatedBy()` method for tracking member creation
|
|
497
|
+
|
|
498
|
+
**Internationalization:**
|
|
499
|
+
- Added 13 new i18n string keys (3 builder errors, 10 streaming errors)
|
|
500
|
+
- Translations provided in 8 languages: EN-US, EN-GB, FR, ES, DE, JA, UK, ZH-CN
|
|
501
|
+
- Replaced all hardcoded error strings with i18n translations
|
|
502
|
+
- Fixed circular dependency in i18n imports
|
|
503
|
+
|
|
504
|
+
**Service Improvements:**
|
|
505
|
+
- Added `mnemonicToSimpleKeyPair()` alias method for backward compatibility
|
|
506
|
+
- Clarified `ECIESService.encryptMultiple()` signature (takes single Member, not array)
|
|
507
|
+
- Enhanced error handling in multi-recipient processor
|
|
508
|
+
|
|
509
|
+
**Test Improvements:**
|
|
510
|
+
- Fixed encryption type byte expectations (Simple=33, Single=66, Multiple=99)
|
|
511
|
+
- Fixed recipient ID sizes to use correct constant (12 bytes for ObjectID)
|
|
512
|
+
- Added comprehensive binary compatibility tests for streaming/chunking
|
|
513
|
+
- Updated service coverage tests to match actual API signatures
|
|
514
|
+
- All 459 tests passing
|
|
515
|
+
|
|
516
|
+
**Binary Compatibility:**
|
|
517
|
+
- ✅ 100% compatible with browser @digitaldefiance/ecies-lib
|
|
518
|
+
- ✅ Chunk header format verified (4-byte big-endian index + 1-byte flags)
|
|
519
|
+
- ✅ Multi-recipient header format verified (big-endian byte order)
|
|
520
|
+
- ✅ Buffer/Uint8Array interoperability confirmed
|
|
521
|
+
|
|
522
|
+
### Version 3.0.0 - Streaming Encryption & Security Hardening
|
|
523
|
+
|
|
524
|
+
**Major Features**:
|
|
525
|
+
|
|
526
|
+
- ✨ **Streaming Encryption**: Memory-efficient encryption for large files (<10MB RAM for any size)
|
|
527
|
+
- 🔐 **Multi-Recipient Streaming**: Encrypt once for up to 65,535 recipients with shared symmetric key
|
|
528
|
+
- 📊 **Progress Tracking**: Real-time throughput, ETA, and completion percentage
|
|
529
|
+
- 🔒 **Security Hardening**: 16 comprehensive security validations across all layers
|
|
530
|
+
- ✅ **Binary Compatible**: 100% compatible with browser @digitaldefiance/ecies-lib v2.2.0
|
|
531
|
+
|
|
532
|
+
**New APIs**:
|
|
533
|
+
|
|
534
|
+
**Member Streaming Methods**:
|
|
535
|
+
- `member.encryptDataStream(source, options?)` - Stream encryption with progress tracking
|
|
536
|
+
- `member.decryptDataStream(source, options?)` - Stream decryption with progress tracking
|
|
537
|
+
|
|
538
|
+
**EncryptionStream Service**:
|
|
539
|
+
- `encryptStream(source, publicKey, options?)` - Single-recipient streaming
|
|
540
|
+
- `encryptStreamMultiple(source, recipients, options?)` - Multi-recipient streaming
|
|
541
|
+
- `decryptStream(source, privateKey, options?)` - Single-recipient decryption
|
|
542
|
+
- `decryptStreamMultiple(source, recipientId, privateKey, options?)` - Multi-recipient decryption
|
|
543
|
+
|
|
544
|
+
**Security Enhancements (16 validations)**:
|
|
545
|
+
|
|
546
|
+
**Base ECIES Layer (8 fixes)**:
|
|
547
|
+
- Public key all-zeros validation
|
|
548
|
+
- Private key all-zeros validation
|
|
549
|
+
- Shared secret all-zeros validation
|
|
550
|
+
- Message size validation (max 2GB)
|
|
551
|
+
- Encrypted size bounds checking
|
|
552
|
+
- Minimum encrypted data size validation
|
|
553
|
+
- Component extraction validation
|
|
554
|
+
- Decrypted data validation
|
|
555
|
+
|
|
556
|
+
**AES-GCM Layer (5 fixes)**:
|
|
557
|
+
- Key length validation (16/24/32 bytes only)
|
|
558
|
+
- IV length validation (16 bytes)
|
|
559
|
+
- Null/undefined data rejection
|
|
560
|
+
- Data size validation (max 2GB)
|
|
561
|
+
- Comprehensive decrypt input validation
|
|
562
|
+
|
|
563
|
+
**Multi-Recipient Layer (3 fixes)**:
|
|
564
|
+
- Chunk index bounds checking (uint32 range)
|
|
565
|
+
- Data size validation (max 2GB)
|
|
566
|
+
- Safe accumulation with overflow detection
|
|
567
|
+
|
|
568
|
+
**New Services**:
|
|
569
|
+
- `EncryptionStream` - High-level streaming API
|
|
570
|
+
- `ChunkProcessor` - Single-recipient chunk processing
|
|
571
|
+
- `MultiRecipientProcessor` - Multi-recipient chunk processing
|
|
572
|
+
- `ProgressTracker` - Real-time progress tracking
|
|
573
|
+
|
|
574
|
+
**New Interfaces**:
|
|
575
|
+
- `IEncryptedChunk` - Encrypted chunk with metadata
|
|
576
|
+
- `IMultiRecipientChunk` - Multi-recipient chunk format
|
|
577
|
+
- `IStreamProgress` - Progress tracking information
|
|
578
|
+
- `IStreamConfig` - Stream configuration options
|
|
579
|
+
|
|
580
|
+
**Performance**:
|
|
581
|
+
- 99% memory reduction (1GB file: 1GB RAM → <10MB RAM)
|
|
582
|
+
- < 0.1% overhead from security validations
|
|
583
|
+
- Single-recipient: ~50-100 MB/s throughput
|
|
584
|
+
- Multi-recipient: ~40-80 MB/s throughput
|
|
585
|
+
|
|
586
|
+
**Binary Compatibility**:
|
|
587
|
+
- ✅ 100% compatible with @digitaldefiance/ecies-lib v2.2.0
|
|
588
|
+
- ✅ Cross-platform encrypt/decrypt verified
|
|
589
|
+
- ✅ All existing encryption formats unchanged
|
|
590
|
+
|
|
438
591
|
### Version 2.1.42
|
|
439
592
|
|
|
440
|
-
-
|
|
593
|
+
- Upgrade ecies
|
|
441
594
|
|
|
442
595
|
### Version 2.1.40
|
|
443
596
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@digitaldefiance/node-ecies-lib",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"description": "Digital Defiance Node ECIES Library",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"types": "src/index.d.ts",
|
|
@@ -45,8 +45,8 @@
|
|
|
45
45
|
"license": "MIT",
|
|
46
46
|
"packageManager": "yarn@4.10.3",
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@digitaldefiance/ecies-lib": "
|
|
49
|
-
"@digitaldefiance/i18n-lib": "
|
|
48
|
+
"@digitaldefiance/ecies-lib": "3.0.1",
|
|
49
|
+
"@digitaldefiance/i18n-lib": "3.6.0",
|
|
50
50
|
"@ethereumjs/wallet": "^10.0.0",
|
|
51
51
|
"@noble/curves": "^2.0.1",
|
|
52
52
|
"@noble/hashes": "^2.0.1",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"ts-brand": "^0.2.0"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
|
-
"@digitaldefiance/express-suite-test-utils": "1.0.
|
|
59
|
+
"@digitaldefiance/express-suite-test-utils": "1.0.9"
|
|
60
60
|
},
|
|
61
61
|
"type": "commonjs"
|
|
62
62
|
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { ECIESService } from '../services/ecies';
|
|
2
|
-
import { IECIESConstants } from '@digitaldefiance/ecies-lib';
|
|
2
|
+
import { IECIESConstants, IECIESConfig } from '@digitaldefiance/ecies-lib';
|
|
3
3
|
export declare class ECIESBuilder {
|
|
4
|
-
private
|
|
4
|
+
private serviceConfig;
|
|
5
|
+
private eciesConsts;
|
|
5
6
|
static create(): ECIESBuilder;
|
|
6
|
-
|
|
7
|
+
withServiceConfig(config: Partial<IECIESConfig>): this;
|
|
8
|
+
withConstants(constants: Partial<IECIESConstants>): this;
|
|
7
9
|
build(): ECIESService;
|
|
8
10
|
}
|
|
9
11
|
//# sourceMappingURL=ecies-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ecies-builder.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-node-ecies-lib/src/builders/ecies-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"ecies-builder.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-node-ecies-lib/src/builders/ecies-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG3E,qBAAa,YAAY;IACvB,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,WAAW,CAAgC;IAEnD,MAAM,CAAC,MAAM,IAAI,YAAY;IAI7B,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;IAKtD,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IAKxD,KAAK,IAAI,YAAY;CAItB"}
|
|
@@ -4,16 +4,22 @@ exports.ECIESBuilder = void 0;
|
|
|
4
4
|
const ecies_1 = require("../services/ecies");
|
|
5
5
|
const constants_1 = require("../constants");
|
|
6
6
|
class ECIESBuilder {
|
|
7
|
-
|
|
7
|
+
serviceConfig = {};
|
|
8
|
+
eciesConsts = {};
|
|
8
9
|
static create() {
|
|
9
10
|
return new ECIESBuilder();
|
|
10
11
|
}
|
|
11
|
-
|
|
12
|
-
this.
|
|
12
|
+
withServiceConfig(config) {
|
|
13
|
+
this.serviceConfig = { ...this.serviceConfig, ...config };
|
|
14
|
+
return this;
|
|
15
|
+
}
|
|
16
|
+
withConstants(constants) {
|
|
17
|
+
this.eciesConsts = { ...this.eciesConsts, ...constants };
|
|
13
18
|
return this;
|
|
14
19
|
}
|
|
15
20
|
build() {
|
|
16
|
-
|
|
21
|
+
const finalConstants = { ...constants_1.Constants.ECIES, ...this.eciesConsts };
|
|
22
|
+
return new ecies_1.ECIESService(this.serviceConfig, finalConstants);
|
|
17
23
|
}
|
|
18
24
|
}
|
|
19
25
|
exports.ECIESBuilder = ECIESBuilder;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ecies-builder.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-node-ecies-lib/src/builders/ecies-builder.ts"],"names":[],"mappings":";;;AAAA,6CAAiD;AAEjD,4CAAyC;AAEzC,MAAa,YAAY;IACf,
|
|
1
|
+
{"version":3,"file":"ecies-builder.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-node-ecies-lib/src/builders/ecies-builder.ts"],"names":[],"mappings":";;;AAAA,6CAAiD;AAEjD,4CAAyC;AAEzC,MAAa,YAAY;IACf,aAAa,GAA0B,EAAE,CAAC;IAC1C,WAAW,GAA6B,EAAE,CAAC;IAEnD,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,iBAAiB,CAAC,MAA6B;QAC7C,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,MAAM,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa,CAAC,SAAmC;QAC/C,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,SAAS,EAAE,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,MAAM,cAAc,GAAG,EAAE,GAAG,qBAAS,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACnE,OAAO,IAAI,oBAAY,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAC9D,CAAC;CACF;AAtBD,oCAsBC"}
|
|
@@ -1,16 +1,22 @@
|
|
|
1
|
-
import { MemberType, EmailString } from '@digitaldefiance/ecies-lib';
|
|
1
|
+
import { MemberType, EmailString, SecureString } from '@digitaldefiance/ecies-lib';
|
|
2
2
|
import { ECIESService } from '../services/ecies';
|
|
3
3
|
import { IBackendMemberWithMnemonic } from '../interfaces/member-with-mnemonic';
|
|
4
|
+
import { ObjectId } from 'bson';
|
|
4
5
|
export declare class MemberBuilder {
|
|
6
|
+
private eciesService?;
|
|
5
7
|
private type?;
|
|
6
8
|
private name?;
|
|
7
9
|
private email?;
|
|
8
|
-
private
|
|
10
|
+
private mnemonic?;
|
|
11
|
+
private createdBy?;
|
|
9
12
|
static create(): MemberBuilder;
|
|
13
|
+
withEciesService(service: ECIESService): this;
|
|
10
14
|
withType(type: MemberType): this;
|
|
11
15
|
withName(name: string): this;
|
|
12
16
|
withEmail(email: string | EmailString): this;
|
|
13
|
-
|
|
17
|
+
withMnemonic(mnemonic: SecureString): this;
|
|
18
|
+
withCreatedBy(creatorId: ObjectId): this;
|
|
19
|
+
generateMnemonic(): this;
|
|
14
20
|
build(): IBackendMemberWithMnemonic;
|
|
15
21
|
}
|
|
16
22
|
//# sourceMappingURL=member-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"member-builder.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-node-ecies-lib/src/builders/member-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"member-builder.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-node-ecies-lib/src/builders/member-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAIhC,qBAAa,aAAa;IACxB,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,IAAI,CAAC,CAAa;IAC1B,OAAO,CAAC,IAAI,CAAC,CAAS;IACtB,OAAO,CAAC,KAAK,CAAC,CAAc;IAC5B,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,SAAS,CAAC,CAAW;IAE7B,MAAM,CAAC,MAAM,IAAI,aAAa;IAI9B,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAK7C,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAKhC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK5B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAK5C,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAK1C,aAAa,CAAC,SAAS,EAAE,QAAQ,GAAG,IAAI;IAKxC,gBAAgB,IAAI,IAAI;IASxB,KAAK,IAAI,0BAA0B;CAkBpC"}
|
|
@@ -3,15 +3,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.MemberBuilder = void 0;
|
|
4
4
|
const member_1 = require("../member");
|
|
5
5
|
const ecies_lib_1 = require("@digitaldefiance/ecies-lib");
|
|
6
|
-
const
|
|
6
|
+
const node_ecies_i18n_setup_1 = require("../i18n/node-ecies-i18n-setup");
|
|
7
|
+
const ecies_i18n_factory_1 = require("../i18n/ecies-i18n-factory");
|
|
7
8
|
class MemberBuilder {
|
|
9
|
+
eciesService;
|
|
8
10
|
type;
|
|
9
11
|
name;
|
|
10
12
|
email;
|
|
11
|
-
|
|
13
|
+
mnemonic;
|
|
14
|
+
createdBy;
|
|
12
15
|
static create() {
|
|
13
16
|
return new MemberBuilder();
|
|
14
17
|
}
|
|
18
|
+
withEciesService(service) {
|
|
19
|
+
this.eciesService = service;
|
|
20
|
+
return this;
|
|
21
|
+
}
|
|
15
22
|
withType(type) {
|
|
16
23
|
this.type = type;
|
|
17
24
|
return this;
|
|
@@ -24,15 +31,31 @@ class MemberBuilder {
|
|
|
24
31
|
this.email = typeof email === 'string' ? new ecies_lib_1.EmailString(email) : email;
|
|
25
32
|
return this;
|
|
26
33
|
}
|
|
27
|
-
|
|
28
|
-
this.
|
|
34
|
+
withMnemonic(mnemonic) {
|
|
35
|
+
this.mnemonic = mnemonic;
|
|
36
|
+
return this;
|
|
37
|
+
}
|
|
38
|
+
withCreatedBy(creatorId) {
|
|
39
|
+
this.createdBy = creatorId;
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
generateMnemonic() {
|
|
43
|
+
if (!this.eciesService) {
|
|
44
|
+
const engine = (0, node_ecies_i18n_setup_1.getNodeEciesI18nEngine)();
|
|
45
|
+
throw new Error(engine.translate(ecies_i18n_factory_1.NodeEciesComponentId, ecies_i18n_factory_1.NodeEciesStringKey.Error_Builder_ECIESServiceMustBeSetBeforeGeneratingMnemonic));
|
|
46
|
+
}
|
|
47
|
+
this.mnemonic = this.eciesService.generateNewMnemonic();
|
|
29
48
|
return this;
|
|
30
49
|
}
|
|
31
50
|
build() {
|
|
51
|
+
const engine = (0, node_ecies_i18n_setup_1.getNodeEciesI18nEngine)();
|
|
52
|
+
if (!this.eciesService) {
|
|
53
|
+
throw new Error(engine.translate(ecies_i18n_factory_1.NodeEciesComponentId, ecies_i18n_factory_1.NodeEciesStringKey.Error_Builder_ECIESServiceIsRequired));
|
|
54
|
+
}
|
|
32
55
|
if (!this.type || !this.name || !this.email) {
|
|
33
|
-
throw new Error(
|
|
56
|
+
throw new Error(engine.translate(ecies_i18n_factory_1.NodeEciesComponentId, ecies_i18n_factory_1.NodeEciesStringKey.Error_Builder_TypeNameAndEmailAreRequired));
|
|
34
57
|
}
|
|
35
|
-
return member_1.Member.newMember(this.
|
|
58
|
+
return member_1.Member.newMember(this.eciesService, this.type, this.name, this.email, this.mnemonic, this.createdBy);
|
|
36
59
|
}
|
|
37
60
|
}
|
|
38
61
|
exports.MemberBuilder = MemberBuilder;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"member-builder.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-node-ecies-lib/src/builders/member-builder.ts"],"names":[],"mappings":";;;AAAA,sCAAmC;AACnC,
|
|
1
|
+
{"version":3,"file":"member-builder.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-node-ecies-lib/src/builders/member-builder.ts"],"names":[],"mappings":";;;AAAA,sCAAmC;AACnC,0DAAmF;AAInF,yEAAuE;AACvE,mEAAsF;AAEtF,MAAa,aAAa;IAChB,YAAY,CAAgB;IAC5B,IAAI,CAAc;IAClB,IAAI,CAAU;IACd,KAAK,CAAe;IACpB,QAAQ,CAAgB;IACxB,SAAS,CAAY;IAE7B,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,gBAAgB,CAAC,OAAqB;QACpC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,IAAgB;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,IAAY;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,KAA2B;QACnC,IAAI,CAAC,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,uBAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACxE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY,CAAC,QAAsB;QACjC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa,CAAC,SAAmB;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,IAAA,8CAAsB,GAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,yCAAoB,EAAE,uCAAkB,CAAC,2DAA2D,CAAC,CAAC,CAAC;QAC1I,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,mBAAmB,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,MAAM,MAAM,GAAG,IAAA,8CAAsB,GAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,yCAAoB,EAAE,uCAAkB,CAAC,oCAAoC,CAAC,CAAC,CAAC;QACnH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,yCAAoB,EAAE,uCAAkB,CAAC,yCAAyC,CAAC,CAAC,CAAC;QACxH,CAAC;QAED,OAAO,eAAM,CAAC,SAAS,CACrB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,SAAS,CACf,CAAC;IACJ,CAAC;CACF;AArED,sCAqEC"}
|
|
@@ -27,8 +27,27 @@ declare enum NodeEciesStringKey {
|
|
|
27
27
|
Error_LengthExceedsMaximumSafeInteger = "error_lengthExceedsMaximumSafeInteger",
|
|
28
28
|
Error_BufferIsTooShortForDeclaredDataLength = "error_bufferIsTooShortForDeclaredDataLength",
|
|
29
29
|
Error_InvalidChecksumConstants = "error_invalidChecksumConstants",
|
|
30
|
+
Error_InvalidAESKeyLength = "error_invalidAESKeyLength",
|
|
31
|
+
Error_CannotEncryptEmptyData = "error_cannotEncryptEmptyData",
|
|
32
|
+
Error_CannotDecryptEmptyData = "error_cannotDecryptEmptyData",
|
|
33
|
+
Error_InvalidIVLength = "error_invalidIVLength",
|
|
34
|
+
Error_MessageTooLarge = "error_messageTooLarge",
|
|
35
|
+
Error_EncryptedSizeExceedsExpected = "error_encryptedSizeExceedsExpected",
|
|
30
36
|
Error_Pbkdf2_InvalidSaltLength = "error_pbkdf2_invalid_salt_length",
|
|
31
|
-
Error_Pbkdf2_InvalidHashLength = "error_pbkdf2_invalid_hash_length"
|
|
37
|
+
Error_Pbkdf2_InvalidHashLength = "error_pbkdf2_invalid_hash_length",
|
|
38
|
+
Error_Builder_ECIESServiceMustBeSetBeforeGeneratingMnemonic = "error_builder_ecies_service_must_be_set_before_generating_mnemonic",
|
|
39
|
+
Error_Builder_ECIESServiceIsRequired = "error_builder_ecies_service_is_required",
|
|
40
|
+
Error_Builder_TypeNameAndEmailAreRequired = "error_builder_type_name_and_email_are_required",
|
|
41
|
+
Error_Stream_InvalidPublicKeyLength = "error_stream_invalid_public_key_length",
|
|
42
|
+
Error_Stream_EncryptionCancelled = "error_stream_encryption_cancelled",
|
|
43
|
+
Error_Stream_BufferOverflow = "error_stream_buffer_overflow",
|
|
44
|
+
Error_Stream_AtLeastOneRecipientRequired = "error_stream_at_least_one_recipient_required",
|
|
45
|
+
Error_Stream_MaxRecipientsExceeded = "error_stream_max_recipients_exceeded",
|
|
46
|
+
Error_Stream_InvalidRecipientPublicKeyLength = "error_stream_invalid_recipient_public_key_length",
|
|
47
|
+
Error_Stream_InvalidRecipientIdLength = "error_stream_invalid_recipient_id_length",
|
|
48
|
+
Error_Stream_InvalidPrivateKeyLength = "error_stream_invalid_private_key_length",
|
|
49
|
+
Error_Stream_DecryptionCancelled = "error_stream_decryption_cancelled",
|
|
50
|
+
Error_Stream_ChunkSequenceError = "error_stream_chunk_sequence_error"
|
|
32
51
|
}
|
|
33
52
|
export declare const NodeEciesComponentId = "node-ecies";
|
|
34
53
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ecies-i18n-factory.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-node-ecies-lib/src/i18n/ecies-i18n-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EAErB,gBAAgB,EAEhB,gBAAgB,EAChB,cAAc,EACd,YAAY,EACb,MAAM,2BAA2B,CAAC;AAGnC;;GAEG;AACH,aAAK,kBAAkB;IACrB,qCAAqC,8CAA8C;IAGnF,8BAA8B,qCAAqC;IACnE,wCAAwC,gDAAgD;IACxF,qBAAqB,2BAA2B;IAChD,gCAAgC,uCAAuC;IACvE,4BAA4B,kCAAkC;IAC9D,8BAA8B,qCAAqC;IACnE,kCAAkC,yCAAyC;IAC3E,mCAAmC,2CAA2C;IAC9E,yBAAyB,+BAA+B;IACxD,mCAAmC,0CAA0C;IAC7E,sBAAsB,2BAA2B;IACjD,4BAA4B,iCAAiC;IAC7D,4CAA4C,iDAAiD;IAC7F,+CAA+C,oDAAoD;IACnG,iCAAiC,sCAAsC;IACvE,sCAAsC,2CAA2C;IACjF,0BAA0B,+BAA+B;IACzD,0BAA0B,+BAA+B;IACzD,sBAAsB,2BAA2B;IACjD,2CAA2C,gDAAgD;IAC3F,qCAAqC,0CAA0C;IAC/E,2CAA2C,gDAAgD;IAC3F,8BAA8B,mCAAmC;IAGjE,8BAA8B,qCAAqC;IACnE,8BAA8B,qCAAqC;
|
|
1
|
+
{"version":3,"file":"ecies-i18n-factory.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-node-ecies-lib/src/i18n/ecies-i18n-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EAErB,gBAAgB,EAEhB,gBAAgB,EAChB,cAAc,EACd,YAAY,EACb,MAAM,2BAA2B,CAAC;AAGnC;;GAEG;AACH,aAAK,kBAAkB;IACrB,qCAAqC,8CAA8C;IAGnF,8BAA8B,qCAAqC;IACnE,wCAAwC,gDAAgD;IACxF,qBAAqB,2BAA2B;IAChD,gCAAgC,uCAAuC;IACvE,4BAA4B,kCAAkC;IAC9D,8BAA8B,qCAAqC;IACnE,kCAAkC,yCAAyC;IAC3E,mCAAmC,2CAA2C;IAC9E,yBAAyB,+BAA+B;IACxD,mCAAmC,0CAA0C;IAC7E,sBAAsB,2BAA2B;IACjD,4BAA4B,iCAAiC;IAC7D,4CAA4C,iDAAiD;IAC7F,+CAA+C,oDAAoD;IACnG,iCAAiC,sCAAsC;IACvE,sCAAsC,2CAA2C;IACjF,0BAA0B,+BAA+B;IACzD,0BAA0B,+BAA+B;IACzD,sBAAsB,2BAA2B;IACjD,2CAA2C,gDAAgD;IAC3F,qCAAqC,0CAA0C;IAC/E,2CAA2C,gDAAgD;IAC3F,8BAA8B,mCAAmC;IAGjE,yBAAyB,8BAA8B;IACvD,4BAA4B,iCAAiC;IAC7D,4BAA4B,iCAAiC;IAC7D,qBAAqB,0BAA0B;IAC/C,qBAAqB,0BAA0B;IAC/C,kCAAkC,uCAAuC;IAGzE,8BAA8B,qCAAqC;IACnE,8BAA8B,qCAAqC;IAGnE,2DAA2D,uEAAuE;IAClI,oCAAoC,4CAA4C;IAChF,yCAAyC,mDAAmD;IAG5F,mCAAmC,2CAA2C;IAC9E,gCAAgC,sCAAsC;IACtE,2BAA2B,iCAAiC;IAC5D,wCAAwC,iDAAiD;IACzF,kCAAkC,yCAAyC;IAC3E,4CAA4C,qDAAqD;IACjG,qCAAqC,6CAA6C;IAClF,oCAAoC,4CAA4C;IAChF,gCAAgC,sCAAsC;IACtE,+BAA+B,sCAAsC;CACtE;AACD,eAAO,MAAM,oBAAoB,eAAe,CAAC;AAOjD;;GAEG;AACH,wBAAgB,kCAAkC,IAAI,mBAAmB,CAAC,kBAAkB,CAAC,CAO5F;AAED,wBAAgB,oCAAoC,IAAI,qBAAqB,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAgBxG;AAOD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAkBrH;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,kBAAkB,EACvB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAC3C,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,MAAM,CAKR;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,GAAG,CAEvE;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
|