@bitgo/sdk-core 38.15.0 → 38.17.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.
- package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +3 -1
- package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +1 -1
- package/dist/src/account-lib/util/ed25519KeyDeriver.js +4 -2
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +7 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
- package/dist/src/bitgo/defi/defiVault.d.ts +7 -7
- package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -1
- package/dist/src/bitgo/defi/defiVault.js +10 -10
- package/dist/src/bitgo/defi/iDefiVault.d.ts +7 -2
- package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -1
- package/dist/src/bitgo/defi/iDefiVault.js +1 -1
- package/dist/src/bitgo/environments.js +3 -3
- package/dist/src/bitgo/keychain/iKeychains.d.ts +4 -0
- package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/iKeychains.js +1 -1
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +15 -15
- package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts +24 -81
- package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -1
- package/dist/src/bitgo/safe/derivableEd25519Pub.js +117 -147
- package/dist/src/bitgo/safe/iSafe.d.ts +5 -2
- package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -1
- package/dist/src/bitgo/safe/iSafe.js +1 -1
- package/dist/src/bitgo/safe/safe.d.ts +14 -7
- package/dist/src/bitgo/safe/safe.d.ts.map +1 -1
- package/dist/src/bitgo/safe/safe.js +108 -30
- package/dist/src/bitgo/safe/safeDerivation.d.ts +13 -0
- package/dist/src/bitgo/safe/safeDerivation.d.ts.map +1 -1
- package/dist/src/bitgo/safe/safeDerivation.js +30 -1
- package/dist/src/bitgo/safe/safes.d.ts.map +1 -1
- package/dist/src/bitgo/safe/safes.js +10 -8
- package/dist/src/bitgo/staking/iStakingWallet.d.ts +13 -5
- package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/iStakingWallet.js +1 -1
- package/dist/src/bitgo/staking/stakingWallet.d.ts +2 -2
- package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/stakingWallet.js +14 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +4 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +18 -6
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +9 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +24 -3
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts +50 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.js +154 -4
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +3 -0
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +1 -1
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/recipientUtils.js +9 -1
- package/dist/src/bitgo/wallet/BuildParams.d.ts +8 -0
- package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/BuildParams.js +6 -1
- package/dist/src/bitgo/wallet/iWallet.d.ts +5 -1
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/test/unit/bitgo/defi/defiVault.js +102 -1
- package/dist/test/unit/bitgo/keychain/keychains.js +40 -29
- package/dist/test/unit/bitgo/safe/derivableEd25519Pub.js +72 -76
- package/dist/test/unit/bitgo/safe/fixtures/derivableEd25519Pub.json +50 -175
- package/dist/test/unit/bitgo/safe/safe.js +122 -23
- package/dist/test/unit/bitgo/safe/safeDerivation.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/safeDerivation.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/safeDerivation.js +71 -0
- package/dist/test/unit/bitgo/safe/safes.js +23 -11
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +29 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
|
@@ -36,15 +36,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
const sinon = __importStar(require("sinon"));
|
|
37
37
|
require("should");
|
|
38
38
|
const src_1 = require("../../../../src");
|
|
39
|
-
/**
|
|
40
|
-
* Slot-④ root keys are generated as XLM keychains, so `create()` yields a 56-char StrKey pub.
|
|
41
|
-
* Taken from the cross-repo fixture pinned in WCN-2485.
|
|
42
|
-
*/
|
|
39
|
+
/** Slot-④ roots are generated as XLM keychains, then persisted as raw pub||chain-code base32. */
|
|
43
40
|
const STRKEY_PUB = 'GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH';
|
|
44
|
-
/** Marks the key as a safe root; combined with the pub's shape this identifies slot ④. */
|
|
45
41
|
const SAFE_ID = 'safe-1';
|
|
46
|
-
/** An xpub, as the secp256k1Multisig (slot ①) root coin generates. Already has a chain code. */
|
|
47
42
|
const XPUB = 'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8';
|
|
43
|
+
const BASE32_ROOT = /^[A-Z2-7]{103}$/;
|
|
48
44
|
describe('Keychains.createBackup', function () {
|
|
49
45
|
let keychains;
|
|
50
46
|
let send;
|
|
@@ -87,27 +83,25 @@ describe('Keychains.createBackup', function () {
|
|
|
87
83
|
});
|
|
88
84
|
});
|
|
89
85
|
describe('safe ed25519Multisig root (slot ④)', function () {
|
|
90
|
-
it('posts
|
|
86
|
+
it('posts raw public key plus chain code as unpadded base32', async function () {
|
|
91
87
|
await keychains.createBackup({ passphrase: 'pw', safeId: SAFE_ID });
|
|
92
88
|
const pub = sentBody().pub;
|
|
93
|
-
pub.
|
|
94
|
-
(0, src_1.decodeDerivableEd25519Pub)(pub)
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
const { chainCode } = (0, src_1.decodeDerivableEd25519Pub)(sentBody().pub);
|
|
101
|
-
chainCode.should.match(/^[A-Z2-7]{52}$/);
|
|
89
|
+
BASE32_ROOT.test(pub).should.equal(true);
|
|
90
|
+
(0, src_1.decodeDerivableEd25519Pub)(pub)
|
|
91
|
+
.pub.toString('hex')
|
|
92
|
+
.should.match(/^[0-9a-f]{64}$/);
|
|
93
|
+
(0, src_1.decodeDerivableEd25519Pub)(pub)
|
|
94
|
+
.chainCode.toString('hex')
|
|
95
|
+
.should.match(/^[0-9a-f]{64}$/);
|
|
102
96
|
});
|
|
103
97
|
it('mints a different chain code for each backup key', async function () {
|
|
104
|
-
await keychains.createBackup({ passphrase: 'pw', safeId: SAFE_ID });
|
|
105
98
|
await keychains.createBackup({ passphrase: 'pw', safeId: SAFE_ID });
|
|
106
99
|
const first = (0, src_1.decodeDerivableEd25519Pub)(send.firstCall.args[0].pub).chainCode;
|
|
100
|
+
await keychains.createBackup({ passphrase: 'pw', safeId: SAFE_ID });
|
|
107
101
|
const second = (0, src_1.decodeDerivableEd25519Pub)(send.secondCall.args[0].pub).chainCode;
|
|
108
|
-
first.should.
|
|
102
|
+
first.equals(second).should.equal(false);
|
|
109
103
|
});
|
|
110
|
-
it('sends no chainCode field
|
|
104
|
+
it('sends no separate chainCode field', async function () {
|
|
111
105
|
await keychains.createBackup({ passphrase: 'pw', safeId: SAFE_ID });
|
|
112
106
|
sentBody().should.not.have.property('chainCode');
|
|
113
107
|
});
|
|
@@ -124,8 +118,7 @@ describe('Keychains.createBackup', function () {
|
|
|
124
118
|
body.pub.should.equal(STRKEY_PUB);
|
|
125
119
|
body.pub.length.should.equal(56);
|
|
126
120
|
});
|
|
127
|
-
it('does not compose a safe secp256k1Multisig root
|
|
128
|
-
// An xpub already carries its own chain code; composing onto it would corrupt the pub.
|
|
121
|
+
it('does not compose a safe secp256k1Multisig root', async function () {
|
|
129
122
|
const btcKeychains = buildKeychains(XPUB);
|
|
130
123
|
await btcKeychains.createBackup({ passphrase: 'pw', safeId: SAFE_ID });
|
|
131
124
|
sentBody().pub.should.equal(XPUB);
|
|
@@ -137,13 +130,6 @@ describe('Keychains.createBackup', function () {
|
|
|
137
130
|
body.source.should.equal('backup');
|
|
138
131
|
body.encryptedPrv.should.equal('encrypted-prv');
|
|
139
132
|
});
|
|
140
|
-
it('leaves a TSS backup key untouched', async function () {
|
|
141
|
-
// No local keypair is generated on the TSS path, so there is no pub to inspect or compose.
|
|
142
|
-
await keychains.createBackup({ prv: 'tss-prv', commonKeychain: 'common-keychain', safeId: SAFE_ID });
|
|
143
|
-
const body = sentBody();
|
|
144
|
-
body.commonKeychain.should.equal('common-keychain');
|
|
145
|
-
(body.pub === undefined).should.be.true();
|
|
146
|
-
});
|
|
147
133
|
it('leaves a KRS-provider backup key untouched', async function () {
|
|
148
134
|
await keychains.createBackup({ provider: 'krs-provider', safeId: SAFE_ID });
|
|
149
135
|
const body = sentBody();
|
|
@@ -151,5 +137,30 @@ describe('Keychains.createBackup', function () {
|
|
|
151
137
|
body.provider.should.equal('krs-provider');
|
|
152
138
|
});
|
|
153
139
|
});
|
|
140
|
+
describe('password rotation encryption session', function () {
|
|
141
|
+
it('uses the supplied session for the new encrypted private key', async function () {
|
|
142
|
+
mockBitGo.decrypt = sinon.stub().resolves('decrypted-prv');
|
|
143
|
+
const sessionEncrypt = sinon.stub().resolves('session-encrypted');
|
|
144
|
+
const session = {
|
|
145
|
+
encrypt: sessionEncrypt,
|
|
146
|
+
decrypt: sinon.stub().resolves('decrypted-prv'),
|
|
147
|
+
destroy: sinon.stub(),
|
|
148
|
+
};
|
|
149
|
+
const updatedKeychain = await keychains.updateSingleKeychainPassword({
|
|
150
|
+
keychain: {
|
|
151
|
+
id: 'key-id',
|
|
152
|
+
encryptedPrv: 'legacy-encrypted-prv',
|
|
153
|
+
type: 'independent',
|
|
154
|
+
},
|
|
155
|
+
oldPassword: 'old-password',
|
|
156
|
+
newPassword: 'new-password',
|
|
157
|
+
encryptionVersion: 2,
|
|
158
|
+
encryptionSession: session,
|
|
159
|
+
});
|
|
160
|
+
sessionEncrypt.calledOnceWithExactly('decrypted-prv').should.equal(true);
|
|
161
|
+
mockBitGo.encrypt.called.should.equal(false);
|
|
162
|
+
updatedKeychain.encryptedPrv.should.equal('session-encrypted');
|
|
163
|
+
});
|
|
164
|
+
});
|
|
154
165
|
});
|
|
155
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL2tleWNoYWluL2tleWNoYWlucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUErQjtBQUMvQixrQkFBZ0I7QUFDaEIseUNBQXVFO0FBRXZFOzs7R0FHRztBQUNILE1BQU0sVUFBVSxHQUFHLDBEQUEwRCxDQUFDO0FBRTlFLDBGQUEwRjtBQUMxRixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUM7QUFFekIsZ0dBQWdHO0FBQ2hHLE1BQU0sSUFBSSxHQUNSLGlIQUFpSCxDQUFDO0FBRXBILFFBQVEsQ0FBQyx3QkFBd0IsRUFBRTtJQUNqQyxJQUFJLFNBQW9CLENBQUM7SUFDekIsSUFBSSxJQUFxQixDQUFDO0lBQzFCLElBQUksU0FBYyxDQUFDO0lBRW5CLDBFQUEwRTtJQUMxRSxTQUFTLFFBQVE7UUFDZixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxTQUFTLGNBQWMsQ0FBQyxHQUFHLEdBQUcsVUFBVTtRQUN0QyxNQUFNLFlBQVksR0FBRztZQUNuQixHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ25ELGVBQWUsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsQ0FBQztTQUNqRSxDQUFDO1FBQ0YsT0FBTyxJQUFJLGVBQVMsQ0FBQyxTQUFTLEVBQUUsWUFBbUIsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxVQUFVLENBQUM7UUFDVCxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9B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QUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGNBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDckQsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNENBQTRDLEVBQUUsS0FBSztZQUNwRCxNQUFNLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBRTVFLE1BQU0sSUFBSSxHQUFHLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxRQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBLZXljaGFpbnMsIGRlY29kZURlcml2YWJsZUVkMjU1MTlQdWIgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuXG4vKipcbiAqIFNsb3Qt4pGjIHJvb3Qga2V5cyBhcmUgZ2VuZXJhdGVkIGFzIFhMTSBrZXljaGFpbnMsIHNvIGBjcmVhdGUoKWAgeWllbGRzIGEgNTYtY2hhciBTdHJLZXkgcHViLlxuICogVGFrZW4gZnJvbSB0aGUgY3Jvc3MtcmVwbyBmaXh0dXJlIHBpbm5lZCBpbiBXQ04tMjQ4NS5cbiAqL1xuY29uc3QgU1RSS0VZX1BVQiA9ICdHQTVXVUo1NFoyM0tJTExDVU9VTkFLVFBCVlpXS01RVk80TzZFUTVHSExBRVJJTUxMSE5DU0tZSCc7XG5cbi8qKiBNYXJrcyB0aGUga2V5IGFzIGEgc2FmZSByb290OyBjb21iaW5lZCB3aXRoIHRoZSBwdWIncyBzaGFwZSB0aGlzIGlkZW50aWZpZXMgc2xvdCDikaMuICovXG5jb25zdCBTQUZFX0lEID0gJ3NhZmUtMSc7XG5cbi8qKiBBbiB4cHViLCBhcyB0aGUgc2VjcDI1NmsxTXVsdGlzaWcgKHNsb3Qg4pGgKSByb290IGNvaW4gZ2VuZXJhdGVzLiBBbHJlYWR5IGhhcyBhIGNoYWluIGNvZGUuICovXG5jb25zdCBYUFVCID1cbiAgJ3hwdWI2NjFNeU13QXFSYmNGdFhnUzVzWUpBQnFxRzlZTG1DNFExUmRhcDlnU0U4TnF0d3liR2hlUFkyZ1oyOUVTRmpxSm9DdTFSdXBqZThZdEdxc2VmRDI2NVRNZzd1c1VERmRwNlcxRUdNY2V0OCc7XG5cbmRlc2NyaWJlKCdLZXljaGFpbnMuY3JlYXRlQmFja3VwJywgZnVuY3Rpb24gKCkge1xuICBsZXQga2V5Y2hhaW5zOiBLZXljaGFpbnM7XG4gIGxldCBzZW5kOiBzaW5vbi5TaW5vblN0dWI7XG4gIGxldCBtb2NrQml0R286IGFueTtcblxuICAvKiogVGhlIGJvZHkgYWN0dWFsbHkgaGFuZGVkIHRvIGAuc2VuZCgpYCDigJQgaS5lLiB3aGF0IGdvZXMgb24gdGhlIHdpcmUuICovXG4gIGZ1bmN0aW9uIHNlbnRCb2R5KCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gc2VuZC5maXJzdENhbGwuYXJnc1swXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkS2V5Y2hhaW5zKHB1YiA9IFNUUktFWV9QVUIpOiBLZXljaGFpbnMge1xuICAgIGNvbnN0IG1vY2tCYXNlQ29pbiA9IHtcbiAgICAgIHVybDogc2lub24uc3R1YigpLmNhbGxzRmFrZSgocGF0aDogc3RyaW5nKSA9PiBwYXRoKSxcbiAgICAgIGdlbmVyYXRlS2V5UGFpcjogc2lub24uc3R1YigpLnJldHVybnMoeyBwdWIsIHBydjogJ1NPTUVfU0VFRCcgfSksXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IEtleWNoYWlucyhtb2NrQml0R28sIG1vY2tCYXNlQ29pbiBhcyBhbnkpO1xuICB9XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2VuZCA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBpZDogJ2JhY2t1cC1rZXktaWQnIH0pIH0pO1xuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIHBvc3Q6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgc2VuZCB9KSxcbiAgICAgIGVuY3J5cHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcygnZW5jcnlwdGVkLXBydicpLFxuICAgICAgc2V0UmVxdWVzdFRyYWNlcjogc2lub24uc3R1YigpLFxuICAgIH07XG4gICAga2V5Y2hhaW5zID0gYnVpbGRLZXljaGFpbnMoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NhZmUgY2hpbGQga2V5IHJlZ2lzdHJhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2VyaWFsaXplcyB0aGUgaGFyZGVuZWQgZGVyaXZhdGlvbiBwYXRoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmFkZCh7XG4gICAgICAgIHB1YjogWFBVQixcbiAgICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICAgIGtleVR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICAgIHBhcmVudDogJ3VzZXItcm9vdC1pZCcsXG4gICAgICAgIHNhZmVJZDogU0FGRV9JRCxcbiAgICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aDogXCJtLzcnXCIsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGVyaXZlZFBhdGggPSBzZW50Qm9keSgpLmRlcml2ZWRGcm9tUGFyZW50V2l0aFBhdGg7XG4gICAgICBpZiAodHlwZW9mIGRlcml2ZWRQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIGRlcml2ZWRGcm9tUGFyZW50V2l0aFBhdGggdG8gYmUgc2VyaWFsaXplZCcpO1xuICAgICAgfVxuICAgICAgZGVyaXZlZFBhdGguc2hvdWxkLmVxdWFsKFwibS83J1wiKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NhZmUgZWQyNTUxOU11bHRpc2lnIHJvb3QgKHNsb3Qg4pGjKScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgncG9zdHMgYSAxMDgtY2hhciBjb21wb3NpdGUgcHViIGJ1aWx0IGZyb20gdGhlIGdlbmVyYXRlZCBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuXG4gICAgICBjb25zdCBwdWIgPSBzZW50Qm9keSgpLnB1YiBhcyBzdHJpbmc7XG4gICAgICBwdWIubGVuZ3RoLnNob3VsZC5lcXVhbCgxMDgpO1xuICAgICAgZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihwdWIpLnB1Yi5zaG91bGQuZXF1YWwoU1RSS0VZX1BVQik7XG4gICAgfSk7XG5cbiAgICBpdCgnbWludHMgYSBjaGFpbiBjb2RlIHRoYXQgcm91bmQtdHJpcHMgb3V0IG9mIHRoZSBwdWInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuXG4gICAgICAvLyBUaGUgY2hhaW4gY29kZSBoYXMgbm8gZmllbGQgb2YgaXRzIG93bjsgdGhpcyBkZWNvZGUgaXMgaG93IGNhbGxlcnMgKGUuZy4gdGhlIGtleWNhcmQnc1xuICAgICAgLy8gYm94IEIpIHJlY292ZXIgaXQuXG4gICAgICBjb25zdCB7IGNoYWluQ29kZSB9ID0gZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihzZW50Qm9keSgpLnB1YiBhcyBzdHJpbmcpO1xuICAgICAgY2hhaW5Db2RlLnNob3VsZC5tYXRjaCgvXltBLVoyLTddezUyfSQvKTtcbiAgICB9KTtcblxuICAgIGl0KCdtaW50cyBhIGRpZmZlcmVudCBjaGFpbiBjb2RlIGZvciBlYWNoIGJhY2t1cCBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBhc3NwaHJhc2U6ICdwdycsIHNhZmVJZDogU0FGRV9JRCB9KTtcblxuICAgICAgY29uc3QgZmlyc3QgPSBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHNlbmQuZmlyc3RDYWxsLmFyZ3NbMF0ucHViKS5jaGFpbkNvZGU7XG4gICAgICBjb25zdCBzZWNvbmQgPSBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHNlbmQuc2Vjb25kQ2FsbC5hcmdzWzBdLnB1YikuY2hhaW5Db2RlO1xuICAgICAgZmlyc3Quc2hvdWxkLm5vdC5lcXVhbChzZWNvbmQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NlbmRzIG5vIGNoYWluQ29kZSBmaWVsZCBvZiBpdHMgb3duJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBhc3NwaHJhc2U6ICdwdycsIHNhZmVJZDogU0FGRV9JRCB9KTtcblxuICAgICAgc2VudEJvZHkoKS5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ2NoYWluQ29kZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3N0aWxsIGVuY3J5cHRzIGFuZCByZXR1cm5zIHRoZSB1bi1jb21wb3NlZCBwcnYnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuXG4gICAgICBzZW50Qm9keSgpLmVuY3J5cHRlZFBydiEuc2hvdWxkLmVxdWFsKCdlbmNyeXB0ZWQtcHJ2Jyk7XG4gICAgICByZXN1bHQucHJ2IS5zaG91bGQuZXF1YWwoJ1NPTUVfU0VFRCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbGVhdmVzIGV2ZXJ5IG90aGVyIGtleSB1bnRvdWNoZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2RvZXMgbm90IGNvbXBvc2Ugd2l0aG91dCBhIHNhZmVJZCwgZXZlbiBmb3IgYW4gZWQyNTUxOSBjb2luJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBhc3NwaHJhc2U6ICdwdycgfSk7XG5cbiAgICAgIGNvbnN0IGJvZHkgPSBzZW50Qm9keSgpO1xuICAgICAgYm9keS5wdWIhLnNob3VsZC5lcXVhbChTVFJLRVlfUFVCKTtcbiAgICAgIChib2R5LnB1YiBhcyBzdHJpbmcpLmxlbmd0aC5zaG91bGQuZXF1YWwoNTYpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGNvbXBvc2UgYSBzYWZlIHNlY3AyNTZrMU11bHRpc2lnIHJvb3QgKHNsb3Qg4pGgKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEFuIHhwdWIgYWxyZWFkeSBjYXJyaWVzIGl0cyBvd24gY2hhaW4gY29kZTsgY29tcG9zaW5nIG9udG8gaXQgd291bGQgY29ycnVwdCB0aGUgcHViLlxuICAgICAgY29uc3QgYnRjS2V5Y2hhaW5zID0gYnVpbGRLZXljaGFpbnMoWFBVQik7XG5cbiAgICAgIGF3YWl0IGJ0Y0tleWNoYWlucy5jcmVhdGVCYWNrdXAoeyBwYXNzcGhyYXNlOiAncHcnLCBzYWZlSWQ6IFNBRkVfSUQgfSk7XG5cbiAgICAgIHNlbnRCb2R5KCkucHViIS5zaG91bGQuZXF1YWwoWFBVQik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2VuZHMgYSBib2R5IHdpdGggbm8gY2hhaW5Db2RlIGFuZCBzb3VyY2UgYmFja3VwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBhc3NwaHJhc2U6ICdwdycgfSk7XG5cbiAgICAgIGNvbnN0IGJvZHkgPSBzZW50Qm9keSgpO1xuICAgICAgYm9keS5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ2NoYWluQ29kZScpO1xuICAgICAgYm9keS5zb3VyY2UhLnNob3VsZC5lcXVhbCgnYmFja3VwJyk7XG4gICAgICBib2R5LmVuY3J5cHRlZFBydiEuc2hvdWxkLmVxdWFsKCdlbmNyeXB0ZWQtcHJ2Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnbGVhdmVzIGEgVFNTIGJhY2t1cCBrZXkgdW50b3VjaGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gTm8gbG9jYWwga2V5cGFpciBpcyBnZW5lcmF0ZWQgb24gdGhlIFRTUyBwYXRoLCBzbyB0aGVyZSBpcyBubyBwdWIgdG8gaW5zcGVjdCBvciBjb21wb3NlLlxuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBydjogJ3Rzcy1wcnYnLCBjb21tb25LZXljaGFpbjogJ2NvbW1vbi1rZXljaGFpbicsIHNhZmVJZDogU0FGRV9JRCB9KTtcblxuICAgICAgY29uc3QgYm9keSA9IHNlbnRCb2R5KCk7XG4gICAgICBib2R5LmNvbW1vbktleWNoYWluIS5zaG91bGQuZXF1YWwoJ2NvbW1vbi1rZXljaGFpbicpO1xuICAgICAgKGJvZHkucHViID09PSB1bmRlZmluZWQpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnbGVhdmVzIGEgS1JTLXByb3ZpZGVyIGJhY2t1cCBrZXkgdW50b3VjaGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHByb3ZpZGVyOiAna3JzLXByb3ZpZGVyJywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuXG4gICAgICBjb25zdCBib2R5ID0gc2VudEJvZHkoKTtcbiAgICAgIChib2R5LnB1YiA9PT0gdW5kZWZpbmVkKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgYm9keS5wcm92aWRlciEuc2hvdWxkLmVxdWFsKCdrcnMtcHJvdmlkZXInKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL2tleWNoYWluL2tleWNoYWlucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUErQjtBQUMvQixrQkFBZ0I7QUFDaEIseUNBQXVFO0FBR3ZFLGlHQUFpRztBQUNqRyxNQUFNLFVBQVUsR0FBRywwREFBMEQsQ0FBQztBQUM5RSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUM7QUFDekIsTUFBTSxJQUFJLEdBQ1IsaUhBQWlILENBQUM7QUFDcEgsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUM7QUFFdEMsUUFBUSxDQUFDLHdCQUF3QixFQUFFO0lBQ2pDLElBQUksU0FBb0IsQ0FBQztJQUN6QixJQUFJLElBQXFCLENBQUM7SUFDMUIsSUFBSSxTQUFjLENBQUM7SUFFbkIsMEVBQTBFO0lBQzFFLFNBQVMsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELFNBQVMsY0FBYyxDQUFDLEdBQUcsR0FBRyxVQUFVO1FBQ3RDLE1BQU0sWUFBWSxHQUFHO1lBQ25CLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDbkQsZUFBZSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxDQUFDO1NBQ2pFLENBQUM7UUFDRixPQUFPLElBQUksZUFBUyxDQUFDLFNBQVMsRUFBRSxZQUFtQixDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELFVBQVUsQ0FBQztRQUNULElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEYsU0FBUyxHQUFHO1lBQ1YsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNwQyxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7WUFDL0MsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRTtTQUMvQixDQUFDO1FBQ0YsU0FBUyxHQUFHLGNBQWMsRUFBRSxDQUFDO0lBQy9CLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLDZCQUE2QixFQUFFO1FBQ3RDLEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLO1lBQ2pELE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FBQztnQkFDbEIsR0FBRyxFQUFFLElBQUk7Z0JBQ1QsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsT0FBTyxFQUFFLGFBQWE7Z0JBQ3RCLE1BQU0sRUFBRSxjQUFjO2dCQUN0QixNQUFNLEVBQUUsT0FBTztnQkFDZix5QkFBeUIsRUFBRSxNQUFNO2FBQ2xDLENBQUMsQ0FBQztZQUVILE1BQU0sV0FBVyxHQUFHLFFBQVEsRUFBRSxDQUFDLHlCQUF5QixDQUFDO1lBQ3pELElBQUksT0FBTyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztZQUN6RSxDQUFDO1lBQ0QsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxvQ0FBb0MsRUFBRTtRQUM3QyxFQUFFLENBQUMseURBQXlELEVBQUUsS0FBSztZQUNqRSxNQUFNLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBRXBFLE1BQU0sR0FBRyxHQUFHLFFBQVEsRUFBRSxDQUFDLEdBQWEsQ0FBQztZQUNyQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekMsSUFBQSwrQkFBeUIsRUFBQyxHQUFHLENBQUM7aUJBQzNCLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2lCQUNuQixNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDbEMsSUFBQSwrQkFBeUIsRUFBQyxHQUFHLENBQUM7aUJBQzNCLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2lCQUN6QixNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUUsS0FBSztZQUMxRCxNQUFNLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLE1BQU0sS0FBSyxHQUFHLElBQUEsK0JBQXlCLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzlFLE1BQU0sU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDcEUsTUFBTSxNQUFNLEdBQUcsSUFBQSwrQkFBeUIsRUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDaEYsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEtBQUs7WUFDM0MsTUFBTSxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNwRSxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0RBQWdELEVBQUUsS0FBSztZQUN4RCxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ25GLFFBQVEsRUFBRSxDQUFDLFlBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sQ0FBQyxHQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGtDQUFrQyxFQUFFO1FBQzNDLEVBQUUsQ0FBQyw2REFBNkQsRUFBRSxLQUFLO1lBQ3JFLE1BQU0sU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELE1BQU0sSUFBSSxHQUFHLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxHQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsR0FBYyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGdEQUFnRCxFQUFFLEtBQUs7WUFDeEQsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFDLE1BQU0sWUFBWSxDQUFDLFlBQVksQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDdkUsUUFBUSxFQUFFLENBQUMsR0FBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUUsS0FBSztZQUMxRCxNQUFNLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUVuRCxNQUFNLElBQUksR0FBRyxRQUFRLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxNQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsWUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNENBQTRDLEVBQUUsS0FBSztZQUNwRCxNQUFNLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBRTVFLE1BQU0sSUFBSSxHQUFHLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxRQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0gsUUFBUSxDQUFDLHNDQUFzQyxFQUFFO1FBQy9DLEVBQUUsQ0FBQyw2REFBNkQsRUFBRSxLQUFLO1lBQ3JFLFNBQVMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMzRCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDbEUsTUFBTSxPQUFPLEdBQXVCO2dCQUNsQyxPQUFPLEVBQUUsY0FBYztnQkFDdkIsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO2dCQUMvQyxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRTthQUN0QixDQUFDO1lBRUYsTUFBTSxlQUFlLEdBQUcsTUFBTSxTQUFTLENBQUMsNEJBQTRCLENBQUM7Z0JBQ25FLFFBQVEsRUFBRTtvQkFDUixFQUFFLEVBQUUsUUFBUTtvQkFDWixZQUFZLEVBQUUsc0JBQXNCO29CQUNwQyxJQUFJLEVBQUUsYUFBYTtpQkFDcEI7Z0JBQ0QsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxjQUFjO2dCQUMzQixpQkFBaUIsRUFBRSxDQUFDO2dCQUNwQixpQkFBaUIsRUFBRSxPQUFPO2FBQzNCLENBQUMsQ0FBQztZQUVILGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pFLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0MsZUFBZSxDQUFDLFlBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgS2V5Y2hhaW5zLCBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcbmltcG9ydCB0eXBlIHsgSUVuY3J5cHRpb25TZXNzaW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2FwaSc7XG5cbi8qKiBTbG90LeKRoyByb290cyBhcmUgZ2VuZXJhdGVkIGFzIFhMTSBrZXljaGFpbnMsIHRoZW4gcGVyc2lzdGVkIGFzIHJhdyBwdWJ8fGNoYWluLWNvZGUgYmFzZTMyLiAqL1xuY29uc3QgU1RSS0VZX1BVQiA9ICdHQTVXVUo1NFoyM0tJTExDVU9VTkFLVFBCVlpXS01RVk80TzZFUTVHSExBRVJJTUxMSE5DU0tZSCc7XG5jb25zdCBTQUZFX0lEID0gJ3NhZmUtMSc7XG5jb25zdCBYUFVCID1cbiAgJ3hwdWI2NjFNeU13QXFSYmNGdFhnUzVzWUpBQnFxRzlZTG1DNFExUmRhcDlnU0U4TnF0d3liR2hlUFkyZ1oyOUVTRmpxSm9DdTFSdXBqZThZdEdxc2VmRDI2NVRNZzd1c1VERmRwNlcxRUdNY2V0OCc7XG5jb25zdCBCQVNFMzJfUk9PVCA9IC9eW0EtWjItN117MTAzfSQvO1xuXG5kZXNjcmliZSgnS2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCcsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGtleWNoYWluczogS2V5Y2hhaW5zO1xuICBsZXQgc2VuZDogc2lub24uU2lub25TdHViO1xuICBsZXQgbW9ja0JpdEdvOiBhbnk7XG5cbiAgLyoqIFRoZSBib2R5IGFjdHVhbGx5IGhhbmRlZCB0byBgLnNlbmQoKWAg4oCUIGkuZS4gd2hhdCBnb2VzIG9uIHRoZSB3aXJlLiAqL1xuICBmdW5jdGlvbiBzZW50Qm9keSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHNlbmQuZmlyc3RDYWxsLmFyZ3NbMF07XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZEtleWNoYWlucyhwdWIgPSBTVFJLRVlfUFVCKTogS2V5Y2hhaW5zIHtcbiAgICBjb25zdCBtb2NrQmFzZUNvaW4gPSB7XG4gICAgICB1cmw6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHBhdGg6IHN0cmluZykgPT4gcGF0aCksXG4gICAgICBnZW5lcmF0ZUtleVBhaXI6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgcHViLCBwcnY6ICdTT01FX1NFRUQnIH0pLFxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBLZXljaGFpbnMobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4gYXMgYW55KTtcbiAgfVxuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNlbmQgPSBzaW5vbi5zdHViKCkucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaWQ6ICdiYWNrdXAta2V5LWlkJyB9KSB9KTtcbiAgICBtb2NrQml0R28gPSB7XG4gICAgICBwb3N0OiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHNlbmQgfSksXG4gICAgICBlbmNyeXB0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoJ2VuY3J5cHRlZC1wcnYnKSxcbiAgICAgIHNldFJlcXVlc3RUcmFjZXI6IHNpbm9uLnN0dWIoKSxcbiAgICB9O1xuICAgIGtleWNoYWlucyA9IGJ1aWxkS2V5Y2hhaW5zKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzYWZlIGNoaWxkIGtleSByZWdpc3RyYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3NlcmlhbGl6ZXMgdGhlIGhhcmRlbmVkIGRlcml2YXRpb24gcGF0aCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGtleWNoYWlucy5hZGQoe1xuICAgICAgICBwdWI6IFhQVUIsXG4gICAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgICBrZXlUeXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICBwYXJlbnQ6ICd1c2VyLXJvb3QtaWQnLFxuICAgICAgICBzYWZlSWQ6IFNBRkVfSUQsXG4gICAgICAgIGRlcml2ZWRGcm9tUGFyZW50V2l0aFBhdGg6IFwibS83J1wiLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRlcml2ZWRQYXRoID0gc2VudEJvZHkoKS5kZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoO1xuICAgICAgaWYgKHR5cGVvZiBkZXJpdmVkUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBkZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoIHRvIGJlIHNlcmlhbGl6ZWQnKTtcbiAgICAgIH1cbiAgICAgIGRlcml2ZWRQYXRoLnNob3VsZC5lcXVhbChcIm0vNydcIik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzYWZlIGVkMjU1MTlNdWx0aXNpZyByb290IChzbG90IOKRoyknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Bvc3RzIHJhdyBwdWJsaWMga2V5IHBsdXMgY2hhaW4gY29kZSBhcyB1bnBhZGRlZCBiYXNlMzInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuXG4gICAgICBjb25zdCBwdWIgPSBzZW50Qm9keSgpLnB1YiBhcyBzdHJpbmc7XG4gICAgICBCQVNFMzJfUk9PVC50ZXN0KHB1Yikuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihwdWIpXG4gICAgICAgIC5wdWIudG9TdHJpbmcoJ2hleCcpXG4gICAgICAgIC5zaG91bGQubWF0Y2goL15bMC05YS1mXXs2NH0kLyk7XG4gICAgICBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHB1YilcbiAgICAgICAgLmNoYWluQ29kZS50b1N0cmluZygnaGV4JylcbiAgICAgICAgLnNob3VsZC5tYXRjaCgvXlswLTlhLWZdezY0fSQvKTtcbiAgICB9KTtcblxuICAgIGl0KCdtaW50cyBhIGRpZmZlcmVudCBjaGFpbiBjb2RlIGZvciBlYWNoIGJhY2t1cCBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuICAgICAgY29uc3QgZmlyc3QgPSBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHNlbmQuZmlyc3RDYWxsLmFyZ3NbMF0ucHViKS5jaGFpbkNvZGU7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuICAgICAgY29uc3Qgc2Vjb25kID0gZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihzZW5kLnNlY29uZENhbGwuYXJnc1swXS5wdWIpLmNoYWluQ29kZTtcbiAgICAgIGZpcnN0LmVxdWFscyhzZWNvbmQpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2VuZHMgbm8gc2VwYXJhdGUgY2hhaW5Db2RlIGZpZWxkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBhc3NwaHJhc2U6ICdwdycsIHNhZmVJZDogU0FGRV9JRCB9KTtcbiAgICAgIHNlbnRCb2R5KCkuc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCdjaGFpbkNvZGUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzdGlsbCBlbmNyeXB0cyBhbmQgcmV0dXJucyB0aGUgdW4tY29tcG9zZWQgcHJ2JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBhc3NwaHJhc2U6ICdwdycsIHNhZmVJZDogU0FGRV9JRCB9KTtcbiAgICAgIHNlbnRCb2R5KCkuZW5jcnlwdGVkUHJ2IS5zaG91bGQuZXF1YWwoJ2VuY3J5cHRlZC1wcnYnKTtcbiAgICAgIHJlc3VsdC5wcnYhLnNob3VsZC5lcXVhbCgnU09NRV9TRUVEJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsZWF2ZXMgZXZlcnkgb3RoZXIga2V5IHVudG91Y2hlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnZG9lcyBub3QgY29tcG9zZSB3aXRob3V0IGEgc2FmZUlkLCBldmVuIGZvciBhbiBlZDI1NTE5IGNvaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3JyB9KTtcbiAgICAgIGNvbnN0IGJvZHkgPSBzZW50Qm9keSgpO1xuICAgICAgYm9keS5wdWIhLnNob3VsZC5lcXVhbChTVFJLRVlfUFVCKTtcbiAgICAgIChib2R5LnB1YiBhcyBzdHJpbmcpLmxlbmd0aC5zaG91bGQuZXF1YWwoNTYpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGNvbXBvc2UgYSBzYWZlIHNlY3AyNTZrMU11bHRpc2lnIHJvb3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidGNLZXljaGFpbnMgPSBidWlsZEtleWNoYWlucyhYUFVCKTtcbiAgICAgIGF3YWl0IGJ0Y0tleWNoYWlucy5jcmVhdGVCYWNrdXAoeyBwYXNzcGhyYXNlOiAncHcnLCBzYWZlSWQ6IFNBRkVfSUQgfSk7XG4gICAgICBzZW50Qm9keSgpLnB1YiEuc2hvdWxkLmVxdWFsKFhQVUIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NlbmRzIGEgYm9keSB3aXRoIG5vIGNoYWluQ29kZSBhbmQgc291cmNlIGJhY2t1cCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGtleWNoYWlucy5jcmVhdGVCYWNrdXAoeyBwYXNzcGhyYXNlOiAncHcnIH0pO1xuXG4gICAgICBjb25zdCBib2R5ID0gc2VudEJvZHkoKTtcbiAgICAgIGJvZHkuc2hvdWxkLm5vdC5oYXZlLnByb3BlcnR5KCdjaGFpbkNvZGUnKTtcbiAgICAgIGJvZHkuc291cmNlIS5zaG91bGQuZXF1YWwoJ2JhY2t1cCcpO1xuICAgICAgYm9keS5lbmNyeXB0ZWRQcnYhLnNob3VsZC5lcXVhbCgnZW5jcnlwdGVkLXBydicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2xlYXZlcyBhIEtSUy1wcm92aWRlciBiYWNrdXAga2V5IHVudG91Y2hlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGtleWNoYWlucy5jcmVhdGVCYWNrdXAoeyBwcm92aWRlcjogJ2tycy1wcm92aWRlcicsIHNhZmVJZDogU0FGRV9JRCB9KTtcblxuICAgICAgY29uc3QgYm9keSA9IHNlbnRCb2R5KCk7XG4gICAgICAoYm9keS5wdWIgPT09IHVuZGVmaW5lZCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGJvZHkucHJvdmlkZXIhLnNob3VsZC5lcXVhbCgna3JzLXByb3ZpZGVyJyk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgncGFzc3dvcmQgcm90YXRpb24gZW5jcnlwdGlvbiBzZXNzaW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCd1c2VzIHRoZSBzdXBwbGllZCBzZXNzaW9uIGZvciB0aGUgbmV3IGVuY3J5cHRlZCBwcml2YXRlIGtleScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCaXRHby5kZWNyeXB0ID0gc2lub24uc3R1YigpLnJlc29sdmVzKCdkZWNyeXB0ZWQtcHJ2Jyk7XG4gICAgICBjb25zdCBzZXNzaW9uRW5jcnlwdCA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcygnc2Vzc2lvbi1lbmNyeXB0ZWQnKTtcbiAgICAgIGNvbnN0IHNlc3Npb246IElFbmNyeXB0aW9uU2Vzc2lvbiA9IHtcbiAgICAgICAgZW5jcnlwdDogc2Vzc2lvbkVuY3J5cHQsXG4gICAgICAgIGRlY3J5cHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcygnZGVjcnlwdGVkLXBydicpLFxuICAgICAgICBkZXN0cm95OiBzaW5vbi5zdHViKCksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB1cGRhdGVkS2V5Y2hhaW4gPSBhd2FpdCBrZXljaGFpbnMudXBkYXRlU2luZ2xlS2V5Y2hhaW5QYXNzd29yZCh7XG4gICAgICAgIGtleWNoYWluOiB7XG4gICAgICAgICAgaWQ6ICdrZXktaWQnLFxuICAgICAgICAgIGVuY3J5cHRlZFBydjogJ2xlZ2FjeS1lbmNyeXB0ZWQtcHJ2JyxcbiAgICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICB9LFxuICAgICAgICBvbGRQYXNzd29yZDogJ29sZC1wYXNzd29yZCcsXG4gICAgICAgIG5ld1Bhc3N3b3JkOiAnbmV3LXBhc3N3b3JkJyxcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IDIsXG4gICAgICAgIGVuY3J5cHRpb25TZXNzaW9uOiBzZXNzaW9uLFxuICAgICAgfSk7XG5cbiAgICAgIHNlc3Npb25FbmNyeXB0LmNhbGxlZE9uY2VXaXRoRXhhY3RseSgnZGVjcnlwdGVkLXBydicpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIG1vY2tCaXRHby5lbmNyeXB0LmNhbGxlZC5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgdXBkYXRlZEtleWNoYWluLmVuY3J5cHRlZFBydiEuc2hvdWxkLmVxdWFsKCdzZXNzaW9uLWVuY3J5cHRlZCcpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -35,103 +35,99 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
require("should");
|
|
37
37
|
const src_1 = require("../../../../src");
|
|
38
|
-
// Cross-repo fixture: byte-identical to
|
|
39
|
-
//
|
|
40
|
-
//
|
|
41
|
-
// unrecoverable wallet.
|
|
38
|
+
// Cross-repo fixture: byte-identical to wallet-platform
|
|
39
|
+
// test/unit/base/safes/fixtures/derivableEd25519Pub.json. Four independent implementations of this
|
|
40
|
+
// format will otherwise drift, and the failure mode is unrecoverable wallets.
|
|
42
41
|
const fixture = __importStar(require("./fixtures/derivableEd25519Pub.json"));
|
|
42
|
+
const PUBLIC_KEY = Buffer.alloc(32);
|
|
43
|
+
const CHAIN_CODE = Buffer.alloc(32, 0xab);
|
|
44
|
+
const ROOT_PUB = (0, src_1.encodeDerivableEd25519Pub)(PUBLIC_KEY, CHAIN_CODE);
|
|
45
|
+
const ROOT_KEYCHAIN = Buffer.concat([PUBLIC_KEY, CHAIN_CODE]).toString('hex');
|
|
46
|
+
const STRKEY_PUBLIC = 'GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH';
|
|
47
|
+
const STRKEY_SEED = 'SAAACAQDAQCQMBYIBEFAWDANBYHRAEISCMKBKFQXDAMRUGY4DUPB6NKI';
|
|
43
48
|
describe('derivableEd25519Pub', function () {
|
|
44
|
-
describe('format
|
|
49
|
+
describe('base32 root format', function () {
|
|
50
|
+
it('encodes 32-byte public key plus 32-byte chain code', function () {
|
|
51
|
+
src_1.DERIVABLE_ED25519_CHAIN_CODE_BYTES.should.equal(32);
|
|
52
|
+
src_1.DERIVABLE_ED25519_PUB_LENGTH.should.equal(103);
|
|
53
|
+
ROOT_PUB.should.match(/^[A-Z2-7]{103}$/);
|
|
54
|
+
(0, src_1.decodeDerivableEd25519Pub)(ROOT_PUB).pub.equals(PUBLIC_KEY).should.equal(true);
|
|
55
|
+
(0, src_1.decodeDerivableEd25519Pub)(ROOT_PUB).chainCode.equals(CHAIN_CODE).should.equal(true);
|
|
56
|
+
});
|
|
45
57
|
it('matches the constants pinned in the shared fixture', function () {
|
|
46
|
-
src_1.
|
|
47
|
-
src_1.
|
|
48
|
-
|
|
58
|
+
src_1.DERIVABLE_ED25519_PUB_LENGTH.should.equal(fixture.rootPubBase32Length);
|
|
59
|
+
src_1.DERIVABLE_ED25519_CHAIN_CODE_BYTES.should.equal(fixture.chainCodeBytes);
|
|
60
|
+
});
|
|
61
|
+
it('generates raw chain code for root composition', function () {
|
|
62
|
+
(0, src_1.generateEd25519ChainCode)().length.should.equal(32);
|
|
49
63
|
});
|
|
50
64
|
});
|
|
51
|
-
describe('
|
|
52
|
-
for (const
|
|
53
|
-
it(`
|
|
54
|
-
(0, src_1.encodeDerivableEd25519Pub)(
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
(
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
describe('decodeDerivableEd25519Pub', function () {
|
|
64
|
-
for (const v of fixture.valid) {
|
|
65
|
-
it(`splits ${v.name}`, function () {
|
|
66
|
-
(0, src_1.decodeDerivableEd25519Pub)(v.composite).should.eql({ pub: v.pub, chainCode: v.chainCode });
|
|
65
|
+
describe('fixture vectors', function () {
|
|
66
|
+
for (const vector of fixture.valid) {
|
|
67
|
+
it(`round-trips ${vector.name}`, function () {
|
|
68
|
+
const composite = (0, src_1.encodeDerivableEd25519Pub)(Buffer.from(vector.pub, 'hex'), Buffer.from(vector.chainCode, 'hex'));
|
|
69
|
+
composite.should.equal(vector.composite);
|
|
70
|
+
const decoded = (0, src_1.decodeDerivableEd25519Pub)(vector.composite);
|
|
71
|
+
decoded.pub.toString('hex').should.equal(vector.pub);
|
|
72
|
+
decoded.chainCode.toString('hex').should.equal(vector.chainCode);
|
|
73
|
+
(0, src_1.isDerivableEd25519Pub)(vector.composite).should.equal(true);
|
|
67
74
|
});
|
|
68
75
|
}
|
|
69
|
-
for (const
|
|
70
|
-
it(`rejects ${
|
|
71
|
-
(
|
|
72
|
-
(0, src_1.
|
|
76
|
+
for (const vector of fixture.invalidComposite) {
|
|
77
|
+
it(`rejects ${vector.name}`, function () {
|
|
78
|
+
(0, src_1.isDerivableEd25519Pub)(vector.composite).should.equal(false);
|
|
79
|
+
(() => (0, src_1.decodeDerivableEd25519Pub)(vector.composite)).should.throw(/Invalid derivable ed25519 pub/);
|
|
73
80
|
});
|
|
74
81
|
}
|
|
75
82
|
});
|
|
76
|
-
describe('
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
83
|
+
describe('raw public soft derivation', function () {
|
|
84
|
+
it('derives a deterministic public key and discards the child chain code', async function () {
|
|
85
|
+
const eddsa = await src_1.Eddsa.initialize(await src_1.Ed25519BIP32.initialize());
|
|
86
|
+
const derived = eddsa.deriveUnhardened(ROOT_KEYCHAIN, 'm/7');
|
|
87
|
+
derived.length.should.equal(128);
|
|
88
|
+
derived.slice(0, 64).should.match(/^[0-9a-f]{64}$/);
|
|
89
|
+
derived.slice(64).should.match(/^[0-9a-f]{64}$/);
|
|
90
|
+
(await (0, src_1.softDeriveChildPubEd25519)(ROOT_PUB, 7)).toString('hex').should.equal(derived.slice(0, 64));
|
|
91
|
+
});
|
|
92
|
+
// The golden vectors below pin the unhardened derivation output shared cross-repo with
|
|
93
|
+
// wallet-platform: a divergent implementation derives co-signer keys nobody else can
|
|
94
|
+
// reproduce, permanently bricking the wallets minted with it.
|
|
95
|
+
for (const vector of fixture.softDerivation) {
|
|
96
|
+
it(`derives the pinned golden child: ${vector.name}`, async function () {
|
|
97
|
+
const child = await (0, src_1.softDeriveChildPubEd25519)(vector.composite, vector.index);
|
|
98
|
+
child.toString('hex').should.equal(vector.childPub);
|
|
84
99
|
});
|
|
85
100
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
(0, src_1.isValidEd25519ChainCode)(chainCode).should.equal(true);
|
|
101
|
+
it('rejects a hardened or out-of-range index', async function () {
|
|
102
|
+
await (0, src_1.softDeriveChildPubEd25519)(ROOT_PUB, -1).should.be.rejectedWith(/non-hardened/);
|
|
103
|
+
await (0, src_1.softDeriveChildPubEd25519)(ROOT_PUB, 0x80000000).should.be.rejectedWith(/non-hardened/);
|
|
104
|
+
await (0, src_1.softDeriveChildPubEd25519)(ROOT_PUB, 1.5).should.be.rejectedWith(/non-hardened/);
|
|
91
105
|
});
|
|
92
|
-
it('rejects
|
|
93
|
-
(0, src_1.
|
|
94
|
-
|
|
95
|
-
it('rejects a chain code of the wrong length', function () {
|
|
96
|
-
(0, src_1.isValidEd25519ChainCode)(chainCode.slice(0, 51)).should.equal(false);
|
|
97
|
-
(0, src_1.isValidEd25519ChainCode)(chainCode + 'A').should.equal(false);
|
|
98
|
-
});
|
|
99
|
-
it('rejects a character outside the base32 alphabet', function () {
|
|
100
|
-
// 0, 1, 8 and 9 are absent from the RFC 4648 alphabet.
|
|
101
|
-
(0, src_1.isValidEd25519ChainCode)('0' + chainCode.slice(1)).should.equal(false);
|
|
102
|
-
});
|
|
103
|
-
it('rejects a non-canonical spelling whose padding bits are set', function () {
|
|
104
|
-
// The 52nd character holds 1 significant bit and 4 padding bits, so 16 strings decode to the
|
|
105
|
-
// same 32 bytes. Only the zero-padded one is the chain code.
|
|
106
|
-
const BASE32 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
|
|
107
|
-
const bumped = chainCode.slice(0, 51) + BASE32[BASE32.indexOf(chainCode[51]) + 1];
|
|
108
|
-
bumped.should.not.equal(chainCode);
|
|
109
|
-
(0, src_1.isValidEd25519ChainCode)(bumped).should.equal(false);
|
|
110
|
-
});
|
|
111
|
-
it('accepts what the generator mints', function () {
|
|
112
|
-
(0, src_1.isValidEd25519ChainCode)((0, src_1.generateEd25519ChainCodeBase32)()).should.equal(true);
|
|
106
|
+
it('rejects a malformed root', async function () {
|
|
107
|
+
await (0, src_1.softDeriveChildPubEd25519)(fixture.invalidComposite[1].composite, 0).should.be.rejectedWith(/Invalid derivable ed25519 pub/);
|
|
108
|
+
await (0, src_1.softDeriveChildPubEd25519)(STRKEY_PUBLIC, 0).should.be.rejectedWith(/Invalid derivable ed25519 pub/);
|
|
113
109
|
});
|
|
114
110
|
});
|
|
115
|
-
describe('
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
111
|
+
describe('Stellar user-key codecs', function () {
|
|
112
|
+
it('keeps Stellar encoding separate from the neutral root format', function () {
|
|
113
|
+
(0, src_1.isValidEd25519StrKeyPublicKey)(STRKEY_PUBLIC).should.equal(true);
|
|
114
|
+
(0, src_1.encodeEd25519StrKeyPublicKey)((0, src_1.decodeEd25519StrKeyPublicKey)(STRKEY_PUBLIC)).should.equal(STRKEY_PUBLIC);
|
|
115
|
+
(0, src_1.decodeEd25519StrKeySecretSeed)(STRKEY_SEED).length.should.equal(32);
|
|
116
|
+
(0, src_1.isDerivableEd25519Pub)(STRKEY_PUBLIC).should.equal(false);
|
|
117
|
+
(0, src_1.isChecksumValidStrKeyEd25519Pub)(STRKEY_PUBLIC).should.equal(true);
|
|
118
|
+
});
|
|
119
|
+
it('rejects a public key with a corrupted checksum', function () {
|
|
123
120
|
(0, src_1.isValidEd25519StrKeyPublicKey)('GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYA').should.equal(false);
|
|
124
121
|
});
|
|
125
|
-
it('rejects a secret seed', function () {
|
|
122
|
+
it('rejects a secret seed where a public key is required', function () {
|
|
126
123
|
(0, src_1.isValidEd25519StrKeyPublicKey)('SA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH').should.equal(false);
|
|
124
|
+
(() => (0, src_1.decodeEd25519StrKeyPublicKey)('SA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKYH')).should.throw(/StrKey public key/);
|
|
127
125
|
});
|
|
128
|
-
it('rejects a non-base32 character', function () {
|
|
126
|
+
it('rejects a non-base32 character, the empty string, and lowercase', function () {
|
|
129
127
|
(0, src_1.isValidEd25519StrKeyPublicKey)('GA5WUJ54Z23KILLCUOUNAKTPBVZWKMQVO4O6EQ5GHLAERIMLLHNCSKY1').should.equal(false);
|
|
130
|
-
});
|
|
131
|
-
it('rejects the empty string and a composite pub', function () {
|
|
132
128
|
(0, src_1.isValidEd25519StrKeyPublicKey)('').should.equal(false);
|
|
133
|
-
(0, src_1.isValidEd25519StrKeyPublicKey)(
|
|
129
|
+
(0, src_1.isValidEd25519StrKeyPublicKey)(STRKEY_PUBLIC.toLowerCase()).should.equal(false);
|
|
134
130
|
});
|
|
135
131
|
});
|
|
136
132
|
});
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVyaXZhYmxlRWQyNTUxOVB1Yi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby9zYWZlL2Rlcml2YWJsZUVkMjU1MTlQdWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrQkFBZ0I7QUFDaEIseUNBVXlCO0FBRXpCLHdDQUF3QztBQUN4QyxtRkFBbUY7QUFDbkYsa0dBQWtHO0FBQ2xHLHdCQUF3QjtBQUN4Qiw2RUFBK0Q7QUFFL0QsUUFBUSxDQUFDLHFCQUFxQixFQUFFO0lBQzlCLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtRQUMzQixFQUFFLENBQUMsb0RBQW9ELEVBQUU7WUFDdkQsd0NBQWtDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDckUseUNBQW1DLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDMUUsa0NBQTRCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQywyQkFBMkIsRUFBRTtRQUNwQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM5QixFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3ZCLElBQUEsK0JBQXlCLEVBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUUsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsS0FBSyxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMs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QUFLLENBQUMsQ0FBQztRQUNoRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQge1xuICBERVJJVkFCTEVfRUQyNTUxOV9DSEFJTl9DT0RFX0xFTkdUSCxcbiAgREVSSVZBQkxFX0VEMjU1MTlfUFVCX0xFTkdUSCxcbiAgREVSSVZBQkxFX0VEMjU1MTlfUFVCX1NQTElUX09GRlNFVCxcbiAgZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1YixcbiAgZW5jb2RlRGVyaXZhYmxlRWQyNTUxOVB1YixcbiAgaXNEZXJpdmFibGVFZDI1NTE5UHViLFxuICBpc1ZhbGlkRWQyNTUxOUNoYWluQ29kZSxcbiAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXksXG4gIGdlbmVyYXRlRWQyNTUxOUNoYWluQ29kZUJhc2UzMixcbn0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcblxuLy8gQ3Jvc3MtcmVwbyBmaXh0dXJlOiBieXRlLWlkZW50aWNhbCB0b1xuLy8gcGFja2FnZXMvd2FsbGV0LXBsYXRmb3JtL3Rlc3QvdW5pdC9iYXNlL3NhZmVzL2ZpeHR1cmVzL2Rlcml2YWJsZUVkMjU1MTlQdWIuanNvbi5cbi8vIEZvdXIgaW5kZXBlbmRlbnQgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgc3BsaXQgd2lsbCBvdGhlcndpc2UgZHJpZnQsIGFuZCB0aGUgZmFpbHVyZSBtb2RlIGlzIGFuXG4vLyB1bnJlY292ZXJhYmxlIHdhbGxldC5cbmltcG9ydCAqIGFzIGZpeHR1cmUgZnJvbSAnLi9maXh0dXJlcy9kZXJpdmFibGVFZDI1NTE5UHViLmpzb24nO1xuXG5kZXNjcmliZSgnZGVyaXZhYmxlRWQyNTUxOVB1YicsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ2Zvcm1hdCBjb25zdGFudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ21hdGNoZXMgdGhlIGNvbnN0YW50cyBwaW5uZWQgaW4gdGhlIHNoYXJlZCBmaXh0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgICAgREVSSVZBQkxFX0VEMjU1MTlfUFVCX1NQTElUX09GRlNFVC5zaG91bGQuZXF1YWwoZml4dHVyZS5zcGxpdE9mZnNldCk7XG4gICAgICBERVJJVkFCTEVfRUQyNTUxOV9DSEFJTl9DT0RFX0xFTkdUSC5zaG91bGQuZXF1YWwoZml4dHVyZS5jaGFpbkNvZGVMZW5ndGgpO1xuICAgICAgREVSSVZBQkxFX0VEMjU1MTlfUFVCX0xFTkdUSC5zaG91bGQuZXF1YWwoZml4dHVyZS5jb21wb3NpdGVMZW5ndGgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZW5jb2RlRGVyaXZhYmxlRWQyNTUxOVB1YicsIGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKGNvbnN0IHYgb2YgZml4dHVyZS52YWxpZCkge1xuICAgICAgaXQoYGNvbXBvc2VzICR7di5uYW1lfWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZW5jb2RlRGVyaXZhYmxlRWQyNTUxOVB1Yih2LnB1Yiwgdi5jaGFpbkNvZGUpLnNob3VsZC5lcXVhbCh2LmNvbXBvc2l0ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHYgb2YgZml4dHVyZS5pbnZhbGlkRW5jb2RlSW5wdXRzKSB7XG4gICAgICBpdChgcmVqZWN0cyAke3YubmFtZX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiBlbmNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHYucHViLCB2LmNoYWluQ29kZSkpLnNob3VsZC50aHJvdygvSW52YWxpZCBkZXJpdmFibGUgZWQyNTUxOSBwdWIvKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RlY29kZURlcml2YWJsZUVkMjU1MTlQdWInLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yIChjb25zdCB2IG9mIGZpeHR1cmUudmFsaWQpIHtcbiAgICAgIGl0KGBzcGxpdHMgJHt2Lm5hbWV9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHYuY29tcG9zaXRlKS5zaG91bGQuZXFsKHsgcHViOiB2LnB1YiwgY2hhaW5Db2RlOiB2LmNoYWluQ29kZSB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdiBvZiBmaXh0dXJlLmludmFsaWRDb21wb3NpdGUpIHtcbiAgICAgIGl0KGByZWplY3RzICR7di5uYW1lfWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IGRlY29kZURlcml2YWJsZUVkMjU1MTlQdWIodi5jb21wb3NpdGUpKS5zaG91bGQudGhyb3coL0ludmFsaWQgZGVyaXZhYmxlIGVkMjU1MTkgcHViLyk7XG4gICAgICAgIGlzRGVyaXZhYmxlRWQyNTUxOVB1Yih2LmNvbXBvc2l0ZSkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JvdW5kIHRyaXAnLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yIChjb25zdCB2IG9mIGZpeHR1cmUudmFsaWQpIHtcbiAgICAgIGl0KGByb3VuZC10cmlwcyAke3YubmFtZX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZSA9IGVuY29kZURlcml2YWJsZUVkMjU1MTlQdWIodi5wdWIsIHYuY2hhaW5Db2RlKTtcbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZURlcml2YWJsZUVkMjU1MTlQdWIoY29tcG9zaXRlKTtcbiAgICAgICAgZGVjb2RlZC5zaG91bGQuZXFsKHsgcHViOiB2LnB1YiwgY2hhaW5Db2RlOiB2LmNoYWluQ29kZSB9KTtcbiAgICAgICAgZW5jb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihkZWNvZGVkLnB1YiwgZGVjb2RlZC5jaGFpbkNvZGUpLnNob3VsZC5lcXVhbChjb21wb3NpdGUpO1xuICAgICAgICBpc0Rlcml2YWJsZUVkMjU1MTlQdWIoY29tcG9zaXRlKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkRWQyNTUxOUNoYWluQ29kZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB7IGNoYWluQ29kZSB9ID0gZml4dHVyZS52YWxpZFszXTtcblxuICAgIGl0KCdhY2NlcHRzIDUyIGNhbm9uaWNhbCBiYXNlMzIgY2hhcmFjdGVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlzVmFsaWRFZDI1NTE5Q2hhaW5Db2RlKGNoYWluQ29kZSkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgbG93ZXJjYXNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXNWYWxpZEVkMjU1MTlDaGFpbkNvZGUoY2hhaW5Db2RlLnRvTG93ZXJDYXNlKCkpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIGNoYWluIGNvZGUgb2YgdGhlIHdyb25nIGxlbmd0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlzVmFsaWRFZDI1NTE5Q2hhaW5Db2RlKGNoYWluQ29kZS5zbGljZSgwLCA1MSkpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBpc1ZhbGlkRWQyNTUxOUNoYWluQ29kZShjaGFpbkNvZGUgKyAnQScpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIGNoYXJhY3RlciBvdXRzaWRlIHRoZSBiYXNlMzIgYWxwaGFiZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyAwLCAxLCA4IGFuZCA5IGFyZSBhYnNlbnQgZnJvbSB0aGUgUkZDIDQ2NDggYWxwaGFiZXQuXG4gICAgICBpc1ZhbGlkRWQyNTUxOUNoYWluQ29kZSgnMCcgKyBjaGFpbkNvZGUuc2xpY2UoMSkpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIG5vbi1jYW5vbmljYWwgc3BlbGxpbmcgd2hvc2UgcGFkZGluZyBiaXRzIGFyZSBzZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUaGUgNTJuZCBjaGFyYWN0ZXIgaG9sZHMgMSBzaWduaWZpY2FudCBiaXQgYW5kIDQgcGFkZGluZyBiaXRzLCBzbyAxNiBzdHJpbmdzIGRlY29kZSB0byB0aGVcbiAgICAgIC8vIHNhbWUgMzIgYnl0ZXMuIE9ubHkgdGhlIHplcm8tcGFkZGVkIG9uZSBpcyB0aGUgY2hhaW4gY29kZS5cbiAgICAgIGNvbnN0IEJBU0UzMiA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjIzNDU2Nyc7XG4gICAgICBjb25zdCBidW1wZWQgPSBjaGFpbkNvZGUuc2xpY2UoMCwgNTEpICsgQkFTRTMyW0JBU0UzMi5pbmRleE9mKGNoYWluQ29kZVs1MV0pICsgMV07XG4gICAgICBidW1wZWQuc2hvdWxkLm5vdC5lcXVhbChjaGFpbkNvZGUpO1xuICAgICAgaXNWYWxpZEVkMjU1MTlDaGFpbkNvZGUoYnVtcGVkKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FjY2VwdHMgd2hhdCB0aGUgZ2VuZXJhdG9yIG1pbnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXNWYWxpZEVkMjU1MTlDaGFpbkNvZGUoZ2VuZXJhdGVFZDI1NTE5Q2hhaW5Db2RlQmFzZTMyKCkpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRFZDI1NTE5U3RyS2V5UHVibGljS2V5JywgZnVuY3Rpb24gKCkge1xuICAgIGZvciAoY29uc3QgdiBvZiBmaXh0dXJlLnZhbGlkKSB7XG4gICAgICBpdChgYWNjZXB0cyB0aGUgcHViIGhhbGYgb2YgJHt2Lm5hbWV9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpc1ZhbGlkRWQyNTUxOVN0cktleVB1YmxpY0tleSh2LnB1Yikuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXQoJ3JlamVjdHMgYSBiYWQgY2hlY2tzdW0nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBsYXN0IGNoYXJhY3RlciBvZiBhIGtub3duLWdvb2QgcHViIGZsaXBwZWRcbiAgICAgIGlzVmFsaWRFZDI1NTE5U3RyS2V5UHVibGljS2V5KCdHQTVXVUo1NFoyM0tJTExDVU9VTkFLVFBCVlpXS01RVk80TzZFUTVHSExBRVJJTUxMSE5DU0tZQScpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIHNlY3JldCBzZWVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoJ1NBNVdVSjU0WjIzS0lMTENVT1VOQUtUUEJWWldLTVFWTzRPNkVRNUdITEFFUklNTExITkNTS1lIJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGEgbm9uLWJhc2UzMiBjaGFyYWN0ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpc1ZhbGlkRWQyNTUxOVN0cktleVB1YmxpY0tleSgnR0E1V1VKNTRaMjNLSUxMQ1VPVU5BS1RQQlZaV0tNUVZPNE82RVE1R0hMQUVSSU1MTEhOQ1NLWTEnKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgdGhlIGVtcHR5IHN0cmluZyBhbmQgYSBjb21wb3NpdGUgcHViJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoJycpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBpc1ZhbGlkRWQyNTUxOVN0cktleVB1YmxpY0tleShmaXh0dXJlLnZhbGlkWzNdLmNvbXBvc2l0ZSkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVyaXZhYmxlRWQyNTUxOVB1Yi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby9zYWZlL2Rlcml2YWJsZUVkMjU1MTlQdWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrQkFBZ0I7QUFDaEIseUNBZXlCO0FBRXpCLHdEQUF3RDtBQUN4RCxtR0FBbUc7QUFDbkcsOEVBQThFO0FBQzlFLDZFQUErRDtBQUUvRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzFDLE1BQU0sUUFBUSxHQUFHLElBQUEsK0JBQXlCLEVBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ25FLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUUsTUFBTSxhQUFhLEdBQUcsMERBQTBELENBQUM7QUFDakYsTUFBTSxXQUFXLEdBQUcsMERBQTBELENBQUM7QUFFL0UsUUFBUSxDQUFDLHFCQUFxQixFQUFFO0lBQzlCLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtRQUM3QixFQUFFLENBQUMsb0RBQW9ELEVBQUU7WUFDdkQsd0NBQWtDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwRCxrQ0FBNEIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDekMsSUFBQSwrQkFBeUIsRUFBQyxRQUFRLENBQUMsQ0FB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QixFQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0RBQWdELEVBQUU7WUFDbkQsSUFBQSxtQ0FBNkIsRUFBQywwREFBMEQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEgsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0RBQXNELEVBQUU7WUFDekQsSUFBQSxtQ0FBNkIsRUFBQywwREFBMEQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLGtDQUE0QixFQUFDLDBEQUEwRCxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUMzRyxtQkFBbUIsQ0FDcEIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGlFQUFpRSxFQUFFO1lBQ3BFLElBQUEsbUNBQTZCLEVBQUMsMERBQTBELENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlHLElBQUEsbUNBQTZCLEVBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RCxJQUFBLG1DQUE2QixFQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHtcbiAgREVSSVZBQkxFX0VEMjU1MTlfQ0hBSU5fQ09ERV9CWVRFUyxcbiAgREVSSVZBQkxFX0VEMjU1MTlfUFVCX0xFTkdUSCxcbiAgRWQyNTUxOUJJUDMyLFxuICBFZGRzYSxcbiAgZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1YixcbiAgZGVjb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleSxcbiAgZGVjb2RlRWQyNTUxOVN0cktleVNlY3JldFNlZWQsXG4gIGVuY29kZURlcml2YWJsZUVkMjU1MTlQdWIsXG4gIGVuY29kZUVkMjU1MTlTdHJLZXlQdWJsaWNLZXksXG4gIGdlbmVyYXRlRWQyNTUxOUNoYWluQ29kZSxcbiAgaXNDaGVja3N1bVZhbGlkU3RyS2V5RWQyNTUxOVB1YixcbiAgaXNEZXJpdmFibGVFZDI1NTE5UHViLFxuICBpc1ZhbGlkRWQyNTUxOVN0cktleVB1YmxpY0tleSxcbiAgc29mdERlcml2ZUNoaWxkUHViRWQyNTUxOSxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcblxuLy8gQ3Jvc3MtcmVwbyBmaXh0dXJlOiBieXRlLWlkZW50aWNhbCB0byB3YWxsZXQtcGxhdGZvcm1cbi8vIHRlc3QvdW5pdC9iYXNlL3NhZmVzL2ZpeHR1cmVzL2Rlcml2YWJsZUVkMjU1MTlQdWIuanNvbi4gRm91ciBpbmRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpc1xuLy8gZm9ybWF0IHdpbGwgb3RoZXJ3aXNlIGRyaWZ0LCBhbmQgdGhlIGZhaWx1cmUgbW9kZSBpcyB1bnJlY292ZXJhYmxlIHdhbGxldHMuXG5pbXBvcnQgKiBhcyBmaXh0dXJlIGZyb20gJy4vZml4dHVyZXMvZGVyaXZhYmxlRWQyNTUxOVB1Yi5qc29uJztcblxuY29uc3QgUFVCTElDX0tFWSA9IEJ1ZmZlci5hbGxvYygzMik7XG5jb25zdCBDSEFJTl9DT0RFID0gQnVmZmVyLmFsbG9jKDMyLCAweGFiKTtcbmNvbnN0IFJPT1RfUFVCID0gZW5jb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihQVUJMSUNfS0VZLCBDSEFJTl9DT0RFKTtcbmNvbnN0IFJPT1RfS0VZQ0hBSU4gPSBCdWZmZXIuY29uY2F0KFtQVUJMSUNfS0VZLCBDSEFJTl9DT0RFXSkudG9TdHJpbmcoJ2hleCcpO1xuY29uc3QgU1RSS0VZX1BVQkxJQyA9ICdHQTVXVUo1NFoyM0tJTExDVU9VTkFLVFBCVlpXS01RVk80TzZFUTVHSExBRVJJTUxMSE5DU0tZSCc7XG5jb25zdCBTVFJLRVlfU0VFRCA9ICdTQUFBQ0FRREFRQ1FNQllJQkVGQVdEQU5CWUhSQUVJU0NNS0JLRlFYREFNUlVHWTREVVBCNk5LSSc7XG5cbmRlc2NyaWJlKCdkZXJpdmFibGVFZDI1NTE5UHViJywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnYmFzZTMyIHJvb3QgZm9ybWF0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdlbmNvZGVzIDMyLWJ5dGUgcHVibGljIGtleSBwbHVzIDMyLWJ5dGUgY2hhaW4gY29kZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIERFUklWQUJMRV9FRDI1NTE5X0NIQUlOX0NPREVfQllURVMuc2hvdWxkLmVxdWFsKDMyKTtcbiAgICAgIERFUklWQUJMRV9FRDI1NTE5X1BVQl9MRU5HVEguc2hvdWxkLmVxdWFsKDEwMyk7XG4gICAgICBST09UX1BVQi5zaG91bGQubWF0Y2goL15bQS1aMi03XXsxMDN9JC8pO1xuICAgICAgZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihST09UX1BVQikucHViLmVxdWFscyhQVUJMSUNfS0VZKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKFJPT1RfUFVCKS5jaGFpbkNvZGUuZXF1YWxzKENIQUlOX0NPREUpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdtYXRjaGVzIHRoZSBjb25zdGFudHMgcGlubmVkIGluIHRoZSBzaGFyZWQgZml4dHVyZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIERFUklWQUJMRV9FRDI1NTE5X1BVQl9MRU5HVEguc2hvdWxkLmVxdWFsKGZpeHR1cmUucm9vdFB1YkJhc2UzMkxlbmd0aCk7XG4gICAgICBERVJJVkFCTEVfRUQyNTUxOV9DSEFJTl9DT0RFX0JZVEVTLnNob3VsZC5lcXVhbChmaXh0dXJlLmNoYWluQ29kZUJ5dGVzKTtcbiAgICB9KTtcblxuICAgIGl0KCdnZW5lcmF0ZXMgcmF3IGNoYWluIGNvZGUgZm9yIHJvb3QgY29tcG9zaXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBnZW5lcmF0ZUVkMjU1MTlDaGFpbkNvZGUoKS5sZW5ndGguc2hvdWxkLmVxdWFsKDMyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2ZpeHR1cmUgdmVjdG9ycycsIGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKGNvbnN0IHZlY3RvciBvZiBmaXh0dXJlLnZhbGlkKSB7XG4gICAgICBpdChgcm91bmQtdHJpcHMgJHt2ZWN0b3IubmFtZX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZSA9IGVuY29kZURlcml2YWJsZUVkMjU1MTlQdWIoXG4gICAgICAgICAgQnVmZmVyLmZyb20odmVjdG9yLnB1YiwgJ2hleCcpLFxuICAgICAgICAgIEJ1ZmZlci5mcm9tKHZlY3Rvci5jaGFpbkNvZGUsICdoZXgnKVxuICAgICAgICApO1xuICAgICAgICBjb21wb3NpdGUuc2hvdWxkLmVxdWFsKHZlY3Rvci5jb21wb3NpdGUpO1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1Yih2ZWN0b3IuY29tcG9zaXRlKTtcbiAgICAgICAgZGVjb2RlZC5wdWIudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbCh2ZWN0b3IucHViKTtcbiAgICAgICAgZGVjb2RlZC5jaGFpbkNvZGUudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbCh2ZWN0b3IuY2hhaW5Db2RlKTtcbiAgICAgICAgaXNEZXJpdmFibGVFZDI1NTE5UHViKHZlY3Rvci5jb21wb3NpdGUpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdmVjdG9yIG9mIGZpeHR1cmUuaW52YWxpZENvbXBvc2l0ZSkge1xuICAgICAgaXQoYHJlamVjdHMgJHt2ZWN0b3IubmFtZX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlzRGVyaXZhYmxlRWQyNTUxOVB1Yih2ZWN0b3IuY29tcG9zaXRlKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgICAoKCkgPT4gZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1Yih2ZWN0b3IuY29tcG9zaXRlKSkuc2hvdWxkLnRocm93KC9JbnZhbGlkIGRlcml2YWJsZSBlZDI1NTE5IHB1Yi8pO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBkZXNjcmliZSgncmF3IHB1YmxpYyBzb2Z0IGRlcml2YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2Rlcml2ZXMgYSBkZXRlcm1pbmlzdGljIHB1YmxpYyBrZXkgYW5kIGRpc2NhcmRzIHRoZSBjaGlsZCBjaGFpbiBjb2RlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZWRkc2EgPSBhd2FpdCBFZGRzYS5pbml0aWFsaXplKGF3YWl0IEVkMjU1MTlCSVAzMi5pbml0aWFsaXplKCkpO1xuICAgICAgY29uc3QgZGVyaXZlZCA9IGVkZHNhLmRlcml2ZVVuaGFyZGVuZWQoUk9PVF9LRVlDSEFJTiwgJ20vNycpO1xuICAgICAgZGVyaXZlZC5sZW5ndGguc2hvdWxkLmVxdWFsKDEyOCk7XG4gICAgICBkZXJpdmVkLnNsaWNlKDAsIDY0KS5zaG91bGQubWF0Y2goL15bMC05YS1mXXs2NH0kLyk7XG4gICAgICBkZXJpdmVkLnNsaWNlKDY0KS5zaG91bGQubWF0Y2goL15bMC05YS1mXXs2NH0kLyk7XG4gICAgICAoYXdhaXQgc29mdERlcml2ZUNoaWxkUHViRWQyNTUxOShST09UX1BVQiwgNykpLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoZGVyaXZlZC5zbGljZSgwLCA2NCkpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIGdvbGRlbiB2ZWN0b3JzIGJlbG93IHBpbiB0aGUgdW5oYXJkZW5lZCBkZXJpdmF0aW9uIG91dHB1dCBzaGFyZWQgY3Jvc3MtcmVwbyB3aXRoXG4gICAgLy8gd2FsbGV0LXBsYXRmb3JtOiBhIGRpdmVyZ2VudCBpbXBsZW1lbnRhdGlvbiBkZXJpdmVzIGNvLXNpZ25lciBrZXlzIG5vYm9keSBlbHNlIGNhblxuICAgIC8vIHJlcHJvZHVjZSwgcGVybWFuZW50bHkgYnJpY2tpbmcgdGhlIHdhbGxldHMgbWludGVkIHdpdGggaXQuXG4gICAgZm9yIChjb25zdCB2ZWN0b3Igb2YgZml4dHVyZS5zb2Z0RGVyaXZhdGlvbikge1xuICAgICAgaXQoYGRlcml2ZXMgdGhlIHBpbm5lZCBnb2xkZW4gY2hpbGQ6ICR7dmVjdG9yLm5hbWV9YCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGF3YWl0IHNvZnREZXJpdmVDaGlsZFB1YkVkMjU1MTkodmVjdG9yLmNvbXBvc2l0ZSwgdmVjdG9yLmluZGV4KTtcbiAgICAgICAgY2hpbGQudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbCh2ZWN0b3IuY2hpbGRQdWIpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXQoJ3JlamVjdHMgYSBoYXJkZW5lZCBvciBvdXQtb2YtcmFuZ2UgaW5kZXgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBzb2Z0RGVyaXZlQ2hpbGRQdWJFZDI1NTE5KFJPT1RfUFVCLCAtMSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbm9uLWhhcmRlbmVkLyk7XG4gICAgICBhd2FpdCBzb2Z0RGVyaXZlQ2hpbGRQdWJFZDI1NTE5KFJPT1RfUFVCLCAweDgwMDAwMDAwKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9ub24taGFyZGVuZWQvKTtcbiAgICAgIGF3YWl0IHNvZnREZXJpdmVDaGlsZFB1YkVkMjU1MTkoUk9PVF9QVUIsIDEuNSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbm9uLWhhcmRlbmVkLyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIG1hbGZvcm1lZCByb290JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgc29mdERlcml2ZUNoaWxkUHViRWQyNTUxOShmaXh0dXJlLmludmFsaWRDb21wb3NpdGVbMV0uY29tcG9zaXRlLCAwKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAvSW52YWxpZCBkZXJpdmFibGUgZWQyNTUxOSBwdWIvXG4gICAgICApO1xuICAgICAgYXdhaXQgc29mdERlcml2ZUNoaWxkUHViRWQyNTUxOShTVFJLRVlfUFVCTElDLCAwKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIGRlcml2YWJsZSBlZDI1NTE5IHB1Yi8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnU3RlbGxhciB1c2VyLWtleSBjb2RlY3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2tlZXBzIFN0ZWxsYXIgZW5jb2Rpbmcgc2VwYXJhdGUgZnJvbSB0aGUgbmV1dHJhbCByb290IGZvcm1hdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlzVmFsaWRFZDI1NTE5U3RyS2V5UHVibGljS2V5KFNUUktFWV9QVUJMSUMpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgIGVuY29kZUVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoZGVjb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleShTVFJLRVlfUFVCTElDKSkuc2hvdWxkLmVxdWFsKFNUUktFWV9QVUJMSUMpO1xuICAgICAgZGVjb2RlRWQyNTUxOVN0cktleVNlY3JldFNlZWQoU1RSS0VZX1NFRUQpLmxlbmd0aC5zaG91bGQuZXF1YWwoMzIpO1xuICAgICAgaXNEZXJpdmFibGVFZDI1NTE5UHViKFNUUktFWV9QVUJMSUMpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgICBpc0NoZWNrc3VtVmFsaWRTdHJLZXlFZDI1NTE5UHViKFNUUktFWV9QVUJMSUMpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGEgcHVibGljIGtleSB3aXRoIGEgY29ycnVwdGVkIGNoZWNrc3VtJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoJ0dBNVdVSjU0WjIzS0lMTENVT1VOQUtUUEJWWldLTVFWTzRPNkVRNUdITEFFUklNTExITkNTS1lBJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWplY3RzIGEgc2VjcmV0IHNlZWQgd2hlcmUgYSBwdWJsaWMga2V5IGlzIHJlcXVpcmVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoJ1NBNVdVSjU0WjIzS0lMTENVT1VOQUtUUEJWWldLTVFWTzRPNkVRNUdITEFFUklNTExITkNTS1lIJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgICgoKSA9PiBkZWNvZGVFZDI1NTE5U3RyS2V5UHVibGljS2V5KCdTQTVXVUo1NFoyM0tJTExDVU9VTkFLVFBCVlpXS01RVk80TzZFUTVHSExBRVJJTUxMSE5DU0tZSCcpKS5zaG91bGQudGhyb3coXG4gICAgICAgIC9TdHJLZXkgcHVibGljIGtleS9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIG5vbi1iYXNlMzIgY2hhcmFjdGVyLCB0aGUgZW1wdHkgc3RyaW5nLCBhbmQgbG93ZXJjYXNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoJ0dBNVdVSjU0WjIzS0lMTENVT1VOQUtUUEJWWldLTVFWTzRPNkVRNUdITEFFUklNTExITkNTS1kxJykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgIGlzVmFsaWRFZDI1NTE5U3RyS2V5UHVibGljS2V5KCcnKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgICAgaXNWYWxpZEVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoU1RSS0VZX1BVQkxJQy50b0xvd2VyQ2FzZSgpKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|